diff --git a/productMods/edit/forms/addAuthorsToInformationResource.jsp b/productMods/edit/forms/addAuthorsToInformationResource.jsp index ba4f1a5c..a0f3a654 100644 --- a/productMods/edit/forms/addAuthorsToInformationResource.jsp +++ b/productMods/edit/forms/addAuthorsToInformationResource.jsp @@ -33,7 +33,7 @@ core:authorInAuthorship (Person : Authorship) - inverse of linkedAuthor <%@ page import="edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement" %> <%@ page import="edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary" %> <%@ page import="edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.EditConfiguration" %> -<%@ page import="edu.cornell.mannlib.vitro.webapp.edit.n3editing.PublicationHasAuthorValidator" %> +<%@ page import="edu.cornell.mannlib.vitro.webapp.edit.n3editing.PublicationHasAuthorValidatorOld" %> <%@ page import="edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory" %> <%@ page import="edu.cornell.mannlib.vitro.webapp.controller.VitroRequest" %> <%@ page import="edu.cornell.mannlib.vitro.webapp.web.MiscWebUtils" %> @@ -234,7 +234,7 @@ SPARQL queries for existing values. --%> EditConfiguration.putConfigInSession(editConfig,session); } - editConfig.addValidator(new PublicationHasAuthorValidator()); + editConfig.addValidator(new PublicationHasAuthorValidatorOld()); Model model = (Model) application.getAttribute("jenaOntModel"); String objectUri = (String) request.getAttribute("objectUri"); diff --git a/productMods/edit/forms/addPublicationToPerson.jsp b/productMods/edit/forms/addPublicationToPerson.jsp index 2dae767e..eb36fd33 100644 --- a/productMods/edit/forms/addPublicationToPerson.jsp +++ b/productMods/edit/forms/addPublicationToPerson.jsp @@ -27,7 +27,7 @@ core:informationResourceInAuthorship (InformationResource : Authorship) - invers <%@ page import="edu.cornell.mannlib.vitro.webapp.beans.Individual" %> <%@ page import="edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary" %> <%@ page import="edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.EditConfiguration" %> -<%@ page import="edu.cornell.mannlib.vitro.webapp.edit.n3editing.PersonHasPublicationValidator" %> +<%@ page import="edu.cornell.mannlib.vitro.webapp.edit.n3editing.PersonHasPublicationValidatorOld" %> <%@ page import="edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory" %> <%@ page import="edu.cornell.mannlib.vitro.webapp.controller.VitroRequest" %> <%@ page import="edu.cornell.mannlib.vitro.webapp.web.MiscWebUtils" %> @@ -253,7 +253,7 @@ SPARQL queries for existing values. --%> EditConfiguration.putConfigInSession(editConfig,session); } - editConfig.addValidator(new PersonHasPublicationValidator()); + editConfig.addValidator(new PersonHasPublicationValidatorOld()); Model model = (Model) application.getAttribute("jenaOntModel"); diff --git a/productMods/templates/freemarker/edit/forms/addPublicationToPerson.ftl b/productMods/templates/freemarker/edit/forms/addPublicationToPerson.ftl index 0c5d85c0..86c8d9c0 100644 --- a/productMods/templates/freemarker/edit/forms/addPublicationToPerson.ftl +++ b/productMods/templates/freemarker/edit/forms/addPublicationToPerson.ftl @@ -38,7 +38,7 @@

<#--below shows examples of both printing out all error messages and checking the error message for a specific field--> <#list submissionErrors?keys as errorFieldName> - ${errorFieldName} : ${submissionErrors[errorFieldName]} + ${errorFieldName} : ${submissionErrors[errorFieldName]}

diff --git a/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/PersonHasPublicationValidatorOld.java b/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/PersonHasPublicationValidatorOld.java new file mode 100644 index 00000000..5df45f13 --- /dev/null +++ b/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/PersonHasPublicationValidatorOld.java @@ -0,0 +1,59 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.edit.n3editing; + +import java.util.HashMap; +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; + +public class PersonHasPublicationValidatorOld implements N3Validator { + + 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 validate(EditConfiguration editConfig, + EditSubmission editSub) { + + Map urisFromForm = editSub.getUrisFromForm(); + Map literalsFromForm = editSub.getLiteralsFromForm(); + + Map errors = new HashMap(); + + // 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"); + if (!StringUtils.isEmpty(pubUri)) { + return null; + } + + String pubType = urisFromForm.get("pubType"); + if ("".equals(pubType)) { + pubType = null; + } + + Literal title = literalsFromForm.get("title"); + if (title != null) { + String titleValue = title.getLexicalForm(); + if (StringUtils.isEmpty(titleValue)) { + title = null; + } + } + + if (pubType == null) { + errors.put("pubType", MISSING_PUB_TYPE_ERROR); + } + if (title == null) { + errors.put("title", MISSING_PUB_TITLE_ERROR); + } + + return errors.size() != 0 ? errors : null; + } + +} diff --git a/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/PublicationHasAuthorValidatorOld.java b/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/PublicationHasAuthorValidatorOld.java new file mode 100644 index 00000000..8d0a7666 --- /dev/null +++ b/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/PublicationHasAuthorValidatorOld.java @@ -0,0 +1,65 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.edit.n3editing; + +import java.util.HashMap; +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; + +public class PublicationHasAuthorValidatorOld implements N3Validator { + + 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 validate(EditConfiguration editConfig, + EditSubmission editSub) { + Map urisFromForm = editSub.getUrisFromForm(); + Map literalsFromForm = editSub.getLiteralsFromForm(); + + Map errors = new HashMap(); + + String personUri = urisFromForm.get("personUri"); + if ("".equals(personUri)) { + personUri = null; + } + // If there's a personUri, then we're done. The firstName and lastName fields are + // disabled and so don't get submitted. + if (personUri != null) { + return null; + } + + Literal firstName = literalsFromForm.get("firstName"); + if( firstName != null && firstName.getLexicalForm() != null && "".equals(firstName.getLexicalForm()) ) + firstName = null; + + Literal lastName = literalsFromForm.get("lastName"); + String lastNameValue = ""; + if (lastName != null) { + lastNameValue = lastName.getLexicalForm(); + if( "".equals(lastNameValue) ) { + lastName = null; + } + } + + if (lastName == null) { + errors.put("lastName", MISSING_LAST_NAME_ERROR); + // Don't reject space in the last name: de Vries, etc. + } else if (lastNameValue.contains(",")) { + errors.put("lastName", MALFORMED_LAST_NAME_ERROR); + } + + if (firstName == null) { + errors.put("firstName", MISSING_FIRST_NAME_ERROR); + } + + return errors.size() != 0 ? errors : null; + } + +} diff --git a/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/AddPublicationToPersonGenerator.java b/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/AddPublicationToPersonGenerator.java index 442d03ec..13e0ab51 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/AddPublicationToPersonGenerator.java +++ b/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/AddPublicationToPersonGenerator.java @@ -29,8 +29,6 @@ public class AddPublicationToPersonGenerator extends VivoBaseGenerator implement initBasics(editConfiguration, vreq); initPropertyParameters(vreq, session, editConfiguration); initObjectPropForm(editConfiguration, vreq); - //Overriding url to return to - setUrlToReturnTo(editConfiguration, vreq); setVarNames(editConfiguration); @@ -75,12 +73,7 @@ public class AddPublicationToPersonGenerator extends VivoBaseGenerator implement } - - - private void setUrlToReturnTo(EditConfigurationVTwo editConfiguration, VitroRequest vreq) { - editConfiguration.setUrlPatternToReturnTo(EditConfigurationUtils.getFormUrlWithoutContext(vreq)); - - } + /***N3 strings both required and optional***/ private List generateN3Optional() { diff --git a/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/AddUserDefinedConceptGenerator.java b/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/AddUserDefinedConceptGenerator.java new file mode 100644 index 00000000..7804266c --- /dev/null +++ b/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/AddUserDefinedConceptGenerator.java @@ -0,0 +1,316 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.generators; + +import java.util.Arrays; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.commons.lang.StringUtils; +import javax.servlet.http.HttpSession; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.vivoweb.webapp.util.ModelUtils; + +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.DateTimeWithPrecisionVTwo; +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.dao.jena.QueryUtils; + +import com.hp.hpl.jena.rdf.model.Literal; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.vocabulary.RDFS; +import com.hp.hpl.jena.vocabulary.RDF; +import com.hp.hpl.jena.vocabulary.XSD; +import com.hp.hpl.jena.ontology.OntModel; +import edu.cornell.mannlib.vitro.webapp.beans.DataProperty; +import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement; +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.responsevalues.ResponseValues; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues; +import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary; +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.EditConfigurationVTwo; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.Field; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.RoleToActivityPredicatePreprocessor; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.processEdit.RdfLiteralHash; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditN3GeneratorVTwo; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.SelectListGeneratorVTwo; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.FieldVTwo; +import edu.cornell.mannlib.vitro.webapp.web.MiscWebUtils; +import edu.cornell.mannlib.vitro.webapp.search.beans.ProhibitedFromSearch; +import edu.cornell.mannlib.vitro.webapp.utils.FrontEndEditingUtils; +import edu.cornell.mannlib.vitro.webapp.utils.FrontEndEditingUtils.EditMode; +import edu.cornell.mannlib.vitro.webapp.utils.generators.EditModeUtils; +/** + * Generates the edit configuration for importing concepts from external + * search services, e.g. UMLS etc. + * + * The N3 for this is set with the default settinf of + * + */ +public class AddUserDefinedConceptGenerator extends VivoBaseGenerator implements EditConfigurationGenerator { + + private Log log = LogFactory.getLog(AddUserDefinedConceptGenerator.class); + private boolean isObjectPropForm = false; + private String subjectUri = null; + private String predicateUri = null; + private String objectUri = null; + private String datapropKeyStr= null; + private int dataHash = 0; + private DataPropertyStatement dps = null; + private String dataLiteral = null; + private String template = "addUserDefinedConcept.ftl"; + private static HashMap defaultsForXSDtypes ; + private static String SKOSConceptType = "http://www.w3.org/2004/02/skos/core#Concept"; + + @Override + public EditConfigurationVTwo getEditConfiguration(VitroRequest vreq, HttpSession session) { + EditConfigurationVTwo editConfiguration = new EditConfigurationVTwo(); + initBasics(editConfiguration, vreq); + initPropertyParameters(vreq, session, editConfiguration); + initObjectPropForm(editConfiguration, vreq); + + editConfiguration.setTemplate(template); + + setVarNames(editConfiguration); + + //Assumes this is a simple case of subject predicate var + editConfiguration.setN3Required(this.generateN3Required(vreq)); + + //n3 optional + editConfiguration.setN3Optional(this.generateN3Optional()); + + //Todo: what do new resources depend on here? + //In original form, these variables start off empty + editConfiguration.setNewResources(generateNewResources(vreq)); + //In scope + this.setUrisAndLiteralsInScope(editConfiguration, vreq); + + //on Form + this.setUrisAndLiteralsOnForm(editConfiguration, vreq); + + editConfiguration.setFilesOnForm(new ArrayList()); + + //Sparql queries + this.setSparqlQueries(editConfiguration, vreq); + + //set fields + setFields(editConfiguration, vreq, EditConfigurationUtils.getPredicateUri(vreq)); + + + setTemplate(editConfiguration, vreq); + //No validators required here + //Add preprocessors + addPreprocessors(editConfiguration, vreq.getWebappDaoFactory()); + //Adding additional data, specifically edit mode + addFormSpecificData(editConfiguration, vreq); + //One override for basic functionality, changing url pattern + //and entity + //Adding term should return to this same page, not the subject + //Return takes the page back to the individual form + editConfiguration.setUrlPatternToReturnTo(EditConfigurationUtils.getFormUrlWithoutContext(vreq)); + return editConfiguration; + } + + + + private void setVarNames(EditConfigurationVTwo editConfiguration) { + editConfiguration.setVarNameForSubject("subject"); + editConfiguration.setVarNameForPredicate("predicate"); + editConfiguration.setVarNameForObject("conceptNode"); + } + + protected void setTemplate(EditConfigurationVTwo editConfiguration, + VitroRequest vreq) { + editConfiguration.setTemplate(template); + + } + + + + /* + * N3 Required and Optional Generators as well as supporting methods + */ + + private String getPrefixesString() { + //TODO: Include dynamic way of including this + return "@prefix core: ."; + } + + + //Here, the node is typed as a skos concept + private List generateN3Required(VitroRequest vreq) { + return list( + getPrefixesString() + "\n" + + "?subject ?predicate ?conceptNode .\n" + ); + } + + //Optional b/c user may select an existing SKOS concept + private List generateN3Optional() { + return list( + "?conceptNode <" + VitroVocabulary.RDF_TYPE + "> <" + SKOSConceptType + "> .\n" + + "?conceptNode <" + label + "> ?conceptLabel ." + ); + } + + + + + /* + * Get new resources + */ + private Map generateNewResources(VitroRequest vreq) { + HashMap newResources = new HashMap(); + newResources.put("conceptNode", null); + //There are no new resources here, the concept node uri doesn't + //get created but already exists, and vocab uri should already exist as well + return newResources; + } + + + + + /* + * Set URIS and Literals In Scope and on form and supporting methods + */ + + private void setUrisAndLiteralsInScope(EditConfigurationVTwo editConfiguration, VitroRequest vreq) { + HashMap> urisInScope = new HashMap>(); + //note that at this point the subject, predicate, and object var parameters have already been processed + //these two were always set when instantiating an edit configuration object from json, + //although the json itself did not specify subject/predicate as part of uris in scope + urisInScope.put(editConfiguration.getVarNameForSubject(), + Arrays.asList(new String[]{editConfiguration.getSubjectUri()})); + urisInScope.put(editConfiguration.getVarNameForPredicate(), + Arrays.asList(new String[]{editConfiguration.getPredicateUri()})); + //Setting inverse role predicate + urisInScope.put("inverseRolePredicate", getInversePredicate(vreq)); + + + editConfiguration.setUrisInScope(urisInScope); + //Uris in scope include subject, predicate, and object var + //literals in scope empty initially, usually populated by code in prepare for update + //with existing values for variables + editConfiguration.setLiteralsInScope(new HashMap>()); + } + + private List getInversePredicate(VitroRequest vreq) { + List inversePredicateArray = new ArrayList(); + ObjectProperty op = EditConfigurationUtils.getObjectProperty(vreq); + if(op != null && op.getURIInverse() != null) { + inversePredicateArray.add(op.getURIInverse()); + } + return inversePredicateArray; + } + + //n3 should look as follows + //?subject ?predicate ?objectVar + + private void setUrisAndLiteralsOnForm(EditConfigurationVTwo editConfiguration, VitroRequest vreq) { + List urisOnForm = new ArrayList(); + List literalsOnForm = new ArrayList(); + //The URI of the node that defines the concept + urisOnForm.add("conceptNode"); + //In case the user defines a new concept, will add a concept label + literalsOnForm.add("conceptLabel"); + editConfiguration.setLiteralsOnForm(literalsOnForm); + } + + + /** + * Set SPARQL Queries and supporting methods + */ + + + private void setSparqlQueries(EditConfigurationVTwo editConfiguration, VitroRequest vreq) { + //Sparql queries defining retrieval of literals etc. + editConfiguration.setSparqlForAdditionalLiteralsInScope(new HashMap()); + Map urisInScope = new HashMap(); + editConfiguration.setSparqlForAdditionalUrisInScope(new HashMap()); + editConfiguration.setSparqlForExistingLiterals(new HashMap()); + editConfiguration.setSparqlForExistingUris(new HashMap()); + } + + /** + * + * Set Fields and supporting methods + */ + + private void setFields(EditConfigurationVTwo editConfiguration, VitroRequest vreq, String predicateUri) { + setConceptNodeField(editConfiguration, vreq); + setConceptLabelField(editConfiguration, vreq); + } + + //this field will be hidden and include the concept node URI + private void setConceptNodeField(EditConfigurationVTwo editConfiguration, + VitroRequest vreq) { + editConfiguration.addField(new FieldVTwo(). + setName("conceptNode"). + setOptionsType("UNDEFINED")); + + } + + + private void setConceptLabelField(EditConfigurationVTwo editConfiguration, + VitroRequest vreq) { + editConfiguration.addField(new FieldVTwo(). + setName("conceptLabel"). + setValidators(list("datatype:" + XSD.xstring.toString())). + setRangeDatatypeUri(XSD.xstring.toString()) + ); + } + + + + + + + + + //Add preprocessor + + private void addPreprocessors(EditConfigurationVTwo editConfiguration, WebappDaoFactory wadf) { + //Will be a completely different type of preprocessor + /* + editConfiguration.addEditSubmissionPreprocessor( + new RoleToActivityPredicatePreprocessor(editConfiguration, wadf)); + */ + } + + + //Form specific data + public void addFormSpecificData(EditConfigurationVTwo editConfiguration, VitroRequest vreq) { + HashMap formSpecificData = new HashMap(); + formSpecificData.put("sparqlForAcFilter", getSparqlForAcFilter(vreq)); + editConfiguration.setFormSpecificData(formSpecificData); + } + + + public String getSparqlForAcFilter(VitroRequest vreq) { + String subject = EditConfigurationUtils.getSubjectUri(vreq); + + String query = "PREFIX core:<" + vivoCore + "> " + + "SELECT ?conceptNode WHERE { " + + "<" + subject + "> ?predicate ?conceptNode ." + + "?conceptNode <" + VitroVocabulary.RDF_TYPE + "> <" + SKOSConceptType + "> . }"; + return query; + } + + //skos concepts can be added for either research areas or subject areas + //IF coming in from a different form then can get the predicate here as it will be stored + public String getCurrentPredicate(VitroRequest vreq) { + return vreq.getParameter("conceptPredicate"); + } + + +}