Updates for add role to person two stage logic

This commit is contained in:
hjkhjk54 2011-11-02 21:04:19 +00:00
parent babd610e03
commit 75eb9952d0
4 changed files with 317 additions and 158 deletions

View file

@ -161,7 +161,7 @@
</#if> </#if>
</#if> </#if>
</div> </div>
<input type="hidden" id="editKey" name="editKey" value="${editKey} /> <input type="hidden" id="editKey" name="editKey" value="${editKey}" />
<p class="submit"> <p class="submit">
<input type="submit" id="submit" value="${submitButtonText}"/><span class="or"> or <a class="cancel" href="${cancelUrl}">Cancel</a> <input type="submit" id="submit" value="${submitButtonText}"/><span class="or"> or <a class="cancel" href="${cancelUrl}">Cancel</a>
</p> </p>

View file

@ -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. Important: This form cannot be directly used as a custom form. It has parameters that must be set.
See addClinicalRoleToPerson.jsp for an example. 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 { public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurationGenerator {
@ -142,7 +146,7 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
//Add validator //Add validator
editConfiguration.addValidator(new DateTimeIntervalValidationVTwo("startField","endField") ); editConfiguration.addValidator(new DateTimeIntervalValidationVTwo("startField","endField") );
//Add preprocessors //Add preprocessors
addPreprocessors(editConfiguration); addPreprocessors(editConfiguration, vreq.getWebappDaoFactory());
//Adding additional data, specifically edit mode //Adding additional data, specifically edit mode
addFormSpecificData(editConfiguration, vreq); addFormSpecificData(editConfiguration, vreq);
return editConfiguration; return editConfiguration;
@ -210,18 +214,18 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
private String getPrefixesString() { private String getPrefixesString() {
//TODO: Include dynamic way of including this //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 //TODO: Check if single string or multiple strings - check rdfslabel form etc. for prefix
//processing //processing
private List<String> generateN3Required(VitroRequest vreq) { private List<String> generateN3Required(VitroRequest vreq) {
List<String> n3ForEdit = new ArrayList<String>(); List<String> n3ForEdit = new ArrayList<String>();
String editString = getPrefixesString() + " /n"; String editString = getPrefixesString();
editString += "?person ?rolePredicate ?role ."; editString += "?person ?rolePredicate ?role .";
editString += "?role a <" + getRoleType(vreq) + "> ."; editString += "?role a <" + getRoleType(vreq) + "> .";
editString += "?role <" + getRoleToActivityPredicate(vreq) + "> ?roleActivity ."; editString += "?role " + getRoleToActivityPredicate(vreq) + " ?roleActivity .";
editString += "?roleActivity <" + getActivityToRolePredicate(vreq) + "> ?role ."; editString += "?roleActivity " + getActivityToRolePredicate(vreq) + " ?role .";
n3ForEdit.add(editString); n3ForEdit.add(editString);
return n3ForEdit; return n3ForEdit;
} }
@ -342,6 +346,10 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
//add role activity and roleActivityType to uris on form //add role activity and roleActivityType to uris on form
urisOnForm.add("roleActivity"); urisOnForm.add("roleActivity");
urisOnForm.add("roleActivityType"); 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); editConfiguration.setUrisOnform(urisOnForm);
//activity label and role label are literals on form //activity label and role label are literals on form
literalsOnForm.add("activityLabel"); literalsOnForm.add("activityLabel");
@ -378,10 +386,43 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
map.put("endNode", getEndNodeQuery(vreq)); map.put("endNode", getEndNodeQuery(vreq));
map.put("startField-precision", getStartPrecisionQuery(vreq)); map.put("startField-precision", getStartPrecisionQuery(vreq));
map.put("endField-precision", getEndPrecisionQuery(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; 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 {" + String query = "SELECT ?existingEndPrecision WHERE {" +
"?role <" + getRoleToIntervalURI() + "> ?intervalNode ." + "?role <" + getRoleToIntervalURI() + "> ?intervalNode ." +
"?intervalNode <" + VitroVocabulary.RDF_TYPE + "> <" + getIntervalTypeURI() + "> ." + "?intervalNode <" + VitroVocabulary.RDF_TYPE + "> <" + getIntervalTypeURI() + "> ." +
@ -473,7 +514,9 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
List<String> typeUris = new ArrayList<String>(); List<String> typeUris = new ArrayList<String>();
Set<String> optionUris = typeLiteralOptions.keySet(); Set<String> optionUris = typeLiteralOptions.keySet();
for(String uri: optionUris) { for(String uri: optionUris) {
typeUris.add("(?existingActivityType = <" + uri + ">)"); if(!uri.isEmpty()) {
typeUris.add("(?existingActivityType = <" + uri + ">)");
}
} }
String typeFilters = "FILTER (" + StringUtils.join(typeUris, "||") + ")"; String typeFilters = "FILTER (" + StringUtils.join(typeUris, "||") + ")";
String defaultActivityTypeQuery = getDefaultActivityTypeQuery(vreq); String defaultActivityTypeQuery = getDefaultActivityTypeQuery(vreq);
@ -490,8 +533,17 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
activityTypeQuery = getDefaultActivityTypeQuery(vreq); activityTypeQuery = getDefaultActivityTypeQuery(vreq);
} }
String roleToActivityPredicate = getRoleToActivityPredicate(vreq); //The replacement of activity type query's predicate was only relevant when we actually
activityTypeQuery = QueryUtils.subUriForQueryVar(activityTypeQuery, "predicate", roleToActivityPredicate); //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); log.debug("Activity type query: " + activityTypeQuery);
return activityTypeQuery; return activityTypeQuery;
@ -503,8 +555,11 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
"PREFIX vitro: <" + VitroVocabulary.vitroURI + "> \n" + "PREFIX vitro: <" + VitroVocabulary.vitroURI + "> \n" +
"SELECT ?existingActivityType WHERE { \n" + "SELECT ?existingActivityType WHERE { \n" +
" ?role ?predicate ?existingActivity . \n" + " ?role ?predicate ?existingActivity . \n" +
" ?existingActivity vitro:mostSpecificType ?existingActivityType . \n" + " ?existingActivity vitro:mostSpecificType ?existingActivityType . \n";
"}"; if(doAddFilterToRoleToActivityQuery(vreq)) {
query += getFilterRoleToActivityPredicate("predicate");
}
query+= "}";
return query; return query;
} }
@ -515,8 +570,11 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
"SELECT ?existingActivityType WHERE {\n" + "SELECT ?existingActivityType WHERE {\n" +
" ?role ?predicate ?existingActivity . \n" + " ?role ?predicate ?existingActivity . \n" +
" ?existingActivity vitro:mostSpecificType ?existingActivityType . \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; return query;
} }
@ -526,8 +584,11 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
"SELECT ?existingActivityType WHERE { \n" + "SELECT ?existingActivityType WHERE { \n" +
" ?role ?predicate ?existingActivity . \n" + " ?role ?predicate ?existingActivity . \n" +
" ?existingActivity vitro:mostSpecificType ?existingActivityType . \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; return query;
} }
@ -539,15 +600,17 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
String roleToActivityPredicate = getRoleToActivityPredicate(vreq); String roleToActivityPredicate = getRoleToActivityPredicate(vreq);
//Portion below for multiple possible predicates //Portion below for multiple possible predicates
/*if(roleToActivityPredicate.equals(getDefaultRoleToActivityPredicate())) { if(doAddFilterToRoleToActivityQuery(vreq)) {
query += "SELECT ?existingActivity WHERE { " + List<String> predicates = getPossibleRoleToActivityPredicates();
"{?role <" + ModelUtils.processPropertyURI + "> ?existingActivity .} UNION " + List<String> addToQuery = new ArrayList<String>();
"{?role <" + ModelUtils.nonProcessPropertyURI + "> ?existingActivity .}" + query += "SELECT ?existingActivity WHERE { \n" +
"}"; " ?role ?predicate ?existingActivity . \n ";
query += getFilterRoleToActivityPredicate("predicate");
query += "}";
} else { } else {
*/
query += "SELECT ?existingActivity WHERE { ?role <" +roleToActivityPredicate + "> ?existingActivity . }"; query += "SELECT ?existingActivity WHERE { ?role <" +roleToActivityPredicate + "> ?existingActivity . }";
/*}*/ }
return query; return query;
} }
@ -594,19 +657,19 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
"PREFIX rdfs: <" + RDFS.getURI() + "> \n"; "PREFIX rdfs: <" + RDFS.getURI() + "> \n";
String roleToActivityPredicate = getRoleToActivityPredicate(vreq); 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 . } " +
"}";
} else {*/ query += "SELECT ?existingTitle WHERE { \n" +
"?role ?predicate ?existingActivity . \n" +
"?existingActivity rdfs:label ?existingTitle . \n";
query += getFilterRoleToActivityPredicate("predicate");
query += "}";
} else {
query += "SELECT ?existingTitle WHERE { \n" + query += "SELECT ?existingTitle WHERE { \n" +
"?role <" + roleToActivityPredicate + "> ?existingActivity . \n" + "?role <" + roleToActivityPredicate + "> ?existingActivity . \n" +
"?existingActivity rdfs:label ?existingTitle . }"; "?existingActivity rdfs:label ?existingTitle . }";
/*}*/ }
return query; return query;
} }
@ -625,10 +688,85 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
getRoleLabelField(editConfiguration, vreq, fields); getRoleLabelField(editConfiguration, vreq, fields);
getStartField(editConfiguration, vreq, fields); getStartField(editConfiguration, vreq, fields);
getEndField(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); 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 //Label of "right side" of role, i.e. label for role roleIn Activity
private void getActivityLabelField(EditConfigurationVTwo editConfiguration, private void getActivityLabelField(EditConfigurationVTwo editConfiguration,
@ -743,8 +881,8 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
List<String> assertions = new ArrayList<String>(); List<String> assertions = new ArrayList<String>();
//N3ForRoleToActivity //N3ForRoleToActivity
String n3ForRoleToActivity = "@prefix core: <" + getVivoCoreNamespace() + "> ." + String n3ForRoleToActivity = "@prefix core: <" + getVivoCoreNamespace() + "> ." +
"?role <" + getRoleToActivityPredicate(vreq) + "> ?roleActivity ." + "?role " + getRoleToActivityPredicate(vreq) + " ?roleActivity ." +
"?roleActivity <" + getActivityToRolePredicate(vreq) + "> ?role ."; "?roleActivity " + getActivityToRolePredicate(vreq) + " ?role .";
assertions.add(n3ForRoleToActivity); assertions.add(n3ForRoleToActivity);
field.setAssertions(assertions); field.setAssertions(assertions);
fields.put(field.getName(), field); fields.put(field.getName(), field);
@ -883,10 +1021,12 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
//Add preprocessor //Add preprocessor
private void addPreprocessors(EditConfigurationVTwo editConfiguration) { private void addPreprocessors(EditConfigurationVTwo editConfiguration, WebappDaoFactory wadf) {
//Add preprocessor that will replace the generic role to activity predicate preprocessor //Add preprocessor that will replace the role to activity predicate and inverse
//With roleIn //with correct properties based on the activity type
editConfiguration.addModelChangePreprocessor(new RoleToActivityPredicatePreprocessor()); editConfiguration.addEditSubmissionPreprocessor(
new RoleToActivityPredicatePreprocessor(editConfiguration, wadf));
} }
/** /**
@ -913,15 +1053,20 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
} }
public String getActivityToRolePredicate(VitroRequest vreq) { 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 //This has a default value, but note that even that will not be used
//in the update with realized in or contributes to //in the update with realized in or contributes to
//Overridden when need be in subclassed generator //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) { 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 //Some values will have a default value
//activityToRolePredicate //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 * Methods that check edit mode
*/ */
//Get edit mode //Get edit mode
private EditMode getEditMode(VitroRequest vreq) { 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); 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; return mode;
//(mode == EditMode.ADD || mode == EditMode.REPAIR) ? "\"nonempty\" //(mode == EditMode.ADD || mode == EditMode.REPAIR) ? "\"nonempty\"
} }
@ -1022,4 +1205,35 @@ public abstract class AddRoleToPersonTwoStageGenerator implements EditConfigurat
editConfiguration.setFormSpecificData(formSpecificData); 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";
}
} }

View file

@ -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.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; 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.EditConfigurationVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.MultiValueEditSubmission; import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.MultiValueEditSubmission;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.FieldVTwo; import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.FieldVTwo;
import org.vivoweb.webapp.util.ModelUtils; 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()); private static final Log log = LogFactory.getLog(CreateLabelFromNameFields.class.getName());
public RoleToActivityPredicatePreprocessor() { private WebappDaoFactory wadf = null;
super(); //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 //Query for all statements using the original roleIn predicate replace
//with the appropriate roleRealizedIn or roleContributesTo //with the appropriate roleRealizedIn or roleContributesTo
//In addition, need to ensure the inverse predicate is also set correctly //In addition, need to ensure the inverse predicate is also set correctly
try { try {
VitroRequest vreq = new VitroRequest(request); //Get the uris from form
WebappDaoFactory wadf = vreq.getWebappDaoFactory(); Map<String, List<String>> urisFromForm = submission.getUrisFromForm();
replacePredicates(retractionsModel, wadf); //Get the type of the activity selected
replacePredicates(additionsModel, wadf); 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) { } catch (Exception e) {
log.error("Error retrieving name values from edit submission."); 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) { private ObjectProperty getCorrectProperty(String uri, WebappDaoFactory wadf) {
//ObjectProperty correctProperty = ModelUtils.getPropertyForRoleInClass(uri, wadf); ObjectProperty correctProperty = ModelUtils.getPropertyForRoleInClass(uri, wadf);
ObjectProperty op = new ObjectProperty(); return correctProperty;
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";
}
} }

View file

@ -2,6 +2,7 @@
package org.vivoweb.webapp.util; package org.vivoweb.webapp.util;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
@ -19,10 +20,10 @@ public class ModelUtils {
private static final Log log = LogFactory.getLog(ModelUtils.class.getName()); private static final Log log = LogFactory.getLog(ModelUtils.class.getName());
public static final String processPropertyURI = "http://vivoweb.org/ontology/core#roleRealizedIn"; private static final String processPropertyURI = "http://vivoweb.org/ontology/core#roleRealizedIn";
public static final String processPropertyInverseURI = "http://vivoweb.org/ontology/core#realizedRole"; private static final String processPropertyInverseURI = "http://vivoweb.org/ontology/core#realizedRole";
public static final String nonProcessPropertyURI = "http://vivoweb.org/ontology/core#roleContributesTo"; private 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 nonProcessPropertyInverseURI = "http://vivoweb.org/ontology/core#ContributingRole";
private static Set<String> processClass = new HashSet<String>(); private static Set<String> processClass = new HashSet<String>();
static { static {
@ -79,4 +80,19 @@ public class ModelUtils {
return op; 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;
}
} }