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"); + } } }