![JAR search and dependency download from the Maven repository](/logo.png)
com.eduworks.rollup.coprocessor.MilCredCoprocessor Maven / Gradle / Ivy
package com.eduworks.rollup.coprocessor;
import cass.rollup.InquiryPacket;
import cass.rollup.coprocessor.AssertionCoprocessor;
import com.eduworks.ec.array.EcArray;
import com.eduworks.ec.array.EcAsyncHelper;
import com.eduworks.ec.array.EcObject;
import org.cass.profile.EcAssertion;
import org.cassproject.ebac.repository.EcRepository;
import org.cassproject.schema.general.EcRemoteLinkedData;
import org.schema.AchieveAction;
import org.schema.Action;
import org.schema.CreativeWork;
import org.stjs.javascript.Array;
import org.stjs.javascript.JSObjectAdapter;
import org.stjs.javascript.functions.Callback0;
import org.stjs.javascript.functions.Callback1;
import org.stjs.javascript.functions.Callback2;
/**
* Created by fray on 5/30/17.
*/
public class MilCredCoprocessor extends AssertionCoprocessor {
public Object assertedBy = null;
public Object assertions = null;
public Array nextSearch = null;
@Override
public void collectAssertions(final InquiryPacket ip, final Array listOfCompetencies, final Callback1> success) {
//Collect things that assert things in listOfCompetencies
//Recurse, detecting cycles
//For each of those things that have an AssertAction or equivalent,
// add that thing to the evidence when creating an assertion.
assertedBy = new Object();
assertions = new Object();
final MilCredCoprocessor me = this;
rabbitHole(0, ip, listOfCompetencies, new Callback0() {
@Override
public void $invoke() {
me.findAssertions(ip, new Callback0() {
@Override
public void $invoke() {
me.generateAssertions(ip, listOfCompetencies, success);
}
});
}
});
}
private int getAssertedByCount() {
int count = 0;
Array keys = EcObject.keys(assertedBy);
for (int i = 0; i < keys.$length(); i++)
count += ((Array) JSObjectAdapter.$get(assertedBy, keys.$get(i))).$length();
return count;
}
private void generateAssertions(final InquiryPacket ip, final Array listOfCompetencies, final Callback1> success) {
Array assertions = new Array();
for (int i = 0; i < listOfCompetencies.$length(); i++) {
Array evidences = new Array<>();
addEvidenceOfDependenciesToArray(listOfCompetencies.$get(i), evidences);
if (evidences.$length() == 0)
continue;
EcAssertion a = new EcAssertion();
a.generateId("internal");
for (int j = 0; j < ip.subject.$length(); j++)
a.addOwner(ip.subject.$get(j));
a.setSubject(ip.subject.$get(0));
a.setCompetency(listOfCompetencies.$get(i));
a.setEvidence(evidences);
a.setConfidence(1.0);
assertions.push(a);
}
success.$invoke(assertions);
}
private void addEvidenceOfDependenciesToArray(String s, Array evidences) {
if (JSObjectAdapter.$get(assertions, s) != null) {
for (int i = 0; i < ((Array) JSObjectAdapter.$get(assertions, s)).$length(); i++)
evidences.push(((Array) JSObjectAdapter.$get(assertions, s)).$get(i).shortId());
}
if (JSObjectAdapter.$get(assertedBy, s) != null) {
for (int i = 0; i < ((Array) JSObjectAdapter.$get(assertedBy, s)).$length(); i++)
addEvidenceOfDependenciesToArray(((Array) JSObjectAdapter.$get(assertedBy, s)).$get(i), evidences);
}
}
private void findAssertions(final InquiryPacket ip, final Callback0 success) {
final MilCredCoprocessor me = this;
me.assertionProcessor.log(ip, "Querying repositories for AchieveActions");
final Array evidence = new Array();
Array keys = EcObject.keys(assertedBy);
for (int i = 0; i < keys.$length(); i++)
for (int j = 0; j < ((Array) JSObjectAdapter.$get(assertedBy, keys.$get(i))).$length(); j++)
evidence.push(((Array) JSObjectAdapter.$get(assertedBy, keys.$get(i))).$get(j));
if (evidence.$length() == 0) {
success.$invoke();
return;
}
EcAsyncHelper eah = new EcAsyncHelper();
eah.each(me.assertionProcessor.repositories, new Callback2() {
@Override
public void $invoke(EcRepository currentRepository, final Callback0 callback0) {
String searchQuery = me.buildAssertionSearchQuery(ip, evidence);
me.assertionProcessor.log(ip, "Querying repositories for AchieveActions regarding " + evidence.$length() + " evidences: " + searchQuery);
Object params = new Object();
JSObjectAdapter.$put(params, "size", 5000);
currentRepository.searchWithParams(searchQuery, params, null, new Callback1>() {
public void $invoke(Array p1) {
me.assertionProcessor.log(ip, p1.$length() + " AchieveActions found.");
for (int i = 0; i < p1.$length(); i++) {
AchieveAction a = new AchieveAction();
a.copyFrom(p1.$get(i));
String thingy = EcRemoteLinkedData.trimVersionFromUrl((String) (Object) a.object);
if (((Array) JSObjectAdapter.$get(me.assertions, thingy) == null))
JSObjectAdapter.$put(me.assertions, thingy, new Array());
Array as = (Array) JSObjectAdapter.$get(me.assertions, thingy);
EcArray.setAdd(as, a);
}
callback0.$invoke();
}
}, new Callback1() {
public void $invoke(String p1) {
callback0.$invoke();
}
});
}
}, new Callback1>() {
@Override
public void $invoke(Array strings) {
success.$invoke();
}
});
}
private void rabbitHole(final int level, final InquiryPacket ip, final Array listOfThingies, final Callback0 success) {
final MilCredCoprocessor me = this;
nextSearch = new Array();
EcAsyncHelper eah = new EcAsyncHelper();
eah.each(me.assertionProcessor.repositories, new Callback2() {
@Override
public void $invoke(EcRepository currentRepository, final Callback0 callback0) {
String searchQuery = me.buildRelationsSearchQuery(ip, listOfThingies);
me.assertionProcessor.log(ip, "Querying repositories for relations regarding " + listOfThingies.$length() + " objects: " + searchQuery);
Object params = new Object();
JSObjectAdapter.$put(params, "size", 5000);
currentRepository.searchWithParams(searchQuery, params, null, new Callback1>() {
public void $invoke(Array p1) {
me.assertionProcessor.log(ip, p1.$length() + " relations found.");
for (int i = 0; i < p1.$length(); i++) {
CreativeWork a = new CreativeWork();
a.copyFrom(p1.$get(i));
String thingy = EcRemoteLinkedData.trimVersionFromUrl(a.educationalAlignment.targetUrl);
String assertedBy = EcRemoteLinkedData.trimVersionFromUrl(a.url);
if (((Array) JSObjectAdapter.$get(me.assertedBy, thingy) == null))
JSObjectAdapter.$put(me.assertedBy, thingy, new Array());
Array as = (Array) JSObjectAdapter.$get(me.assertedBy, thingy);
if (!EcArray.has(as, assertedBy)) {
as.push(assertedBy);
me.nextSearch.push(assertedBy);
}
}
callback0.$invoke();
}
}, new Callback1() {
public void $invoke(String p1) {
callback0.$invoke();
}
});
}
}, new Callback1>() {
@Override
public void $invoke(Array strings) {
if (me.nextSearch.$length() > 0)
me.rabbitHole(level + 1, ip, me.nextSearch, success);
else
success.$invoke();
}
});
}
protected String buildRelationsSearchQuery(InquiryPacket ip, Array competencies) {
String result = null;
if (InquiryPacket.IPType.ROLLUPRULE==ip.type) {
ip.failure.$invoke("NOT SUPPOSED TO BE HERE.");
throw new RuntimeException("Collecting assertions when root node is a rollup rule. Not supported.");
} else if (InquiryPacket.IPType.COMPETENCY==ip.type) {
result = "educationalAlignment.alignmentType:\"*asserts\" AND (";
for (int i = 0; i < competencies.$length(); i++) {
if (i != 0)
result += " OR ";
result += "educationalAlignment.targetUrl:\"" + competencies.$get(i) + "\"";
}
result += ")";
}
if (result != null)
return result;
throw new RuntimeException("Trying to build a coprocessor rabbit hole search query on an unsupported type: " + ip.type);
}
protected String buildAssertionSearchQuery(InquiryPacket ip, Array competencies) {
String result = null;
if (InquiryPacket.IPType.ROLLUPRULE==ip.type) {
ip.failure.$invoke("NOT SUPPOSED TO BE HERE.");
throw new RuntimeException("Collecting assertions when root node is a rollup rule. Not supported.");
} else if (InquiryPacket.IPType.COMPETENCY==ip.type) {
result = "@type:\"*AchieveAction\" AND (";
for (int i = 0; i < competencies.$length(); i++) {
if (i != 0)
result += " OR ";
result += "object:\"" + competencies.$get(i) + "\"";
}
result += ")";
}
for (int i = 0; i < ip.subject.$length(); i++)
result += " AND (agent:\"" + ip.subject.$get(i).toPem() + "\")";
if (result != null)
return result;
throw new RuntimeException("Trying to build a coprocessor achieveAction search query on an unsupported type: " + ip.type);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy