[jboss-user] [JBoss jBPM] - Re: How use Swimlane in a portlet??

antitrust1982 do-not-reply at jboss.com
Mon Aug 28 02:39:13 EDT 2006


hi,

I post my java file, where I create my process and try to use the swimlane.


  | package com.opensymphony.webwork.portlet.tutorial;
  | 
  | import java.util.*;
  | import java.util.ArrayList;
  | 
  | 
  | import org.jbpm.graph.def.ProcessDefinition;
  | import org.jbpm.graph.exe.ProcessInstance;
  | import org.jbpm.db.*;
  | import org.jbpm.graph.exe.Token;
  | import org.jbpm.taskmgmt.exe.*; 
  | import org.jbpm.taskmgmt.log.TaskCreateLog;
  | import org.jbpm.graph.exe.*;
  | 
  | import com.opensymphony.xwork.ActionContext;
  | import com.opensymphony.xwork.ActionSupport;
  | import org.jbpm.*;
  | 
  | import org.jbpm.taskmgmt.def.*;
  | 
  | public class CreateProcessInstanceAction extends ActionSupport{
  | 	
  | 	private String nameProcess;
  | 	private String currentNode;
  | 
  | 	static JbpmConfiguration jbpmConfiguration = null;
  | 	static ProcessDefinition processDefinition= null;
  | 	ProcessInstance pi= null;
  | 	JbpmContext	jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
  | 	Map session = (Map) ActionContext.getContext().get("session");
  | 	SwimlaneInstance si =null;
  |     ExecutionContext ec=null;
  | 	
  | 	public void setNameProcess(String nameProcess) {
  | 		System.out.println("set NameProcess");
  | 		this.nameProcess = nameProcess;
  | 	}
  | 	
  | 	public String getNameProcess() {
  | 		System.out.println("get NameProcess");
  | 		return nameProcess;
  | 	}
  | 	
  | 	public void setCurrentNode(String currentNode) {
  | 		System.out.println("set currentNode");
  | 		this.currentNode = currentNode;
  | 	}
  | 	
  | 	public String getCurrentNode() {
  | 		System.out.println("get currentNode");
  | 		return currentNode;
  | 	}
  | 	
  | 	public Long instantiate(ProcessDefinition pd, String userId) {
  |         Long instanceId = null;
  |         System.out.println("JBPM session factory");
  |         JbpmSessionFactory jbpmSessionFactory = JbpmSessionFactory.getInstance();
  |         System.out.println("JBPM session");
  |         JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession(); 
  |         System.out.println("Graph session");
  |         GraphSession graphSession = jbpmSession.getGraphSession();
  |         System.out.println("Task management");
  |         TaskMgmtSession taskMgmtSession = jbpmSession.getTaskMgmtSession();
  |         System.out.println("instance des session ok");
  |         
  |         System.out.println("process definition instance");
  |         System.out.println("PROCESS NAME:"+ pd.getName());
  |         jbpmSession.beginTransaction();
  |         pi = new ProcessInstance(pd);
  |         System.out.println("PROCESS  INSTANCE ID:"+ pi.getId());
  |         //This ensures that all swimlanes are initialized and available for reporting and reassignment immediately.
  |         //If we don't initialize them up front, they won't be created until a task calls for them.
  |         
  |         Map swimlanes = pd.getTaskMgmtDefinition().getSwimlanes();
  |         Iterator itr = swimlanes.keySet().iterator();
  |         while(itr.hasNext()) {
  |             Swimlane swimlane = (Swimlane)swimlanes.get(itr.next());
  |             System.out.println("SWIMLANE CREE:"+ swimlane.getName());			
  | 			
  | 			 swimlane.setPooledActorsExpression("ernie");
  | 			 swimlane.setPooledActorsExpression("bert");
  | 		
  |             
  |             System.out.println("ID porcess "+pi.toString());
  |             System.out.println(pi.getRootToken().toString());
  |             System.out.println(pi.getRootToken().getName());
  |             ec= new ExecutionContext(pi.getRootToken());
  |             System.out.println("execution context reussi");
  |             System.out.println("token lancer:"+ec.getToken().getName());
  |             
  |             
  |             SwimlaneInstance swi = pi.getTaskMgmtInstance().getInitializedSwimlaneInstance(ec, swimlane);
  |             
  |           
  |             System.out.println("swimlane instance good : "+swi.getName());
  |             //We have to do this cause it doesn't automatically happen when we
  |             // call swimlaneInstance.setPooledActors()
  |             System.out.println("pooled actors");
  |             Set pooledActors = swi.getPooledActors();
  |             if(pooledActors != null) {
  |                 Iterator paItr = pooledActors.iterator();
  |                 while(paItr.hasNext()) {
  |                     ( (PooledActor)paItr.next() ).setSwimlaneInstance(swi);
  |                 }
  |             }
  |         }
  | 
  |         //If this process definition defines a startTask in the StartState, we'll have to
  |         // explicitly create it--it won't be created otherwise...
  |         if (pd.getTaskMgmtDefinition().getStartTask() != null) {
  |             
  |             //When we create the startTaskInstance, the start task will be assigned
  |             // to the currently authenticated user (as understood by Jbpm), and that
  |             // data WILL overwrite any default swimlane assignments, as well as update
  |             // the actual swimlaneInstance itself.  The swimlaneInstance's pooledActors will be NULL
  | 
  |             // To preserve any original assignments to the swimlaneInstance, we'll have
  |             // to record that data now and re-set it in the swimlaneInstance after the
  |             // startTaskInstance has been created.
  |             org.jbpm.taskmgmt.def.Task task = pd.getTaskMgmtDefinition().getStartTask();
  |             String swimlaneName = task.getSwimlane().getName();
  |             SwimlaneInstance swi = pi.getTaskMgmtInstance().getSwimlaneInstance(swimlaneName);
  |             String originalActorId = swi.getActorId();
  |             Set originalPooledActors = swi.getPooledActors();
  |             System.out.println("taskinstance");
  |             TaskInstance startTask = pi.getTaskMgmtInstance().createStartTaskInstance();
  |             System.out.println("task instance name: "+startTask.getName());
  |             //Unless our application's authentication scheme has been tied into Jbpm's, we
  |             // should manually assign the startTask to a user as well as manually set the swimlane actors
  |             // referenced by this task, otherwise both will be null.
  |             System.out.println("set actor ID a task instance");
  |             startTask.setActorId(userId);
  |             
  |             if(startTask.getSwimlaneInstance() != null) {
  |             	System.out.println("startTask.getSwimlaneInstance() != null");
  |               System.out.println("Swimlane assigned actor: " + startTask.getSwimlaneInstance().getActorId());
  |              si = startTask.getSwimlaneInstance();
  |             System.out.println(si.getName());
  |              
  |               System.out.println("test pour voir");
  |                 startTask.getSwimlaneInstance().setActorId(userId);
  |                
  |                 
  |                 //Currently, no pooledActors are being set
  |                 
  |                 //swi.setPooledActors(originalPooledActors);
  |                 //startTask.getSwimlaneInstance().setPooledActors(originalPooledActors);
  |                 if (startTask.getSwimlaneInstance().getPooledActors() != null) {
  |                 	System.out.println("startTask.getSwimlaneInstance().getPooledActors() != null");
  |                     System.out.println("Swimlane assigned pooled actor: " + ( (PooledActor)(startTask.getSwimlaneInstance().getPooledActors().iterator().next()) ).getActorId() );
  |                 }
  |                 System.out.println("NOM DE LA TACHE////::"+startTask.getName());
  |                 
  |                 //////////////////////////////
  |               //  jbpmSession.getSession().save(swi);
  |                 //////////////////////////////
  |             }
  |             
  |         }else {
  |             //If our new process doesn't have a startTask defined, we may want to get the new process rolling...
  |             // Although, some executions may want to set process variables, etc. before
  |             // continuing, in which case they should do such and signal for themselves.
  |             //pi.signal();
  |         	System.out.println("################################else#########################################");
  |         }
  |        
  |         System.out.println("graphsession enregistre le porcess instance");
  |       //graphSession.saveProcessInstance(pi);
  |        System.out.println("OK");
  |         jbpmSession.commitTransaction();
  |       
  |         instanceId = Long.valueOf(pi.getId());
  |         jbpmSession.close();
  |         
  |         return instanceId;
  | 	}
  | 	@Override
  | 	public String execute() throws Exception {
  | 		
  | 		System.out.println("#### execute");
  | 		System.out.println("Create process instance" );
  | 		  // This method shows a process definition and one execution
  | 		  // of the process definition.  The process definition has 
  | 		  // 3 nodes: an unnamed start-state, a state 's' and an 
  | 		  // end-state named 'end'.
  | 		  // The next line parses a piece of xml text into a
  | 		  // ProcessDefinition.  A ProcessDefinition is the formal 
  | 		  // description of a process represented as a java object.
  | 		 
  | 		processDefinition = ProcessDefinition.parseXmlString(
  | 		
  | 
  | 				"<process-definition   name='DeclarationSinistre'>"+
  | 				"<swimlane name='F*' >"+
  | 				  	"<assignment expression='user(ernie)'/>"+
  | 				  	"</swimlane>"+
  | 		
  | 				  	"<swimlane name='A*' >"+
  | 				  	"<assignment expression='user(bert)'/>"+
  | 				  	"</swimlane>"+
  | 				  	
  | 				  	
  | 				   "<start-state name='start'>"+
  | 				     "<task swimlane='F*'>"+
  | 				      "</task>"+
  | 				      "<transition name='' to='DeclarationSinistre'>"+"</transition>"+
  | 				   "</start-state>"+
  | 				   
  | 				   "<end-state name='end'>"+"</end-state>"+
  | 				   
  | 				   "<task-node name='DeclarationSinistre'>"+
  | 				       "<task swimlane='F*'>"+
  | 				      "</task>"+
  | 				      "<transition name='' to='EnregistrementSinistre'>"+"</transition>"+
  | 				   "</task-node>"+
  | 				   
  | 				   "<task-node name='EnregistrementSinistre'>"+
  | 				      "<task swimlane='A*'>"+
  | 				      "</task>"+
  | 				      "<transition name='' to='ControlePrime'>"+"</transition>"+
  | 				   "</task-node>"+
  | 				   
  | 				   "<task-node name='ControlePrime'>"+
  | 				   "<task swimlane='F*'>"+
  | 				      "</task>"+
  | 				      "<transition name='OK' to='fork1'>"+"</transition>"+
  | 				      "<transition name='SinistreHorsClause' to='HorsClause'>"+"</transition>"+
  | 				      "<transition name='PrimeNonPayee' to='RelancePaiement'>"+"</transition>"+
  | 				   "</task-node>"+
  | 				   
  | 				   "<task-node name='RelancePaiement'>"+
  | 				   "<task swimlane='A*'>"+
  | 				      "</task>"+
  | 				      "<transition name='' to='ControlePrime'>"+"</transition>"+
  | 				   "</task-node>"+
  | 				   
  | 				   "<task-node name='HorsClause'>"+
  | 				   "<task swimlane='F*'>"+
  | 				      "</task>"+
  | 				   		"<transition name='' to='end'>"+"</transition>"+
  | 				   "</task-node>"+
  | 				   
  | 				   "<task-node name='TraitementSinistre'>"+
  | 				   "<task swimlane='A*'>"+
  | 				      "</task>"+
  | 				      "<transition name='' to='join1'>"+"</transition>"+
  | 				   "</task-node>"+
  | 				   
  | 				   "<task-node name='ExtractionDonnées'>"+
  | 				   "<task swimlane='F*'>"+
  | 				      "</task>"+
  | 				      "<transition name='' to='transfertDonnées'>"+"</transition>"+
  | 				   "</task-node>"+
  | 				   
  | 				   "<task-node name='transfertDonnées'>"+
  | 				   "<task swimlane='A*'>"+
  | 				      "</task>"+
  | 				      "<transition name='' to='join1'>"+"</transition>"+
  | 				   "</task-node>"+
  | 				   
  | 				   "<fork name='fork1'>"+
  | 				      "<transition name='' to='TraitementSinistre'>"+"</transition>"+
  | 				      "<transition name='tr2' to='ExtractionDonnées'>"+"</transition>"+
  | 				   "</fork>"+
  | 				   
  | 				   "<join name='join1'>"+
  | 				      "<transition name='' to='end'>"+"</transition>"+
  | 				   "</join>"+
  | 				   
  | 				"</process-definition>"
  | 		  );
  | 		System.out.println("################## debut jbpm configuration #############"); 
  | 		
  | 		jbpmConfiguration = JbpmConfiguration.parseXmlString(
  | 		      "<jbpm-configuration>" +
  | 		      
  | 		      // A jbpm-context mechanism separates the jbpm core 
  | 		      // engine from the services that jbpm uses from 
  | 		      // the environment.  
  | 		      
  | 		      "  <jbpm-context>" +
  | 		      "    <service name='persistence' " +
  | 		      "             factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' />" + 
  | 		      "  </jbpm-context>" +
  | 		      
  | 		      // Also all the resource files that are used by jbpm are 
  | 		      // referenced from the jbpm.cfg.xml
  | 		      
  | 		      "  <string name='resource.hibernate.cfg.xml' " +
  | 		      "          value='hibernate.cfg.xml' />" +
  | 		      "  <string name='resource.business.calendar' " +
  | 		      "          value='org/jbpm/calendar/jbpm.business.calendar.properties' />" +
  | 		      "  <string name='resource.default.modules' " +
  | 		      "          value='org/jbpm/graph/def/jbpm.default.modules.properties' />" +
  | 		      "  <string name='resource.converter' " +
  | 		      "          value='org/jbpm/db/hibernate/jbpm.converter.properties' />" +
  | 		      "  <string name='resource.action.types' " +
  | 		      "          value='org/jbpm/graph/action/action.types.xml' />" +
  | 		      "  <string name='resource.node.types' " +
  | 		      "          value='org/jbpm/graph/node/node.types.xml' />" +
  | 		      "  <string name='resource.varmapping' " +
  | 		      "          value='org/jbpm/context/exe/jbpm.varmapping.xml' />" +
  | 		      "</jbpm-configuration>"
  | 		    );
  | 
  | 	
  | 		
  | 		Long longVariable = instantiate(processDefinition, "ernie");	
  | 		try{
  | 			Token token = pi.getRootToken();
  | 		        nameProcess=pi.getProcessDefinition().getName();
  | 		       // System.out.println("avant affectation user");
  | 		       // jbpmContext.setActorId("ernie");
  | 		       // System.out.println("affectation user effectuer ok");
  | 		       // System.out.println("nom de l'utilisateur est:"+ jbpmContext.getActorId());
  | 		    this.setNameProcess(nameProcess);
  | 			token.signal();
  | 			
  | 		    currentNode=token.getNode().getName();
  | 		    this.setCurrentNode(currentNode);
  | 		    System.out.println("noeud courant:"+currentNode);
  | 		    jbpmContext.save(token);
  | 		    System.out.println("############## save token good#######");
  | 		    jbpmContext.save(pi);
  | 		    System.out.println("############## save process good#######");
  | 			Map session = (Map) ActionContext.getContext().get("session");
  | 			  session.put("process",pi);
  | 			  session.put("jbpmContext",jbpmContext);
  | 			  System.out.println("cuicuiactorid: "+jbpmContext.getActorId());
  | 			  session.put("processName",nameProcess);
  | 			  session.put("processDefiniton",processDefinition);
  | 			  session.put("ec",ec);
  | 			  session.put("si",si);
  | 		}
  | 		finally {
  | 			System.out.println("dans finally");
  | 		    //jbpmContext.close();
  | 		    System.out.println("fermeture du context");
  | 		}
  | 		
  | 			  
  | 		  return SUCCESS;
  | 	}
  | }

I hope you will see where my error or my missing. 

thank you very much for you help. I will try to see you way of problem of execution of the swimlane.

antitrust1982

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3967739#3967739

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3967739




More information about the jboss-user mailing list