diff --git a/source/java/org/alfresco/repo/forms/FormServiceImplTest.java b/source/java/org/alfresco/repo/forms/FormServiceImplTest.java index 33be030634..2c3026fedc 100644 --- a/source/java/org/alfresco/repo/forms/FormServiceImplTest.java +++ b/source/java/org/alfresco/repo/forms/FormServiceImplTest.java @@ -490,7 +490,6 @@ public class FormServiceImplTest extends BaseAlfrescoSpringTest Date modifiedDate = (Date)data.getFieldData(modifiedField.getDataKeyName()).getValue(); assertNotNull("Expecting to find modified date", modifiedDate); - assertTrue("Expecting modified field to return a Date", (modifiedDate instanceof Date)); Calendar calTestValue = Calendar.getInstance(); calTestValue.setTime(VALUE_SENT_DATE); diff --git a/source/java/org/alfresco/repo/forms/processor/workflow/AbstractWorkflowFormProcessor.java b/source/java/org/alfresco/repo/forms/processor/workflow/AbstractWorkflowFormProcessor.java new file mode 100644 index 0000000000..3e92f7f96d --- /dev/null +++ b/source/java/org/alfresco/repo/forms/processor/workflow/AbstractWorkflowFormProcessor.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +package org.alfresco.repo.forms.processor.workflow; + +import java.util.List; + +import org.alfresco.repo.forms.Form; +import org.alfresco.repo.forms.FormData; +import org.alfresco.repo.forms.FormData.FieldData; +import org.alfresco.repo.forms.processor.FormCreationData; +import org.alfresco.repo.forms.processor.node.ContentModelFormProcessor; +import org.alfresco.repo.forms.processor.node.ItemData; +import org.alfresco.repo.workflow.WorkflowModel; +import org.alfresco.service.cmr.workflow.WorkflowService; + +/** + * @author Nick Smith + * + */ +public abstract class AbstractWorkflowFormProcessor extends ContentModelFormProcessor +{ + /** WorkflowService */ + protected WorkflowService workflowService; + + @Override + protected void populateForm(Form form, List fields, FormCreationData data) + { + super.populateForm(form, fields, data); + + // Add package actions to FormData. + ItemData itemData = (ItemData) data.getItemData(); + addPropertyDataIfRequired(WorkflowModel.PROP_PACKAGE_ACTION_GROUP, form, itemData); + addPropertyDataIfRequired(WorkflowModel.PROP_PACKAGE_ITEM_ACTION_GROUP, form, itemData); + } + + + /* (non-Javadoc) + * @see org.alfresco.repo.forms.processor.FilteredFormProcessor#internalPersist(java.lang.Object, org.alfresco.repo.forms.FormData) + */ + @Override + protected PersistType internalPersist(ItemType item, FormData data) + { + ContentModelFormPersister persister = makeFormPersister(item); + for (FieldData fieldData : data) + { + persister.addField(fieldData); + } + return persister.persist(); + } + + /** + * @param workflowService the workflowService to set + */ + public void setWorkflowService(WorkflowService workflowService) + { + this.workflowService = workflowService; + } + + protected abstract ContentModelFormPersister makeFormPersister(ItemType item); + +} diff --git a/source/java/org/alfresco/repo/forms/processor/workflow/ContentModelFormPersister.java b/source/java/org/alfresco/repo/forms/processor/workflow/ContentModelFormPersister.java new file mode 100644 index 0000000000..fcc9d6e359 --- /dev/null +++ b/source/java/org/alfresco/repo/forms/processor/workflow/ContentModelFormPersister.java @@ -0,0 +1,194 @@ +/* + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +package org.alfresco.repo.forms.processor.workflow; + +import java.io.Serializable; +import java.util.List; + +import org.alfresco.repo.forms.FormData.FieldData; +import org.alfresco.repo.forms.processor.node.ItemData; +import org.alfresco.service.cmr.dictionary.DictionaryService; +import org.alfresco.service.cmr.dictionary.PropertyDefinition; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + + +/** + * @author Nick Smith + * + */ +public abstract class ContentModelFormPersister implements FormPersister +{ + /** + * Default Logger. + */ + private static final Log LOGGER= LogFactory.getLog(ContentModelFormPersister.class); + + protected final static TypedPropertyValueGetter valueGetter = new TypedPropertyValueGetter(); + protected final DataKeyMatcher keyMatcher; + protected final DictionaryService dictionaryService; + protected final Log logger; + protected final ItemData itemData; + + public ContentModelFormPersister(ItemData itemData, NamespaceService namespaceService, DictionaryService dictionaryService, Log logger) + { + this.dictionaryService= dictionaryService; + this.logger = logger==null ? LOGGER : logger; + this.keyMatcher = new DataKeyMatcher(namespaceService); + this.itemData = itemData; + } + + /* (non-Javadoc) + * @see org.alfresco.repo.forms.processor.workflow.FormPersister#addField(java.lang.String, java.lang.Object) + */ + public void addField(FieldData fieldData) + { + String dataKeyName = fieldData.getName(); + DataKeyInfo keyInfo = keyMatcher.match(dataKeyName); + if (keyInfo == null) + { + logIgnore(fieldData); + } + else + { + boolean wasApplied = persistField(fieldData, keyInfo); + if(wasApplied == false) + { + logIgnore(fieldData); + } + } + } + + private boolean persistField(FieldData fieldData, DataKeyInfo keyInfo) + { + switch(keyInfo.getFieldType()) + { + case PROPERTY: + return addProperty(keyInfo.getQName(), fieldData); + case TRANSIENT_PROPERTY: + return addTransientProperty(keyInfo.getFieldName(), fieldData); + default: // Handle properties + return changeAssociation(keyInfo, fieldData); + } + } + + protected boolean addTransientProperty(String fieldName, FieldData fieldData) + { + return false; + } + + protected boolean changeTransientAssociation(String fieldName, List values, boolean add) + { + if(add) + { + return addTransientAssociation(fieldName, values); + } + else + { + return removeTransientAssociation(fieldName, values); + } + } + + protected boolean removeTransientAssociation(String fieldName, List values) + { + return false; + } + + protected boolean addTransientAssociation(String fieldName, List values) + { + return false; + } + + protected boolean addProperty(QName qName, FieldData fieldData) + { + Object rawValue = fieldData.getValue(); + Serializable value = getPropertyValueToPersist(qName, rawValue); + return updateProperty(qName, value); + } + + protected Serializable getPropertyValueToPersist(QName qName, Object value) + { + PropertyDefinition propDef = itemData.getPropertyDefinition(qName); + if (propDef == null) + { + propDef = dictionaryService.getProperty(qName); + } + if (propDef != null) + { + return valueGetter.getValue(value, propDef); + } + return (Serializable) value; + } + + protected boolean changeAssociation(DataKeyInfo info, FieldData fieldData) + { + Object rawValue = fieldData.getValue(); + if (rawValue instanceof String) + { + List values = NodeRef.getNodeRefs((String)rawValue, LOGGER); + if (values.isEmpty()==false) + { + boolean add = info.isAdd(); + if(info.getFieldType() == FieldType.ASSOCIATION) + { + return changeAssociation(info.getQName(), values, add); + } + else + { + return changeTransientAssociation(info.getFieldName(), values, add); + } + } + } + return false; + } + + private boolean changeAssociation(QName qName, List values, boolean add) + { + if(add) + { + return addAssociation(qName, values); + } + else + { + return removeAssociation(qName, values); + } + } + + protected void logIgnore(FieldData fieldData) + { + if(logger.isDebugEnabled()) + logger.debug("Ignoring unrecognized field: " + fieldData.getName()); + } + + /* (non-Javadoc) + * @see org.alfresco.repo.forms.processor.workflow.FormPersister#persist() + */ + public abstract T persist(); + + protected abstract boolean removeAssociation(QName qName, List values); + + protected abstract boolean addAssociation(QName qName, List values); + + protected abstract boolean updateProperty(QName qName, Serializable value); + +} diff --git a/source/java/org/alfresco/repo/forms/processor/workflow/FormPersister.java b/source/java/org/alfresco/repo/forms/processor/workflow/FormPersister.java new file mode 100644 index 0000000000..2c12ba3db1 --- /dev/null +++ b/source/java/org/alfresco/repo/forms/processor/workflow/FormPersister.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +package org.alfresco.repo.forms.processor.workflow; + +import org.alfresco.repo.forms.FormData.FieldData; + + +/** + * @author Nick Smith + * + */ +public interface FormPersister +{ + + + void addField(FieldData fieldData); + + T persist(); +} diff --git a/source/java/org/alfresco/repo/forms/processor/workflow/TaskFormPersister.java b/source/java/org/alfresco/repo/forms/processor/workflow/TaskFormPersister.java new file mode 100644 index 0000000000..fe31493066 --- /dev/null +++ b/source/java/org/alfresco/repo/forms/processor/workflow/TaskFormPersister.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +package org.alfresco.repo.forms.processor.workflow; + +import java.io.Serializable; +import java.util.List; + +import org.alfresco.repo.forms.processor.node.ItemData; +import org.alfresco.service.cmr.dictionary.DictionaryService; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.workflow.WorkflowService; +import org.alfresco.service.cmr.workflow.WorkflowTask; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; +import org.apache.commons.logging.Log; + +/** + * @author Nick Smith + * + */ +public class TaskFormPersister extends ContentModelFormPersister +{ + private final TaskUpdater updater; + + public TaskFormPersister(ItemData itemData, + NamespaceService namespaceService, + DictionaryService dictionaryService, + WorkflowService workflowService, + Log logger) + { + super(itemData, namespaceService, dictionaryService, logger); + WorkflowTask item = itemData.getItem(); + this.updater = new TaskUpdater(item.id, workflowService); + } + + /* (non-Javadoc) + * @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#addAssociation(org.alfresco.service.namespace.QName, java.util.List) + */ + @Override + protected boolean addAssociation(QName qName, List values) + { + updater.addAssociation(qName, values); + return true; + } + + + /* (non-Javadoc) + * @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#removeAssociation(org.alfresco.service.namespace.QName, java.util.List) + */ + @Override + protected boolean removeAssociation(QName qName, List values) + { + updater.removeAssociation(qName, values); + return true; + } + + /* (non-Javadoc) + * @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#updateProperty(org.alfresco.service.namespace.QName, java.io.Serializable) + */ + @Override + protected boolean updateProperty(QName qName, Serializable value) + { + updater.addProperty(qName, value); + return true; + } + + /* (non-Javadoc) + * @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#persist() + */ + @Override + public WorkflowTask persist() + { + return updater.update(); + } + +} diff --git a/source/java/org/alfresco/repo/forms/processor/workflow/TaskFormProcessor.java b/source/java/org/alfresco/repo/forms/processor/workflow/TaskFormProcessor.java index aa7d18b17b..66bceb50fb 100644 --- a/source/java/org/alfresco/repo/forms/processor/workflow/TaskFormProcessor.java +++ b/source/java/org/alfresco/repo/forms/processor/workflow/TaskFormProcessor.java @@ -30,16 +30,12 @@ import java.util.List; import java.util.Map; import org.alfresco.repo.forms.Form; -import org.alfresco.repo.forms.FormData; import org.alfresco.repo.forms.Item; -import org.alfresco.repo.forms.FormData.FieldData; import org.alfresco.repo.forms.processor.FieldProcessorRegistry; import org.alfresco.repo.forms.processor.FormCreationData; -import org.alfresco.repo.forms.processor.node.ContentModelFormProcessor; import org.alfresco.repo.forms.processor.node.ItemData; import org.alfresco.repo.workflow.WorkflowModel; import org.alfresco.service.cmr.dictionary.DictionaryService; -import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.service.cmr.dictionary.TypeDefinition; import org.alfresco.service.cmr.workflow.WorkflowService; import org.alfresco.service.cmr.workflow.WorkflowTask; @@ -52,14 +48,10 @@ import org.apache.commons.logging.LogFactory; /** * @author Nick Smith */ -public class TaskFormProcessor extends ContentModelFormProcessor +public class TaskFormProcessor extends AbstractWorkflowFormProcessor { /** Logger */ private static final Log LOGGER = LogFactory.getLog(TaskFormProcessor.class); - - private TypedPropertyValueGetter valueGetter; - private DataKeyMatcher keyMatcher; - private WorkflowService workflowService; // Constructor for Spring public TaskFormProcessor() @@ -75,8 +67,6 @@ public class TaskFormProcessor extends ContentModelFormProcessor itemData = makeItemData(task); - for (FieldData fieldData : data) - { - addFieldToSerialize(updater, itemData, fieldData); - } - return updater.update(); - } - - private void addFieldToSerialize(TaskUpdater updater, - ItemData itemData, - FieldData fieldData) - { - String name = fieldData.getName(); - DataKeyInfo keyInfo = keyMatcher.match(name); - if (keyInfo == null || - FieldType.TRANSIENT_PROPERTY == keyInfo.getFieldType() ) - { - if(LOGGER.isDebugEnabled()) - LOGGER.debug("Ignoring unrecognized field: " + name); - return; - } - - QName fullName = keyInfo.getQName(); - Object rawValue = fieldData.getValue(); - if (FieldType.PROPERTY == keyInfo.getFieldType()) - { - Serializable propValue = getPropertyValueToPersist(fullName, rawValue, itemData); - // TODO What if the user wants to set prop to null? - if (propValue != null) - { - updater.addProperty(fullName, propValue); - } - } - else if (FieldType.ASSOCIATION == keyInfo.getFieldType()) - { - if (rawValue instanceof String) - { - updater.changeAssociation(fullName, (String) rawValue, keyInfo.isAdd()); - } - } - } - - private Serializable getPropertyValueToPersist(QName fullName, - Object value, - ItemData itemData) - { - PropertyDefinition propDef = itemData.getPropertyDefinition(fullName); - if (propDef == null) - { - propDef = dictionaryService.getProperty(fullName); - } - if (propDef != null) - { - return valueGetter.getValue(value, propDef); - } - return (Serializable) value; - } - /* * (non-Javadoc) * @@ -224,36 +152,13 @@ public class TaskFormProcessor extends ContentModelFormProcessor makeFormPersister(WorkflowTask item) { - super.setDictionaryService(dictionaryService); - this.valueGetter = new TypedPropertyValueGetter(dictionaryService); + ItemData itemData = makeItemData(item); + return new TaskFormPersister(itemData, namespaceService, dictionaryService, workflowService, LOGGER); } } diff --git a/source/java/org/alfresco/repo/forms/processor/workflow/TypedPropertyValueGetter.java b/source/java/org/alfresco/repo/forms/processor/workflow/TypedPropertyValueGetter.java index c28b91b037..822fb023f1 100644 --- a/source/java/org/alfresco/repo/forms/processor/workflow/TypedPropertyValueGetter.java +++ b/source/java/org/alfresco/repo/forms/processor/workflow/TypedPropertyValueGetter.java @@ -31,11 +31,8 @@ import java.util.Arrays; import java.util.List; import org.alfresco.repo.forms.FormException; -import org.alfresco.repo.forms.processor.node.ItemData; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; -import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.dictionary.PropertyDefinition; -import org.alfresco.service.namespace.QName; import org.json.JSONArray; import org.json.JSONException; import org.springframework.extensions.surf.util.I18NUtil; @@ -47,27 +44,6 @@ public class TypedPropertyValueGetter { public static final String ON = "on"; - private final DictionaryService dictionaryService; - - public TypedPropertyValueGetter(DictionaryService dictionaryService) - { - this.dictionaryService = dictionaryService; - } - - public Serializable getPropertyValueToPersist(QName fullName, Object value, ItemData itemData) - { - PropertyDefinition propDef = itemData.getPropertyDefinition(fullName); - if (propDef == null) - { - propDef = dictionaryService.getProperty(fullName); - } - if (propDef != null) - { - return getValue(value, propDef); - } - return (Serializable) value; - } - public Serializable getValue(Object value, PropertyDefinition propDef) { if (value == null) diff --git a/source/java/org/alfresco/repo/forms/processor/workflow/WorkflowBuilder.java b/source/java/org/alfresco/repo/forms/processor/workflow/WorkflowBuilder.java index 3adaa59b40..5a0fe74407 100644 --- a/source/java/org/alfresco/repo/forms/processor/workflow/WorkflowBuilder.java +++ b/source/java/org/alfresco/repo/forms/processor/workflow/WorkflowBuilder.java @@ -71,9 +71,12 @@ public class WorkflowBuilder params.put(name, value); } - public void addAssociationParameter(QName name, Serializable value) + public void addAssociationParameter(QName name, List values) { - params.put(name, value); + if(values instanceof Serializable) + { + params.put(name, (Serializable) values); + } } public void addPackageItems(List items) diff --git a/source/java/org/alfresco/repo/forms/processor/workflow/WorkflowFormPersister.java b/source/java/org/alfresco/repo/forms/processor/workflow/WorkflowFormPersister.java new file mode 100644 index 0000000000..d9a2387f4b --- /dev/null +++ b/source/java/org/alfresco/repo/forms/processor/workflow/WorkflowFormPersister.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +package org.alfresco.repo.forms.processor.workflow; + +import java.io.Serializable; +import java.util.List; + +import org.alfresco.repo.forms.processor.node.ItemData; +import org.alfresco.service.cmr.dictionary.DictionaryService; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.workflow.WorkflowDefinition; +import org.alfresco.service.cmr.workflow.WorkflowInstance; +import org.alfresco.service.cmr.workflow.WorkflowService; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; +import org.apache.commons.logging.Log; + +/** + * @author Nick Smith + * + */ +public class WorkflowFormPersister extends ContentModelFormPersister +{ + private final WorkflowBuilder builder; + + public WorkflowFormPersister(ItemData itemData, + NamespaceService namespaceService, + DictionaryService dictionaryService, + WorkflowService workflowService, + NodeService nodeService, + Log logger) + { + super(itemData, namespaceService, dictionaryService, logger); + WorkflowDefinition definition = (WorkflowDefinition) itemData.getItem(); + this.builder = new WorkflowBuilder(definition, workflowService, nodeService); + } + + /* (non-Javadoc) + * @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#addAssociation(org.alfresco.service.namespace.QName, java.util.List) + */ + @Override + protected boolean addAssociation(QName qName, List values) + { + builder.addAssociationParameter(qName, values); + return true; + } + + /* (non-Javadoc) + * @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#persist() + */ + @Override + public WorkflowInstance persist() + { + return builder.build(); + } + + /* (non-Javadoc) + * @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#removeAssociation(org.alfresco.service.namespace.QName, java.util.List) + */ + @Override + protected boolean removeAssociation(QName qName, List values) + { + // Do nothing! + return false; + } + + /* (non-Javadoc) + * @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#updateProperty(org.alfresco.service.namespace.QName, java.io.Serializable) + */ + @Override + protected boolean updateProperty(QName qName, Serializable value) + { + builder.addParameter(qName, value); + return true; + } + + /* (non-Javadoc) + * @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#addTransientAssociation(java.lang.String, java.util.List) + */ + @Override + protected boolean addTransientAssociation(String fieldName, List values) + { + if(PackageItemsFieldProcessor.KEY.equals(fieldName)) + { + builder.addPackageItems(values); + return true; + } + return false; + } +} diff --git a/source/java/org/alfresco/repo/forms/processor/workflow/WorkflowFormProcessor.java b/source/java/org/alfresco/repo/forms/processor/workflow/WorkflowFormProcessor.java index 0a72fd406c..af3ee1b597 100644 --- a/source/java/org/alfresco/repo/forms/processor/workflow/WorkflowFormProcessor.java +++ b/source/java/org/alfresco/repo/forms/processor/workflow/WorkflowFormProcessor.java @@ -20,28 +20,16 @@ package org.alfresco.repo.forms.processor.workflow; import java.io.Serializable; import java.util.Collections; -import java.util.List; import java.util.Map; import java.util.regex.Matcher; -import org.alfresco.repo.forms.Form; -import org.alfresco.repo.forms.FormData; -import org.alfresco.repo.forms.FormException; import org.alfresco.repo.forms.FormNotFoundException; import org.alfresco.repo.forms.Item; -import org.alfresco.repo.forms.FormData.FieldData; -import org.alfresco.repo.forms.processor.FormCreationData; -import org.alfresco.repo.forms.processor.node.ContentModelFormProcessor; import org.alfresco.repo.forms.processor.node.ItemData; -import org.alfresco.repo.workflow.WorkflowModel; -import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.dictionary.TypeDefinition; -import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.workflow.WorkflowDefinition; import org.alfresco.service.cmr.workflow.WorkflowInstance; -import org.alfresco.service.cmr.workflow.WorkflowService; import org.alfresco.service.cmr.workflow.WorkflowTaskDefinition; -import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -52,34 +40,11 @@ import org.apache.commons.logging.LogFactory; * * @author Nick Smith */ -public class WorkflowFormProcessor extends ContentModelFormProcessor +public class WorkflowFormProcessor extends AbstractWorkflowFormProcessor { /** Logger */ private final static Log logger = LogFactory.getLog(WorkflowFormProcessor.class); - /** WorkflowService */ - private WorkflowService workflowService; - - /** TyepdPropertyValueGetter */ - private TypedPropertyValueGetter valueGetter; - - private DataKeyMatcher keyMatcher; - - - /* (non-Javadoc) - * @see org.alfresco.repo.forms.processor.FilteredFormProcessor#generateFields(org.alfresco.repo.forms.Form, java.util.List, org.alfresco.repo.forms.processor.FormCreationData) - */ - @Override - protected void populateForm(Form form, List fields, FormCreationData data) - { - super.populateForm(form, fields, data); - - // Add package actions to FormData. - ItemData itemData = (ItemData) data.getItemData(); - addPropertyDataIfRequired(WorkflowModel.PROP_PACKAGE_ACTION_GROUP, form, itemData); - addPropertyDataIfRequired(WorkflowModel.PROP_PACKAGE_ITEM_ACTION_GROUP, form, itemData); - } - /* (non-Javadoc) * @see org.alfresco.repo.forms.processor.node.ContentModelFormProcessor#getAssociationValues(java.lang.Object) */ @@ -197,126 +162,13 @@ public class WorkflowFormProcessor extends ContentModelFormProcessor makeFormPersister(WorkflowDefinition item) { - WorkflowBuilder builder = new WorkflowBuilder(definition, workflowService, nodeService); - ItemData itemData = makeItemData(definition); - for (FieldData fieldData : data) - { - addFieldToSerialize(builder, itemData, fieldData); - } - return builder.build(); - } - - private void addFieldToSerialize(WorkflowBuilder builder, ItemData itemData, FieldData fieldData) - { - String dataKeyName = fieldData.getName(); - DataKeyInfo keyInfo = keyMatcher.match(dataKeyName); - if (keyInfo == null || - FieldType.TRANSIENT_PROPERTY == keyInfo.getFieldType() ) - { - if(logger.isDebugEnabled()) - logger.debug("Ignoring unrecognized field: " + dataKeyName); - return; - } - WorkflowDataKeyInfoVisitor visitor = new WorkflowDataKeyInfoVisitor(fieldData.getValue(), builder, itemData); - keyInfo.visit(visitor); - } - - /** - * @param workflowService the workflowService to set - */ - public void setWorkflowService(WorkflowService workflowService) - { - this.workflowService = workflowService; - } - - /* (non-Javadoc) - * @see org.alfresco.repo.forms.processor.node.ContentModelFormProcessor#setNamespaceService(org.alfresco.service.namespace.NamespaceService) - */ - @Override - public void setNamespaceService(NamespaceService namespaceService) - { - super.setNamespaceService(namespaceService); - this.keyMatcher = new DataKeyMatcher(namespaceService); - } - - /* (non-Javadoc) - * @see org.alfresco.repo.forms.processor.node.ContentModelFormProcessor#setDictionaryService(org.alfresco.service.cmr.dictionary.DictionaryService) - */ - @Override - public void setDictionaryService(DictionaryService dictionaryService) - { - super.setDictionaryService(dictionaryService); - this.valueGetter = new TypedPropertyValueGetter(dictionaryService); - } - - private class WorkflowDataKeyInfoVisitor implements DataKeyInfoVisitor - { - private final Object rawValue; - private final WorkflowBuilder builder; - private final ItemData itemData; - - public WorkflowDataKeyInfoVisitor(Object rawValue, WorkflowBuilder builder, - ItemData itemData) - { - this.rawValue = rawValue; - this.builder = builder; - this.itemData = itemData; - } - - /* (non-Javadoc) - * @see org.alfresco.repo.forms.processor.workflow.DataKeyInfoVisitor#visitAssociation(org.alfresco.repo.forms.processor.workflow.DataKeyInfo) - */ - public Void visitAssociation(DataKeyInfo info) - { - QName qName = info.getQName(); - if (rawValue instanceof String) - { - Serializable nodes = (Serializable) NodeRef.getNodeRefs((String) rawValue); - builder.addParameter(qName, nodes); - } - return null; - } - - /* (non-Javadoc) - * @see org.alfresco.repo.forms.processor.workflow.DataKeyInfoVisitor#visitProperty(org.alfresco.repo.forms.processor.workflow.DataKeyInfo) - */ - public Void visitProperty(DataKeyInfo info) - { - QName qName = info.getQName(); - Serializable propValue = valueGetter.getPropertyValueToPersist(qName, rawValue, itemData); - builder.addParameter(qName, propValue); - return null; - } - - /* (non-Javadoc) - * @see org.alfresco.repo.forms.processor.workflow.DataKeyInfoVisitor#visitTransientAssociation(org.alfresco.repo.forms.processor.workflow.DataKeyInfo) - */ - public Void visitTransientAssociation(DataKeyInfo info) - { - if(PackageItemsFieldProcessor.KEY.equals(info.getFieldName())) - { - if(rawValue instanceof String) - { - builder.addPackageItems((String)rawValue); - } - } - return null; - } - - /* (non-Javadoc) - * @see org.alfresco.repo.forms.processor.workflow.DataKeyInfoVisitor#visitTransientProperty(org.alfresco.repo.forms.processor.workflow.DataKeyInfo) - */ - public Void visitTransientProperty(DataKeyInfo info) - { - throw new FormException("This methdo should never be called!"); - } - + ItemData itemData = makeItemData(item); + return new WorkflowFormPersister(itemData, namespaceService, dictionaryService, workflowService, nodeService, logger); } }