Adding user defined concept generators and updating publication and authors generators/forms. Adding validation to addAuthorsToInformationResource

This commit is contained in:
hjkhjk54 2011-11-22 21:42:09 +00:00
parent 57dfb86262
commit c5743ce2fa
9 changed files with 384 additions and 103 deletions

View file

@ -3,42 +3,48 @@
package edu.cornell.mannlib.vitro.webapp.edit.n3editing;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import com.hp.hpl.jena.rdf.model.Literal;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.EditConfiguration;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.validators.N3Validator;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.processEdit.EditSubmission;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.N3ValidatorVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.MultiValueEditSubmission;
public class PersonHasPublicationValidator implements N3Validator {
public class PersonHasPublicationValidator implements N3ValidatorVTwo {
private static String MISSING_PUB_TYPE_ERROR = "Must specify a publication type.";
private static String MISSING_PUB_TITLE_ERROR = "Must specify a publication title.";
@Override
public Map<String, String> validate(EditConfiguration editConfig,
EditSubmission editSub) {
public Map<String, String> validate(EditConfigurationVTwo editConfig,
MultiValueEditSubmission editSub) {
Map<String,String> urisFromForm = editSub.getUrisFromForm();
Map<String,Literal> literalsFromForm = editSub.getLiteralsFromForm();
Map<String,List<String>> urisFromForm = editSub.getUrisFromForm();
Map<String,List<Literal>> literalsFromForm = editSub.getLiteralsFromForm();
Map<String,String> errors = new HashMap<String,String>();
// If there's a pubUri, then we're done. The other fields are disabled and so don't get submitted.
String pubUri = urisFromForm.get("pubUri");
List<String> pubUriList = urisFromForm.get("pubUri");
//This method will return null if the list is null or empty, otherwise returns first element
//Assumption is that only one value for uri, type, or title will be sent back
String pubUri = (String) getFirstElement(pubUriList);
if (!StringUtils.isEmpty(pubUri)) {
return null;
}
String pubType = urisFromForm.get("pubType");
List<String> pubTypeList = urisFromForm.get("pubType");
String pubType = (String) getFirstElement(pubTypeList);
if ("".equals(pubType)) {
pubType = null;
}
Literal title = literalsFromForm.get("title");
List<Literal> titleList = literalsFromForm.get("title");
Literal title = (Literal) getFirstElement(titleList);
if (title != null) {
String titleValue = title.getLexicalForm();
if (StringUtils.isEmpty(titleValue)) {
@ -55,5 +61,13 @@ public class PersonHasPublicationValidator implements N3Validator {
return errors.size() != 0 ? errors : null;
}
private Object getFirstElement(List checkList) {
if(checkList == null || checkList.size() == 0) {
return null;
}
return checkList.get(0);
}
}

View file

@ -3,30 +3,31 @@
package edu.cornell.mannlib.vitro.webapp.edit.n3editing;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.hp.hpl.jena.rdf.model.Literal;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.EditConfiguration;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.validators.N3Validator;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.processEdit.EditSubmission;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.N3ValidatorVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.MultiValueEditSubmission;
public class PublicationHasAuthorValidator implements N3Validator {
public class PublicationHasAuthorValidator implements N3ValidatorVTwo {
private static String MISSING_FIRST_NAME_ERROR = "Must specify the author's first name.";
private static String MISSING_LAST_NAME_ERROR = "Must specify the author's last name.";
private static String MALFORMED_LAST_NAME_ERROR = "Last name may not contain a comma. Please enter first name in first name field.";
;
@Override
public Map<String, String> validate(EditConfiguration editConfig,
EditSubmission editSub) {
Map<String,String> urisFromForm = editSub.getUrisFromForm();
Map<String,Literal> literalsFromForm = editSub.getLiteralsFromForm();
public Map<String, String> validate(EditConfigurationVTwo editConfig,
MultiValueEditSubmission editSub) {
Map<String,List<String>> urisFromForm = editSub.getUrisFromForm();
Map<String,List<Literal>> literalsFromForm = editSub.getLiteralsFromForm();
Map<String,String> errors = new HashMap<String,String>();
String personUri = urisFromForm.get("personUri");
if ("".equals(personUri)) {
List<String> personUri = urisFromForm.get("personUri");
if (allListElementsEmpty(personUri)) {
personUri = null;
}
// If there's a personUri, then we're done. The firstName and lastName fields are
@ -35,11 +36,24 @@ public class PublicationHasAuthorValidator implements N3Validator {
return null;
}
Literal firstName = literalsFromForm.get("firstName");
if( firstName != null && firstName.getLexicalForm() != null && "".equals(firstName.getLexicalForm()) )
//Expecting only one first name in this case
//To Do: update logic if multiple first names considered
Literal firstName = null;
List<Literal> firstNameList = literalsFromForm.get("firstName");
if(firstNameList != null && firstNameList.size() > 0) {
firstName = firstNameList.get(0);
}
if( firstName != null &&
firstName.getLexicalForm() != null &&
"".equals(firstName.getLexicalForm()) )
firstName = null;
Literal lastName = literalsFromForm.get("lastName");
List<Literal> lastNameList = literalsFromForm.get("lastName");
Literal lastName = null;
if(lastNameList != null && lastNameList.size() > 0) {
lastName = lastNameList.get(0);
}
String lastNameValue = "";
if (lastName != null) {
lastNameValue = lastName.getLexicalForm();
@ -61,5 +75,21 @@ public class PublicationHasAuthorValidator implements N3Validator {
return errors.size() != 0 ? errors : null;
}
private boolean allListElementsEmpty(List<String> checkList) {
if(checkList == null)
return true;
if(checkList.isEmpty()) {
return true;
}
boolean allEmpty = true;
for(String s: checkList) {
if(s.length() != 0){
allEmpty = false;
break;
}
}
return allEmpty;
}
}

View file

@ -33,6 +33,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary;
@ -354,9 +355,22 @@ public class AddAssociatedConceptGenerator extends VivoBaseGenerator implements
List<AssociatedConceptInfo> testInfo = new ArrayList<AssociatedConceptInfo>();
testInfo.add(new AssociatedConceptInfo("testLabel", "testURI", "testVocabURI", "testVocabLabel"));
formSpecificData.put("existingConcepts", testInfo);
//Return url for adding user defined concept
formSpecificData.put("userDefinedConceptUrl", getUserDefinedConceptUrl(vreq));
editConfiguration.setFormSpecificData(formSpecificData);
}
private Object getUserDefinedConceptUrl(VitroRequest vreq) {
String subjectUri = EditConfigurationUtils.getSubjectUri(vreq);
String predicateUri = EditConfigurationUtils.getPredicateUri(vreq);
String generatorName = "edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.generators.AddUserDefinedConceptGenerator";
String editUrl = EditConfigurationUtils.getEditUrl(vreq);
return editUrl + "?subject=" + UrlBuilder.urlEncode(subjectUri) +
"&predicate=" + UrlBuilder.urlEncode(predicateUri) +
"&editForm=" + UrlBuilder.urlEncode(generatorName);
}
public class AssociatedConceptInfo {
private String conceptLabel;
private String conceptURI;

View file

@ -19,6 +19,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyComparator;
import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.PublicationHasAuthorValidator;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.DateTimeIntervalValidationVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationUtils;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationVTwo;
@ -60,10 +61,11 @@ public class AddAuthorsToInformationResourceGenerator extends VivoBaseGenerator
//template file
editConfiguration.setTemplate("addAuthorsToInformationResource.ftl");
//no validators or preprocessors
//add validators
editConfiguration.addValidator(new PublicationHasAuthorValidator());
//Adding additional data, specifically edit mode
addFormSpecificData(editConfiguration, vreq);
addFormSpecificData(editConfiguration, vreq);
return editConfiguration;
}

View file

@ -2,6 +2,7 @@
package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.generators;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -9,12 +10,17 @@ import java.util.Map;
import javax.servlet.http.HttpSession;
import com.hp.hpl.jena.rdf.model.Literal;
import com.hp.hpl.jena.vocabulary.XSD;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.PersonHasPublicationValidator;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationUtils;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.FieldVTwo;
import edu.cornell.mannlib.vitro.webapp.utils.FrontEndEditingUtils.EditMode;
import edu.cornell.mannlib.vitro.webapp.utils.generators.EditModeUtils;
public class AddPublicationToPersonGenerator extends BaseEditConfigurationGenerator implements EditConfigurationGenerator {
public class AddPublicationToPersonGenerator extends VivoBaseGenerator implements EditConfigurationGenerator {
@Override
public EditConfigurationVTwo getEditConfiguration(VitroRequest vreq,
@ -46,11 +52,12 @@ public class AddPublicationToPersonGenerator extends BaseEditConfigurationGenera
setSparqlQueries(editConfiguration, vreq);
//set fields
setFields(editConfiguration, vreq, EditConfigurationUtils.getPredicateUri(vreq));
setFields(editConfiguration, vreq);
//template file
editConfiguration.setTemplate("addAuthorsToInformationResource.ftl");
//no validators or preprocessors
editConfiguration.setTemplate("addPublicationToPerson.ftl");
//adding person has publication validator
editConfiguration.addValidator(new PersonHasPublicationValidator());
//Adding additional data, specifically edit mode
addFormSpecificData(editConfiguration, vreq);
@ -62,7 +69,7 @@ public class AddPublicationToPersonGenerator extends BaseEditConfigurationGenera
private void setVarNames(EditConfigurationVTwo editConfiguration) {
editConfiguration.setVarNameForSubject("infoResource");
editConfiguration.setVarNameForSubject("person");
editConfiguration.setVarNameForPredicate("predicate");
editConfiguration.setVarNameForObject("authorshipUri");
@ -77,14 +84,45 @@ public class AddPublicationToPersonGenerator extends BaseEditConfigurationGenera
/***N3 strings both required and optional***/
private List<String> generateN3Optional() {
// TODO Auto-generated method stub
return null;
return list(getN3ForExistingPub(),
getN3ForNewPub(),
getN3NewPubNameAssertion(),
getN3NewPubTypeAssertion());
}
private List<String> generateN3Required() {
// TODO Auto-generated method stub
return null;
return list(getAuthorshipN3());
}
private String getAuthorshipN3() {
return "@prefix core: <" + vivoCore + "> . " +
"?authorshipUri a core:Authorship ;" +
"core:linkedAuthor ?person ." +
"?person core:authorInAuthorship ?authorshipUri .";
}
private String getN3ForExistingPub() {
return "@prefix core: <" + vivoCore + "> ." +
"?authorshipUri core:linkedInformationResource ?pubUri ." +
"?pubUri core:informationResourceInAuthorship ?authorshipUri .";
}
private String getN3ForNewPub() {
return "@prefix core: <" + vivoCore + "> ." +
"?pubUri a ?pubType ;" +
"<" + label + "> ?title ." +
"?authorshipUri core:linkedInformationResource ?pubUri ." +
"?pubUri core:informationResourceInAuthorship ?authorshipUri .";
}
private String getN3NewPubNameAssertion() {
return "?pubUri <" + label + "> ?title .";
}
private String getN3NewPubTypeAssertion() {
return "?pubUri a ?pubType . ";
}
/** Get new resources */
@ -92,17 +130,18 @@ public class AddPublicationToPersonGenerator extends BaseEditConfigurationGenera
String DEFAULT_NS_TOKEN=null; //null forces the default NS
HashMap<String, String> newResources = new HashMap<String, String>();
newResources.put("role", DEFAULT_NS_TOKEN);
newResources.put("roleActivity", DEFAULT_NS_TOKEN);
newResources.put("intervalNode", DEFAULT_NS_TOKEN);
newResources.put("startNode", DEFAULT_NS_TOKEN);
newResources.put("endNode", DEFAULT_NS_TOKEN);
newResources.put("authorshipUri", DEFAULT_NS_TOKEN);
newResources.put("pubUri", DEFAULT_NS_TOKEN);
return newResources;
}
/** Set URIS and Literals In Scope and on form and supporting methods */
private void setUrisAndLiteralsInScope(EditConfigurationVTwo editConfiguration, VitroRequest vreq) {
HashMap<String, List<String>> urisInScope = new HashMap<String, List<String>>();
urisInScope.put(editConfiguration.getVarNameForSubject(),
Arrays.asList(new String[]{editConfiguration.getSubjectUri()}));
urisInScope.put(editConfiguration.getVarNameForPredicate(),
Arrays.asList(new String[]{editConfiguration.getPredicateUri()}));
editConfiguration.setUrisInScope(urisInScope);
HashMap<String, List<Literal>> literalsInScope = new HashMap<String, List<Literal>>();
editConfiguration.setLiteralsInScope(literalsInScope);
@ -112,26 +151,23 @@ public class AddPublicationToPersonGenerator extends BaseEditConfigurationGenera
private void setUrisAndLiteralsOnForm(EditConfigurationVTwo editConfiguration, VitroRequest vreq) {
List<String> urisOnForm = new ArrayList<String>();
//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");
urisOnForm.add("pubUri");
urisOnForm.add("pubType");
editConfiguration.setUrisOnform(urisOnForm);
//activity label and role label are literals on form
List<String> literalsOnForm = new ArrayList<String>();
literalsOnForm.add("activityLabel");
literalsOnForm.add("roleLabel");
literalsOnForm.add("title");
editConfiguration.setLiteralsOnForm(literalsOnForm);
}
/** Set SPARQL Queries and supporting methods. */
//In this case no queries for existing
private void setSparqlQueries(EditConfigurationVTwo editConfiguration, VitroRequest vreq) {
//Queries for activity label, role label, start Field value, end Field value
HashMap<String, String> map = new HashMap<String, String>();
editConfiguration.setSparqlForExistingUris(map);
editConfiguration.setSparqlForExistingUris(new HashMap<String, String>());
editConfiguration.setSparqlForAdditionalLiteralsInScope(new HashMap<String, String>());
editConfiguration.setSparqlForAdditionalUrisInScope(new HashMap<String, String>());
editConfiguration.setSparqlForExistingLiterals(new HashMap<String, String>());
}
/**
@ -139,15 +175,98 @@ public class AddPublicationToPersonGenerator extends BaseEditConfigurationGenera
* Set Fields and supporting methods
*/
private void setFields(EditConfigurationVTwo editConfiguration, VitroRequest vreq, String predicateUri) {
private void setFields(EditConfigurationVTwo editConfiguration, VitroRequest vreq) {
setTitleField(editConfiguration);
setPubTypeField(editConfiguration);
setPubUriField(editConfiguration);
}
//Form specific data
public void addFormSpecificData(EditConfigurationVTwo editConfiguration, VitroRequest vreq) {
HashMap<String, Object> formSpecificData = new HashMap<String, Object>();
editConfiguration.setFormSpecificData(formSpecificData);
private void setTitleField(EditConfigurationVTwo editConfiguration) {
String stringDatatypeUri = XSD.xstring.toString();
editConfiguration.addField(new FieldVTwo().
setName("title").
setValidators(list("datatype:" + stringDatatypeUri)).
setRangeDatatypeUri(stringDatatypeUri));
}
private void setPubTypeField(EditConfigurationVTwo editConfiguration) {
editConfiguration.addField(new FieldVTwo().
setName("pubType").
setOptionsType("HARDCODED_LITERALS").
setLiteralOptions(getPublicationTypeLiteralOptions()));
}
private void setPubUriField(EditConfigurationVTwo editConfiguration) {
editConfiguration.addField(new FieldVTwo().
setName("pubUri").
setObjectClassUri(personClass));
}
private List<List<String>> getPublicationTypeLiteralOptions() {
List<List<String>> literalOptions = new ArrayList<List<String>>();
literalOptions.add(list("http://purl.org/ontology/bibo/AcademicArticle", "Academic Article"));
literalOptions.add(list("http://purl.org/ontology/bibo/Article", "Article"));
literalOptions.add(list("http://purl.org/ontology/bibo/AudioDocument", "Audio Document"));
literalOptions.add(list("http://vivoweb.org/ontology/core#BlogPosting", "Blog Posting"));
literalOptions.add(list("http://purl.org/ontology/bibo/Book", "Book"));
literalOptions.add(list("http://vivoweb.org/ontology/core#CaseStudy", "Case Study"));
literalOptions.add(list("http://vivoweb.org/ontology/core#Catalog", "Catalog"));
literalOptions.add(list("http://purl.org/ontology/bibo/Chapter", "Chapter"));
literalOptions.add(list("http://vivoweb.org/ontology/core#ConferencePaper", "Conference Paper"));
literalOptions.add(list("http://vivoweb.org/ontology/core#ConferencePoster", "Conference Poster"));
literalOptions.add(list("http://vivoweb.org/ontology/core#Database", "Database"));
literalOptions.add(list("http://purl.org/ontology/bibo/EditedBook", "Edited Book"));
literalOptions.add(list("http://vivoweb.org/ontology/core#EditorialArticle", "Editorial Article"));
literalOptions.add(list("http://purl.org/ontology/bibo/Film", "Film"));
literalOptions.add(list("http://vivoweb.org/ontology/core#Newsletter", "Newsletter"));
literalOptions.add(list("http://vivoweb.org/ontology/core#NewsRelease", "News Release"));
literalOptions.add(list("http://purl.org/ontology/bibo/Patent", "Patent"));
literalOptions.add(list("http://purl.obolibrary.org/obo/OBI_0000272", "Protocol"));
literalOptions.add(list("http://purl.org/ontology/bibo/Report", "Report"));
literalOptions.add(list("http://vivoweb.org/ontology/core#ResearchProposal", "Research Proposal"));
literalOptions.add(list("http://vivoweb.org/ontology/core#Review", "Review"));
literalOptions.add(list("http://vivoweb.org/ontology/core#Software", "Software"));
literalOptions.add(list("http://vivoweb.org/ontology/core#Speech", "Speech"));
literalOptions.add(list("http://purl.org/ontology/bibo/Thesis", "Thesis"));
literalOptions.add(list("http://vivoweb.org/ontology/core#Video", "Video"));
literalOptions.add(list("http://purl.org/ontology/bibo/Webpage", "Webpage"));
literalOptions.add(list("http://purl.org/ontology/bibo/Website", "Website"));
literalOptions.add(list("http://vivoweb.org/ontology/core#WorkingPaper", "Working Paper"));
return literalOptions;
}
//Form specific data
public void addFormSpecificData(EditConfigurationVTwo editConfiguration, VitroRequest vreq) {
HashMap<String, Object> formSpecificData = new HashMap<String, Object>();
formSpecificData.put("editMode", getEditMode(vreq).name().toLowerCase());
formSpecificData.put("sparqlForAcFilter", getSparqlForAcFilter(vreq));
editConfiguration.setFormSpecificData(formSpecificData);
}
public String getSparqlForAcFilter(VitroRequest vreq) {
String subject = EditConfigurationUtils.getSubjectUri(vreq);
String query = "PREFIX core:<" + vivoCore + "> " +
"SELECT ?pubUri WHERE { " +
"<" + subject + "> core:authorInAuthorship ?authorshipUri ." +
"?authorshipUri core:linkedInformationResource ?pubUri . }";
return query;
}
public EditMode getEditMode(VitroRequest vreq) {
return EditModeUtils.getEditMode(vreq, list("http://vivoweb.org/ontology/core#linkedInformationResource"));
}
}