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