From 5d2143cfe51ab5c35ca3e70f1b254085dccb94c5 Mon Sep 17 00:00:00 2001 From: N Smith Date: Tue, 20 Jul 2010 14:34:23 +0000 Subject: [PATCH] Added Package/PackageItem Action Group data to Workflow and Task FormProcessors. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@21307 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/form-services-context.xml | 1 - source/java/org/alfresco/repo/forms/Form.java | 14 +++ .../processor/FilteredFormProcessor.java | 9 +- .../node/ContentModelFormProcessor.java | 19 +++ .../node/MockClassAttributeDefinition.java | 11 +- .../node/PropertyFieldProcessor.java | 14 ++- .../processor/workflow/TaskFormProcessor.java | 15 +++ .../workflow/TaskFormProcessorTest.java | 33 ++++- .../workflow/WorkflowFormProcessor.java | 119 +++--------------- .../workflow/WorkflowFormProcessorTest.java | 29 +++++ 10 files changed, 155 insertions(+), 109 deletions(-) create mode 100644 source/java/org/alfresco/repo/forms/processor/workflow/WorkflowFormProcessorTest.java diff --git a/config/alfresco/form-services-context.xml b/config/alfresco/form-services-context.xml index a7869618c5..c4c92a2a69 100644 --- a/config/alfresco/form-services-context.xml +++ b/config/alfresco/form-services-context.xml @@ -158,7 +158,6 @@ class="org.alfresco.repo.forms.processor.workflow.WorkflowFormProcessor" parent="baseFormProcessor"> - workflow diff --git a/source/java/org/alfresco/repo/forms/Form.java b/source/java/org/alfresco/repo/forms/Form.java index f8d3e51b96..2b7d824020 100644 --- a/source/java/org/alfresco/repo/forms/Form.java +++ b/source/java/org/alfresco/repo/forms/Form.java @@ -22,6 +22,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import org.alfresco.repo.forms.FormData.FieldData; + /** * Data representation of a form to be displayed in the UI. * @@ -168,6 +170,18 @@ public class Form { this.data = data; } + + /** + * Returns true if the Form contains {@link FieldData} for the + * specified dataKey. + * + * @param dataKey The dataKey for the field. + * @return + */ + public boolean dataExists(String dataKey) + { + return data.getFieldNames().contains(dataKey); + } /** * Adds some data to be displayed by the form diff --git a/source/java/org/alfresco/repo/forms/processor/FilteredFormProcessor.java b/source/java/org/alfresco/repo/forms/processor/FilteredFormProcessor.java index 0ce5bdef46..d616c4d9d8 100644 --- a/source/java/org/alfresco/repo/forms/processor/FilteredFormProcessor.java +++ b/source/java/org/alfresco/repo/forms/processor/FilteredFormProcessor.java @@ -156,6 +156,13 @@ public abstract class FilteredFormProcessor extends Abstr Object itemData = makeItemData(item); FormCreationData data = new FormCreationData(itemData, forcedFields, context); + populateForm(form, fields, data); + if (log.isDebugEnabled()) // + log.debug("Generated form: " + form); + } + + protected void populateForm(Form form, List fields, FormCreationData data) + { List fieldsToAdd; if (fields != null && fields.size() > 0) { @@ -166,8 +173,6 @@ public abstract class FilteredFormProcessor extends Abstr fieldsToAdd = generateDefaultFields(data); } form.addFields(fieldsToAdd); - if (log.isDebugEnabled()) // - log.debug("Generated form: " + form); } /** diff --git a/source/java/org/alfresco/repo/forms/processor/node/ContentModelFormProcessor.java b/source/java/org/alfresco/repo/forms/processor/node/ContentModelFormProcessor.java index 8e5e5cc4a1..6a09536954 100644 --- a/source/java/org/alfresco/repo/forms/processor/node/ContentModelFormProcessor.java +++ b/source/java/org/alfresco/repo/forms/processor/node/ContentModelFormProcessor.java @@ -31,6 +31,7 @@ import java.util.regex.Pattern; import org.alfresco.model.ContentModel; import org.alfresco.repo.forms.Field; +import org.alfresco.repo.forms.Form; import org.alfresco.repo.forms.FormData; import org.alfresco.repo.forms.FormException; import org.alfresco.repo.forms.FormData.FieldData; @@ -197,6 +198,24 @@ public abstract class ContentModelFormProcessor extends this.contentService = contentService; } + protected void addPropertyDataIfRequired(QName propName, Form form, ItemData itemData) + { + String dataKey = makePropDataKey(propName); + if(form.dataExists(dataKey)== false) + { + PropertyFieldProcessor processor = new PropertyFieldProcessor(namespaceService, dictionaryService); + Object value = processor.getValue(propName, itemData); + form.addData(dataKey, value); + } + } + + private String makePropDataKey(QName propName) + { + String propPrefixName = propName.toPrefixString(namespaceService); + String dataKey = FormFieldConstants.PROP_DATA_PREFIX + propPrefixName.replace(':', '_'); + return dataKey; + } + @Override protected List generateDefaultFields(FormCreationData data) { diff --git a/source/java/org/alfresco/repo/forms/processor/node/MockClassAttributeDefinition.java b/source/java/org/alfresco/repo/forms/processor/node/MockClassAttributeDefinition.java index fe6a7f28b0..cd3892180a 100644 --- a/source/java/org/alfresco/repo/forms/processor/node/MockClassAttributeDefinition.java +++ b/source/java/org/alfresco/repo/forms/processor/node/MockClassAttributeDefinition.java @@ -25,7 +25,8 @@ package org.alfresco.repo.forms.processor.node; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.util.List; @@ -76,6 +77,14 @@ public class MockClassAttributeDefinition implements PropertyDefinition, Associa mockDataTypeName(dataTypeName, mock); return mock; } + + public static MockClassAttributeDefinition mockPropertyDefinition(QName name, QName dataTypeName, String defaultValue) + { + MockClassAttributeDefinition mock = new MockClassAttributeDefinition(name); + mockDataTypeName(dataTypeName, mock); + mock.defaultValue = defaultValue; + return mock; + } public static MockClassAttributeDefinition mockPropertyDefinition(QName name,// QName dataTypeName,// diff --git a/source/java/org/alfresco/repo/forms/processor/node/PropertyFieldProcessor.java b/source/java/org/alfresco/repo/forms/processor/node/PropertyFieldProcessor.java index ac30e228dd..5b47afcadf 100644 --- a/source/java/org/alfresco/repo/forms/processor/node/PropertyFieldProcessor.java +++ b/source/java/org/alfresco/repo/forms/processor/node/PropertyFieldProcessor.java @@ -94,12 +94,12 @@ public class PropertyFieldProcessor extends QNameFieldProcessor data) + public Object getValue(QName name, ItemData data) { Serializable value = data.getPropertyValue(name); if (value == null) { - return null; + return getDefaultValue(name, data); } if (value instanceof Collection) @@ -121,6 +121,16 @@ public class PropertyFieldProcessor extends QNameFieldProcessor data) + { + PropertyDefinition propDef = data.getPropertyDefinition(name); + if(propDef !=null) + { + return propDef.getDefaultValue(); + } + return null; + } + private PropertyFieldDefinition makePropertyFieldDefinition(final PropertyDefinition propDef, FieldGroup group) { String name = getPrefixedName(propDef); 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 3a0b9afd2a..aa7d18b17b 100644 --- a/source/java/org/alfresco/repo/forms/processor/workflow/TaskFormProcessor.java +++ b/source/java/org/alfresco/repo/forms/processor/workflow/TaskFormProcessor.java @@ -26,14 +26,18 @@ package org.alfresco.repo.forms.processor.workflow; import java.io.Serializable; +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; @@ -84,6 +88,17 @@ public class TaskFormProcessor extends ContentModelFormProcessor 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); + } + @Override protected WorkflowTask internalPersist(WorkflowTask task, FormData data) { diff --git a/source/java/org/alfresco/repo/forms/processor/workflow/TaskFormProcessorTest.java b/source/java/org/alfresco/repo/forms/processor/workflow/TaskFormProcessorTest.java index 141a85620e..12328c0996 100644 --- a/source/java/org/alfresco/repo/forms/processor/workflow/TaskFormProcessorTest.java +++ b/source/java/org/alfresco/repo/forms/processor/workflow/TaskFormProcessorTest.java @@ -146,6 +146,7 @@ public class TaskFormProcessorTest extends TestCase fields = Arrays.asList(fullPropertyName); form = processForm(fields); checkSingleProperty(form, fieldName, WorkflowTaskState.IN_PROGRESS); + checkPackageActionGroups(form.getFormData()); } public void testGenerateSingleAssociation() @@ -163,6 +164,7 @@ public class TaskFormProcessorTest extends TestCase fields = Arrays.asList(fullAssociationName); form = processForm(fields); checkSingleAssociation(form, fieldName, fieldData); + checkPackageActionGroups(form.getFormData()); } public void testIgnoresUnknownFields() throws Exception @@ -172,22 +174,25 @@ public class TaskFormProcessorTest extends TestCase List fields = Arrays.asList(fakeFieldName, statusFieldName); Form form = processForm(fields); checkSingleProperty(form, statusFieldName, WorkflowTaskState.IN_PROGRESS); + checkPackageActionGroups(form.getFormData()); } public void testGenerateDefaultForm() throws Exception { Form form = processForm(null); List fieldDefs = form.getFieldDefinitionNames(); - assertEquals(6, fieldDefs.size()); + assertEquals(8, fieldDefs.size()); assertTrue(fieldDefs.contains(ASSIGNEE_NAME.toPrefixString(namespaceService))); assertTrue(fieldDefs.contains(ACTORS_NAME.toPrefixString(namespaceService))); assertTrue(fieldDefs.contains(DESC_NAME.toPrefixString(namespaceService))); assertTrue(fieldDefs.contains(STATUS_NAME.toPrefixString(namespaceService))); + Serializable fieldData = (Serializable) Arrays.asList(FAKE_NODE.toString()); FormData formData = form.getFormData(); - assertEquals(4, formData.getNumberOfFields()); + assertEquals(6, formData.getNumberOfFields()); assertEquals(fieldData, formData.getFieldData("assoc_bpm_assignee").getValue()); + checkPackageActionGroups(formData); assertEquals(WorkflowTaskState.IN_PROGRESS, formData.getFieldData("prop_bpm_status").getValue()); } @@ -310,6 +315,16 @@ public class TaskFormProcessorTest extends TestCase return form; } + private void checkPackageActionGroups(FormData formData) + { + FieldData pckgActionData = formData.getFieldData("prop_bpm_packageActionGroup"); + assertNotNull(pckgActionData); + assertEquals("", pckgActionData.getValue()); + FieldData pckgItemActionData = formData.getFieldData("prop_bpm_packageItemActionGroup"); + assertNotNull(pckgItemActionData); + assertEquals("read_package_item_actions", pckgItemActionData.getValue()); + } + private void checkSingleProperty(Form form, String fieldName, Serializable fieldData) { checkSingleField(form, fieldName, fieldData, "prop_"); @@ -441,6 +456,18 @@ public class TaskFormProcessorTest extends TestCase // Add a Status property PropertyDefinition with_ = MockClassAttributeDefinition.mockPropertyDefinition(PROP_WITH_, textType); properties.put(PROP_WITH_, with_); + + // Add a Package Action property + QName pckgActionGroup = WorkflowModel.PROP_PACKAGE_ACTION_GROUP; + PropertyDefinition pckgAction = + MockClassAttributeDefinition.mockPropertyDefinition(pckgActionGroup, textType, ""); + properties.put(pckgActionGroup, pckgAction); + + // Add a Package Action property + QName pckgItemActionGroup = WorkflowModel.PROP_PACKAGE_ITEM_ACTION_GROUP; + PropertyDefinition pckgItemAction = + MockClassAttributeDefinition.mockPropertyDefinition(pckgItemActionGroup, textType, "read_package_item_actions"); + properties.put(pckgItemActionGroup, pckgItemAction); return properties; } @@ -504,4 +531,6 @@ public class TaskFormProcessorTest extends TestCase when(service.updateTask(anyString(), anyMap(), anyMap(), anyMap())).thenReturn(newTask); return service; } + + } 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 951be3ae1f..0a72fd406c 100644 --- a/source/java/org/alfresco/repo/forms/processor/workflow/WorkflowFormProcessor.java +++ b/source/java/org/alfresco/repo/forms/processor/workflow/WorkflowFormProcessor.java @@ -19,38 +19,32 @@ package org.alfresco.repo.forms.processor.workflow; import java.io.Serializable; -import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; -import org.alfresco.model.ContentModel; +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.repository.NodeService; import org.alfresco.service.cmr.workflow.WorkflowDefinition; import org.alfresco.service.cmr.workflow.WorkflowInstance; -import org.alfresco.service.cmr.workflow.WorkflowPath; import org.alfresco.service.cmr.workflow.WorkflowService; -import org.alfresco.service.cmr.workflow.WorkflowTask; import org.alfresco.service.cmr.workflow.WorkflowTaskDefinition; -import org.alfresco.service.cmr.workflow.WorkflowTaskState; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.util.StringUtils; /** * Temporary FormProcessor implementation that can generate and persist @@ -65,14 +59,27 @@ public class WorkflowFormProcessor extends ContentModelFormProcessor 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) */ @@ -138,11 +145,6 @@ public class WorkflowFormProcessor extends ContentModelFormProcessor params = new HashMap(8); - - // create a package for the workflow - NodeRef workflowPackage = this.workflowService.createPackage(null); - params.put(WorkflowModel.ASSOC_PACKAGE, workflowPackage); - - // TODO: iterate through form data to collect properties, for now - // just hardcode the ones we know - params.put(WorkflowModel.PROP_DESCRIPTION, - (Serializable)data.getFieldData("prop_bpm_workflowDescription").getValue()); - - // look for assignee and group assignee - FieldData assigneeField = data.getFieldData("assoc_bpm_assignee_added"); - if (assigneeField != null) - { - NodeRef assignee = new NodeRef(assigneeField.getValue().toString()); - ArrayList assigneeList = new ArrayList(1); - assigneeList.add(assignee); - params.put(WorkflowModel.ASSOC_ASSIGNEE, assigneeList); - } - else - { - Object groupValue = data.getFieldData("assoc_bpm_groupAssignee_added").getValue(); - NodeRef group = new NodeRef(groupValue.toString()); - ArrayList groupList = new ArrayList(1); - groupList.add(group); - params.put(QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "groupAssignee"), - groupList); - } - - // add any package items - Object items = data.getFieldData("assoc_packageItems_added").getValue(); - if (items != null) - { - String[] nodeRefs = StringUtils.tokenizeToStringArray(items.toString(), ","); - for (int x = 0; x < nodeRefs.length; x++) - { - NodeRef item = new NodeRef(nodeRefs[x]); - this.unprotectedNodeService.addChild(workflowPackage, item, - WorkflowModel.ASSOC_PACKAGE_CONTAINS, QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, - QName.createValidLocalName((String)this.nodeService.getProperty( - item, ContentModel.PROP_NAME)))); - } - } - - // TODO: add any context (this could re-use alf_destination) - - // start the workflow to get access to the start task - WorkflowPath path = this.workflowService.startWorkflow(workflowDef.getId(), params); - if (path != null) - { - // get hold of the workflow instance for returning - workflow = path.instance; - - // extract the start task - List tasks = this.workflowService.getTasksForWorkflowPath(path.id); - if (tasks.size() == 1) - { - WorkflowTask startTask = tasks.get(0); - - if (logger.isDebugEnabled()) - logger.debug("Found start task:" + startTask); - - if (startTask.state == WorkflowTaskState.IN_PROGRESS) - { - // end the start task to trigger the first 'proper' - // task in the workflow - this.workflowService.endTask(startTask.id, null); - } - } - - if (logger.isDebugEnabled()) - logger.debug("Started workflow: " + workflowDef.getId()); - } - - // return the workflow just started - return workflow; - } - /** * @param workflowService the workflowService to set */ diff --git a/source/java/org/alfresco/repo/forms/processor/workflow/WorkflowFormProcessorTest.java b/source/java/org/alfresco/repo/forms/processor/workflow/WorkflowFormProcessorTest.java new file mode 100644 index 0000000000..89d3e08210 --- /dev/null +++ b/source/java/org/alfresco/repo/forms/processor/workflow/WorkflowFormProcessorTest.java @@ -0,0 +1,29 @@ +/* + * 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; + +/** + * @author Nick Smith + * + */ +public class WorkflowFormProcessorTest +{ + +}