From 357781f35c8697955d8eabcd63ecc0ee2e33b554 Mon Sep 17 00:00:00 2001 From: Britt Park Date: Wed, 11 Oct 2006 23:02:35 +0000 Subject: [PATCH] This is a very rudimentary version of a WCM Workflow that uses Workflow packages. It's hooked up to the sumbit single file action in the top level website screen in an exceedingly awkard way. The UI doesn't complain about anything, nor does it display the contents of the package. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@4099 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/action-services-context.xml | 9 +++ .../messages/action-config.properties | 5 ++ .../messages/workflow-messages.properties | 3 +- config/alfresco/model/contentModel.xml | 14 ++++ config/alfresco/workflow/wcmSubmit.xml | 24 +++++-- config/alfresco/workflow/wcmSubmitModel.xml | 48 ++++++------- .../java/org/alfresco/model/ContentModel.java | 3 + .../avm/actions/StartAVMWorkflowAction.java | 67 ++++++++++++++++--- .../repo/avm/wf/AVMSubmitPackageHandler.java | 42 +++++++----- 9 files changed, 155 insertions(+), 60 deletions(-) diff --git a/config/alfresco/action-services-context.xml b/config/alfresco/action-services-context.xml index dadad1640d..0fc579e6de 100644 --- a/config/alfresco/action-services-context.xml +++ b/config/alfresco/action-services-context.xml @@ -406,6 +406,15 @@ + + + + + + + + + diff --git a/config/alfresco/messages/action-config.properties b/config/alfresco/messages/action-config.properties index f816114c55..2c2b3dead3 100644 --- a/config/alfresco/messages/action-config.properties +++ b/config/alfresco/messages/action-config.properties @@ -93,3 +93,8 @@ simple-avm-submit.description=This will submit any newer nodes in the matched it simple-avm-promote.title=Simple Sandbox Promotion simple-avm-promote.description=This promotes any newer nodes in the matched item to the specified target sandbox. simple-avm-promote.target-store.display-label=The name of the target AVM store. + +start-avm-workflow.title=Start a WCM Workflow +start-avm-workflow.description=Starts a workflow expecting an AVM workflow package +start-avm-workflow.store-name.display-label=Store name for start task +start-avm-workflow.workflow-name.display-label=The name of the WCM workflow to invoke. diff --git a/config/alfresco/messages/workflow-messages.properties b/config/alfresco/messages/workflow-messages.properties index 6c4d11eb25..ee60619283 100644 --- a/config/alfresco/messages/workflow-messages.properties +++ b/config/alfresco/messages/workflow-messages.properties @@ -75,10 +75,11 @@ wcmwf_submit.workflow.description=Submit Web Content wcmwf_submitmodel.type.wcmwf_startSubmit.title=Submit Web Content wcmwf_submitmodel.type.wcmwf_startSubmit.description=Have colleague review changes -wcmwf_submitmodel.property.wcmwf_submitDueDate.description=Task Due Date wcmwf_submitmodel.association.wcmwf_assignee.title=Asignee wcmwf_submitmodel.association.wcmwf_assignee.description=Who's doing the reviewing wcmwf_submitmodel.property.wcmwf_description.title=Task Description wcmwf_submitmodel.property.wcmwf_description.description=Description of what needs to be achieved +wcmwf_submitmodel.type.wcmwf_setupSubmit.title=Submit Web Content +wcmwf_submitmodel.type.wcmwf_setupSubmit.description=Choose a colleague to review changes wcmwf_submitmodel.type.wcmwf_review.title=Review Content wcmwf_submitmodel.type.wcmwf_review.description=Review Content diff --git a/config/alfresco/model/contentModel.xml b/config/alfresco/model/contentModel.xml index da5560951d..4c18eda728 100644 --- a/config/alfresco/model/contentModel.xml +++ b/config/alfresco/model/contentModel.xml @@ -686,6 +686,20 @@ + + + References Node + + + Node Reference + d:noderef + true + + + + diff --git a/config/alfresco/workflow/wcmSubmit.xml b/config/alfresco/workflow/wcmSubmit.xml index c8b7348f30..bacc922ff3 100644 --- a/config/alfresco/workflow/wcmSubmit.xml +++ b/config/alfresco/workflow/wcmSubmit.xml @@ -10,16 +10,27 @@ - - - + + - + + + + + + + + + + + + + @@ -28,13 +39,12 @@ - - - + + diff --git a/config/alfresco/workflow/wcmSubmitModel.xml b/config/alfresco/workflow/wcmSubmitModel.xml index f2d4538240..5d00a22056 100644 --- a/config/alfresco/workflow/wcmSubmitModel.xml +++ b/config/alfresco/workflow/wcmSubmitModel.xml @@ -9,7 +9,7 @@ - + @@ -21,41 +21,33 @@ Description d:text - - - Sandbox Store Name - d:text - Submit Web Content wcmwf:baseSubmitTask - - - - Due Date - d:date - - - - - - Assignee - - false - false - - - cm:person - true - false - - - + + Submit Web Content + wcmwf:baseSubmitTask + + + The Reviewer + + false + false + + + cm:person + true + false + + + + + Review wcmwf:baseSubmitTask diff --git a/source/java/org/alfresco/model/ContentModel.java b/source/java/org/alfresco/model/ContentModel.java index 68e82b07d1..c3cd5e5397 100644 --- a/source/java/org/alfresco/model/ContentModel.java +++ b/source/java/org/alfresco/model/ContentModel.java @@ -190,6 +190,9 @@ public interface ContentModel public static final QName PROP_HITS = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "hits"); public static final QName PROP_COUNTER = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "counter"); + // referencesnode aspect + public static final QName ASPECT_REFERENCES_NODE = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "referencesnode"); + public static final QName PROP_NODE_REF = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "noderef"); // // Application Model Definitions diff --git a/source/java/org/alfresco/repo/avm/actions/StartAVMWorkflowAction.java b/source/java/org/alfresco/repo/avm/actions/StartAVMWorkflowAction.java index f7ca3383f9..3fb5288705 100644 --- a/source/java/org/alfresco/repo/avm/actions/StartAVMWorkflowAction.java +++ b/source/java/org/alfresco/repo/avm/actions/StartAVMWorkflowAction.java @@ -4,20 +4,27 @@ package org.alfresco.repo.avm.actions; import java.io.Serializable; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.alfresco.repo.action.ParameterDefinitionImpl; import org.alfresco.repo.action.executer.ActionExecuterAbstractBase; +import org.alfresco.repo.avm.AVMNodeConverter; import org.alfresco.repo.workflow.WorkflowModel; import org.alfresco.service.cmr.action.Action; import org.alfresco.service.cmr.action.ParameterDefinition; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.cmr.workflow.WorkflowDefinition; +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.WorkflowTaskState; import org.alfresco.service.namespace.QName; +import org.apache.log4j.Logger; /** * This action knows how to start an AVM specific workflow. @@ -25,8 +32,9 @@ import org.alfresco.service.namespace.QName; */ public class StartAVMWorkflowAction extends ActionExecuterAbstractBase { + private static Logger fgLogger = Logger.getLogger(StartAVMWorkflowAction.class); + public static final String NAME = "start-avm-workflow"; - public static final String PARAM_STORE_NAME = "store-name"; public static final String PARAM_WORKFLOW_NAME = "workflow-name"; /** @@ -34,6 +42,11 @@ public class StartAVMWorkflowAction extends ActionExecuterAbstractBase */ private WorkflowService fWorkflowService; + /** + * Reference to person service. + */ + private PersonService fPersonService; + /** * Set the workflow service. * @param service The workflow service. @@ -43,6 +56,15 @@ public class StartAVMWorkflowAction extends ActionExecuterAbstractBase fWorkflowService = service; } + /** + * Set the person service. + * @param service The person service. + */ + public void setPersonService(PersonService service) + { + fPersonService = service; + } + /** * Default constructor. */ @@ -61,11 +83,42 @@ public class StartAVMWorkflowAction extends ActionExecuterAbstractBase protected void executeImpl(Action action, NodeRef actionedUponNodeRef) { String workflowName = (String)action.getParameterValue(PARAM_WORKFLOW_NAME); - String storeName = (String)action.getParameterValue(PARAM_STORE_NAME); - WorkflowDefinition def = fWorkflowService.getDefinitionByName(name); - NodeRef workflowPackage = fWorkflowService.createPackage(actionedUponNodeRef); + WorkflowDefinition def = fWorkflowService.getDefinitionByName(workflowName); Map wfParams = new HashMap(); - wfParams.put(WorkflowModel.ASSOC_PACKAGE, workflowPackage); + wfParams.put(WorkflowModel.ASSOC_PACKAGE, actionedUponNodeRef); +// ArrayList assigneeList = new ArrayList(); +// assigneeList.add(fPersonService.getPerson("admin")); +// wfParams.put(QName.createQName("http://www.alfresco.org/model/wcmwf/1.0", "assignee"), +// assigneeList); + wfParams.put(QName.createQName("http://www.alfresco.org/model/wcmwf/1.0", "description"), + "This performs a submit."); + wfParams.put(WorkflowModel.PROP_CONTEXT, actionedUponNodeRef); + for (QName name : wfParams.keySet()) + { + fgLogger.error(name); + fgLogger.error(wfParams.get(name).getClass()); + fgLogger.error(wfParams.get(name)); + } + WorkflowPath path = fWorkflowService.startWorkflow(def.id, wfParams); + if (path != null) + { + fgLogger.error("Workflow path is not null."); + // extract the start task + List tasks = fWorkflowService.getTasksForWorkflowPath(path.id); + fgLogger.error(tasks.size() + " tasks."); + if (tasks.size() == 1) + { + WorkflowTask startTask = tasks.get(0); + + if (startTask.state == WorkflowTaskState.IN_PROGRESS) + { + fgLogger.error("Calling End Task."); + // end the start task to trigger the first 'proper' + // task in the workflow + fWorkflowService.endTask(startTask.id, null); + } + } + } } /** @@ -75,10 +128,6 @@ public class StartAVMWorkflowAction extends ActionExecuterAbstractBase @Override protected void addParameterDefinitions(List paramList) { - paramList.add(new ParameterDefinitionImpl(PARAM_STORE_NAME, - DataTypeDefinition.TEXT, - true, - getParamDisplayLabel(PARAM_STORE_NAME))); paramList.add(new ParameterDefinitionImpl(PARAM_WORKFLOW_NAME, DataTypeDefinition.TEXT, true, diff --git a/source/java/org/alfresco/repo/avm/wf/AVMSubmitPackageHandler.java b/source/java/org/alfresco/repo/avm/wf/AVMSubmitPackageHandler.java index 8f108b7cd0..173ca3ec43 100644 --- a/source/java/org/alfresco/repo/avm/wf/AVMSubmitPackageHandler.java +++ b/source/java/org/alfresco/repo/avm/wf/AVMSubmitPackageHandler.java @@ -2,12 +2,17 @@ package org.alfresco.repo.avm.wf; import java.io.Serializable; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import org.alfresco.model.ContentModel; import org.alfresco.repo.avm.AVMNodeConverter; +import org.alfresco.repo.workflow.jbpm.JBPMNode; import org.alfresco.repo.workflow.jbpm.JBPMSpringActionHandler; import org.alfresco.service.cmr.avm.AVMService; import org.alfresco.service.cmr.avmsync.AVMDifference; +import org.alfresco.service.cmr.avmsync.AVMSyncException; import org.alfresco.service.cmr.avmsync.AVMSyncService; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; @@ -55,30 +60,37 @@ public class AVMSubmitPackageHandler extends JBPMSpringActionHandler implements */ public void execute(ExecutionContext executionContext) throws Exception { - String srcStoreName = (String)executionContext.getContextInstance().getVariable("storeName"); - NodeRef pkg = (NodeRef)executionContext.getContextInstance().getVariable("package"); - String webSiteName = - fAVMService.getStoreProperty(srcStoreName, QName.createQName(null, ".website.name")).getStringValue(); - String stagingName = webSiteName + "-staging"; + NodeRef pkg = ((JBPMNode)executionContext.getContextInstance().getVariable("package")).getNodeRef(); List children = fNodeService.getChildAssocs(pkg); List diffs = new ArrayList(); + Map storesHit = new HashMap(); for (ChildAssociationRef child : children) { NodeRef childRef = child.getChildRef(); - Pair childPath = AVMNodeConverter.ToAVMVersionPath(childRef); - List> possiblePaths = - fAVMService.getPathsInStoreHead(fAVMService.lookup(childPath.getFirst(), childPath.getSecond()), - srcStoreName); - Pair actualPath = possiblePaths.get(0); - String [] pathParts = actualPath.getSecond().split(":"); + if (!fNodeService.hasAspect(childRef, ContentModel.ASPECT_REFERENCES_NODE)) + { + throw new AVMSyncException("Package node does not have cm:referencesnode."); + } + NodeRef toSubmit = (NodeRef)fNodeService.getProperty(childRef, ContentModel.PROP_NODE_REF); + Pair versionPath = AVMNodeConverter.ToAVMVersionPath(toSubmit); + String avmPath = versionPath.getSecond(); + String [] storePath = avmPath.split(":"); + String websiteName = fAVMService.getStoreProperty(storePath[0], + QName.createQName(null, ".website.name")). + getStringValue(); + String stagingName = websiteName + "-staging"; AVMDifference diff = - new AVMDifference(-1, srcStoreName + ":" + pathParts[1], - -1, stagingName + ":" + pathParts[1], + new AVMDifference(-1, avmPath, + -1, stagingName + ":" + storePath[1], AVMDifference.NEWER); diffs.add(diff); + storesHit.put(storePath[0], stagingName); } fAVMSyncService.update(diffs, true, true, false, false); - fAVMSyncService.flatten(srcStoreName + ":/appBase", - stagingName + ":/appBase"); + for (Map.Entry entry : storesHit.entrySet()) + { + fAVMSyncService.flatten(entry.getKey() + ":/appBase", + entry.getValue() + ":/appBase"); + } } }