cancel
Showing results for 
Search instead for 
Did you mean: 

Reg how to start a worklfow from js using rule?

dynamolalit
Champ on-the-rise
Champ on-the-rise
Hi,

I have a space called 'Under Review' under my repository which is used as an intermediate place to put content while it is in workflow.If content is approved, it will go to same space from where it had been uploaded, if it is rejected, it will go to 'User Home' of user who is uploading the content.I have given ' Inherit Parent Space Permissions' for this space.
       As per our requirement, i want that normal user who is uploading any content for approval workflow using 'Add Content' link for that space,should not see it.Only admin should see this folder.
        So i unchecked ' Inherit Parent Space Permissions'  check box but i am getting this error:

Please correct the errors below then click OK.
Failed to create content due to error: 02260020 Failed to execute script 'workspace://SpacesStore/8667c518-3ca3-4e45-9a4e-fa949b6d50d1': Destination Node is a mandatory parameter

Also in my case, only administrator can see 'Data Dictionary' space not any normal user.So what i thought of is to create a space named 'Under Review' in 'Data Dictionary' & direct any incoming content there but in this case also, i am getting same error as above.

So how can i achieve this. After some goggling i found this post:

http://forums.alfresco.com/en/viewtopic.php?t=7311

But it was not much useful  :idea: .

Any help is much appreciated.
2 REPLIES 2

dynamolalit
Champ on-the-rise
Champ on-the-rise
Hi,

I am still stuck up. :?:

I tried with logging as a normal user & using following syntax to access 'Under Review' space for admin:

document.owner='admin';
companyhome.owner='admin';
space.owner='admin';
var targetFolder = companyhome.childByNamePath("/{http://www.alfresco.org/model/application/1.0}company_home/{http://www.alfresco.org/model/applicatio... Review");
//var targetFolder = companyhome.childByNamePath("Under Review");
logger.log("targetFolder !@@!"+targetFolder);
var res = document.move(targetFolder);

Here i am getting targetFolder as  null :!:

14:10:14,599 User:xxxxx DEBUG [repo.jscript.ScriptLogger] targetFolder !@@!null

My idea here is to get companyhome node for admin as i have created 'Under Review' space inside Data Dictionary which only admin can see.

What i inferred from here is that each user has its own companyhome node.  8).Or may be for company home there are different views for each of user & normal user can not access spaces on which they do not have any rights. So getting companyhome for admin is an issue from a normal user perspective.

So its visibility thing that comes into picture.Normal user can not see the companyhome for admin.

So is there any workaround for this?

Any idea?

dynamolalit
Champ on-the-rise
Champ on-the-rise
Hi,

It can be done as a combination of JavaScript+Java in Alfresco.I created a processdefinition.xml which invokes my Custom ActionHandler.


java script code executing as a rule :


//This worlfow is triggered as any content is uploaded in repository using DM.
logger.log('************* Starting Approval workflow! *************');
var workflow = actions.create("start-workflow");
workflow.parameters.workflowName = "jbpm$workflwo_name";
var APPROVER_GROUP="APPROVER_GROUP_NAME";
var approverGroup=people.getGroup("GROUP_"+APPROVER_GROUP);
workflow.parameters["bpm_groupAssignee"] = approverGroup;
workflow.parameters["bpm:workflowDescription"] = "This document is pending for your approval.";
workflow.execute(document);

processdefinition.xml

<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="KPDocsReview">
    <swimlane name="initiator" />

    <start-state name="start">
        <task name="wf:submitReviewTask" swimlane="initiator" />
        <transition name="" to="review" />
    </start-state>

    <swimlane name="reviewer">
        <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
           <pooledactors>#{bpm_assignee}</pooledactors>
        </assignment>   
    </swimlane>

    <task-node name="review">
        <task name="wf:reviewTask" swimlane="reviewer">
          <event type="task-create">  
         <script>
               <variable name="wfFlag" access="write"/>
               <expression>
                  wfFlag = "Moved";
               </expression>
            </script>               
            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
         <runas>admin</runas>
            <script>
               logger.log("In Workflow,Content moved.");
               executionContext.setVariable("wfFlag", wfFlag);
               logger.log("wfFlag in WF "+wfFlag);
               for (var i = 0; i &lt; bpm_package.children.length; i++) {
                  var nodeRef = bpm_package.children[i].nodeRef;               
                  logger.log("nodeRef "+nodeRef);
                  executionContext.setVariable("nodeRef", nodeRef);
                  var docParentRef = bpm_package.children[i].parent.nodeRef;
                  logger.log("docParentRef "+docParentRef);
                  executionContext.setVariable("docParentRef", docParentRef);   
               }
               var finalLoc = companyhome.childByNamePath("/xxxx Knowledge Management/Under Review");
               var targetNodeRef = finalLoc.nodeRef;
               logger.log("targetNodeRef "+targetNodeRef);
               executionContext.setVariable("targetNodeRef", targetNodeRef);   
               var userHomeRef = userhome.nodeRef;
               logger.log("userHomeRef "+userHomeRef);
               executionContext.setVariable("userHomeRef", userHomeRef);   
            </script>
         </action> 
         <action class="com.xxxx.alfresco.km.bpm.KMReviewProcessAction" name="test123"/>      
         </event>
        </task>
        <transition name="Approve" to="approved" />
        <transition name="Disapprove" to="rejected" />
    </task-node>

    <node name="rejected">
        <event type="node-leave">
      <script>
               <variable name="wfFlag" access="write"/>
               <expression>
                  wfFlag = "Rejected";
               </expression>
            </script>            
                  <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
               <runas>admin</runas>
            <script>
               logger.log("In Rejection Process.");
            </script>
            </action>
            <action class="com.xxxx.alfresco.km.bpm.KMReviewProcessAction" name="test123"/>
           </event>
        <transition name="" to="end" />
    </node>

    <node name="approved">       
         <event type="node-leave">
         <script>
               <variable name="wfFlag" access="write"/>
               <expression>
                  wfFlag = "Approved";
               </expression>
            </script>               
            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
         <runas>admin</runas>
            <script>
               logger.log("In Approval Process,changing Owner to Admin.");
               bpm_package.children[0].owner = "admin";               
            </script>
         </action> 
         <action class="com.xxxx.alfresco.km.bpm.KMReviewProcessAction" name="test123"/>               
           </event>
        <transition name="" to="end" />
    </node>
   
    <end-state name="end" />

</process-definition>

ActionHandler

package com.xxxx.alfresco.km.bpm;

import java.util.List;

import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.workflow.jbpm.JBPMSpringActionHandler;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.apache.log4j.Logger;
import org.jbpm.context.exe.ContextInstance;
import org.jbpm.graph.exe.ExecutionContext;
import org.springframework.beans.factory.BeanFactory;

/**
*
* @author Lalit Jangra
* Action Class for xxxxx Approval Workflow.
* Content is moved to "Under Review" once it is uploaded.
* If content is approved, it will be moved back to original location.
* If content is rejected, it will be moved to User Home of Workflow initiator.
*
*/
public class KMReviewProcessAction extends JBPMSpringActionHandler {

   private static final long serialVersionUID = 1L;
   private static Logger logger = Logger
         .getLogger(KMReviewProcessAction.class);
   private ServiceRegistry services;
   private FileFolderService fileFolderService;

   /**
    * Method to initialize services.
    */
   @Override
   protected void initialiseHandler(BeanFactory factory) {
      logger.debug("Inside initialiseHandler of KMReviewProcessAction!!!!");
      services = (ServiceRegistry) factory
            .getBean(ServiceRegistry.SERVICE_REGISTRY);
      fileFolderService = services.getFileFolderService();
   }

   /**
    * Method to move content in workflow.
    * It will move content depending upon wfFlag variable value.
    */
   public void execute(ExecutionContext context) throws Exception {
      logger.debug("Inside execute of KMReviewProcessAction");
      final ContextInstance contextInstance = context.getContextInstance();
      String systemUserName = AuthenticationUtil.getSystemUserName();
      logger.debug("systemUserName " + systemUserName);
      AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<Object>() {
         String wfFlag = (String) contextInstance.getVariable("wfFlag");
         NodeRef nodeRef = (NodeRef) contextInstance.getVariable("nodeRef");
         NodeRef targetNodeRef = (NodeRef) contextInstance
               .getVariable("targetNodeRef");
         NodeRef docParentRef = (NodeRef) contextInstance
               .getVariable("docParentRef");
         NodeRef userHomeRef = (NodeRef) contextInstance
               .getVariable("userHomeRef");
         List<ChildAssociationRef> children = null;

         public Object doWork() throws Exception {
            logger.debug("wfFlag in  KMReviewProcessAction "
                  + wfFlag);
            logger.debug("nodeRef in execute() " + nodeRef);
            logger.debug("targetNodeRef in execute()  "
                  + targetNodeRef);
            logger.debug("docParentRef in execute()  " + docParentRef);
            logger.debug("userHomeRef in execute()  " + userHomeRef);

            if (wfFlag.equalsIgnoreCase("Moved")) {
               // Moving Content from its original location to Under
               // Review.
               logger.debug("Moving content to Under Review");
               try {
                  @SuppressWarnings("unused")
                  FileInfo fileInfo = fileFolderService.move(nodeRef,
                        targetNodeRef, null);
               } catch (Exception e) {
                  logger
                        .error("Error while moving content to Under Review "
                              + e.getMessage());
               }
            } else if (wfFlag.equalsIgnoreCase("Approved")) {
               // Move Content back to original location.
               logger.debug("Moving Content back after Approval");
               try {
                  @SuppressWarnings("unused")
                  FileInfo fileInfo = fileFolderService.move(nodeRef,
                        docParentRef, null);
               } catch (Exception e) {
                  logger
                  .error("Error while moving content to original location "
                        + e.getMessage());
               }
            } else if (wfFlag.equalsIgnoreCase("Rejected")) {
               // Move content to User Home.
               logger.debug("Moving Content to User Home after Rejection");
               try {
                  FileInfo fileInfo = fileFolderService.move(nodeRef,
                        userHomeRef, null);
                  System.out.println("After Rejection   "
                        + fileInfo.getName());
               } catch (Exception e) {
                  logger
                  .error("Error while moving content to User Home "
                        + e.getMessage());
               }
            }
            return children;
         }
      }, "admin");
   }

}

Along with this, I updated permissions for "Under Review" so that admin is coordinator for it & Approver is consumer for it. Smiley Very Happy