Updates for add role to person two stage logic
This commit is contained in:
parent
babd610e03
commit
75eb9952d0
4 changed files with 317 additions and 158 deletions
|
@ -161,7 +161,7 @@
|
|||
</#if>
|
||||
</#if>
|
||||
</div>
|
||||
<input type="hidden" id="editKey" name="editKey" value="${editKey} />
|
||||
<input type="hidden" id="editKey" name="editKey" value="${editKey}" />
|
||||
<p class="submit">
|
||||
<input type="submit" id="submit" value="${submitButtonText}"/><span class="or"> or <a class="cancel" href="${cancelUrl}">Cancel</a>
|
||||
</p>
|
||||
|
|
|
@ -70,6 +70,10 @@ import edu.cornell.mannlib.vitro.webapp.utils.FrontEndEditingUtils.EditMode;
|
|||
Important: This form cannot be directly used as a custom form. It has parameters that must be set.
|
||||
See addClinicalRoleToPerson.jsp for an example.
|
||||
|
||||
roleToActivityPredicate and activityToRolePredicate are both dependent on the type of
|
||||
the activity itself. For a new statement, the predicate type is not known.
|
||||
For an existing statement, the predicate is known but may change based on the type of the activity newly selected.
|
||||
|
||||
*
|
||||
*/
|
||||
public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurationGenerator {
|
||||
|
@ -142,7 +146,7 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
//Add validator
|
||||
editConfiguration.addValidator(new DateTimeIntervalValidationVTwo("startField","endField") );
|
||||
//Add preprocessors
|
||||
addPreprocessors(editConfiguration);
|
||||
addPreprocessors(editConfiguration, vreq.getWebappDaoFactory());
|
||||
//Adding additional data, specifically edit mode
|
||||
addFormSpecificData(editConfiguration, vreq);
|
||||
return editConfiguration;
|
||||
|
@ -210,18 +214,18 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
|
||||
private String getPrefixesString() {
|
||||
//TODO: Include dynamic way of including this
|
||||
return "@prefix core: http://vivoweb.org/ontology/core# .";
|
||||
return "@prefix core: <http://vivoweb.org/ontology/core#> .";
|
||||
}
|
||||
|
||||
//TODO: Check if single string or multiple strings - check rdfslabel form etc. for prefix
|
||||
//processing
|
||||
private List<String> generateN3Required(VitroRequest vreq) {
|
||||
List<String> n3ForEdit = new ArrayList<String>();
|
||||
String editString = getPrefixesString() + " /n";
|
||||
String editString = getPrefixesString();
|
||||
editString += "?person ?rolePredicate ?role .";
|
||||
editString += "?role a <" + getRoleType(vreq) + "> .";
|
||||
editString += "?role <" + getRoleToActivityPredicate(vreq) + "> ?roleActivity .";
|
||||
editString += "?roleActivity <" + getActivityToRolePredicate(vreq) + "> ?role .";
|
||||
editString += "?role " + getRoleToActivityPredicate(vreq) + " ?roleActivity .";
|
||||
editString += "?roleActivity " + getActivityToRolePredicate(vreq) + " ?role .";
|
||||
n3ForEdit.add(editString);
|
||||
return n3ForEdit;
|
||||
}
|
||||
|
@ -342,6 +346,10 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
//add role activity and roleActivityType to uris on form
|
||||
urisOnForm.add("roleActivity");
|
||||
urisOnForm.add("roleActivityType");
|
||||
//Also adding the predicates
|
||||
//TODO: Check how to override this in case of default parameter? Just write hidden input to form?
|
||||
urisOnForm.add("roleToActivityPredicate");
|
||||
urisOnForm.add("activityToRolePredicate");
|
||||
editConfiguration.setUrisOnform(urisOnForm);
|
||||
//activity label and role label are literals on form
|
||||
literalsOnForm.add("activityLabel");
|
||||
|
@ -378,10 +386,43 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
map.put("endNode", getEndNodeQuery(vreq));
|
||||
map.put("startField-precision", getStartPrecisionQuery(vreq));
|
||||
map.put("endField-precision", getEndPrecisionQuery(vreq));
|
||||
//Also need sparql queries for roleToActivityPredicate and activityToRolePredicate
|
||||
map.put("roleToActivityPredicate", getRoleToActivityPredicateQuery(vreq));
|
||||
map.put("activityToRolePredicate", getActivityToRolePredicateQuery(vreq));
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
private String getEndPrecisionQuery(VitroRequest vreq) {
|
||||
private String getActivityToRolePredicateQuery(VitroRequest vreq) {
|
||||
String query = "SELECT ?existingActivityToRolePredicate \n " +
|
||||
"WHERE { \n" +
|
||||
"?roleActivity ?existingActivityToRolePredicate ?role .";
|
||||
//Get possible predicates
|
||||
List<String> addToQuery = new ArrayList<String>();
|
||||
List<String> predicates = getPossibleActivityToRolePredicates();
|
||||
for(String p:predicates) {
|
||||
addToQuery.add("(?existingActivityToRolePredicate=<" + p + ">)");
|
||||
}
|
||||
query += "FILTER (" + StringUtils.join(addToQuery, " || ") + ")";
|
||||
query += "}";
|
||||
return query;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private String getRoleToActivityPredicateQuery(VitroRequest vreq) {
|
||||
String query = "SELECT ?existingRoleToActivityPredicate \n " +
|
||||
"WHERE { \n" +
|
||||
"?role ?existingRoleToActivityPredicate ?roleActivity .";
|
||||
//Get possible predicates
|
||||
query += getFilterRoleToActivityPredicate("existingRoleToActivityPredicate");
|
||||
query += "}";
|
||||
return query;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private String getEndPrecisionQuery(VitroRequest vreq) {
|
||||
String query = "SELECT ?existingEndPrecision WHERE {" +
|
||||
"?role <" + getRoleToIntervalURI() + "> ?intervalNode ." +
|
||||
"?intervalNode <" + VitroVocabulary.RDF_TYPE + "> <" + getIntervalTypeURI() + "> ." +
|
||||
|
@ -473,7 +514,9 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
List<String> typeUris = new ArrayList<String>();
|
||||
Set<String> optionUris = typeLiteralOptions.keySet();
|
||||
for(String uri: optionUris) {
|
||||
typeUris.add("(?existingActivityType = <" + uri + ">)");
|
||||
if(!uri.isEmpty()) {
|
||||
typeUris.add("(?existingActivityType = <" + uri + ">)");
|
||||
}
|
||||
}
|
||||
String typeFilters = "FILTER (" + StringUtils.join(typeUris, "||") + ")";
|
||||
String defaultActivityTypeQuery = getDefaultActivityTypeQuery(vreq);
|
||||
|
@ -490,8 +533,17 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
activityTypeQuery = getDefaultActivityTypeQuery(vreq);
|
||||
}
|
||||
|
||||
String roleToActivityPredicate = getRoleToActivityPredicate(vreq);
|
||||
activityTypeQuery = QueryUtils.subUriForQueryVar(activityTypeQuery, "predicate", roleToActivityPredicate);
|
||||
//The replacement of activity type query's predicate was only relevant when we actually
|
||||
//know which predicate is definitely being used here
|
||||
//Here we have multiple values possible for predicate so the original
|
||||
//Replacement should only happen when we have an actual predicate
|
||||
|
||||
String replaceRoleToActivityPredicate = getRoleToActivityPredicate(vreq);
|
||||
//if no filters to add, this means an actual parameter exists for the role to activity predicate and that should be utilized
|
||||
//as the replacement
|
||||
if(!doAddFilterToRoleToActivityQuery(vreq)) {
|
||||
activityTypeQuery = QueryUtils.subUriForQueryVar(activityTypeQuery, "predicate", replaceRoleToActivityPredicate);
|
||||
}
|
||||
log.debug("Activity type query: " + activityTypeQuery);
|
||||
|
||||
return activityTypeQuery;
|
||||
|
@ -503,8 +555,11 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
"PREFIX vitro: <" + VitroVocabulary.vitroURI + "> \n" +
|
||||
"SELECT ?existingActivityType WHERE { \n" +
|
||||
" ?role ?predicate ?existingActivity . \n" +
|
||||
" ?existingActivity vitro:mostSpecificType ?existingActivityType . \n" +
|
||||
"}";
|
||||
" ?existingActivity vitro:mostSpecificType ?existingActivityType . \n";
|
||||
if(doAddFilterToRoleToActivityQuery(vreq)) {
|
||||
query += getFilterRoleToActivityPredicate("predicate");
|
||||
}
|
||||
query+= "}";
|
||||
return query;
|
||||
}
|
||||
|
||||
|
@ -515,8 +570,11 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
"SELECT ?existingActivityType WHERE {\n" +
|
||||
" ?role ?predicate ?existingActivity . \n" +
|
||||
" ?existingActivity vitro:mostSpecificType ?existingActivityType . \n" +
|
||||
" ?existingActivityType rdfs:subClassOf ?objectClassUri . \n" +
|
||||
"}";
|
||||
" ?existingActivityType rdfs:subClassOf ?objectClassUri . \n";
|
||||
if(doAddFilterToRoleToActivityQuery(vreq)) {
|
||||
query += getFilterRoleToActivityPredicate("predicate");
|
||||
}
|
||||
query+= "}";
|
||||
return query;
|
||||
}
|
||||
|
||||
|
@ -526,8 +584,11 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
"SELECT ?existingActivityType WHERE { \n" +
|
||||
" ?role ?predicate ?existingActivity . \n" +
|
||||
" ?existingActivity vitro:mostSpecificType ?existingActivityType . \n" +
|
||||
" ?existingActivityType vitro:inClassGroup ?classgroup . \n" +
|
||||
"}";
|
||||
" ?existingActivityType vitro:inClassGroup ?classgroup . \n";
|
||||
if(doAddFilterToRoleToActivityQuery(vreq)) {
|
||||
query += getFilterRoleToActivityPredicate("predicate");
|
||||
}
|
||||
query+= "}";
|
||||
return query;
|
||||
}
|
||||
|
||||
|
@ -539,15 +600,17 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
|
||||
String roleToActivityPredicate = getRoleToActivityPredicate(vreq);
|
||||
//Portion below for multiple possible predicates
|
||||
/*if(roleToActivityPredicate.equals(getDefaultRoleToActivityPredicate())) {
|
||||
query += "SELECT ?existingActivity WHERE { " +
|
||||
"{?role <" + ModelUtils.processPropertyURI + "> ?existingActivity .} UNION " +
|
||||
"{?role <" + ModelUtils.nonProcessPropertyURI + "> ?existingActivity .}" +
|
||||
"}";
|
||||
if(doAddFilterToRoleToActivityQuery(vreq)) {
|
||||
List<String> predicates = getPossibleRoleToActivityPredicates();
|
||||
List<String> addToQuery = new ArrayList<String>();
|
||||
query += "SELECT ?existingActivity WHERE { \n" +
|
||||
" ?role ?predicate ?existingActivity . \n ";
|
||||
query += getFilterRoleToActivityPredicate("predicate");
|
||||
query += "}";
|
||||
} else {
|
||||
*/
|
||||
|
||||
query += "SELECT ?existingActivity WHERE { ?role <" +roleToActivityPredicate + "> ?existingActivity . }";
|
||||
/*}*/
|
||||
}
|
||||
|
||||
return query;
|
||||
}
|
||||
|
@ -594,19 +657,19 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
"PREFIX rdfs: <" + RDFS.getURI() + "> \n";
|
||||
|
||||
String roleToActivityPredicate = getRoleToActivityPredicate(vreq);
|
||||
/*if(roleToActivityPredicate.equals(getDefaultRoleToActivityPredicate())) {
|
||||
if(doAddFilterToRoleToActivityQuery(vreq)) {
|
||||
|
||||
query += "SELECT ?existingTitle WHERE { \n" +
|
||||
"{?role <" + ModelUtils.processPropertyURI + "> ?existingActivity . \n" +
|
||||
"?existingActivity rdfs:label ?existingTitle . } UNION " +
|
||||
"{?role <" + ModelUtils.nonProcessPropertyURI + "> ?existingActivity . \n" +
|
||||
"?existingActivity rdfs:label ?existingTitle . } " +
|
||||
"}";
|
||||
"?role ?predicate ?existingActivity . \n" +
|
||||
"?existingActivity rdfs:label ?existingTitle . \n";
|
||||
query += getFilterRoleToActivityPredicate("predicate");
|
||||
query += "}";
|
||||
|
||||
} else {*/
|
||||
} else {
|
||||
query += "SELECT ?existingTitle WHERE { \n" +
|
||||
"?role <" + roleToActivityPredicate + "> ?existingActivity . \n" +
|
||||
"?existingActivity rdfs:label ?existingTitle . }";
|
||||
/*}*/
|
||||
}
|
||||
|
||||
return query;
|
||||
}
|
||||
|
@ -625,11 +688,86 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
getRoleLabelField(editConfiguration, vreq, fields);
|
||||
getStartField(editConfiguration, vreq, fields);
|
||||
getEndField(editConfiguration, vreq, fields);
|
||||
|
||||
//These fields are for the predicates that will be set later
|
||||
//TODO: Do these only if not using a parameter for the predicate?
|
||||
getRoleToActivityPredicateField(editConfiguration, vreq, fields);
|
||||
getActivityToRolePredicateField(editConfiguration, vreq, fields);
|
||||
editConfiguration.setFields(fields);
|
||||
}
|
||||
|
||||
|
||||
//This is a literal technically?
|
||||
private void getActivityToRolePredicateField(
|
||||
EditConfigurationVTwo editConfiguration, VitroRequest vreq,
|
||||
Map<String, FieldVTwo> fields) {
|
||||
String fieldName = "activityToRolePredicate";
|
||||
//get range data type uri and range language
|
||||
String stringDatatypeUri = XSD.xstring.toString();
|
||||
|
||||
FieldVTwo field = new FieldVTwo();
|
||||
field.setName(fieldName);
|
||||
field.setNewResource(false);
|
||||
//queryForExisting is not being used anywhere in Field
|
||||
|
||||
//Not really interested in validators here
|
||||
List<String> validators = new ArrayList<String>();
|
||||
field.setValidators(validators);
|
||||
|
||||
//subjectUri and subjectClassUri are not being used in Field
|
||||
|
||||
field.setOptionsType("UNDEFINED");
|
||||
//why isn't predicate uri set for data properties?
|
||||
field.setPredicateUri(null);
|
||||
field.setObjectClassUri(null);
|
||||
field.setRangeDatatypeUri(null);
|
||||
|
||||
field.setLiteralOptions(new ArrayList<List<String>>());
|
||||
|
||||
//set assertions
|
||||
List<String> assertions = new ArrayList<String>();
|
||||
assertions.add("?roleActivity ?activityToRolePredicate ?role .");
|
||||
field.setAssertions(assertions);
|
||||
fields.put(field.getName(), field);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void getRoleToActivityPredicateField(
|
||||
EditConfigurationVTwo editConfiguration, VitroRequest vreq,
|
||||
Map<String, FieldVTwo> fields) {
|
||||
String fieldName = "roleToActivityPredicate";
|
||||
//get range data type uri and range language
|
||||
String stringDatatypeUri = XSD.xstring.toString();
|
||||
|
||||
FieldVTwo field = new FieldVTwo();
|
||||
field.setName(fieldName);
|
||||
field.setNewResource(false);
|
||||
//queryForExisting is not being used anywhere in Field
|
||||
|
||||
//Not really interested in validators here
|
||||
List<String> validators = new ArrayList<String>();
|
||||
field.setValidators(validators);
|
||||
|
||||
//subjectUri and subjectClassUri are not being used in Field
|
||||
|
||||
field.setOptionsType("UNDEFINED");
|
||||
//why isn't predicate uri set for data properties?
|
||||
field.setPredicateUri(null);
|
||||
field.setObjectClassUri(null);
|
||||
field.setRangeDatatypeUri(null);
|
||||
|
||||
field.setLiteralOptions(new ArrayList<List<String>>());
|
||||
|
||||
//set assertions
|
||||
List<String> assertions = new ArrayList<String>();
|
||||
assertions.add("?role ?roleToActivityPredicate ?roleActivity .");
|
||||
field.setAssertions(assertions);
|
||||
fields.put(field.getName(), field);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Label of "right side" of role, i.e. label for role roleIn Activity
|
||||
private void getActivityLabelField(EditConfigurationVTwo editConfiguration,
|
||||
VitroRequest vreq, Map<String, FieldVTwo> fields) {
|
||||
|
@ -743,8 +881,8 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
List<String> assertions = new ArrayList<String>();
|
||||
//N3ForRoleToActivity
|
||||
String n3ForRoleToActivity = "@prefix core: <" + getVivoCoreNamespace() + "> ." +
|
||||
"?role <" + getRoleToActivityPredicate(vreq) + "> ?roleActivity ." +
|
||||
"?roleActivity <" + getActivityToRolePredicate(vreq) + "> ?role .";
|
||||
"?role " + getRoleToActivityPredicate(vreq) + " ?roleActivity ." +
|
||||
"?roleActivity " + getActivityToRolePredicate(vreq) + " ?role .";
|
||||
assertions.add(n3ForRoleToActivity);
|
||||
field.setAssertions(assertions);
|
||||
fields.put(field.getName(), field);
|
||||
|
@ -883,10 +1021,12 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
|
||||
//Add preprocessor
|
||||
|
||||
private void addPreprocessors(EditConfigurationVTwo editConfiguration) {
|
||||
//Add preprocessor that will replace the generic role to activity predicate preprocessor
|
||||
//With roleIn
|
||||
editConfiguration.addModelChangePreprocessor(new RoleToActivityPredicatePreprocessor());
|
||||
private void addPreprocessors(EditConfigurationVTwo editConfiguration, WebappDaoFactory wadf) {
|
||||
//Add preprocessor that will replace the role to activity predicate and inverse
|
||||
//with correct properties based on the activity type
|
||||
editConfiguration.addEditSubmissionPreprocessor(
|
||||
new RoleToActivityPredicatePreprocessor(editConfiguration, wadf));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -913,15 +1053,20 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
}
|
||||
|
||||
public String getActivityToRolePredicate(VitroRequest vreq) {
|
||||
return getDefaultActivityToRolePredicate();
|
||||
return getActivityToRolePlaceholder();
|
||||
//return getDefaultActivityToRolePredicate();
|
||||
}
|
||||
|
||||
//This has a default value, but note that even that will not be used
|
||||
//in the update with realized in or contributes to
|
||||
//Overridden when need be in subclassed generator
|
||||
//Also note that for now we're going to actually going to return a
|
||||
//placeholder value by default
|
||||
public String getRoleToActivityPredicate(VitroRequest vreq) {
|
||||
return getDefaultRoleToActivityPredicate();
|
||||
return getRoleToActivityPlaceholder();
|
||||
//return getDefaultRoleToActivityPredicate();
|
||||
}
|
||||
//Ensure when overwritten that this includes the <> b/c otherwise the query won't work
|
||||
|
||||
//Some values will have a default value
|
||||
//activityToRolePredicate
|
||||
|
@ -935,15 +1080,53 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
|
||||
}
|
||||
|
||||
public List<String> getPossibleRoleToActivityPredicates() {
|
||||
return ModelUtils.getPossiblePropertiesForRole();
|
||||
}
|
||||
|
||||
public List<String> getPossibleActivityToRolePredicates() {
|
||||
return ModelUtils.getPossibleInversePropertiesForRole();
|
||||
}
|
||||
|
||||
/**
|
||||
* Methods that check edit mode
|
||||
*/
|
||||
|
||||
//Get edit mode
|
||||
private EditMode getEditMode(VitroRequest vreq) {
|
||||
String roleToActivityPredicate = getRoleToActivityPredicate(vreq);
|
||||
List<String> roleToActivityPredicates = getPossibleRoleToActivityPredicates();
|
||||
//We're making some assumptions here: That there is only one role objec tot one activity object
|
||||
//pairing, i.e. the same role object can't be related to a different activity object
|
||||
//That said, there should only be one role to Activity predicate linking a role to an activity
|
||||
//So if
|
||||
List<EditMode> editModes = new ArrayList<EditMode>();
|
||||
Individual object = EditConfigurationUtils.getObjectIndividual(vreq);
|
||||
EditMode mode = FrontEndEditingUtils.getEditMode(vreq, object, roleToActivityPredicate);
|
||||
boolean foundEditMode = false;
|
||||
boolean foundErrorMode = false;
|
||||
boolean onlyRepairModes = true;
|
||||
for(String predicate:roleToActivityPredicates) {
|
||||
EditMode mode = FrontEndEditingUtils.getEditMode(vreq, object, predicate);
|
||||
//TODO: Check what to do with repair, because unclear
|
||||
if(mode != EditMode.REPAIR) {
|
||||
onlyRepairModes = false;
|
||||
}
|
||||
if(mode == EditMode.EDIT) {
|
||||
foundEditMode = true;
|
||||
break;
|
||||
}
|
||||
if(mode == EditMode.ERROR) {
|
||||
foundErrorMode = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
EditMode mode = EditMode.ADD;
|
||||
//if found one edit or error, then sufficient
|
||||
|
||||
if(foundEditMode) mode = EditMode.EDIT;
|
||||
if(foundErrorMode) mode = EditMode.ERROR;
|
||||
//if all results are repair, then we need to repair
|
||||
//doing this this way b/c unclear since zero statements may be returned otherwise
|
||||
if(onlyRepairModes) mode = EditMode.REPAIR;
|
||||
return mode;
|
||||
//(mode == EditMode.ADD || mode == EditMode.REPAIR) ? "\"nonempty\"
|
||||
}
|
||||
|
@ -1022,4 +1205,35 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
|
|||
editConfiguration.setFormSpecificData(formSpecificData);
|
||||
}
|
||||
|
||||
//Do add filter fo rroel to activity or activity to role predicates
|
||||
public boolean doAddFilterToRoleToActivityQuery(VitroRequest vreq) {
|
||||
return (getRoleToActivityPredicate(vreq) == getRoleToActivityPlaceholder());
|
||||
}
|
||||
|
||||
public boolean doAddFilterToActivityToRoleQuery(VitroRequest vreq) {
|
||||
return (getActivityToRolePredicate(vreq) == getActivityToRolePlaceholder());
|
||||
}
|
||||
|
||||
|
||||
public String getFilterRoleToActivityPredicate(String predicateVar) {
|
||||
String addFilter = "FILTER (";
|
||||
List<String> predicates = getPossibleRoleToActivityPredicates();
|
||||
List<String> filterPortions = new ArrayList<String>();
|
||||
for(String p: predicates) {
|
||||
filterPortions.add("(?" + predicateVar + "=<" + p + ">)");
|
||||
}
|
||||
addFilter += StringUtils.join(filterPortions, " || ");
|
||||
addFilter += ")";
|
||||
System.out.println("Add filter is " + addFilter);
|
||||
return addFilter;
|
||||
}
|
||||
|
||||
public String getRoleToActivityPlaceholder() {
|
||||
return "?roleToActivityPredicate";
|
||||
}
|
||||
|
||||
public String getActivityToRolePlaceholder() {
|
||||
return "?activityToRolePredicate";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -32,28 +32,56 @@ import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
|
|||
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
|
||||
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
|
||||
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.BaseEditSubmissionPreprocessorVTwo;
|
||||
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationVTwo;
|
||||
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.MultiValueEditSubmission;
|
||||
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.FieldVTwo;
|
||||
import org.vivoweb.webapp.util.ModelUtils;
|
||||
|
||||
public class RoleToActivityPredicatePreprocessor implements ModelChangePreprocessor {
|
||||
public class RoleToActivityPredicatePreprocessor extends BaseEditSubmissionPreprocessorVTwo {
|
||||
|
||||
private static final Log log = LogFactory.getLog(CreateLabelFromNameFields.class.getName());
|
||||
public RoleToActivityPredicatePreprocessor() {
|
||||
super();
|
||||
private WebappDaoFactory wadf = null;
|
||||
//Need the webapp dao factory to try to figure out what the predicate should be
|
||||
public RoleToActivityPredicatePreprocessor(EditConfigurationVTwo editConfig, WebappDaoFactory wadf) {
|
||||
super(editConfig);
|
||||
this.wadf = wadf;
|
||||
}
|
||||
|
||||
public void preprocess(Model retractionsModel, Model additionsModel, HttpServletRequest request) {
|
||||
public void preprocess(MultiValueEditSubmission submission) {
|
||||
//Query for all statements using the original roleIn predicate replace
|
||||
//with the appropriate roleRealizedIn or roleContributesTo
|
||||
//In addition, need to ensure the inverse predicate is also set correctly
|
||||
|
||||
try {
|
||||
VitroRequest vreq = new VitroRequest(request);
|
||||
WebappDaoFactory wadf = vreq.getWebappDaoFactory();
|
||||
replacePredicates(retractionsModel, wadf);
|
||||
replacePredicates(additionsModel, wadf);
|
||||
//Get the uris from form
|
||||
Map<String, List<String>> urisFromForm = submission.getUrisFromForm();
|
||||
//Get the type of the activity selected
|
||||
List<String> activityTypes = urisFromForm.get("roleActivityType");
|
||||
//Really should just be one here
|
||||
if(activityTypes != null && activityTypes.size() > 0) {
|
||||
String type = activityTypes.get(0);
|
||||
ObjectProperty roleToActivityProperty = getCorrectProperty(type, wadf);
|
||||
String roleToActivityPredicate = roleToActivityProperty.getURI();
|
||||
String activityToRolePredicate = roleToActivityProperty.getURIInverse();
|
||||
List<String> predicates = new ArrayList<String>();
|
||||
predicates.add(roleToActivityPredicate);
|
||||
|
||||
List<String> inversePredicates = new ArrayList<String>();
|
||||
inversePredicates.add(activityToRolePredicate);
|
||||
//Populate the two fields in edit submission
|
||||
if(urisFromForm.containsKey("roleToActivityPredicate")) {
|
||||
urisFromForm.remove("roleToActivityPredicate");
|
||||
}
|
||||
|
||||
urisFromForm.put("roleToActivityPredicate", predicates);
|
||||
|
||||
if(urisFromForm.containsKey("activityToRolePredicate")) {
|
||||
urisFromForm.remove("activityToRolePredicate");
|
||||
}
|
||||
urisFromForm.put("activityToRolePredicate", inversePredicates);
|
||||
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("Error retrieving name values from edit submission.");
|
||||
|
@ -61,108 +89,9 @@ public class RoleToActivityPredicatePreprocessor implements ModelChangePreproces
|
|||
|
||||
}
|
||||
|
||||
private void replacePredicates(Model inputModel, WebappDaoFactory wadf) {
|
||||
executeQueryAndReplace(inputModel, wadf);
|
||||
}
|
||||
private void executeQueryAndReplace(Model inputModel, WebappDaoFactory wadf) {
|
||||
String queryString= getRoleAndActivityQuery();
|
||||
Query query = QueryFactory.create(queryString);
|
||||
QueryExecution qe = QueryExecutionFactory.create(query, inputModel);
|
||||
ResultSet rs = qe.execSelect();
|
||||
|
||||
while(rs.hasNext()) {
|
||||
QuerySolution qs = rs.nextSolution();
|
||||
Resource role = null, activity = null, mostSpecificType = null;
|
||||
role = getResourceFromSolution(qs, "role");
|
||||
activity = getResourceFromSolution(qs, "activity");
|
||||
mostSpecificType = getResourceFromSolution(qs, "mostSpecificType");
|
||||
|
||||
//Within the input model, replace predicate linking role and activity and vice versa
|
||||
//based on the most specific type of the activity
|
||||
replacePredicatesForRoleAndActivity(inputModel, role, activity, mostSpecificType, wadf);
|
||||
|
||||
}
|
||||
}
|
||||
private void replacePredicatesForRoleAndActivity(Model inputModel,
|
||||
Resource role, Resource activity, Resource mostSpecificType,
|
||||
WebappDaoFactory wadf) {
|
||||
Property roleToActivityPredicate = ResourceFactory.createProperty(getGenericRoleToActivityPredicate());
|
||||
Property activityToRolePredicate = ResourceFactory.createProperty(getGenericActivityToRolePredicate());
|
||||
if(role != null && activity != null && mostSpecificType != null) {
|
||||
|
||||
ObjectProperty newRoleToActivityProperty = getCorrectProperty(mostSpecificType.getURI(), wadf);
|
||||
String propertyURI = newRoleToActivityProperty.getURI();
|
||||
String inversePropertyURI = newRoleToActivityProperty.getURIInverse();
|
||||
//Remove all the old statements connecting role and activity
|
||||
inputModel.enterCriticalSection(Lock.WRITE);
|
||||
try {
|
||||
Model removeRoleToActivityModel = ModelFactory.createDefaultModel();
|
||||
removeRoleToActivityModel.add(inputModel.listStatements(
|
||||
role,
|
||||
roleToActivityPredicate,
|
||||
activity));
|
||||
Model removeActivityToRoleModel = ModelFactory.createDefaultModel();
|
||||
removeActivityToRoleModel.add(inputModel.listStatements(
|
||||
activity,
|
||||
activityToRolePredicate,
|
||||
role));
|
||||
//Add statements
|
||||
inputModel.add(inputModel.createStatement(
|
||||
role,
|
||||
ResourceFactory.createProperty(propertyURI),
|
||||
activity));
|
||||
|
||||
inputModel.add(inputModel.createStatement(
|
||||
activity,
|
||||
ResourceFactory.createProperty(inversePropertyURI),
|
||||
role));
|
||||
|
||||
//Remove all roleToActivityPredicates and replace with the new predicate
|
||||
inputModel.remove(removeRoleToActivityModel);
|
||||
//Remove all activity to role predicates and replace with new predicate
|
||||
inputModel.remove(removeActivityToRoleModel);
|
||||
} catch(Exception ex) {
|
||||
log.error("Exception occurred in replacing predicates in model ", ex);
|
||||
} finally {
|
||||
inputModel.leaveCriticalSection();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private ObjectProperty getCorrectProperty(String uri, WebappDaoFactory wadf) {
|
||||
//ObjectProperty correctProperty = ModelUtils.getPropertyForRoleInClass(uri, wadf);
|
||||
ObjectProperty op = new ObjectProperty();
|
||||
op.setURI( "http://vivoweb.org/ontology/core#roleRealizedIn");
|
||||
op.setURIInverse("http://vivoweb.org/ontology/core#realizedRole");
|
||||
return op;
|
||||
}
|
||||
|
||||
private String getRoleAndActivityQuery() {
|
||||
String roleToActivityPredicate = getGenericRoleToActivityPredicate();
|
||||
String query = "PREFIX core: <http://vivoweb.org/ontology/core#>" +
|
||||
"SELECT ?role ?activity ?mostSpecificType WHERE { ?role <" + roleToActivityPredicate + "> ?activity . \n" +
|
||||
"?activity <" + VitroVocabulary.RDF_TYPE + "> ?mostSpecificType. \n" +
|
||||
"}";
|
||||
return query;
|
||||
}
|
||||
|
||||
private Resource getResourceFromSolution(QuerySolution qs, String variableName) {
|
||||
Resource resource = null;
|
||||
if(qs.get(variableName) != null && qs.get(variableName).isResource()) {
|
||||
resource = qs.getResource(variableName);
|
||||
}
|
||||
return resource;
|
||||
}
|
||||
|
||||
|
||||
//Values used in the forms
|
||||
private static String getGenericRoleToActivityPredicate() {
|
||||
return "http://vivoweb.org/ontology/core#roleIn";
|
||||
}
|
||||
|
||||
private static String getGenericActivityToRolePredicate() {
|
||||
return "http://vivoweb.org/ontology/core#relatedRole";
|
||||
|
||||
}
|
||||
ObjectProperty correctProperty = ModelUtils.getPropertyForRoleInClass(uri, wadf);
|
||||
return correctProperty;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
package org.vivoweb.webapp.util;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
@ -19,10 +20,10 @@ public class ModelUtils {
|
|||
|
||||
private static final Log log = LogFactory.getLog(ModelUtils.class.getName());
|
||||
|
||||
public static final String processPropertyURI = "http://vivoweb.org/ontology/core#roleRealizedIn";
|
||||
public static final String processPropertyInverseURI = "http://vivoweb.org/ontology/core#realizedRole";
|
||||
public static final String nonProcessPropertyURI = "http://vivoweb.org/ontology/core#roleContributesTo";
|
||||
public static final String nonProcessPropertyInverseURI = "http://vivoweb.org/ontology/core#ContributingRole";
|
||||
private static final String processPropertyURI = "http://vivoweb.org/ontology/core#roleRealizedIn";
|
||||
private static final String processPropertyInverseURI = "http://vivoweb.org/ontology/core#realizedRole";
|
||||
private static final String nonProcessPropertyURI = "http://vivoweb.org/ontology/core#roleContributesTo";
|
||||
private static final String nonProcessPropertyInverseURI = "http://vivoweb.org/ontology/core#ContributingRole";
|
||||
|
||||
private static Set<String> processClass = new HashSet<String>();
|
||||
static {
|
||||
|
@ -79,4 +80,19 @@ public class ModelUtils {
|
|||
|
||||
return op;
|
||||
}
|
||||
|
||||
//Return list of all possible predicates
|
||||
public static List<String> getPossiblePropertiesForRole() {
|
||||
List<String> properties = new ArrayList<String>();
|
||||
properties.add(processPropertyURI);
|
||||
properties.add(nonProcessPropertyURI);
|
||||
return properties;
|
||||
}
|
||||
|
||||
public static List<String> getPossibleInversePropertiesForRole() {
|
||||
List<String> properties = new ArrayList<String>();
|
||||
properties.add(processPropertyInverseURI);
|
||||
properties.add(nonProcessPropertyInverseURI);
|
||||
return properties;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue