[jbpm-commits] JBoss JBPM SVN: r2473 - in projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri: model/builder and 1 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Fri Oct 3 07:18:34 EDT 2008


Author: thomas.diesler at jboss.com
Date: 2008-10-03 07:18:34 -0400 (Fri, 03 Oct 2008)
New Revision: 2473

Modified:
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/AbstractElementImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EventImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/NodeImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessDefinitionImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessStructureImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ReceiveTaskImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/SendTaskImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StartEventImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/ProcessBuilderImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/PersistenceServiceImpl.java
Log:
Cleanup node lifecycle

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/AbstractElementImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/AbstractElementImpl.java	2008-10-03 10:51:32 UTC (rev 2472)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/AbstractElementImpl.java	2008-10-03 11:18:34 UTC (rev 2473)
@@ -33,6 +33,8 @@
 import org.jbpm.api.InvalidProcessException;
 import org.jbpm.api.client.ProcessEngine;
 import org.jbpm.api.model.AbstractElement;
+import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 
 /**
  * The parrent of all Elements
@@ -80,4 +82,44 @@
   {
     return ProcessEngine.getProcessEngine(engineName);
   }
+  
+  protected void create(ProcessDefinition procDef)
+  {
+    // nothing to do
+  }
+  
+  protected void register(ProcessDefinition procDef)
+  {
+    // nothing to do
+  }
+  
+  protected void unregister(ProcessDefinition procDef)
+  {
+    // nothing to do
+  }
+  
+  protected void destroy(ProcessDefinition procDef)
+  {
+    // nothing to do
+  }
+  
+  protected void create(Process proc)
+  {
+    // nothing to do
+  }
+  
+  protected void register(Process proc)
+  {
+    // nothing to do
+  }
+  
+  protected void unregister(Process proc)
+  {
+    // nothing to do
+  }
+  
+  protected void destroy(Process proc)
+  {
+    // nothing to do
+  }
 }
\ No newline at end of file

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EventImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EventImpl.java	2008-10-03 10:51:32 UTC (rev 2472)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EventImpl.java	2008-10-03 11:18:34 UTC (rev 2473)
@@ -35,6 +35,7 @@
 import org.jbpm.api.model.Event;
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Node;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.builder.ObjectNameFactory;
@@ -181,9 +182,9 @@
   }
 
   @Override
-  protected void initialize(ProcessStructure procStruct)
+  protected void create(ProcessDefinition procDef)
   {
-    super.initialize(procStruct);
+    super.create(procDef);
     
     if (detailType == EventDetailType.Signal && signalRef == null)
       throw new InvalidProcessException("Event with detail type 'Signal' must have a signalRef");
@@ -197,8 +198,8 @@
     
     if (messageRef != null)
     {
-      ProcessStructureImpl procStructImpl = (ProcessStructureImpl)procStruct;
-      procStructImpl.initializeMessageRef(messageRef);
+      ProcessDefinitionImpl procDefImpl = (ProcessDefinitionImpl)procDef;
+      procDefImpl.initializeMessageRef(messageRef);
     }
   }
 }
\ No newline at end of file

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/NodeImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/NodeImpl.java	2008-10-03 10:51:32 UTC (rev 2472)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/NodeImpl.java	2008-10-03 11:18:34 UTC (rev 2473)
@@ -137,25 +137,15 @@
   @Override
   public ProcessDefinition getProcessDefinition()
   {
-    return procDef;
+    return (proc != null ? proc.getProcessDefinition() : procDef);
   }
 
-  void setProcessDefinition(ProcessDefinition procDef)
-  {
-    this.procDef = procDef;
-  }
-
   @Override
   public Process getProcess()
   {
     return proc;
   }
 
-  void setProcess(Process process)
-  {
-    this.proc = process;
-  }
-
   public int getNodeIndex()
   {
     return nodeIndex;
@@ -358,8 +348,24 @@
     return handler;
   }
 
-  protected void initialize(ProcessStructure procStruct)
+  @Override
+  protected void create(ProcessDefinition procDef)
   {
+    super.create(procDef);
+    this.procDef = procDef;
+    checkAndInitializeStructure(procStruct);
+  }
+
+  @Override
+  protected void create(Process proc)
+  {
+    super.create(proc);
+    this.proc = proc;
+    checkAndInitializeStructure(procStruct);
+  }
+
+  private void checkAndInitializeStructure(ProcessStructure procStruct)
+  {
     // Check required name
     if (name == null)
       throw new InvalidProcessException("Name is required for: " + this);
@@ -411,11 +417,6 @@
     if (outFlow == null && (this instanceof EndEvent == false))
       throw new InvalidProcessException("Dead end node: " + this);
   }
-
-  protected void instantiate(Process proc)
-  {
-    // noting to do
-  }
   
   private void initFlow(SequenceFlowImpl flow)
   {

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessDefinitionImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessDefinitionImpl.java	2008-10-03 10:51:32 UTC (rev 2472)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessDefinitionImpl.java	2008-10-03 11:18:34 UTC (rev 2473)
@@ -23,19 +23,23 @@
 
 //$Id$
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import javax.management.ObjectName;
 import javax.persistence.Entity;
+import javax.persistence.Lob;
 import javax.persistence.Transient;
 
 import org.jbpm.api.Constants;
 import org.jbpm.api.client.ProcessEngine;
-import org.jbpm.api.model.Node;
 import org.jbpm.api.model.Process;
 import org.jbpm.api.model.ProcessDefinition;
-import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.model.Property;
 import org.jbpm.api.model.builder.ObjectNameFactory;
-import org.jbpm.api.service.ProcessDefinitionService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -53,33 +57,52 @@
   // provide logging
   final static Logger log = LoggerFactory.getLogger(ProcessDefinitionImpl.class);
 
-  public ProcessDefinitionImpl(ProcessEngine engine, ProcessStructure procStruct)
+  @Lob
+  private byte[] rawProcStruct;
+
+  public ProcessDefinitionImpl(ProcessEngine engine, ProcessStructureImpl procStruct)
   {
     super(engine, procStruct);
-    for (Node node : procStruct.getNodes())
+
+    // Save the raw process structure
+    try
     {
-      NodeImpl nodeImpl = (NodeImpl)node;
-      nodeImpl.setProcessDefinition(this);
+      ByteArrayOutputStream baos = new ByteArrayOutputStream();
+      ObjectOutputStream oos = new ObjectOutputStream(baos);
+      oos.writeObject(procStruct);
+      rawProcStruct = baos.toByteArray();
     }
+    catch (IOException ex)
+    {
+      throw new IllegalStateException("Cannot serialize process structure", ex);
+    }
+
+    // Call the create life cycle
+    procStruct.create(this);
   }
-  
+
   // Persistence ctor
   protected ProcessDefinitionImpl()
   {
   }
-  
+
   @Override
   public Process newInstance()
   {
-    // Register the process definition if needed
-    ProcessDefinitionService procDefService = getProcessEngine().getService(ProcessDefinitionService.class);
-    if (procDefService.getProcessDefinitionByName(getName()) == null)
-      procDefService.registerProcessDefinition(this);
-    
-    ProcessStructureImpl procStructImpl = (ProcessStructureImpl)procStruct;
-    ProcessStructure newProcStruct = procStructImpl.newInstance();
-    ProcessImpl procImpl = new ProcessImpl(getProcessEngine(), this, newProcStruct);
-    
+    // Create a copy of the process structure from raw data
+    ProcessStructureImpl procStructCopy;
+    try
+    {
+      ByteArrayInputStream bais = new ByteArrayInputStream(rawProcStruct);
+      ObjectInputStream ois = new ObjectInputStream(bais);
+      procStructCopy = (ProcessStructureImpl)ois.readObject();
+    }
+    catch (Exception ex)
+    {
+      throw new IllegalStateException("Cannot deserialize process", ex);
+    }
+
+    ProcessImpl procImpl = new ProcessImpl(getProcessEngine(), this, procStructCopy);
     return procImpl;
   }
 
@@ -105,6 +128,25 @@
     throw new IllegalStateException("Cannot add remove a property to a process definition");
   }
 
+  public void initializeMessageRef(MessageImpl msgRef)
+  {
+    String msgName = msgRef.getName();
+    MessageImpl procMsg = (MessageImpl)getMessage(msgName);
+    if (procMsg == null)
+      throw new IllegalStateException("Cannot obtain process message: " + msgName);
+
+    if (msgRef.getFromRef() == null && procMsg.getFromRef() != null)
+      msgRef.setFromRef(procMsg.getFromRef());
+    if (msgRef.getToRef() == null && procMsg.getToRef() != null)
+      msgRef.setToRef(procMsg.getToRef());
+
+    for (String propName : procMsg.getPropertyNames())
+    {
+      Property prop = procMsg.getProperty(propName);
+      msgRef.addProperty(prop);
+    }
+  }
+
   public String toString()
   {
     return "ProcessDefinition[" + getName() + "]";

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessImpl.java	2008-10-03 10:51:32 UTC (rev 2472)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessImpl.java	2008-10-03 11:18:34 UTC (rev 2473)
@@ -24,18 +24,18 @@
 //$Id$
 
 import javax.management.ObjectName;
+import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
 import javax.persistence.ManyToOne;
 import javax.persistence.Transient;
 
 import org.jbpm.api.Constants;
 import org.jbpm.api.client.ProcessEngine;
-import org.jbpm.api.model.Node;
 import org.jbpm.api.model.Process;
 import org.jbpm.api.model.ProcessDefinition;
-import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.model.builder.ObjectNameFactory;
 import org.jbpm.api.runtime.Attachments;
 import org.jbpm.api.service.ExecutionService;
@@ -59,24 +59,17 @@
   @Enumerated(EnumType.STRING)
   private ProcessStatus status = ProcessStatus.None;
   
-  @ManyToOne(targetEntity = ProcessDefinitionImpl.class)
+  @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = ProcessDefinitionImpl.class)
   private ProcessDefinition procDef;
   
   @Transient 
   private transient RuntimeException runtimeException; 
 
-  public ProcessImpl(ProcessEngine engine, ProcessDefinition procDef, ProcessStructure procStruct)
+  public ProcessImpl(ProcessEngine engine, ProcessDefinitionImpl procDef, ProcessStructureImpl procStruct)
   {
     super(engine, procStruct);
-    
     this.procDef = procDef;
-    
-    for (Node node : procStruct.getNodes())
-    {
-      NodeImpl nodeImpl = (NodeImpl)node;
-      nodeImpl.setProcessDefinition(procDef);
-      nodeImpl.setProcess(this);
-    }
+    procStruct.create(this);
   }
 
   // Persistence ctor

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessStructureImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessStructureImpl.java	2008-10-03 10:51:32 UTC (rev 2472)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessStructureImpl.java	2008-10-03 11:18:34 UTC (rev 2473)
@@ -23,11 +23,6 @@
 
 //$Id$
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -39,7 +34,6 @@
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
-import javax.persistence.Lob;
 import javax.persistence.OneToMany;
 import javax.persistence.Transient;
 
@@ -51,8 +45,9 @@
 import org.jbpm.api.model.EndEvent;
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Node;
-import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
+import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.model.Property;
 import org.jbpm.api.model.StartEvent;
 import org.jbpm.api.model.builder.ObjectNameFactory;
@@ -88,15 +83,12 @@
 
   @Transient
   private List<Assignment> assignments = new ArrayList<Assignment>();
-  
-  @Lob
-  private byte[] rawProc;
-  
+
   public ProcessStructureImpl(ProcessEngine engine, String name)
   {
     super(engine);
     this.name = name;
-    
+
     if (name == null)
       throw new InvalidProcessException("Process name cannot be null");
   }
@@ -105,22 +97,6 @@
   protected ProcessStructureImpl()
   {
   }
-  
-  public ProcessStructureImpl newInstance()
-  {
-    ProcessStructureImpl procCopy;
-    try
-    {
-      ByteArrayInputStream bais = new ByteArrayInputStream(rawProc);
-      ObjectInputStream ois = new ObjectInputStream(bais);
-      procCopy = (ProcessStructureImpl)ois.readObject();
-    }
-    catch (Exception ex)
-    {
-      throw new IllegalStateException("Cannot deserialize process", ex);
-    }
-    return procCopy;
-  }
 
   @Override
   @Transient
@@ -269,8 +245,11 @@
     this.assignments.add(assignment);
   }
 
-  public void initialize(ProcessStructure procStruct)
+  @Override
+  public void create(ProcessDefinition procDef)
   {
+    super.create(procDef);
+
     // Check required name
     if (name == null)
       throw new InvalidProcessException("Name is required for: " + this);
@@ -281,58 +260,25 @@
     if (getNodes(EndEvent.class).size() == 0)
       throw new InvalidProcessException("Process does not have end events");
 
-    // Initialize the nodes
     for (Node node : getNodes())
     {
       NodeImpl nodeImpl = (NodeImpl)node;
-      nodeImpl.initialize(procStruct);
+      nodeImpl.create(procDef);
     }
-
-    // Save the initalized raw data
-    if (rawProc == null)
-    {
-      try
-      {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        ObjectOutputStream oos = new ObjectOutputStream(baos);
-        oos.writeObject(this);
-        rawProc = baos.toByteArray();
-      }
-      catch (IOException ex)
-      {
-        throw new IllegalStateException("Cannot serialize process structure", ex);
-      }
-    }
   }
 
-  public void instantiate(Process proc)
+  @Override
+  protected void create(Process proc)
   {
-    for (Node node : nodes)
+    super.create(proc);
+    
+    for (Node node : getNodes())
     {
       NodeImpl nodeImpl = (NodeImpl)node;
-      nodeImpl.instantiate(proc);
+      nodeImpl.create(proc);
     }
   }
 
-  public void initializeMessageRef(MessageImpl msgRef)
-  {
-    String msgName = msgRef.getName();
-    MessageImpl procMsg = (MessageImpl)getMessage(msgName);
-    if (procMsg == null)
-      throw new IllegalStateException("Cannot obtain process message: " + msgName);
-
-    if (msgRef.getFromRef() == null && procMsg.getFromRef() != null)
-      msgRef.setFromRef(procMsg.getFromRef());
-    if (msgRef.getToRef() == null && procMsg.getToRef() != null)
-      msgRef.setToRef(procMsg.getToRef());
-
-    for (String propName : procMsg.getPropertyNames())
-    {
-      Property prop = procMsg.getProperty(propName);
-      msgRef.addProperty(prop);
-    }
-  }
-
   public String toString()
   {
     return "ProcessStructure[" + getName() + "]";

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ReceiveTaskImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ReceiveTaskImpl.java	2008-10-03 10:51:32 UTC (rev 2472)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ReceiveTaskImpl.java	2008-10-03 11:18:34 UTC (rev 2473)
@@ -34,6 +34,7 @@
 import org.jbpm.api.client.MessageListener;
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Node;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.runtime.ExecutionContext;
 import org.jbpm.api.runtime.ExecutionHandler;
@@ -198,14 +199,14 @@
   }
 
   @Override
-  protected void initialize(ProcessStructure procStruct)
+  protected void create(ProcessDefinition procDef)
   {
-    super.initialize(procStruct);
+    super.create(procDef);
 
     if (messageRef == null)
       throw new InvalidProcessException("A message for the message ref attribute MUST be entered");
 
-    ProcessStructureImpl procDefImpl = (ProcessStructureImpl)procStruct;
+    ProcessDefinitionImpl procDefImpl = (ProcessDefinitionImpl)procDef;
     procDefImpl.initializeMessageRef(messageRef);
   }
 }
\ No newline at end of file

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/SendTaskImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/SendTaskImpl.java	2008-10-03 10:51:32 UTC (rev 2472)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/SendTaskImpl.java	2008-10-03 11:18:34 UTC (rev 2473)
@@ -29,6 +29,7 @@
 import org.jbpm.api.InvalidProcessException;
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Node;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.runtime.ExecutionHandler;
 import org.jbpm.api.runtime.Token;
@@ -101,14 +102,14 @@
   }
 
   @Override
-  protected void initialize(ProcessStructure procStruct)
+  protected void create(ProcessDefinition procDef)
   {
-    super.initialize(procStruct);
+    super.create(procDef);
 
     if (messageRef == null)
       throw new InvalidProcessException("A message for the message ref attribute MUST be entered");
 
-    ProcessStructureImpl procDefImpl = (ProcessStructureImpl)procStruct;
+    ProcessDefinitionImpl procDefImpl = (ProcessDefinitionImpl)procDef;
     procDefImpl.initializeMessageRef(messageRef);
 
     if (messageRef.getToRef() == null)

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StartEventImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StartEventImpl.java	2008-10-03 10:51:32 UTC (rev 2472)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StartEventImpl.java	2008-10-03 11:18:34 UTC (rev 2473)
@@ -147,9 +147,9 @@
   }
 
   @Override
-  protected void instantiate(Process proc)
+  protected void create(Process proc)
   {
-    super.instantiate(proc);
+    super.create(proc);
 
     final ProcessEngine engine = getProcessEngine();
     final SignalService sigService = engine.getService(SignalService.class);

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/ProcessBuilderImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/ProcessBuilderImpl.java	2008-10-03 10:51:32 UTC (rev 2472)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/ProcessBuilderImpl.java	2008-10-03 11:18:34 UTC (rev 2473)
@@ -91,10 +91,7 @@
   public ProcessDefinition getProcessDefinition()
   {
     ProcessStructureImpl procStruct = getProcessStructure();
-    procStruct.initialize(procStruct);
-    
-    ProcessDefinitionImpl procImpl = new ProcessDefinitionImpl(engine, procStruct);
-    return procImpl;
+    return new ProcessDefinitionImpl(engine, procStruct);
   }
 
   public ProcessBuilder addSequenceFlow(String targetName)

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/PersistenceServiceImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/PersistenceServiceImpl.java	2008-10-03 10:51:32 UTC (rev 2472)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/PersistenceServiceImpl.java	2008-10-03 11:18:34 UTC (rev 2473)
@@ -85,7 +85,7 @@
     Transaction tx = session.beginTransaction();
     try
     {
-      session.save(procDef);
+      session.saveOrUpdate(procDef);
       tx.commit();
     }
     finally
@@ -146,7 +146,7 @@
     Transaction tx = session.beginTransaction();
     try
     {
-      session.save(proc);
+      session.saveOrUpdate(proc);
       tx.commit();
     }
     finally




More information about the jbpm-commits mailing list