Adding MultiValuedEditSubmission

This commit is contained in:
briancaruso 2011-07-01 14:19:10 +00:00
parent 5e45a7b63d
commit 8904a227d6
9 changed files with 468 additions and 4 deletions

View file

@ -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 ){

View file

@ -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;
}
}

View file

@ -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);

View file

@ -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 ;

View file

@ -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;
}
}

View file

@ -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);
}

View file

@ -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();
}
}

View file

@ -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;
}
}