diff --git a/webapp/lib/commons-beanutils.jar b/webapp/lib/commons-beanutils.jar new file mode 100644 index 000000000..b1b89c9c9 Binary files /dev/null and b/webapp/lib/commons-beanutils.jar differ diff --git a/webapp/lib/ezmorph-1.0.4.jar b/webapp/lib/ezmorph-1.0.4.jar new file mode 100644 index 000000000..7625af67e Binary files /dev/null and b/webapp/lib/ezmorph-1.0.4.jar differ diff --git a/webapp/lib/json-lib-2.2.2-jdk15.jar b/webapp/lib/json-lib-2.2.2-jdk15.jar new file mode 100644 index 000000000..27e7c7cc5 Binary files /dev/null and b/webapp/lib/json-lib-2.2.2-jdk15.jar differ diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/EditConfigurationVTwo.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/EditConfigurationVTwo.java index 7a53b0988..ef3fd9293 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/EditConfigurationVTwo.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/EditConfigurationVTwo.java @@ -438,7 +438,14 @@ public class EditConfigurationVTwo { public void setN3Required(String ... n3RequiredStrs){ this.n3Required = Arrays.asList( n3RequiredStrs ); } + //these methods allow strings to be added to the n3 required list and not just for the list to be set + public void addN3Required(List n3Required) { + this.n3Required.addAll(n3Required); + } + public void addN3Required(String ... n3RequiredStrs) { + this.n3Required.addAll(Arrays.asList( n3RequiredStrs )); + } /** return a copy of the value so that the configuration is not modified by external code. * @return */ @@ -453,6 +460,14 @@ public class EditConfigurationVTwo { public void setN3Optional(String ... n3Strs){ this.n3Optional = Arrays.asList( n3Strs ); } + + public void addN3Optional(List n3Optional) { + this.n3Optional.addAll(n3Optional); + } + + public void addN3Optional(String ... n3Strs){ + this.n3Optional.addAll(Arrays.asList( n3Strs )); + } public Map getNewResources() { @@ -508,7 +523,14 @@ public class EditConfigurationVTwo { public void setLiteralsOnForm(String ... strs){ this.literalsOnForm = Arrays.asList( strs ); } - + + public void addLiteralsOnForm(List literalsOnForm) { + this.literalsOnForm.addAll(literalsOnForm); + } + + public void addLiteralsOnForm(String ... strs){ + this.literalsOnForm.addAll(Arrays.asList( strs )); + } public Map> getUrisInScope() { return urisInScope; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java index 9496c2aa0..bb0b454c9 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java @@ -2,53 +2,22 @@ package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.generators; -import java.util.Arrays; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpSession; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.DateTimeIntervalValidationVTwo; -import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.DateTimeWithPrecisionVTwo; -import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationUtils; - - -import com.hp.hpl.jena.rdf.model.Literal; -import com.hp.hpl.jena.rdf.model.Model; -import com.hp.hpl.jena.vocabulary.OWL; -import com.hp.hpl.jena.vocabulary.RDF; -import com.hp.hpl.jena.vocabulary.RDFS; -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.EditConfigurationUtils; 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.validators.AntiXssValidation; -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.fields.ChildVClassesOptions; import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo; -import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.SelectListGeneratorVTwo; import edu.cornell.mannlib.vitro.webapp.utils.dataGetter.DataGetterUtils; import edu.cornell.mannlib.vitro.webapp.utils.menuManagement.MenuManagementDataUtils; -import edu.cornell.mannlib.vitro.webapp.web.MiscWebUtils; -import edu.cornell.mannlib.vitro.webapp.search.beans.ProhibitedFromSearch; -import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary; /** * Generates the form for adding and editing a page in the display model. @@ -80,6 +49,11 @@ public class ManagePageGenerator extends BaseEditConfigurationGenerator implemen //Add sparql queries setSparqlQueries(conf); + // In scope + setUrisAndLiteralsInScope(conf, vreq); + + // on Form + setUrisAndLiteralsOnForm(conf, vreq); //Set the fields setFields(conf); @@ -91,6 +65,24 @@ public class ManagePageGenerator extends BaseEditConfigurationGenerator implemen return conf ; } + private void setUrisAndLiteralsOnForm(EditConfigurationVTwo conf, + VitroRequest vreq) { + conf.setUrisOnForm(new String[]{"page", "menuItem"}); //new resources: should this be on form for new - should be for existing + conf.setLiteralsOnForm(new String[]{"pageTitle", "urlMapping", "linkText", "menuPosition", "menuLinkText", "bodyTemplate", "pageContentUnit"}); //page content unit = data getter JSON object + + } + + private void setUrisAndLiteralsInScope(EditConfigurationVTwo conf, + VitroRequest vreq) { + //URIs + conf.addUrisInScope(conf.getVarNameForSubject(), + Arrays.asList(new String[]{conf.getSubjectUri()})); + conf.addUrisInScope(conf.getVarNameForPredicate(), + Arrays.asList(new String[]{conf.getPredicateUri()})); + + + } + private void setN3Optional(EditConfigurationVTwo conf) { //body template is not required, and a given page may or may not be a menu item, but should linked to menu if menu item conf.setN3Optional(Arrays.asList(prefixes + pageBodyTemplateN3, diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ManagePagePreprocessor.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ManagePagePreprocessor.java new file mode 100644 index 000000000..639534655 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ManagePagePreprocessor.java @@ -0,0 +1,207 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.hp.hpl.jena.rdf.model.Literal; +import com.hp.hpl.jena.vocabulary.RDFS; +import com.hp.hpl.jena.vocabulary.XSD; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.BaseEditSubmissionPreprocessorVTwo; +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.MultiValueEditSubmission; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils.ProcessDataGetterN3; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils.ProcessDataGetterN3Utils; +import net.sf.json.JSONObject; +import net.sf.json.JSONSerializer; + +public class ManagePagePreprocessor extends + BaseEditSubmissionPreprocessorVTwo { + + protected static final Log log = LogFactory + .getLog(ManagePagePreprocessor.class.getName()); + + + private static MultiValueEditSubmission submission = null; + private static EditConfigurationVTwo editConfiguration = null; + private static Map> transformedLiteralsFromForm = null; + private static Map> urisFromForm = null; + private static List pageContentUnits = null;//String submission from form + private static List pageContentUnitsJSON = null;//converted to JSON objects that can be read + // String datatype + + // Will be editing the edit configuration as well as edit submission here + + public ManagePagePreprocessor(EditConfigurationVTwo editConfig) { + super(editConfig); + editConfiguration = editConfig; + } + + public void preprocess(MultiValueEditSubmission inputSubmission) { + submission = inputSubmission; + // Get the input elements for concept node and concept label as well + // as vocab uri (which is based on thge + // For query parameters, check whether CUI + copySubmissionValues(); + processDataGetters(); + + + } + + //Since we will change the uris and literals from form, we should make copies + //of the original values and store them, this will also make iterations + //and updates to the submission independent from accessing the values + private void copySubmissionValues() { + Map> literalsFromForm = submission.getLiteralsFromForm(); + transformedLiteralsFromForm = copyMap(EditConfigurationUtils.transformLiteralMap(literalsFromForm)); + urisFromForm = copyMap(submission.getUrisFromForm()); + pageContentUnits = transformedLiteralsFromForm.get("pageContentUnit"); + } + + private Map> copyMap( + Map> originalMap) { + Map> copyMap = new HashMap>(); + copyMap.putAll(originalMap); + return copyMap; + } + + private void processDataGetters() { + convertToJson(); + int counter = 0; + for(JSONObject jsonObject:pageContentUnitsJSON) { + String dataGetterClass = getDataGetterClass(jsonObject); + ProcessDataGetterN3 pn = ProcessDataGetterN3Utils.getDataGetterProcessorN3(dataGetterClass, jsonObject); + //Add n3 required + addN3Required(pn, counter); + //Add N3 Optional as well + addN3Optional(pn, counter); + // Add URIs on Form and Add Literals On Form + addLiteralsAndUrisOnForm(pn, counter); + // Add fields + addFields(pn, counter); + //Add input values to submission + addInputsToSubmission(pn, counter, jsonObject); + counter++; + } + + + + + } + + private void convertToJson() { + //Iterate through list of inputs + pageContentUnitsJSON = new ArrayList(); + for(String pageContentUnit: pageContentUnits) { + JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON( pageContentUnit ); + pageContentUnitsJSON.add(jsonObject); + } + + } + + //This is where the actual values will be submitted as if they were separate input fields + //Each field name will correspond to the names of the fileds/uris on form/literals on form + //generated here + + private void addInputsToSubmission(ProcessDataGetterN3 pn, int counter, JSONObject jsonObject) { + List literalLabels = pn.getLiteralVarNamesBase(); + List uriLabels = pn.getUriVarNamesBase(); + //this needs to be different + //Get the literals directly from the processor - which you can get based on counter + //Problem then is we know what the connection is - some way to put that logic within the processor itself? + //It already knows the json object + + //--> Get field for this base label, with counter value - that you get from configuration +/* + while(jsonObject.keys().hasNext()) + { + //Other than class, all other variables considered a submission value corresponding to field + String key = (String) jsonObject.keys().next(); + if(key != "dataGetterClass") { + //not expecting multiple values, so will need to either make this array or + //think about this some more + //TODO: Consider multiple values here + Map submissionValues = new HashMap(); + submissionValues.put(key, new String[]{jsonObject.getString(key)} ); + + if(literalLabels.contains(key)) { + submission.addLiteralToForm(editConfiguration.getField(key), field, var, valuesArray) + } + } + + } + List uris = pn.retrieveUrissOnForm(counter); + for(String l:literals) { + //json object should have + submissionValues.put(l, new String[]{jsonObject.getString(l)} ); + }*/ + + } + + + + + private void addFields(ProcessDataGetterN3 pn, int counter) { + + } + + + + //original literals on form: label, uris on form: conceptNode and conceptSource + //This will overwrite the original values in the edit configuration + private void addLiteralsAndUrisOnForm(ProcessDataGetterN3 pn, int counter) { + + } + + // N3 being reproduced + /* + * ?subject ?predicate ?conceptNode . + */ + //This will overwrite the original with the set of new n3 required + private void addN3Required(ProcessDataGetterN3 pn, int counter) { + //Use the process utils to figure out what class required to retrieve the N3 required + editConfiguration.addN3Required(pn.retrieveN3Required(counter)); + + } + //Add n3 optional + + private void addN3Optional(ProcessDataGetterN3 pn, int counter) { + editConfiguration.addN3Optional(pn.retrieveN3Optional(counter)); + } + + private String[] convertDelimitedStringToArray(String inputString) { + String[] inputArray = new String[1]; + if (inputString.indexOf(",") != -1) { + inputArray = inputString.split(","); + } else { + inputArray[0] = inputString; + } + return inputArray; + + } + + + + + private Object getFirstElement(List inputList) { + if(inputList == null || inputList.size() == 0) + return null; + return inputList.get(0); + } + + //Each JSON Object will indicate the type of the data getter within it + private String getDataGetterClass(JSONObject jsonObject) { + return jsonObject.getString("dataGetterClass"); + } + + + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterN3.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterN3.java new file mode 100644 index 000000000..c213c6847 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterN3.java @@ -0,0 +1,23 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils; + +import java.util.ArrayList; +import java.util.List; + +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo; + +//Returns the appropriate n3 based on data getter + +public interface ProcessDataGetterN3 { + public List retrieveN3Required(int counter); + public List retrieveN3Optional(int counter); + public ListretrieveLiteralsOnForm(int counter); + + + public List retrieveUrissOnForm(int counter); + public List retrieveFields(int counter); + public List getLiteralVarNamesBase(); + public List getUriVarNamesBase(); + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterN3Utils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterN3Utils.java new file mode 100644 index 000000000..d28adce91 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterN3Utils.java @@ -0,0 +1,51 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.ServletContext; + +import net.sf.json.JSONObject; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.rdf.model.RDFNode; +import com.hp.hpl.jena.rdf.model.ResourceFactory; +import com.hp.hpl.jena.rdf.model.StmtIterator; + +import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; +import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelContext; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils.ProcessDataGetterN3; + +/* + * This class determines what n3 should be returned for a particular data getter and can be overwritten or extended in VIVO. + */ +public class ProcessDataGetterN3Utils { + private static final Log log = LogFactory.getLog(ProcessDataGetterN3Utils.class); + public static HashMap getDataGetterTypeToProcessorMap() { + HashMap map = new HashMap(); + map.put("edu.cornell.mannlib.vitro.webapp.utils.dataGetter.SparqlQueryDataGetter", "edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils.ProcessSparqlDataGetterN3"); + return map; + } + + public static ProcessDataGetterN3 getDataGetterProcessorN3(String dataGetterClass, JSONObject jsonObject) { + HashMap map = getDataGetterTypeToProcessorMap(); + if(map.containsKey(dataGetterClass)) { + String processorClass = map.get(dataGetterClass); + try { + Class clz = Class.forName(processorClass); + ProcessDataGetterN3 pn = (ProcessDataGetterN3) clz.getConstructor(JSONObject.class).newInstance(jsonObject); + return pn; + } catch(Exception ex) { + log.error("Exception occurred in trying to get processor class for n3 for " + dataGetterClass, ex); + return null; + } + } + return null; + } + +} \ No newline at end of file diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessSparqlDataGetterN3.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessSparqlDataGetterN3.java new file mode 100644 index 000000000..3e0797ec5 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessSparqlDataGetterN3.java @@ -0,0 +1,97 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils; + +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import com.hp.hpl.jena.rdf.model.Literal; + +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo; + +import net.sf.json.JSONObject; +import net.sf.json.JSONSerializer; +//Returns the appropriate n3 based on data getter +public class ProcessSparqlDataGetterN3 implements ProcessDataGetterN3 { + private static String classType = "java:edu.cornell.mannlib.vitro.webapp.utils.dataGetter.SparqlQueryDataGetter"; + private JSONObject jsonObject = null; + + public ProcessSparqlDataGetterN3(JSONObject inputJsonObject) { + jsonObject = inputJsonObject; + } + //Pass in variable that represents the counter + + //TODO: ensure correct model returned + public List retrieveN3Required(int counter) { + String dataGetterVar = getDataGetterVar(counter); + String n3 = dataGetterVar + " a <" + classType + ">; \n" + + "display:queryModel <" + jsonObject.getString("queryModel") + ">; \n" + + "display:saveToVar '" + jsonObject.getString("saveToVar") + "'; \n" + + "display:query \"\"\"" + jsonObject.getString("query") + "\"\"\" ."; + return Arrays.asList(getPrefixes() + n3); + + } + public List retrieveN3Optional(int counter) { + return null; + } + + private String getDataGetterVar(int counter) { + return "dataGetter" + counter; + } + + private String getPrefixes() { + return "@prefix display: . \n" + + "@prefix rdfs: . \n"; + } + + + //Need to add method sfor returning the fields, literals on form, and all that + /* + * addLiteralsAndUrisOnForm(pn, counter); + // Add fields + addFields(pn, counter); + //Add input values to submission + addInputsToSubmission(pn, counter); + */ + public List retrieveLiteralsOnForm(int counter) { + List literalsOnForm = new ArrayList(); + literalsOnForm.add("saveToVar" + counter); + literalsOnForm.add("query" + counter); + return literalsOnForm; + + } + + + public List retrieveUrissOnForm(int counter) { + List urisOnForm = new ArrayList(); + //We have no uris as far as I know.. well query Model is a uri + urisOnForm.add("queryModel" + counter); + return urisOnForm; + + } + + public List retrieveFields(int counter) { + List fields = new ArrayList(); + fields.add(new FieldVTwo().setName("queryModel" + counter)); + fields.add(new FieldVTwo().setName("saveToVar" + counter)); + fields.add(new FieldVTwo().setName("query" + counter)); + + return fields; + } + + public List getLiteralVarNamesBase() { + return Arrays.asList("savetoVar", "query"); + } + + public List getUriVarNamesBase() { + return Arrays.asList("queryModel"); + } + + + +} + + diff --git a/webapp/web/js/menupage/pageManagementUtils.js b/webapp/web/js/menupage/pageManagementUtils.js index ea6ac5b55..43e303cdd 100644 --- a/webapp/web/js/menupage/pageManagementUtils.js +++ b/webapp/web/js/menupage/pageManagementUtils.js @@ -292,4 +292,6 @@ var pageManagementUtils = { $(document).ready(function() { pageManagementUtils.onLoad(); -}); \ No newline at end of file +}); + +