From c819d08ddc2a0f6c15f5f423f67bdd9e5d881726 Mon Sep 17 00:00:00 2001 From: Neil McErlean Date: Thu, 12 Feb 2009 16:17:32 +0000 Subject: [PATCH] Merged DEV/FORMS to HEAD (Merging r13070 through r13210) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@13211 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org/alfresco/repo/forms/FormData.java | 6 +- .../repo/forms/processor/NodeHandler.java | 55 +++++++++++++++++-- .../repo/forms/script/ScriptFormService.java | 23 ++++++-- 3 files changed, 73 insertions(+), 11 deletions(-) diff --git a/source/java/org/alfresco/repo/forms/FormData.java b/source/java/org/alfresco/repo/forms/FormData.java index cea48c5df7..b8d6560a3a 100644 --- a/source/java/org/alfresco/repo/forms/FormData.java +++ b/source/java/org/alfresco/repo/forms/FormData.java @@ -25,7 +25,7 @@ package org.alfresco.repo.forms; import java.io.InputStream; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.apache.commons.lang.NotImplementedException; @@ -44,7 +44,7 @@ public class FormData */ public FormData() { - this.data = new HashMap(8); + this.data = new LinkedHashMap(8); } /** @@ -82,6 +82,7 @@ public class FormData /* * @see java.lang.Object#toString() */ + @Override public String toString() { StringBuilder buffer = new StringBuilder(super.toString()); @@ -163,6 +164,7 @@ public class FormData /* * @see java.lang.Object#toString() */ + @Override public String toString() { StringBuilder buffer = new StringBuilder(super.toString()); diff --git a/source/java/org/alfresco/repo/forms/processor/NodeHandler.java b/source/java/org/alfresco/repo/forms/processor/NodeHandler.java index 4050990b24..1f8245674d 100644 --- a/source/java/org/alfresco/repo/forms/processor/NodeHandler.java +++ b/source/java/org/alfresco/repo/forms/processor/NodeHandler.java @@ -29,6 +29,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.alfresco.repo.forms.AssociationFieldDefinition; import org.alfresco.repo.forms.Form; @@ -36,6 +38,7 @@ import org.alfresco.repo.forms.FormData; import org.alfresco.repo.forms.FormException; import org.alfresco.repo.forms.PropertyFieldDefinition; import org.alfresco.repo.forms.AssociationFieldDefinition.Direction; +import org.alfresco.repo.forms.FormData.FieldData; import org.alfresco.repo.forms.PropertyFieldDefinition.FieldConstraint; import org.alfresco.service.cmr.dictionary.AssociationDefinition; import org.alfresco.service.cmr.dictionary.Constraint; @@ -71,6 +74,13 @@ public class NodeHandler extends AbstractHandler protected NodeService nodeService; protected DictionaryService dictionaryService; protected NamespaceService namespaceService; + + /** + * A regular expression which can be used to match property/association names. + * These names will look like "prop:cm:name". + * The pattern can also be used to extract the "cm" and the "name" parts. + */ + private Pattern propertyNamePattern = Pattern.compile("prop:(.*){1}?:(.*){1}?"); /** * Sets the node service @@ -131,14 +141,51 @@ public class NodeHandler extends AbstractHandler */ public void handlePersist(Object item, FormData data) { - if (logger.isDebugEnabled()) - logger.debug("Persisting form for: " + item + " with data: " + data); - // cast to the expected NodeRef representation NodeRef nodeRef = (NodeRef)item; - // TODO: persist data using node service + Map submittedProperties = extractSubmittedPropsFrom(data); + // The call to addProperties changes the repo values of those properties + // included in the Map, but leaves any other property values unchanged. + // + // Compare setProperties(..), which causes the deletion of properties that + // are not included in the Map. + this.nodeService.addProperties(nodeRef, submittedProperties); + } + + private Map extractSubmittedPropsFrom(FormData data) + { + Map result = new HashMap(); + for (String dataKey : data.getData().keySet()) + { + FieldData nextFieldData = data.getData().get(dataKey); + if (nextFieldData.isFile()) + { + //TODO Implement support for file-based submits. + } + else + { + String nextDataName = nextFieldData.getName(); + + Matcher m = this.propertyNamePattern.matcher(nextDataName); + // Only "prop:" properties are handled here + if (m.matches()) + { + String qNamePrefix = m.group(1); + String localName = m.group(2); + QName fullQName = QName.createQName(qNamePrefix, localName, namespaceService); + // These values are all Strings. The repo does most of the data + // conversion work for us. + Object nextDataObject = nextFieldData.getValue(); + + // This cast should be safe as all dataObjects are Strings. + result.put(fullQName, (Serializable)nextDataObject); + } + //TODO Implement support for "assoc:" properties. + } + } + return result; } /** diff --git a/source/java/org/alfresco/repo/forms/script/ScriptFormService.java b/source/java/org/alfresco/repo/forms/script/ScriptFormService.java index 04b6022206..fce5a1a0ad 100644 --- a/source/java/org/alfresco/repo/forms/script/ScriptFormService.java +++ b/source/java/org/alfresco/repo/forms/script/ScriptFormService.java @@ -29,6 +29,8 @@ import org.alfresco.repo.forms.FormData; import org.alfresco.repo.forms.FormService; import org.alfresco.repo.jscript.BaseScopableProcessorExtension; import org.alfresco.service.ServiceRegistry; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * Script object representing the form service. @@ -37,6 +39,7 @@ import org.alfresco.service.ServiceRegistry; */ public class ScriptFormService extends BaseScopableProcessorExtension { + private static Log logger = LogFactory.getLog(ScriptFormService.class); /** Service Registry */ private ServiceRegistry serviceRegistry; @@ -85,11 +88,21 @@ public class ScriptFormService extends BaseScopableProcessorExtension */ public void saveForm(String item, Object postData) { - FormData data = null; + FormData dataForFormService = null; + if (postData instanceof FormData) + { + dataForFormService = (FormData)postData; + // Note on data conversion. The Repo will handle conversion of String-based + // data into the types required by the model. + + //TODO Do we need special handling for submission of false booleans? + } + else + { + // TODO Need to add handling of other POST submit types here. JSON, args. + dataForFormService = new FormData(); + } - // convert the post data into a repo FormData object - data = new FormData(); - - formService.saveForm(item, data); + formService.saveForm(item, dataForFormService); } }