diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/EditConfiguration.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/EditConfiguration.java index 854126779..582aa9411 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/EditConfiguration.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/EditConfiguration.java @@ -634,7 +634,8 @@ public class EditConfiguration { public static void putConfigInSession(EditConfiguration ec, HttpSession sess){ if( sess == null ) throw new Error("EditConfig: could not put config in session because session was null"); - + if( ec.editKey == null ) + throw new Error("EditConfig: could not put into session because editKey was null."); Map configs = (Map)sess.getAttribute("EditConfigurations"); if( configs == null ){ diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/InstitutionalInternalClassForm.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/InstitutionalInternalClassForm.java new file mode 100644 index 000000000..b4c2df84c --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/InstitutionalInternalClassForm.java @@ -0,0 +1,26 @@ +/* $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 javax.servlet.http.HttpSession; + +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.EditConfiguration; + +/** + * Generate the EditConfiguration for the Institutional Internal Class Form. + * see http://issues.library.cornell.edu/browse/NIHVIVO-2666 + * + * + */ +public class InstitutionalInternalClassForm implements EditConfigurationGenerator { + + @Override + public EditConfiguration getEditConfiguration(VitroRequest vreq, HttpSession session) { + EditConfiguration editConfig = new EditConfiguration(); + editConfig.setTemplate("institutionalInternalClassForm.ftl"); + + return editConfig; + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/controller/EditRequestDispatchController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/controller/EditRequestDispatchController.java index ce79c6724..48707dc6f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/controller/EditRequestDispatchController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/controller/EditRequestDispatchController.java @@ -20,6 +20,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.EditConfiguration; import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.generators.EditConfigurationGenerator; import edu.cornell.mannlib.vitro.webapp.web.MiscWebUtils; +import edu.cornell.mannlib.vitro.webapp.web.templatemodels.edit.EditConfigurationTemplateModel; /** * This servlet is intended to handle all requests to create a form for use @@ -195,8 +196,11 @@ public class EditRequestDispatchController extends FreemarkerHttpServlet { vreq.setAttribute("form", editConfGeneratorName); - /**** make the edit configuration ***/ + /**** make new or get an existing edit configuration ***/ + EditConfiguration editConfig = makeEditConfiguration( editConfGeneratorName, vreq, session); + editConfig.setEditKey(editKey); + EditConfiguration.putConfigInSession(editConfig, session); //what template? String template = editConfig.getTemplate(); @@ -204,7 +208,7 @@ public class EditRequestDispatchController extends FreemarkerHttpServlet { //what goes in the map for templates? Map templateData = new HashMap(); - templateData.put("editConfiguration", editConfig); + templateData.put("editConfiguration", new EditConfigurationTemplateModel( editConfig, vreq)); templateData.put("formTitle", formTitle); return new TemplateResponseValues(template, templateData); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/processEdit/EditSubmission.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/processEdit/EditSubmission.java index 61ed8e286..964f5eb56 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/processEdit/EditSubmission.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/processEdit/EditSubmission.java @@ -35,7 +35,7 @@ import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.validators. import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.validators.N3Validator; public class EditSubmission { - private String editKey; + String editKey; private Map literalsFromForm ; private Map urisFromForm ; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/processEdit/EditSubmissionUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/processEdit/EditSubmissionUtils.java new file mode 100644 index 000000000..1063fe41f --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/processEdit/EditSubmissionUtils.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.processEdit; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpSession; + +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.EditConfiguration; + +public class EditSubmissionUtils { + + protected static final String MULTI_VALUED_EDIT_SUBMISSION = "MultiValueEditSubmission"; + + /* *************** Static utility methods to get EditSub from Session *********** */ + + public static MultiValueEditSubmission getEditSubmissionFromSession(HttpSession sess, EditConfiguration editConfig){ + Map submissions = + (Map)sess.getAttribute(MULTI_VALUED_EDIT_SUBMISSION); + if( submissions == null ) + return null; + if( editConfig != null ) + return submissions.get( editConfig.getEditKey() ); //this might be null + else + return null; + } + + public static void putEditSubmissionInSession(HttpSession sess, MultiValueEditSubmission editSub){ + Map submissions = (Map)sess.getAttribute(MULTI_VALUED_EDIT_SUBMISSION); + if( submissions == null ){ + submissions = new HashMap(); + sess.setAttribute(MULTI_VALUED_EDIT_SUBMISSION,submissions); + } + submissions.put(editSub.editKey, editSub); + } + + + public static void clearEditSubmissionInSession(HttpSession sess, MultiValueEditSubmission editSub){ + if( sess == null) return; + if( editSub == null ) return; + Map submissions = (Map)sess.getAttribute("MULTI_VALUED_EDIT_SUBMISSION"); + if( submissions == null ){ + throw new Error("MultiValueEditSubmission: could not get a Map of MultiValueEditSubmission from the session."); + } + + submissions.remove( editSub.editKey ); + } + + public static void clearAllEditSubmissionsInSession(HttpSession sess ){ + if( sess == null) return; + sess.removeAttribute("MULTI_VALUED_EDIT_SUBMISSION"); + } + + public static Map convertParams( + Map> queryParameters) { + HashMap out = new HashMap(); + for( String key : queryParameters.keySet()){ + List item = queryParameters.get(key); + out.put(key, (String[])item.toArray(new String[item.size()])); + } + return out; + } +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/processEdit/MultiValueEditSubmission.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/processEdit/MultiValueEditSubmission.java new file mode 100644 index 000000000..16f07c07e --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/processEdit/MultiValueEditSubmission.java @@ -0,0 +1,287 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.edit.n3editing.processEdit; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +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.fileupload.FileItem; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.joda.time.DateTime; +import org.joda.time.IllegalFieldValueException; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; +import org.json.JSONObject; + +import com.hp.hpl.jena.rdf.model.Literal; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.ResourceFactory; +import com.hp.hpl.jena.vocabulary.XSD; + +import edu.cornell.mannlib.vitro.webapp.edit.EditLiteral; +import edu.cornell.mannlib.vitro.webapp.edit.elements.EditElement; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.EditConfiguration; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.Field; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.validators.BasicValidation; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.validators.N3Validator; + +public class MultiValueEditSubmission { + + String editKey; + + private Map literalsFromForm ; + private Map urisFromForm ; + + private Map validationErrors; + private BasicValidation basicValidation; + + private Map> filesFromForm; + + private static Model literalCreationModel; + + static{ + literalCreationModel = ModelFactory.createDefaultModel(); + } + + public MultiValueEditSubmission(Map queryParameters, EditConfiguration editConfig){ + if( editConfig == null ) + throw new Error("EditSubmission needs an EditConfiguration"); + this.editKey = editConfig.getEditKey(); + if( this.editKey == null || this.editKey.trim().length() == 0) + throw new Error("EditSubmission needs an 'editKey' parameter from the EditConfiguration"); + + validationErrors = new HashMap(); + + this.urisFromForm = new HashMap(); + for( String var: editConfig.getUrisOnform() ){ + String[] valuesArray = queryParameters.get( var ); + String uri = null; + List values = (valuesArray != null) ? Arrays.asList(valuesArray) : null; + if( values != null && values.size() > 0){ + if( values.size() == 1 ) { + uri = values.get(0); + } else if( values.size() > 1 ){ + uri = values.get(0); + log.error("Cannot yet handle multiple URIs for a single field, using first URI on list"); + } + urisFromForm.put(var,uri); + } else { + log.debug("No value found for query parameter " + var); + } + //check to see if a URI field from the form was blank but was intended to create a new URI + if( uri != null && uri.length() == 0 && editConfig.getNewResources().containsKey(var) ){ + log.debug("A new resource URI will be made for var " + var + " since it was blank on the form."); + urisFromForm.remove(var); + } + } + + this.literalsFromForm =new HashMap(); + for(String var: editConfig.getLiteralsOnForm() ){ + Field field = editConfig.getField(var); + if( field == null ) { + log.error("could not find field " + var + " in EditConfiguration" ); + continue; + } else if( field.getEditElement() != null ){ + log.debug("skipping field with edit element, it should not be in literals on form list"); + }else{ + String[] valuesArray = queryParameters.get(var); + List valueList = (valuesArray != null) ? Arrays.asList(valuesArray) : null; + if( valueList != null && valueList.size() > 0 ) { + String value = valueList.get(0); + + // remove any characters that are not valid in XML 1.0 + // from user input so they don't cause problems + // with model serialization + value = EditN3Utils.stripInvalidXMLChars(value); + + if (!StringUtils.isEmpty(value)) { + literalsFromForm.put(var, createLiteral( + value, + field.getRangeDatatypeUri(), + field.getRangeLang())); + } + + if(valueList != null && valueList.size() > 1 ) + log.debug("For field " + var +", cannot yet handle multiple " + + "Literals for a single field, using first Literal on list"); + + }else{ + log.debug("could not find value for parameter " + var ); + } + } + } + + if( log.isDebugEnabled() ){ + for( String key : literalsFromForm.keySet() ){ + log.debug( key + " literal " + literalsFromForm.get(key) ); + } + for( String key : urisFromForm.keySet() ){ + log.debug( key + " uri " + urisFromForm.get(key) ); + } + } + + processEditElementFields(editConfig,queryParameters); + + Map errors = basicValidation.validateUris( urisFromForm ); + + if(editConfig.getValidators() != null ){ + for( N3Validator validator : editConfig.getValidators()){ + if( validator != null ){ + throw new Error("need to implemente a validator interface that works with the new MultivalueEditSubmission."); + //errors = validator.validate(editConfig, this); +// if ( errors != null ) +// validationErrors.putAll(errors); + } + } + } + + if( log.isDebugEnabled() ) + log.debug( this.toString() ); + } + + protected void processEditElementFields(EditConfiguration editConfig, Map queryParameters ){ + for( String fieldName : editConfig.getFields().keySet()){ + Field field = editConfig.getFields().get(fieldName); + if( field != null && field.getEditElement() != null ){ + EditElement element = field.getEditElement(); + log.debug("Checking EditElement for field " + fieldName + " type: " + element.getClass().getName()); + + //check for validation error messages + Map errMsgs = + element.getValidationMessages(fieldName, editConfig, queryParameters); + validationErrors.putAll(errMsgs); + + if( errMsgs == null || errMsgs.isEmpty()){ + //only check for uris and literals when element has no validation errors + Map urisFromElement = element.getURIs(fieldName, editConfig, queryParameters); + if( urisFromElement != null ) + urisFromForm.putAll(urisFromElement); + Map literalsFromElement = element.getLiterals(fieldName, editConfig, queryParameters); + if( literalsFromElement != null ) + literalsFromForm.putAll(literalsFromElement); + }else{ + log.debug("got validation errors for field " + fieldName + " not processing field for literals or URIs"); + } + } + } + } + + /* maybe this could be static */ + public Literal createLiteral(String value, String datatypeUri, String lang) { + if( datatypeUri != null ){ + if( "http://www.w3.org/2001/XMLSchema:anyURI".equals(datatypeUri) ){ + try { + return literalCreationModel.createTypedLiteral( URLEncoder.encode(value, "UTF8"), datatypeUri); + } catch (UnsupportedEncodingException e) { + log.error(e, e); + } + } + return literalCreationModel.createTypedLiteral(value, datatypeUri); + }else if( lang != null && lang.length() > 0 ) + return literalCreationModel.createLiteral(value, lang); + else + return ResourceFactory.createPlainLiteral(value); + } + + private static final String DATE_TIME_URI = XSD.dateTime.getURI(); + private static final String DATE_URI = XSD.date.getURI(); + private static final String TIME_URI = XSD.time.getURI(); + + private static DateTimeFormatter dformater = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:00"); + private static DateTimeFormatter dateFormater = DateTimeFormat.forPattern("yyyy-MM-dd"); + + public Map getValidationErrors(){ + return validationErrors; + } + + public Map getLiteralsFromForm() { + return literalsFromForm; + } + + public Map getUrisFromForm() { + return urisFromForm; + } + /** + * need to generate something like + * "09:10:11"^^ + */ + public Literal getTime(Map queryParameters,String fieldName) { + List hour = Arrays.asList(queryParameters.get("hour" + fieldName)); + List minute = Arrays.asList(queryParameters.get("minute" + fieldName)); + + if ( hour == null || hour.size() == 0 || + minute == null || minute.size() == 0 ) { + log.info("Could not find query parameter values for time field " + fieldName); + validationErrors.put(fieldName, "time must be supplied"); + return null; + } + + int hourInt = -1; + int minuteInt = -1; + + String hourParamStr = hour.get(0); + String minuteParamStr = minute.get(0); + + // if all fields are blank, just return a null value + if (hourParamStr.length() == 0 && minuteParamStr.length() == 0) { + return null; + } + + String errors = ""; + try{ + hourInt = Integer.parseInt(hour.get(0)); + if (hourInt < 0 || hourInt > 23) { + throw new NumberFormatException(); + } + } catch( NumberFormatException nfe ) { + errors += "Please enter a valid hour. "; + } + try{ + minuteInt = Integer.parseInt(minute.get(0)); + if (minuteInt < 0 || minuteInt > 59) { + throw new NumberFormatException(); + } + } catch( NumberFormatException nfe ) { + errors += "Please enter a valid minute. "; + } + if( errors.length() > 0 ){ + validationErrors.put( fieldName, errors); + return null; + } + + + String hourStr = (hourInt < 10) ? "0" + Integer.toString(hourInt) : Integer.toString(hourInt); + String minuteStr = (minuteInt < 10) ? "0" + Integer.toString(minuteInt) : Integer.toString(minuteInt); + String secondStr = "00"; + + return new EditLiteral(hourStr + ":" + minuteStr + ":" + secondStr, TIME_URI, null); + + } + public void setLiteralsFromForm(Map literalsFromForm) { + this.literalsFromForm = literalsFromForm; + } + + public void setUrisFromForm(Map urisFromForm) { + this.urisFromForm = urisFromForm; + } + + public String toString(){ + String[] names ={ + "literalsFromForm", + "urisFromForm","validationErrors","basicValidation" + }; + JSONObject obj = new JSONObject(this,names); + return obj.toString(); + } + + private Log log = LogFactory.getLog(EditSubmission.class); +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditConfigurationTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditConfigurationTemplateModel.java new file mode 100644 index 000000000..eff73d304 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditConfigurationTemplateModel.java @@ -0,0 +1,29 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.web.templatemodels.edit; + +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.EditConfiguration; +import edu.cornell.mannlib.vitro.webapp.web.templatemodels.BaseTemplateModel; + +public class EditConfigurationTemplateModel extends BaseTemplateModel { + EditConfiguration editConfig; + VitroRequest vreq; + + public EditConfigurationTemplateModel( EditConfiguration editConfig, VitroRequest vreq){ + this.editConfig = editConfig; + this.vreq = vreq; + } + + public String getEditKey(){ + return editConfig.getEditKey(); + } + + public boolean isUpdate(){ + return editConfig.isUpdate(); + } + + public String getSubmitToUrl(){ + return editConfig.getSubmitToUrl(); + } +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditSubmissionTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditSubmissionTemplateModel.java new file mode 100644 index 000000000..a0b0565ec --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditSubmissionTemplateModel.java @@ -0,0 +1,33 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.web.templatemodels.edit; + +import java.util.Map; + +import com.hp.hpl.jena.rdf.model.Literal; + +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.processEdit.EditSubmission; + +public class EditSubmissionTemplateModel { + private EditSubmission editSub; + + public Map getLiteralsFromForm() { + return editSub.getLiteralsFromForm(); + } + + public Map getValidationErrors() { + return editSub.getValidationErrors(); + } + + public Map getUrisFromForm() { + return editSub.getUrisFromForm(); + } + + public EditSubmissionTemplateModel(EditSubmission editSub){ + this.editSub = editSub; + } + + + + +} diff --git a/webapp/web/templates/freemarker/edit/forms/institutionalInternalClassForm.ftl b/webapp/web/templates/freemarker/edit/forms/institutionalInternalClassForm.ftl new file mode 100644 index 000000000..dbacc8bae --- /dev/null +++ b/webapp/web/templates/freemarker/edit/forms/institutionalInternalClassForm.ftl @@ -0,0 +1,19 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +<#-- +Institutional Internal Class Form +Associated with generator: +edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.generators.InstitutionalInternalClassForm +--> + +

Lorem ipsum dolor sit amet

+ +
+

consectetur adipisicing elit

+ +
+ +
+
+ +<@dumpAll/> \ No newline at end of file