Adding MultiValuedEditSubmission
This commit is contained in:
parent
5e45a7b63d
commit
8904a227d6
9 changed files with 468 additions and 4 deletions
|
@ -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<String,EditConfiguration> configs = (Map<String,EditConfiguration>)sess.getAttribute("EditConfigurations");
|
||||
if( configs == null ){
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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<String,Object> templateData = new HashMap<String,Object>();
|
||||
templateData.put("editConfiguration", editConfig);
|
||||
templateData.put("editConfiguration", new EditConfigurationTemplateModel( editConfig, vreq));
|
||||
templateData.put("formTitle", formTitle);
|
||||
|
||||
return new TemplateResponseValues(template, templateData);
|
||||
|
|
|
@ -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<String,Literal> literalsFromForm ;
|
||||
private Map<String,String> urisFromForm ;
|
||||
|
|
|
@ -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<String,MultiValueEditSubmission> submissions =
|
||||
(Map<String,MultiValueEditSubmission>)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<String,MultiValueEditSubmission> submissions = (Map<String,MultiValueEditSubmission>)sess.getAttribute(MULTI_VALUED_EDIT_SUBMISSION);
|
||||
if( submissions == null ){
|
||||
submissions = new HashMap<String,MultiValueEditSubmission>();
|
||||
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<String,MultiValueEditSubmission> submissions = (Map<String,MultiValueEditSubmission>)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<String, String[]> convertParams(
|
||||
Map<String, List<String>> queryParameters) {
|
||||
HashMap<String,String[]> out = new HashMap<String,String[]>();
|
||||
for( String key : queryParameters.keySet()){
|
||||
List item = queryParameters.get(key);
|
||||
out.put(key, (String[])item.toArray(new String[item.size()]));
|
||||
}
|
||||
return out;
|
||||
}
|
||||
}
|
|
@ -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<String,Literal> literalsFromForm ;
|
||||
private Map<String,String> urisFromForm ;
|
||||
|
||||
private Map<String,String> validationErrors;
|
||||
private BasicValidation basicValidation;
|
||||
|
||||
private Map<String, List<FileItem>> filesFromForm;
|
||||
|
||||
private static Model literalCreationModel;
|
||||
|
||||
static{
|
||||
literalCreationModel = ModelFactory.createDefaultModel();
|
||||
}
|
||||
|
||||
public MultiValueEditSubmission(Map<String,String[]> 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<String,String>();
|
||||
|
||||
this.urisFromForm = new HashMap<String,String>();
|
||||
for( String var: editConfig.getUrisOnform() ){
|
||||
String[] valuesArray = queryParameters.get( var );
|
||||
String uri = null;
|
||||
List<String> 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<String,Literal>();
|
||||
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<String> 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<String,String> 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<String,String[]> 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<String,String> 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<String,String> urisFromElement = element.getURIs(fieldName, editConfig, queryParameters);
|
||||
if( urisFromElement != null )
|
||||
urisFromForm.putAll(urisFromElement);
|
||||
Map<String,Literal> 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<String,String> getValidationErrors(){
|
||||
return validationErrors;
|
||||
}
|
||||
|
||||
public Map<String, Literal> getLiteralsFromForm() {
|
||||
return literalsFromForm;
|
||||
}
|
||||
|
||||
public Map<String, String> getUrisFromForm() {
|
||||
return urisFromForm;
|
||||
}
|
||||
/**
|
||||
* need to generate something like
|
||||
* "09:10:11"^^<http://www.w3.org/2001/XMLSchema#time>
|
||||
*/
|
||||
public Literal getTime(Map<String,String[]> queryParameters,String fieldName) {
|
||||
List<String> hour = Arrays.asList(queryParameters.get("hour" + fieldName));
|
||||
List<String> 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<String, Literal> literalsFromForm) {
|
||||
this.literalsFromForm = literalsFromForm;
|
||||
}
|
||||
|
||||
public void setUrisFromForm(Map<String, String> 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);
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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<String, Literal> getLiteralsFromForm() {
|
||||
return editSub.getLiteralsFromForm();
|
||||
}
|
||||
|
||||
public Map<String, String> getValidationErrors() {
|
||||
return editSub.getValidationErrors();
|
||||
}
|
||||
|
||||
public Map<String, String> getUrisFromForm() {
|
||||
return editSub.getUrisFromForm();
|
||||
}
|
||||
|
||||
public EditSubmissionTemplateModel(EditSubmission editSub){
|
||||
this.editSub = editSub;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue