From 3aca74a7ee97eb5cbdbcbab191b0747fc809182a Mon Sep 17 00:00:00 2001 From: hudajkhan Date: Fri, 6 Dec 2013 11:08:14 -0500 Subject: [PATCH] VIVO610 when range uri exists but doesn't have corresponding vclass, show error message with option to go back to individual profile --- .../DefaultObjectPropertyFormGenerator.java | 81 +++++++++++++++++-- .../edit/forms/customErrorMessages.ftl | 8 ++ 2 files changed, 81 insertions(+), 8 deletions(-) create mode 100644 webapp/web/templates/freemarker/edit/forms/customErrorMessages.ftl diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultObjectPropertyFormGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultObjectPropertyFormGenerator.java index 4d29a23d1..78a0adb3a 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultObjectPropertyFormGenerator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultObjectPropertyFormGenerator.java @@ -36,6 +36,7 @@ import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationVTw import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo; import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.IndividualsViaObjectPropetyOptions; import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.validators.AntiXssValidation; +import edu.cornell.mannlib.vitro.webapp.i18n.I18n; import edu.cornell.mannlib.vitro.webapp.search.VitroSearchTermNames; import edu.cornell.mannlib.vitro.webapp.search.beans.ProhibitedFromSearch; import edu.cornell.mannlib.vitro.webapp.search.solr.SolrSetup; @@ -64,6 +65,7 @@ public class DefaultObjectPropertyFormGenerator implements EditConfigurationGene protected boolean tooManyRangeIndividuals = false; protected long maxNonACRangeIndividualCount = 300; + protected String customErrorMessages = null; private static HashMap defaultsForXSDtypes ; static { @@ -76,10 +78,19 @@ public class DefaultObjectPropertyFormGenerator implements EditConfigurationGene @Override public EditConfigurationVTwo getEditConfiguration(VitroRequest vreq, HttpSession session) throws Exception { + if(!EditConfigurationUtils.isObjectProperty(EditConfigurationUtils.getPredicateUri(vreq), vreq)) { throw new Exception("DefaultObjectPropertyFormGenerator does not handle data properties."); } + //Custom error can also be represented as an exception above, but in this case + //we would like the page to enable the user to go back to the profile page + + customErrorMessages = getCustomErrorMessages(vreq); + if(customErrorMessages != null) { + return this.getCustomErrorEditConfiguration(vreq, session); + } + if( tooManyRangeOptions( vreq, session ) ){ tooManyRangeIndividuals = true; doAutoComplete = true; @@ -90,7 +101,7 @@ public class DefaultObjectPropertyFormGenerator implements EditConfigurationGene DefaultAddMissingIndividualFormGenerator generator = new DefaultAddMissingIndividualFormGenerator(); return generator.getEditConfiguration(vreq, session); } - + //TODO: Add a generator for delete: based on command being delete - propDelete.jsp //Generate a edit configuration for the default object property form and return it. //if(DefaultDeleteGenerator.isDelete( vreq,session)){ @@ -99,7 +110,21 @@ public class DefaultObjectPropertyFormGenerator implements EditConfigurationGene return getDefaultObjectEditConfiguration(vreq, session); } - protected List getRangeTypes(VitroRequest vreq) { + private String getCustomErrorMessages(VitroRequest vreq) { + String errorMessages = null; + String rangeUri = vreq.getParameter("rangeUri"); + VClass rangeVClass = null; + if(rangeUri != null && !rangeUri.isEmpty()) { + WebappDaoFactory ctxDaoFact = vreq.getLanguageNeutralWebappDaoFactory(); + rangeVClass = ctxDaoFact.getVClassDao().getVClassByURI(rangeUri); + } + if(rangeVClass == null) { + errorMessages = I18n.text(vreq,"the_range_class_does_not_exist"); + } + return errorMessages; + } + + protected List getRangeTypes(VitroRequest vreq) { // This first part needs a WebappDaoFactory with no filtering/RDFService // funny business because it needs to be able to retrieve anonymous union // classes by their "pseudo-bnode URIs". @@ -114,14 +139,18 @@ public class DefaultObjectPropertyFormGenerator implements EditConfigurationGene String rangeUri = EditConfigurationUtils.getRangeUri(vreq); if (rangeUri != null && !rangeUri.isEmpty()) { VClass rangeVClass = ctxDaoFact.getVClassDao().getVClassByURI(rangeUri); - if (!rangeVClass.isUnion()) { - types.add(rangeVClass); + if(rangeVClass != null) { + if (!rangeVClass.isUnion()) { + types.add(rangeVClass); + } else { + for (VClass unionComponent : rangeVClass.getUnionComponents()) { + types.add(unionComponent); + } + } + return types; } else { - for (VClass unionComponent : rangeVClass.getUnionComponents()) { - types.add(unionComponent); - } + log.error("Range VClass does not exist for " + rangeUri); } - return types; } WebappDaoFactory wDaoFact = vreq.getWebappDaoFactory(); //Get all vclasses applicable to subject @@ -238,6 +267,36 @@ public class DefaultObjectPropertyFormGenerator implements EditConfigurationGene return editConfiguration; } + + //We only need enough for the error message to show up + private EditConfigurationVTwo getCustomErrorEditConfiguration(VitroRequest vreq, HttpSession session) { + EditConfigurationVTwo editConfiguration = new EditConfigurationVTwo(); + + //process subject, predicate, object parameters + this.initProcessParameters(vreq, session, editConfiguration); + + this.setUrisAndLiteralsInScope(editConfiguration); + + //Sparql queries + this.setSparqlQueries(editConfiguration); + + + prepareForUpdate(vreq, session, editConfiguration); + + editConfiguration.setTemplate("customErrorMessages.ftl"); + + //Set edit key + setEditKey(editConfiguration, vreq); + + //if custom error messages is not null, then add to form specific data + if(customErrorMessages != null) { + //at this point, it shouldn't be null + HashMap formSpecificData = new HashMap(); + formSpecificData.put("customErrorMessages", customErrorMessages); + editConfiguration.setFormSpecificData(formSpecificData); + } + return editConfiguration; + } private void setEditKey(EditConfigurationVTwo editConfiguration, VitroRequest vreq) { String editKey = EditConfigurationUtils.getEditKey(vreq); @@ -458,6 +517,9 @@ public class DefaultObjectPropertyFormGenerator implements EditConfigurationGene objectSelect.add(editConfiguration.getVarNameForObject()); //TODO: Check if this is the proper way to do this? formSpecificData.put("objectSelect", objectSelect); + if(customErrorMessages != null && !customErrorMessages.isEmpty()) { + formSpecificData.put("customErrorMessages", customErrorMessages); + } editConfiguration.setFormSpecificData(formSpecificData); } @@ -494,6 +556,9 @@ public class DefaultObjectPropertyFormGenerator implements EditConfigurationGene formSpecificData.put("rangeIndividualsExist", rangeIndividualsExist(session,types) ); formSpecificData.put("sparqlForAcFilter", getSparqlForAcFilter(vreq)); + if(customErrorMessages != null && !customErrorMessages.isEmpty()) { + formSpecificData.put("customErrorMessages", customErrorMessages); + } editConfiguration.setTemplate(acObjectPropertyTemplate); editConfiguration.setFormSpecificData(formSpecificData); } diff --git a/webapp/web/templates/freemarker/edit/forms/customErrorMessages.ftl b/webapp/web/templates/freemarker/edit/forms/customErrorMessages.ftl new file mode 100644 index 000000000..0ce8ea511 --- /dev/null +++ b/webapp/web/templates/freemarker/edit/forms/customErrorMessages.ftl @@ -0,0 +1,8 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +<#--Assign variables from editConfig--> +<#assign customErrorMessages = editConfiguration.pageData.customErrorMessages!""/> +

${customErrorMessages}

+

+${i18n().return_to_profile} +

\ No newline at end of file