Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
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;
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) {
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);
}
}