[jbpm-commits] JBoss JBPM SVN: r3220 - in jbpm3/trunk/modules: core/src/main/java/org/jbpm/graph/def and 10 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Fri Dec 5 06:14:57 EST 2008
Author: thomas.diesler at jboss.com
Date: 2008-12-05 06:14:56 -0500 (Fri, 05 Dec 2008)
New Revision: 3220
Added:
jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Identifiable.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/AbstractElementImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NoneTaskImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayForkImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayJoinImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxy.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxySupport.java
jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/task/
jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/task/TaskTest.java
Removed:
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayImpl.java
Modified:
jbpm3/trunk/modules/core/pom.xml
jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/GraphElement.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Node.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/Token.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Decision.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/EndState.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Fork.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Join.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/StartState.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/State.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/TaskNode.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/EndEventImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/EventImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ExclusiveGatewayImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/GatewayImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NodeImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ProcessDefinitionImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ProcessImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/StartEventImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/TaskImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/UserTaskImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/WaitStateImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/builder/ProcessBuilderImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/NodeExecuteInterceptor.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/TokenAttachmentDelegate.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/TokenImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/DeploymentServiceImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ExecutionServiceImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ProcessDefinitionServiceImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ProcessServiceImpl.java
jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/task/TaskImpl.java
jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/deployment/DeploymentPARTest.java
Log:
Update spec integration to use proxies
Modified: jbpm3/trunk/modules/core/pom.xml
===================================================================
--- jbpm3/trunk/modules/core/pom.xml 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/pom.xml 2008-12-05 11:14:56 UTC (rev 3220)
@@ -119,6 +119,11 @@
<artifactId>hsqldb</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>mysql</groupId>
+ <artifactId>mysql-connector-java</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<!-- Plugins -->
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/GraphElement.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/GraphElement.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/GraphElement.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -42,7 +42,7 @@
import org.jbpm.svc.Services;
import org.jbpm.util.EqualsUtil;
-public abstract class GraphElement implements Serializable {
+public abstract class GraphElement implements Identifiable, Serializable {
private static final long serialVersionUID = 1L;
Added: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Identifiable.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Identifiable.java (rev 0)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Identifiable.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.graph.def;
+
+/**
+ * Implemteded by elemtes that support an id
+ *
+ * @author Thomas.Diesler at jboss.com
+ * @since 04-Dec-2008
+ */
+public interface Identifiable
+{
+ long getId();
+}
Property changes on: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Identifiable.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Node.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Node.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Node.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -48,6 +48,8 @@
{
private static final long serialVersionUID = 1L;
+
+ public enum NodeType { Node, StartState, EndState, State, Task, Fork, Join, Decision };
protected List<Transition> leavingTransitions = null;
transient Map leavingTransitionMap = null;
@@ -57,10 +59,20 @@
protected boolean isAsync = false;
protected boolean isAsyncExclusive = false;
+
+ public NodeType getNodeType()
+ {
+ return NodeType.Node;
+ }
+
// event types //////////////////////////////////////////////////////////////
- public static final String[] supportedEventTypes = new String[] { Event.EVENTTYPE_NODE_ENTER, Event.EVENTTYPE_NODE_LEAVE, Event.EVENTTYPE_BEFORE_SIGNAL,
- Event.EVENTTYPE_AFTER_SIGNAL };
+ public static final String[] supportedEventTypes = new String[] {
+ Event.EVENTTYPE_NODE_ENTER,
+ Event.EVENTTYPE_NODE_LEAVE,
+ Event.EVENTTYPE_BEFORE_SIGNAL,
+ Event.EVENTTYPE_AFTER_SIGNAL
+ };
public String[] getSupportedEventTypes()
{
@@ -274,7 +286,7 @@
/**
* are the arriving transitions.
*/
- public Set getArrivingTransitions()
+ public Set<Transition> getArrivingTransitions()
{
return arrivingTransitions;
}
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -33,6 +33,7 @@
import org.jbpm.JbpmException;
import org.jbpm.context.exe.ContextInstance;
import org.jbpm.graph.def.Event;
+import org.jbpm.graph.def.Identifiable;
import org.jbpm.graph.def.Node;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.def.Transition;
@@ -54,7 +55,7 @@
* definition, just use the {@link #ProcessInstance(ProcessDefinition)}.
*
*/
-public class ProcessInstance implements Serializable
+public class ProcessInstance implements Identifiable, Serializable
{
private static final long serialVersionUID = 1L;
@@ -163,6 +164,11 @@
}
Node initialNode = rootToken.getNode();
+ fireStartEvent(initialNode);
+ }
+
+ public void fireStartEvent(Node initialNode)
+ {
// fire the process start event
if (initialNode != null)
{
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/Token.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/Token.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/Token.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -37,6 +37,7 @@
import org.jbpm.JbpmException;
import org.jbpm.db.JobSession;
import org.jbpm.graph.def.Event;
+import org.jbpm.graph.def.Identifiable;
import org.jbpm.graph.def.Node;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.def.Transition;
@@ -57,7 +58,7 @@
* {@link org.jbpm.graph.def.ProcessDefinition}. Most common way to get a hold of the token objects is with
* {@link ProcessInstance#getRootToken()} or {@link org.jbpm.graph.exe.ProcessInstance#findToken(String)}.
*/
-public class Token implements Serializable
+public class Token implements Identifiable, Serializable
{
private static final long serialVersionUID = 1L;
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Decision.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Decision.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Decision.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -58,6 +58,12 @@
super(name);
}
+ @Override
+ public NodeType getNodeType()
+ {
+ return NodeType.Decision;
+ }
+
public void read(Element decisionElement, JpdlXmlReader jpdlReader) {
String expression = decisionElement.attributeValue("expression");
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/EndState.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/EndState.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/EndState.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -46,6 +46,12 @@
super(name);
}
+ @Override
+ public NodeType getNodeType()
+ {
+ return NodeType.EndState;
+ }
+
public void read(Element nodeElement, JpdlXmlReader jpdlXmlReader) {
endCompleteProcess = nodeElement.attributeValue("end-complete-process");
}
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Fork.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Fork.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Fork.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -76,6 +76,12 @@
super(name);
}
+ @Override
+ public NodeType getNodeType()
+ {
+ return NodeType.Fork;
+ }
+
public void read(Element forkElement, JpdlXmlReader jpdlReader) {
Element scriptElement = forkElement.element("script");
if (scriptElement!=null) {
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Join.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Join.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Join.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -77,6 +77,12 @@
super(name);
}
+ @Override
+ public NodeType getNodeType()
+ {
+ return NodeType.Join;
+ }
+
public void read(Element element, JpdlXmlReader jpdlReader) {
String lock = element.attributeValue("lock");
if (lock != null) {
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/StartState.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/StartState.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/StartState.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -41,6 +41,22 @@
super(name);
}
+ @Override
+ public String getName()
+ {
+ String name = super.getName();
+ if (name == null)
+ name = "StartState";
+
+ return name;
+ }
+
+ @Override
+ public NodeType getNodeType()
+ {
+ return NodeType.StartState;
+ }
+
// event types //////////////////////////////////////////////////////////////
public static final String[] supportedEventTypes = new String[]{
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/State.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/State.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/State.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -36,6 +36,13 @@
super( name );
}
- public void execute(ExecutionContext executionContext) {
+ @Override
+ public NodeType getNodeType()
+ {
+ return NodeType.State;
}
+
+ public void execute(ExecutionContext executionContext)
+ {
+ }
}
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/TaskNode.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/TaskNode.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/TaskNode.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -115,6 +115,12 @@
super(name);
}
+ @Override
+ public NodeType getNodeType()
+ {
+ return NodeType.Task;
+ }
+
public void read(Element element, JpdlXmlReader jpdlReader) {
// get the signal
String signalText = element.attributeValue("signal");
Added: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/AbstractElementImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/AbstractElementImpl.java (rev 0)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/AbstractElementImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -0,0 +1,107 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.integration.spec.model;
+
+import org.jboss.bpm.api.client.ProcessEngine;
+import org.jboss.bpm.api.model.AbstractElement;
+import org.jboss.bpm.api.runtime.ExecutionContext;
+import org.jboss.bpm.api.service.ExecutionContextService;
+import org.jbpm.JbpmContext;
+import org.jbpm.graph.def.Identifiable;
+
+/**
+ * An integration wrapper
+ *
+ * @author thomas.diesler at jboss.com
+ * @since 15-Nov-2008
+ */
+public abstract class AbstractElementImpl<T extends Identifiable> implements AbstractElement
+{
+ private static final long serialVersionUID = 1L;
+
+ private ProcessEngine engine;
+
+ private T tempObj;
+ private Class<T> objClass;
+ private long objID;
+
+ @SuppressWarnings("unchecked")
+ public AbstractElementImpl(ProcessEngine engine, Identifiable tempObj, Class<T> objClass)
+ {
+ this.engine = engine;
+ this.objClass = objClass;
+ // Store the ID of the underlying jBPM3 object
+ objID = tempObj.getId();
+ if (objID == 0)
+ this.tempObj = (T)tempObj;
+ }
+
+ public ProcessEngine getProcessEngine()
+ {
+ return engine;
+ }
+
+ @SuppressWarnings("unchecked")
+ public T getDelegate()
+ {
+ T retObj = null;
+
+ // Determine the current ID to use
+ long currID = objID;
+ if (currID == 0 && tempObj != null)
+ currID = tempObj.getId();
+
+ // If there is no ID, use the tmp object
+ if (currID == 0 && tempObj != null)
+ retObj = tempObj;
+
+ // Get the delegate from the persistence session
+ if (retObj == null)
+ {
+ if (objClass == null || currID == 0)
+ throw new IllegalArgumentException("Cannot obtain delegate for '" + objClass + "' id: " + currID);
+
+ // From now on use this object ID
+ objID = currID;
+ tempObj = null;
+
+ ExecutionContextService execService = getProcessEngine().getService(ExecutionContextService.class);
+ ExecutionContext bpmContext = execService.getExecutionContext(true);
+ try
+ {
+ JbpmContext jbpmContext = bpmContext.getAttachment(JbpmContext.class);
+ Object obj = jbpmContext.getSession().get(objClass, objID);
+ retObj = (T)obj;
+ }
+ finally
+ {
+ bpmContext.close();
+ }
+ }
+
+ // Complain if the delegate cannot be obtained
+ if (retObj == null)
+ throw new IllegalStateException("Cannot obtain delegate for '" + objClass.getName() + "' id: " + objID);
+
+ return retObj;
+ }
+}
Property changes on: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/AbstractElementImpl.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/EndEventImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/EndEventImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/EndEventImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -24,9 +24,11 @@
import java.util.List;
import org.jboss.bpm.api.NotImplementedException;
+import org.jboss.bpm.api.client.ProcessEngine;
import org.jboss.bpm.api.model.EndEvent;
import org.jboss.bpm.api.model.ProcessDefinition;
import org.jboss.bpm.api.model.SequenceFlow;
+import org.jbpm.graph.def.Node;
import org.jbpm.graph.node.EndState;
/**
@@ -35,13 +37,13 @@
* @author thomas.diesler at jboss.com
* @since 15-Nov-2008
*/
-public class EndEventImpl extends EventImpl implements EndEvent
+public class EndEventImpl extends EventImpl<EndState> implements EndEvent
{
private static final long serialVersionUID = 1L;
- public EndEventImpl(ProcessDefinition procDef, EndState oldEnd)
+ public EndEventImpl(ProcessEngine engine, ProcessDefinition procDef, Node oldEnd)
{
- super(procDef, oldEnd);
+ super(engine, procDef, EndState.class, oldEnd);
}
//@Override
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/EventImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/EventImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/EventImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -21,6 +21,7 @@
*/
package org.jbpm.integration.spec.model;
+import org.jboss.bpm.api.client.ProcessEngine;
import org.jboss.bpm.api.model.Event;
import org.jboss.bpm.api.model.ProcessDefinition;
import org.jbpm.graph.def.Node;
@@ -31,12 +32,12 @@
* @author thomas.diesler at jboss.com
* @since 15-Nov-2008
*/
-public abstract class EventImpl extends NodeImpl implements Event
+public abstract class EventImpl<T extends Node> extends NodeImpl<T> implements Event
{
private static final long serialVersionUID = 1L;
- public EventImpl(ProcessDefinition procDef, Node oldNode)
+ public EventImpl(ProcessEngine engine, ProcessDefinition procDef, Class<T> clazz, Node oldNode)
{
- super(procDef, oldNode);
+ super(engine, procDef, clazz, oldNode);
}
}
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ExclusiveGatewayImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ExclusiveGatewayImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ExclusiveGatewayImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -30,6 +30,7 @@
import org.jboss.bpm.api.model.SequenceFlow;
import org.jboss.bpm.api.model.SequenceFlow.ConditionType;
import org.jboss.bpm.api.runtime.Token;
+import org.jbpm.graph.def.Node;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.graph.node.Decision;
import org.jbpm.graph.node.DecisionHandler;
@@ -43,15 +44,15 @@
* @author thomas.diesler at jboss.com
* @since 15-Nov-2008
*/
-public class ExclusiveGatewayImpl extends GatewayImpl implements ExclusiveGateway
+public class ExclusiveGatewayImpl extends GatewayImpl<Decision> implements ExclusiveGateway
{
private static final long serialVersionUID = 1L;
- public ExclusiveGatewayImpl(ProcessDefinition procDef, Decision oldDecision)
+ public ExclusiveGatewayImpl(ProcessEngine engine, ProcessDefinition procDef, Node oldDecision)
{
- super(procDef, oldDecision);
+ super(engine, procDef, Decision.class, oldDecision);
ExclusiveGatewayDecisionHandler decisionHandler = new ExclusiveGatewayDecisionHandler();
- oldDecision.setDecisionDelegation(new Delegation(decisionHandler));
+ getDelegate().setDecisionDelegation(new Delegation(decisionHandler));
}
//@Override
@@ -118,7 +119,7 @@
}
if (selectedGate == null)
- throw new IllegalStateException("Cannot select applicable gate in: " + getOldNode());
+ throw new IllegalStateException("Cannot select applicable gate in: " + this);
return selectedGate.getTargetRef();
}
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/GatewayImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/GatewayImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/GatewayImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -24,6 +24,7 @@
import java.util.List;
import org.jboss.bpm.api.NotImplementedException;
+import org.jboss.bpm.api.client.ProcessEngine;
import org.jboss.bpm.api.model.Gateway;
import org.jboss.bpm.api.model.ProcessDefinition;
import org.jboss.bpm.api.model.SequenceFlow;
@@ -35,13 +36,13 @@
* @author thomas.diesler at jboss.com
* @since 15-Nov-2008
*/
-public abstract class GatewayImpl extends NodeImpl implements Gateway
+public abstract class GatewayImpl<T extends Node> extends NodeImpl<T> implements Gateway
{
private static final long serialVersionUID = 1L;
- public GatewayImpl(ProcessDefinition procDef, Node oldNode)
+ public GatewayImpl(ProcessEngine engine, ProcessDefinition procDef, Class<T> clazz, Node oldNode)
{
- super(procDef, oldNode);
+ super(engine, procDef, clazz, oldNode);
}
//@Override
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NodeImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NodeImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NodeImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -30,6 +30,7 @@
import org.jboss.bpm.api.Constants;
import org.jboss.bpm.api.InvalidProcessException;
import org.jboss.bpm.api.NotImplementedException;
+import org.jboss.bpm.api.client.ProcessEngine;
import org.jboss.bpm.api.model.Node;
import org.jboss.bpm.api.model.Process;
import org.jboss.bpm.api.model.ProcessDefinition;
@@ -37,6 +38,7 @@
import org.jboss.bpm.api.model.SequenceFlow.ConditionType;
import org.jboss.bpm.api.model.builder.ObjectNameFactory;
import org.jbpm.graph.def.Transition;
+import org.jbpm.integration.spec.runtime.InvocationProxy;
/**
* An integration wrapper
@@ -44,36 +46,30 @@
* @author thomas.diesler at jboss.com
* @since 15-Nov-2008
*/
-public class NodeImpl implements Node
+public abstract class NodeImpl<T extends org.jbpm.graph.def.Node> extends AbstractElementImpl<T> implements Node
{
private static final long serialVersionUID = 1L;
private ProcessDefinition procDef;
- private org.jbpm.graph.def.Node oldNode;
private List<SequenceFlow> outFlows = new ArrayList<SequenceFlow>();
private List<SequenceFlow> inFlows = new ArrayList<SequenceFlow>();
- public NodeImpl(ProcessDefinition procDef, org.jbpm.graph.def.Node oldNode)
+ public NodeImpl(ProcessEngine engine, ProcessDefinition procDef, Class<T> clazz, org.jbpm.graph.def.Node oldNode)
{
+ super(engine, oldNode, clazz);
this.procDef = procDef;
- this.oldNode = oldNode;
}
public ObjectName getKey()
{
- long id = oldNode.getId();
+ long id = getDelegate().getId();
return ObjectNameFactory.create(Constants.ID_DOMAIN + ":node=" + getName() + ",id=" + id);
}
- public org.jbpm.graph.def.Node getOldNode()
- {
- return oldNode;
- }
-
public String getName()
{
- return oldNode.getName();
+ return getDelegate().getName();
}
public ProcessDefinition getProcessDefinition()
@@ -86,18 +82,21 @@
throw new NotImplementedException();
}
+ @SuppressWarnings("unchecked")
public void addSequenceFlow(SequenceFlowImpl flow)
{
String targetRef = flow.getTargetRef();
- NodeImpl targetNode = (NodeImpl)procDef.getNode(targetRef);
+ NodeImpl<T> targetNode = (NodeImpl<T>)procDef.getNode(targetRef);
if (targetNode == null)
throw new InvalidProcessException("Cannot obtain target node: " + targetRef);
+ org.jbpm.graph.def.Node delegate = getDelegate();
+
Transition trans = flow.getOldTransition();
- if (oldNode.hasLeavingTransition(trans.getName()) == false)
+ if (delegate.hasLeavingTransition(trans.getName()) == false)
{
- oldNode.addLeavingTransition(trans);
- targetNode.getOldNode().addArrivingTransition(trans);
+ delegate.addLeavingTransition(trans);
+ targetNode.getDelegate().addArrivingTransition(trans);
}
if (flow.getConditionType() == ConditionType.Expression)
@@ -118,7 +117,7 @@
SequenceFlow outFlow = null;
for (SequenceFlow auxFlow : outFlows)
{
- SequenceFlowImpl flowImpl = (SequenceFlowImpl)auxFlow;
+ SequenceFlowImpl flowImpl = InvocationProxy.getUnderlying(auxFlow, SequenceFlowImpl.class);
if (flowImpl.getOldTransition() == trans)
{
outFlow = auxFlow;
@@ -137,9 +136,4 @@
{
return Collections.unmodifiableList(outFlows);
}
-
- public String toString()
- {
- return oldNode.toString();
- }
}
Added: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NoneTaskImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NoneTaskImpl.java (rev 0)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NoneTaskImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.integration.spec.model;
+
+import org.jboss.bpm.api.client.ProcessEngine;
+import org.jboss.bpm.api.model.ProcessDefinition;
+import org.jboss.bpm.api.model.Task;
+import org.jbpm.graph.def.Node;
+
+/**
+ * An integration wrapper
+ *
+ * @author thomas.diesler at jboss.com
+ * @since 15-Nov-2008
+ */
+public class NoneTaskImpl extends TaskImpl<Node> implements Task
+{
+ private static final long serialVersionUID = 1L;
+
+ public NoneTaskImpl(ProcessEngine engine, ProcessDefinition procDef, Node oldNode)
+ {
+ super(engine, procDef, Node.class, oldNode);
+ }
+
+ //@Override
+ public TaskType getTaskType()
+ {
+ return TaskType.None;
+ }
+}
Property changes on: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NoneTaskImpl.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayForkImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayForkImpl.java (rev 0)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayForkImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -0,0 +1,52 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.integration.spec.model;
+
+// $Id$
+
+import org.jboss.bpm.api.client.ProcessEngine;
+import org.jboss.bpm.api.model.ProcessDefinition;
+import org.jboss.bpm.incubator.model.ParallelGateway;
+import org.jbpm.graph.def.Node;
+import org.jbpm.graph.node.Fork;
+
+/**
+ * An integration wrapper
+ *
+ * @author thomas.diesler at jboss.com
+ * @since 15-Nov-2008
+ */
+public class ParallelGatewayForkImpl extends GatewayImpl<Fork> implements ParallelGateway
+{
+ private static final long serialVersionUID = 1L;
+
+ public ParallelGatewayForkImpl(ProcessEngine engine, ProcessDefinition procDef, Node oldFork)
+ {
+ super(engine, procDef, Fork.class, oldFork);
+ }
+
+ // @Override
+ public GatewayType getGatewayType()
+ {
+ return GatewayType.Parallel;
+ }
+}
Property changes on: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayForkImpl.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Deleted: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -1,56 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jbpm.integration.spec.model;
-
-// $Id$
-
-import org.jboss.bpm.api.model.ProcessDefinition;
-import org.jboss.bpm.incubator.model.ParallelGateway;
-import org.jbpm.graph.node.Fork;
-import org.jbpm.graph.node.Join;
-
-/**
- * An integration wrapper
- *
- * @author thomas.diesler at jboss.com
- * @since 15-Nov-2008
- */
-public class ParallelGatewayImpl extends GatewayImpl implements ParallelGateway
-{
- private static final long serialVersionUID = 1L;
-
- public ParallelGatewayImpl(ProcessDefinition procDef, Fork oldFork)
- {
- super(procDef, oldFork);
- }
-
- public ParallelGatewayImpl(ProcessDefinition procDef, Join oldJoin)
- {
- super(procDef, oldJoin);
- }
-
- // @Override
- public GatewayType getGatewayType()
- {
- return GatewayType.Parallel;
- }
-}
Copied: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayJoinImpl.java (from rev 3200, jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayImpl.java)
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayJoinImpl.java (rev 0)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayJoinImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -0,0 +1,52 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.integration.spec.model;
+
+// $Id$
+
+import org.jboss.bpm.api.client.ProcessEngine;
+import org.jboss.bpm.api.model.ProcessDefinition;
+import org.jboss.bpm.incubator.model.ParallelGateway;
+import org.jbpm.graph.def.Node;
+import org.jbpm.graph.node.Join;
+
+/**
+ * An integration wrapper
+ *
+ * @author thomas.diesler at jboss.com
+ * @since 15-Nov-2008
+ */
+public class ParallelGatewayJoinImpl extends GatewayImpl<Join> implements ParallelGateway
+{
+ private static final long serialVersionUID = 1L;
+
+ public ParallelGatewayJoinImpl(ProcessEngine engine, ProcessDefinition procDef, Node oldJoin)
+ {
+ super(engine, procDef, Join.class, oldJoin);
+ }
+
+ // @Override
+ public GatewayType getGatewayType()
+ {
+ return GatewayType.Parallel;
+ }
+}
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ProcessDefinitionImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ProcessDefinitionImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ProcessDefinitionImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -29,6 +29,7 @@
import org.jboss.bpm.api.Constants;
import org.jboss.bpm.api.InvalidProcessException;
+import org.jboss.bpm.api.NotImplementedException;
import org.jboss.bpm.api.client.ProcessEngine;
import org.jboss.bpm.api.model.Expression;
import org.jboss.bpm.api.model.Node;
@@ -37,14 +38,9 @@
import org.jboss.bpm.api.model.SequenceFlow.ConditionType;
import org.jboss.bpm.api.model.builder.ObjectNameFactory;
import org.jbpm.graph.def.Transition;
+import org.jbpm.graph.def.Node.NodeType;
import org.jbpm.graph.exe.ProcessInstance;
-import org.jbpm.graph.node.Decision;
-import org.jbpm.graph.node.EndState;
-import org.jbpm.graph.node.Fork;
-import org.jbpm.graph.node.Join;
-import org.jbpm.graph.node.StartState;
-import org.jbpm.graph.node.State;
-import org.jbpm.graph.node.TaskNode;
+import org.jbpm.integration.spec.runtime.InvocationProxy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -54,15 +50,14 @@
* @author thomas.diesler at jboss.com
* @since 15-Nov-2008
*/
-public class ProcessDefinitionImpl implements ProcessDefinition
+public class ProcessDefinitionImpl extends AbstractElementImpl<org.jbpm.graph.def.ProcessDefinition> implements ProcessDefinition
{
private static final long serialVersionUID = 1L;
// provide logging
private static final Logger log = LoggerFactory.getLogger(ProcessDefinitionImpl.class);
-
- private ProcessEngine engine;
- private org.jbpm.graph.def.ProcessDefinition oldProcDef;
+
+ private ObjectName keyCache;
private List<Node> nodes;
public ProcessDefinitionImpl(ProcessEngine engine, String name)
@@ -70,28 +65,25 @@
this(engine, new org.jbpm.graph.def.ProcessDefinition(name));
}
- public ProcessDefinitionImpl(ProcessEngine engine, org.jbpm.graph.def.ProcessDefinition oldProcDef)
+ public ProcessDefinitionImpl(ProcessEngine engine, org.jbpm.graph.def.ProcessDefinition tmpProcDef)
{
- this.oldProcDef = oldProcDef;
- this.engine = engine;
+ super(engine, tmpProcDef, org.jbpm.graph.def.ProcessDefinition.class);
- if (oldProcDef.getName() == null)
+ if (tmpProcDef.getName() == null)
throw new InvalidProcessException("ProcessDefinition name cannot be null");
}
- public org.jbpm.graph.def.ProcessDefinition getOldProcessDefinition()
- {
- return oldProcDef;
- }
-
- public ProcessEngine getProcessEngine()
- {
- return engine;
- }
-
public ObjectName getKey()
{
- return getKey(oldProcDef);
+ ObjectName objKey = keyCache;
+ if (objKey == null)
+ {
+ org.jbpm.graph.def.ProcessDefinition delegate = getDelegate();
+ objKey = getKey(delegate);
+ if (delegate.getId() > 0)
+ keyCache = objKey;
+ }
+ return objKey;
}
public static ObjectName getKey(org.jbpm.graph.def.ProcessDefinition oldProcDef)
@@ -108,32 +100,36 @@
public String getName()
{
- return oldProcDef.getName();
+ return getDelegate().getName();
}
public String getVersion()
{
- int version = oldProcDef.getVersion();
+ int version = getDelegate().getVersion();
return version > 0 ? String.valueOf(version) : null;
}
public Process newInstance()
{
- ProcessImpl procImpl = new ProcessImpl(engine, new ProcessInstance(oldProcDef));
- return procImpl;
+ ProcessInstance oldProc = new ProcessInstance();
+ oldProc.setProcessDefinition(getDelegate());
+
+ Process proc = new ProcessImpl(getProcessEngine(), oldProc);
+ proc = InvocationProxy.newInstance((ProcessImpl)proc, Process.class);
+ return proc;
}
- public void addNode(NodeImpl nodeImpl)
+ public void addNode(NodeImpl<?> nodeImpl)
{
- org.jbpm.graph.def.Node oldNode = nodeImpl.getOldNode();
- oldProcDef.addNode(oldNode);
+ org.jbpm.graph.def.Node oldNode = nodeImpl.getDelegate();
+ getDelegate().addNode(oldNode);
}
public Node getNode(String name)
{
if (name == null)
throw new IllegalArgumentException("Cannot find node with name: null");
-
+
Node retNode = null;
for (Node auxNode : getNodes())
{
@@ -151,46 +147,50 @@
if (nodes == null)
{
nodes = new ArrayList<Node>();
- for(org.jbpm.graph.def.Node oldNode : oldProcDef.getNodes())
+ ProcessEngine engine = getProcessEngine();
+ for (org.jbpm.graph.def.Node oldNode : getDelegate().getNodes())
{
- NodeImpl nodeImpl;
- if (oldNode instanceof StartState)
+ NodeImpl<?> nodeImpl;
+ NodeType nodeType = oldNode.getNodeType();
+ if (nodeType == NodeType.StartState)
{
- nodeImpl = new StartEventImpl(this, (StartState)oldNode);
+ nodeImpl = new StartEventImpl(engine, this, oldNode);
}
- else if (oldNode instanceof State)
+ else if (nodeType == NodeType.State)
{
- nodeImpl = new WaitStateImpl(this, (State)oldNode);
+ nodeImpl = new WaitStateImpl(engine, this, oldNode);
}
- else if (oldNode instanceof Fork)
+ else if (nodeType == NodeType.Fork)
{
- nodeImpl = new ParallelGatewayImpl(this, (Fork)oldNode);
+ nodeImpl = new ParallelGatewayForkImpl(engine, this, oldNode);
}
- else if (oldNode instanceof Join)
+ else if (nodeType == NodeType.Join)
{
- nodeImpl = new ParallelGatewayImpl(this, (Join)oldNode);
+ nodeImpl = new ParallelGatewayJoinImpl(engine, this, oldNode);
}
- else if (oldNode instanceof Decision)
+ else if (nodeType == NodeType.Decision)
{
- nodeImpl = new ExclusiveGatewayImpl(this, (Decision)oldNode);
+ nodeImpl = new ExclusiveGatewayImpl(engine, this, oldNode);
}
- else if (oldNode instanceof TaskNode)
+ else if (nodeType == NodeType.Task)
{
- nodeImpl = new UserTaskImpl(this, (TaskNode)oldNode);
+ nodeImpl = new UserTaskImpl(engine, this, oldNode);
}
- else if (oldNode instanceof EndState)
+ else if (nodeType == NodeType.EndState)
{
- nodeImpl = new EndEventImpl(this, (EndState)oldNode);
+ nodeImpl = new EndEventImpl(engine, this, oldNode);
}
- // Fallback to a general Task node
+ else if (nodeType == NodeType.Node)
+ {
+ nodeImpl = new NoneTaskImpl(engine, this, oldNode);
+ }
else
{
- nodeImpl = new TaskImpl(this, oldNode);
+ throw new NotImplementedException("Unsupported node type: " + nodeType);
}
-
+
nodes.add(nodeImpl);
}
-
initializeSequenceFlows(nodes);
}
return Collections.unmodifiableList(nodes);
@@ -223,14 +223,14 @@
{
for (Node node : nodes)
{
- NodeImpl nodeImpl = (NodeImpl)node;
- org.jbpm.graph.def.Node oldNode = nodeImpl.getOldNode();
+ NodeImpl<?> nodeImpl = (NodeImpl<?>)node;
+ org.jbpm.graph.def.Node oldNode = nodeImpl.getDelegate();
if (oldNode.getLeavingTransitions() != null)
{
for (Transition trans : oldNode.getLeavingTransitions())
{
SequenceFlowImpl seqFlow = new SequenceFlowImpl(trans);
-
+
String condition = trans.getCondition();
if (condition != null)
{
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ProcessImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ProcessImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ProcessImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -41,8 +41,11 @@
import org.jboss.bpm.api.runtime.Token.TokenStatus;
import org.jboss.bpm.api.service.ExecutionContextService;
import org.jboss.bpm.api.service.ProcessService;
+import org.jbpm.JbpmContext;
import org.jbpm.graph.exe.ProcessInstance;
+import org.jbpm.integration.spec.runtime.InvocationProxy;
import org.jbpm.integration.spec.runtime.TokenImpl;
+import org.jbpm.util.Clock;
/**
* An integration wrapper
@@ -50,65 +53,60 @@
* @author thomas.diesler at jboss.com
* @since 15-Nov-2008
*/
-public class ProcessImpl implements Process
+public class ProcessImpl extends AbstractElementImpl<ProcessInstance> implements Process
{
private static final long serialVersionUID = 1L;
- private ProcessEngine engine;
- private ProcessInstance oldProc;
- private ProcessDefinition procDefCache;
+ private ObjectName keyCache;
+
+ // [TODO] delegate this property
private ProcessStatus status = ProcessStatus.None;
- public ProcessImpl(ProcessEngine engine, ProcessInstance oldProc)
+ public ProcessImpl(ProcessEngine engine, ProcessInstance tempObj)
{
- this.engine = engine;
- this.oldProc = oldProc;
+ super(engine, tempObj, ProcessInstance.class);
}
// @Override
public ObjectName getKey()
{
- return getKey(oldProc);
+ ObjectName objKey = keyCache;
+ if (objKey == null)
+ {
+ ProcessInstance delegate = getDelegate();
+ objKey = getKey(delegate);
+ if (delegate.getId() > 0)
+ keyCache = objKey;
+ }
+ return objKey;
}
- public static ObjectName getKey(ProcessInstance oldProc)
+ public static ObjectName getKey(ProcessInstance procInst)
{
- return ObjectNameFactory.create(Constants.ID_DOMAIN + ":proc=" + oldProc.getProcessDefinition().getName() + ",id=" + oldProc.getId());
+ org.jbpm.graph.def.ProcessDefinition oldProcDef = procInst.getProcessDefinition();
+ return ObjectNameFactory.create(Constants.ID_DOMAIN + ":proc=" + oldProcDef.getName() + ",id=" + procInst.getId());
}
// @Override
public ProcessDefinition getProcessDefinition()
{
- if (procDefCache == null)
- {
- procDefCache = new ProcessDefinitionImpl(engine, oldProc.getProcessDefinition());
- }
- return procDefCache;
+ ProcessDefinitionImpl procDef = new ProcessDefinitionImpl(getProcessEngine(), getDelegate().getProcessDefinition());
+ return InvocationProxy.newInstance(procDef, ProcessDefinition.class);
}
// @Override
- public ProcessEngine getProcessEngine()
- {
- return getProcessDefinition().getProcessEngine();
- }
-
- public ProcessInstance getOldProcessInstance()
- {
- return oldProc;
- }
-
- // @Override
public ProcessStatus getProcessStatus()
{
Token rootToken = getRootToken();
TokenStatus tokenStatus = rootToken != null ? rootToken.getTokenStatus() : null;
- if (oldProc.isSuspended())
+ ProcessInstance delegate = getDelegate();
+ if (delegate.isSuspended())
status = ProcessStatus.Suspended;
if (status == ProcessStatus.Active)
{
- if (oldProc.hasEnded() || tokenStatus == TokenStatus.Destroyed)
+ if (delegate.hasEnded() || tokenStatus == TokenStatus.Destroyed)
status = ProcessStatus.Completed;
}
return status;
@@ -119,6 +117,17 @@
this.status = status;
}
+ public Token getRootToken()
+ {
+ Token token = null;
+ if (getDelegate().getRootToken() != null)
+ {
+ TokenImpl tokenImpl = new TokenImpl(getProcessEngine(), getDelegate().getRootToken());
+ token = InvocationProxy.newInstance(tokenImpl, Token.class);
+ }
+ return token;
+ }
+
// @Override
public String getName()
{
@@ -127,12 +136,12 @@
public Date getEndDate()
{
- return oldProc.getEnd();
+ return getDelegate().getEnd();
}
public Date getStartDate()
{
- return oldProc.getStart();
+ return getDelegate().getStart();
}
// @Override
@@ -168,17 +177,28 @@
// @Override
public Token startProcess(Attachments contextData)
{
-
ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
ExecutionContext bpmContext = ctxService.getExecutionContext(true);
try
{
// Register the Process
ProcessService procService = getProcessEngine().getService(ProcessService.class);
- procService.registerProcess(this);
+ if (procService.getProcess(getKey()) == null)
+ procService.registerProcess(this);
+ ProcessInstance delegate = getDelegate();
+
+ // Initialize the members
+ org.jbpm.graph.exe.Token rootToken = new org.jbpm.graph.exe.Token(delegate);
+ delegate.setStart(Clock.getCurrentTime());
+ delegate.setRootToken(rootToken);
+
// Create the root token
- Token token = new TokenImpl(engine, oldProc.getRootToken());
+ Token token = new TokenImpl(getProcessEngine(), rootToken);
+
+ // Save the root token
+ JbpmContext jbpmContext = bpmContext.getAttachment(JbpmContext.class);
+ jbpmContext.getSession().save(rootToken);
// Initialize the context data
if (contextData != null)
@@ -191,23 +211,29 @@
}
}
+ // Set process to active
+ setProcessStatus(ProcessStatus.Active);
+
+ // Fire the jbpm3 start event
+ NodeImpl<?> initialNode = (NodeImpl<?>)token.getCurrentNode();
+ delegate.fireStartEvent(initialNode.getDelegate());
+
// Signal the root token
- setProcessStatus(ProcessStatus.Active);
token.signal();
- return token;
+ return InvocationProxy.newInstance((TokenImpl)token, Token.class);
}
+ catch (RuntimeException rte)
+ {
+ setProcessStatus(ProcessStatus.Aborted);
+ throw rte;
+ }
finally
{
bpmContext.close();
}
}
- public Token getRootToken()
- {
- return new TokenImpl(engine, oldProc.getRootToken());
- }
-
public Set<Token> getTokens()
{
return getAllTokens(getRootToken());
@@ -218,7 +244,7 @@
if (status != ProcessStatus.Active)
throw new IllegalStateException("Cannot suspend a process in state: " + status);
- oldProc.suspend();
+ getDelegate().suspend();
status = ProcessStatus.Suspended;
}
@@ -227,7 +253,7 @@
if (status != ProcessStatus.Suspended)
throw new IllegalStateException("Cannot resume a process in state: " + status);
- oldProc.resume();
+ getDelegate().resume();
status = ProcessStatus.Active;
}
@@ -236,8 +262,10 @@
if (status != ProcessStatus.Active && status != ProcessStatus.Suspended)
throw new IllegalStateException("Cannot cancel a process in state: " + status);
- oldProc.setEnd(new Date());
- oldProc.end();
+ ProcessInstance delegate = getDelegate();
+ delegate.setEnd(new Date());
+ delegate.end();
+
status = ProcessStatus.Cancelled;
}
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/StartEventImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/StartEventImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/StartEventImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -23,11 +23,12 @@
import java.util.List;
-import org.jboss.bpm.api.InvalidProcessException;
import org.jboss.bpm.api.NotImplementedException;
+import org.jboss.bpm.api.client.ProcessEngine;
import org.jboss.bpm.api.model.ProcessDefinition;
import org.jboss.bpm.api.model.SequenceFlow;
import org.jboss.bpm.api.model.StartEvent;
+import org.jbpm.graph.def.Node;
import org.jbpm.graph.node.StartState;
/**
@@ -36,19 +37,13 @@
* @author thomas.diesler at jboss.com
* @since 15-Nov-2008
*/
-public class StartEventImpl extends EventImpl implements StartEvent
+public class StartEventImpl extends EventImpl<StartState> implements StartEvent
{
private static final long serialVersionUID = 1L;
- private StartState oldStart;
-
- public StartEventImpl(ProcessDefinition procDef, StartState oldStart)
+ public StartEventImpl(ProcessEngine engine, ProcessDefinition procDef, Node oldStart)
{
- super(procDef, oldStart);
- this.oldStart = oldStart;
-
- if (oldStart.getName() == null)
- throw new InvalidProcessException("StartEvent name cannot be null");
+ super(engine, procDef, StartState.class, oldStart);
}
// @Override
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/TaskImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/TaskImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/TaskImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -24,11 +24,11 @@
import java.util.List;
import org.jboss.bpm.api.NotImplementedException;
+import org.jboss.bpm.api.client.ProcessEngine;
import org.jboss.bpm.api.model.ProcessDefinition;
import org.jboss.bpm.api.model.SequenceFlow;
import org.jboss.bpm.api.model.Task;
import org.jbpm.graph.def.Node;
-import org.jbpm.graph.def.Transition;
/**
* An integration wrapper
@@ -36,22 +36,16 @@
* @author thomas.diesler at jboss.com
* @since 15-Nov-2008
*/
-public class TaskImpl extends NodeImpl implements Task
+public abstract class TaskImpl<T extends Node> extends NodeImpl<T> implements Task
{
private static final long serialVersionUID = 1L;
- public TaskImpl(ProcessDefinition procDef, org.jbpm.graph.def.Node oldNode)
+ public TaskImpl(ProcessEngine engine, ProcessDefinition procDef, Class<T> clazz, Node oldNode)
{
- super(procDef, oldNode);
+ super(engine, procDef, clazz, oldNode);
}
//@Override
- public TaskType getTaskType()
- {
- return TaskType.None;
- }
-
- //@Override
public SequenceFlow getInFlow()
{
List<SequenceFlow> inFlows = getInFlows();
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/UserTaskImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/UserTaskImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/UserTaskImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -22,10 +22,12 @@
package org.jbpm.integration.spec.model;
import org.jboss.bpm.api.NotImplementedException;
+import org.jboss.bpm.api.client.ProcessEngine;
import org.jboss.bpm.api.model.ProcessDefinition;
import org.jboss.bpm.incubator.client.UserTaskCallback;
import org.jboss.bpm.incubator.model.Message;
import org.jboss.bpm.incubator.model.UserTask;
+import org.jbpm.graph.def.Node;
import org.jbpm.graph.node.TaskNode;
/**
@@ -34,13 +36,13 @@
* @author thomas.diesler at jboss.com
* @since 15-Nov-2008
*/
-public class UserTaskImpl extends TaskImpl implements UserTask
+public class UserTaskImpl extends TaskImpl<TaskNode> implements UserTask
{
private static final long serialVersionUID = 1L;
- public UserTaskImpl(ProcessDefinition procDef, TaskNode oldTaskNode)
+ public UserTaskImpl(ProcessEngine engine, ProcessDefinition procDef, Node oldTaskNode)
{
- super(procDef, oldTaskNode);
+ super(engine, procDef, TaskNode.class, oldTaskNode);
}
// @Override
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/WaitStateImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/WaitStateImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/WaitStateImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -21,8 +21,10 @@
*/
package org.jbpm.integration.spec.model;
+import org.jboss.bpm.api.client.ProcessEngine;
import org.jboss.bpm.api.model.ProcessDefinition;
import org.jboss.bpm.api.model.WaitState;
+import org.jbpm.graph.def.Node;
import org.jbpm.graph.node.State;
/**
@@ -31,13 +33,13 @@
* @author thomas.diesler at jboss.com
* @since 15-Nov-2008
*/
-public class WaitStateImpl extends TaskImpl implements WaitState
+public class WaitStateImpl extends TaskImpl<State> implements WaitState
{
private static final long serialVersionUID = 1L;
- public WaitStateImpl(ProcessDefinition procDef, State oldState)
+ public WaitStateImpl(ProcessEngine engine, ProcessDefinition procDef, Node oldState)
{
- super(procDef, oldState);
+ super(engine, procDef, State.class, oldState);
}
//@Override
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/builder/ProcessBuilderImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/builder/ProcessBuilderImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/builder/ProcessBuilderImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -41,6 +41,7 @@
import org.jboss.bpm.api.model.builder.GatewayBuilder;
import org.jboss.bpm.api.model.builder.ProcessBuilder;
import org.jbpm.graph.def.Transition;
+import org.jbpm.graph.def.Node.NodeType;
import org.jbpm.graph.node.Decision;
import org.jbpm.graph.node.EndState;
import org.jbpm.graph.node.StartState;
@@ -48,10 +49,10 @@
import org.jbpm.integration.spec.model.EndEventImpl;
import org.jbpm.integration.spec.model.ExclusiveGatewayImpl;
import org.jbpm.integration.spec.model.NodeImpl;
+import org.jbpm.integration.spec.model.NoneTaskImpl;
import org.jbpm.integration.spec.model.ProcessDefinitionImpl;
import org.jbpm.integration.spec.model.SequenceFlowImpl;
import org.jbpm.integration.spec.model.StartEventImpl;
-import org.jbpm.integration.spec.model.TaskImpl;
import org.jbpm.integration.spec.model.WaitStateImpl;
/**
@@ -64,7 +65,7 @@
{
protected ProcessEngine engine;
protected ProcessDefinitionImpl procDefImpl;
- protected NodeImpl nodeImpl;
+ protected NodeImpl<?> nodeImpl;
private List<FlowSpec> flows = new ArrayList<FlowSpec>();
@@ -98,7 +99,10 @@
//@Override
public ProcessBuilder addStartEvent(String name)
{
- nodeImpl = new StartEventImpl(procDefImpl, new StartState(name));
+ if (name == null)
+ throw new InvalidProcessException("StartEvent name cannot be null");
+
+ nodeImpl = new StartEventImpl(engine, procDefImpl, new StartState(name));
procDefImpl.addNode(nodeImpl);
return this;
}
@@ -108,7 +112,7 @@
{
if (type == GatewayType.Exclusive)
{
- nodeImpl = new ExclusiveGatewayImpl(procDefImpl, new Decision(name));
+ nodeImpl = new ExclusiveGatewayImpl(engine, procDefImpl, new Decision(name));
procDefImpl.addNode(nodeImpl);
}
else
@@ -129,12 +133,12 @@
{
if (type == TaskType.None)
{
- nodeImpl = new TaskImpl(procDefImpl, new org.jbpm.graph.def.Node(name));
+ nodeImpl = new NoneTaskImpl(engine, procDefImpl, new org.jbpm.graph.def.Node(name));
procDefImpl.addNode(nodeImpl);
}
else if (type == TaskType.Wait)
{
- nodeImpl = new WaitStateImpl(procDefImpl, new State(name));
+ nodeImpl = new WaitStateImpl(engine, procDefImpl, new State(name));
procDefImpl.addNode(nodeImpl);
}
else
@@ -147,7 +151,7 @@
//@Override
public ProcessBuilder addEndEvent(String name)
{
- nodeImpl = new EndEventImpl(procDefImpl, new EndState(name));
+ nodeImpl = new EndEventImpl(engine, procDefImpl, new EndState(name));
procDefImpl.addNode(nodeImpl);
return this;
}
@@ -185,17 +189,17 @@
// Initialize the flows
for (FlowSpec flow : flows)
{
- NodeImpl srcNode = (NodeImpl)procDefImpl.getNode(flow.source);
+ NodeImpl<?> srcNode = (NodeImpl<?>)procDefImpl.getNode(flow.source);
if (srcNode == null)
throw new InvalidProcessException("Cannot obtain source node: " + flow.source);
- NodeImpl targetNode = (NodeImpl)procDefImpl.getNode(flow.target);
+ NodeImpl<?> targetNode = (NodeImpl<?>)procDefImpl.getNode(flow.target);
if (targetNode == null)
throw new InvalidProcessException("Cannot obtain target node: " + flow.target);
Transition trans = new Transition(flow.target);
- trans.setFrom(srcNode.getOldNode());
- trans.setTo(targetNode.getOldNode());
+ trans.setFrom(srcNode.getDelegate());
+ trans.setTo(targetNode.getDelegate());
SequenceFlowImpl seqFlow = new SequenceFlowImpl(trans, flow.exprLang, flow.exprBody);
srcNode.addSequenceFlow(seqFlow);
@@ -214,18 +218,24 @@
// Detect unreachable nodes
for (Node node : procDefImpl.getNodes())
{
- NodeImpl nodeImpl = (NodeImpl)node;
- Set arriving = nodeImpl.getOldNode().getArrivingTransitions();
- if (!(node instanceof StartEvent) && arriving == null)
+ NodeImpl<?> nodeImpl = (NodeImpl<?>)node;
+ org.jbpm.graph.def.Node delegate = nodeImpl.getDelegate();
+ Set<Transition> arriving = delegate.getArrivingTransitions();
+
+ NodeType nodeType = delegate.getNodeType();
+ if (nodeType != NodeType.StartState && arriving == null)
throw new InvalidProcessException("Unreachable node: " + node);
}
// Detect dead end nodes
for (Node node : procDefImpl.getNodes())
{
- NodeImpl nodeImpl = (NodeImpl)node;
- List leaving = nodeImpl.getOldNode().getLeavingTransitions();
- if (!(node instanceof EndEvent) && leaving == null)
+ NodeImpl<?> nodeImpl = (NodeImpl<?>)node;
+ org.jbpm.graph.def.Node delegate = nodeImpl.getDelegate();
+ List<Transition> leaving = delegate.getLeavingTransitions();
+
+ NodeType nodeType = delegate.getNodeType();
+ if (nodeType != NodeType.EndState && leaving == null)
throw new InvalidProcessException("Dead end node: " + node);
}
}
Added: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxy.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxy.java (rev 0)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxy.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -0,0 +1,113 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.integration.spec.runtime;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.Arrays;
+import java.util.List;
+
+import org.jboss.bpm.api.client.ProcessEngine;
+import org.jboss.bpm.api.model.AbstractElement;
+import org.jboss.bpm.api.runtime.ExecutionContext;
+import org.jboss.bpm.api.service.ExecutionContextService;
+import org.jbpm.integration.spec.model.AbstractElementImpl;
+
+/**
+ * Decorates management invocations with common system aspects.
+ *
+ * @author Thomas.Diesler at jboss.com
+ * @since 05-Dec-2008
+ */
+public class InvocationProxy implements InvocationProxySupport, InvocationHandler
+{
+ private static List<Method> proxyMethods = Arrays.asList(InvocationProxySupport.class.getMethods());
+
+ private AbstractElementImpl<?> abstractElement;
+ private ProcessEngine engine;
+
+ @SuppressWarnings("unchecked")
+ public static <T> T newInstance(AbstractElementImpl<?> obj, Class<T> interf)
+ {
+ Class[] interfaces = new Class[] { interf, InvocationProxySupport.class };
+ ClassLoader classLoader = obj.getClass().getClassLoader();
+ return (T)Proxy.newProxyInstance(classLoader, interfaces, new InvocationProxy(obj));
+ }
+
+ @SuppressWarnings("unchecked")
+ public static <T> T getUnderlying(Object implObj, Class<T> implClazz)
+ {
+ T underlyingImpl;
+ if (implClazz.isInstance(implObj))
+ {
+ underlyingImpl = (T)implObj;
+ }
+ else if (implObj instanceof InvocationProxySupport)
+ {
+ InvocationProxySupport proxy = (InvocationProxySupport)implObj;
+ underlyingImpl = (T)proxy.getAbstractElement();
+ }
+ else
+ {
+ throw new IllegalArgumentException("Cannot obtain underlying implementation from: " + implObj);
+ }
+ return underlyingImpl;
+ }
+
+ private InvocationProxy(AbstractElementImpl<?> obj)
+ {
+ this.engine = obj.getProcessEngine();
+ this.abstractElement = obj;
+ }
+
+ public AbstractElement getAbstractElement()
+ {
+ return abstractElement;
+ }
+
+ public Object invoke(Object proxy, Method m, Object[] args) throws Throwable
+ {
+ if (proxyMethods.contains(m) && "getAbstractElement".equals(m.getName()))
+ {
+ return getAbstractElement();
+ }
+ else
+ {
+ ExecutionContextService ctxService = engine.getService(ExecutionContextService.class);
+ ExecutionContext bpmContext = ctxService.getExecutionContext(true);
+ try
+ {
+ return m.invoke(abstractElement, args);
+ }
+ catch (InvocationTargetException ex)
+ {
+ throw ex.getTargetException();
+ }
+ finally
+ {
+ bpmContext.close();
+ }
+ }
+ }
+}
\ No newline at end of file
Property changes on: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxy.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxySupport.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxySupport.java (rev 0)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxySupport.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -0,0 +1,35 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.integration.spec.runtime;
+
+import org.jboss.bpm.api.model.AbstractElement;
+
+/**
+ * Implemented by the proxy to give access to the underlying element.
+ *
+ * @author Thomas.Diesler at jboss.com
+ * @since 05-Dec-2008
+ */
+public interface InvocationProxySupport
+{
+ AbstractElement getAbstractElement();
+}
Property changes on: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxySupport.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/NodeExecuteInterceptor.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/NodeExecuteInterceptor.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/NodeExecuteInterceptor.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -23,7 +23,6 @@
//$Id$
-import org.jboss.bpm.api.runtime.Token;
/**
* An interceptor that invokes the Node.execute
@@ -36,6 +35,6 @@
//@Override
public void execute(RuntimeContext rtContext)
{
- Token token = rtContext.getToken();
+ rtContext.getToken();
}
}
\ No newline at end of file
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/TokenAttachmentDelegate.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/TokenAttachmentDelegate.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/TokenAttachmentDelegate.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -57,10 +57,11 @@
return addAttachment(null, name, value);
}
+ @SuppressWarnings("unchecked")
public <T> T addAttachment(Class<T> clazz, String name, Object value)
{
Key key = new Key(clazz, name);
- context.createVariable(key.toString(), value, token.getOldToken());
+ context.createVariable(key.toString(), value, token.getDelegate());
return (T)value;
}
@@ -74,16 +75,18 @@
return getAttachment(null, name);
}
+ @SuppressWarnings("unchecked")
public <T> T getAttachment(Class<T> clazz, String name)
{
Key key = new Key(clazz, name);
- return (T)context.getVariable(key.toString(), token.getOldToken());
+ return (T)context.getVariable(key.toString(), token.getDelegate());
}
+ @SuppressWarnings("unchecked")
public Collection<Key> getAttachmentKeys()
{
Set<Key> keys = new HashSet<Key>();
- Set<String> strKeys = context.getVariables(token.getOldToken()).keySet();
+ Set<String> strKeys = context.getVariables(token.getDelegate()).keySet();
for (String strKey : strKeys)
{
Key key = Key.valueOf(strKey);
@@ -97,7 +100,7 @@
{
Key key = new Key(clazz, name);
T value = getAttachment(clazz, name);
- context.deleteVariable(key.toString(), token.getOldToken());
+ context.deleteVariable(key.toString(), token.getDelegate());
return value;
}
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/TokenImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/TokenImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/TokenImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -40,6 +40,7 @@
import org.jboss.bpm.api.service.ExecutionContextService;
import org.jbpm.context.exe.ContextInstance;
import org.jbpm.graph.def.Transition;
+import org.jbpm.integration.spec.model.AbstractElementImpl;
import org.jbpm.integration.spec.model.NodeImpl;
import org.jbpm.integration.spec.model.ProcessImpl;
@@ -49,44 +50,47 @@
* @author thomas.diesler at jboss.com
* @since 15-Nov-2008
*/
-public class TokenImpl implements Token
+public class TokenImpl extends AbstractElementImpl<org.jbpm.graph.exe.Token> implements Token
{
private static final long serialVersionUID = 1L;
- private ProcessEngine engine;
- private org.jbpm.graph.exe.Token oldToken;
+ private ObjectName keyCache;
+ private SequenceFlow lastFlow;
private Attachments att;
- private SequenceFlow lastFlow;
public TokenImpl(ProcessEngine engine, org.jbpm.graph.exe.Token oldToken)
{
- this.engine = engine;
- this.oldToken = oldToken;
+ super(engine, oldToken, org.jbpm.graph.exe.Token.class);
ContextInstance context = oldToken.getProcessInstance().getContextInstance();
this.att = new TokenAttachmentDelegate(this, context);
}
- public org.jbpm.graph.exe.Token getOldToken()
+ public ObjectName getKey()
{
- return oldToken;
+ ObjectName objKey = keyCache;
+ if (objKey == null)
+ {
+ org.jbpm.graph.exe.Token delegate = getDelegate();
+ objKey = getKey(delegate);
+ if (delegate.getId() > 0)
+ keyCache = objKey;
+ }
+ return objKey;
}
- public ObjectName getKey()
+ public static ObjectName getKey(org.jbpm.graph.exe.Token oldToken)
{
return ObjectNameFactory.create(Constants.ID_DOMAIN + ":id=" + oldToken.getId());
}
public Process getProcess()
{
- return new ProcessImpl(engine, oldToken.getProcessInstance());
+ Process proc = new ProcessImpl(getProcessEngine(), getDelegate().getProcessInstance());
+ proc = InvocationProxy.newInstance((ProcessImpl)proc, Process.class);
+ return proc;
}
- public ProcessEngine getProcessEngine()
- {
- return engine;
- }
-
// @Override
public Attachments getAttachments()
{
@@ -97,7 +101,7 @@
public TokenStatus getTokenStatus()
{
TokenStatus status = TokenStatus.Suspended;
- if (oldToken.hasEnded())
+ if (getDelegate().hasEnded())
{
status = TokenStatus.Destroyed;
}
@@ -108,15 +112,15 @@
public Set<Token> getChildTokens()
{
Set<Token> childTokens = new HashSet<Token>();
- Map<String, org.jbpm.graph.exe.Token> oldChildMap = oldToken.getChildren();
+ Map<String, org.jbpm.graph.exe.Token> oldChildMap = getDelegate().getChildren();
if (oldChildMap != null)
{
for (org.jbpm.graph.exe.Token oldChildToken : oldChildMap.values())
{
if (oldChildToken.hasEnded() == false)
{
- TokenImpl childToken = new TokenImpl(engine, oldChildToken);
- childTokens.add(childToken);
+ Token childToken = new TokenImpl(getProcessEngine(), oldChildToken);
+ childTokens.add(InvocationProxy.newInstance((TokenImpl)childToken, Token.class));
}
}
}
@@ -126,7 +130,7 @@
// @Override
public Node getCurrentNode()
{
- String nodeName = oldToken.getNode().getName();
+ String nodeName = getDelegate().getNode().getName();
return getProcess().getNode(nodeName);
}
@@ -139,18 +143,26 @@
// @Override
public Token getParentToken()
{
- org.jbpm.graph.exe.Token parent = oldToken.getParent();
- return parent != null ? new TokenImpl(engine, parent) : null;
+ Token token = null;
+ if (getDelegate().getParent() != null)
+ {
+ token = new TokenImpl(getProcessEngine(), getDelegate().getParent());
+ token = InvocationProxy.newInstance((TokenImpl)token, Token.class);
+ }
+ return token;
}
// @Override
public Token getRootToken()
{
- org.jbpm.graph.exe.Token root = oldToken;
+ org.jbpm.graph.exe.Token root = getDelegate();
while (root.getParent() != null)
root = root.getParent();
- return new TokenImpl(engine, root);
+ Token token = new TokenImpl(getProcessEngine(), root);
+ token = InvocationProxy.newInstance((TokenImpl)token, Token.class);
+
+ return token;
}
// @Override
@@ -167,12 +179,10 @@
private void signalInternal(String name)
{
- ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
- ExecutionContext bpmContext = ctxService.getExecutionContext(true);
try
{
// Make sure we have a current node
- NodeImpl currNode = (NodeImpl)getCurrentNode();
+ NodeImpl<?> currNode = (NodeImpl<?>)getCurrentNode();
if (currNode == null)
throw new IllegalStateException("Cannot signal token with no current node: " + this);
@@ -188,39 +198,48 @@
}
if (hasActiveChild)
throw new IllegalStateException("Cannot signal token with active child tokens: " + this);
-
+
// Signal the underlying jBPM node
if (name != null)
{
- Transition trans = currNode.getOldNode().getLeavingTransition(name);
+ Transition trans = currNode.getDelegate().getLeavingTransition(name);
lastFlow = currNode.getOutFlowByTransition(trans);
- oldToken.signal(name);
+ getDelegate().signal(name);
}
else
{
- Transition trans = currNode.getOldNode().getDefaultLeavingTransition();
+ Transition trans = currNode.getDelegate().getDefaultLeavingTransition();
lastFlow = currNode.getOutFlowByTransition(trans);
- oldToken.signal();
+ getDelegate().signal();
}
}
catch (RuntimeException rte)
{
- ProcessImpl procImpl = (ProcessImpl)getProcess();
+ ProcessImpl procImpl = InvocationProxy.getUnderlying(getProcess(), ProcessImpl.class);
procImpl.setProcessStatus(ProcessStatus.Aborted);
throw rte;
}
+ }
+
+ public String toString()
+ {
+ ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
+ ExecutionContext bpmContext = ctxService.getExecutionContext(true);
+ try
+ {
+ Node currNode = getCurrentNode();
+ int children = getChildTokens().size();
+ boolean root = getParentToken() == null;
+ TokenStatus status = getTokenStatus();
+ return "[key=" + getKey() + ",root=" + root + ",status=" + status + ",node=" + currNode + ",flow=" + lastFlow + ",child=" + children + "]";
+ }
+ catch (RuntimeException rte)
+ {
+ throw rte;
+ }
finally
{
bpmContext.close();
}
}
-
- public String toString()
- {
- Node currNode = getCurrentNode();
- int children = getChildTokens().size();
- boolean root = getParentToken() == null;
- TokenStatus status = getTokenStatus();
- return "[key=" + getKey() + ",root=" + root + ",status=" + status + ",node=" + currNode + ",flow=" + lastFlow + ",child=" + children + "]";
- }
}
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/DeploymentServiceImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/DeploymentServiceImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/DeploymentServiceImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -33,7 +33,6 @@
import org.jboss.bpm.api.model.ProcessDefinition;
import org.jboss.bpm.api.service.ProcessDefinitionService;
import org.jboss.bpm.api.service.internal.AbstractDeploymentService;
-import org.jboss.bpm.api.service.internal.AbstractProcessDefinitionService;
import org.jbpm.integration.spec.deployment.PARDeployment;
import org.jbpm.integration.spec.deployment.XMLDeployment;
import org.slf4j.Logger;
@@ -84,10 +83,9 @@
ProcessDefinitionService pdService = getProcessEngine().getService(ProcessDefinitionService.class);
ProcessDefinition procDef = pdService.parseProcessDefinition(pdXML);
procDef = pdService.registerProcessDefinition(procDef);
-
- ObjectName key = procDef.getKey();
- dep.addAttachment(ObjectName.class, "procDefKey", key);
+ dep.addAttachment(ObjectName.class, "procDefKey", procDef.getKey());
+
return procDef;
}
catch (IOException ex)
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ExecutionServiceImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ExecutionServiceImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ExecutionServiceImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -33,7 +33,6 @@
import org.jboss.bpm.api.runtime.Token;
import org.jboss.bpm.api.service.ExecutionService;
import org.jboss.bpm.api.service.ProcessService;
-import org.jboss.bpm.api.service.internal.AbstractProcessService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ProcessDefinitionServiceImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ProcessDefinitionServiceImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ProcessDefinitionServiceImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -33,11 +33,13 @@
import org.jboss.bpm.api.model.ProcessDefinition;
import org.jboss.bpm.api.runtime.ExecutionContext;
import org.jboss.bpm.api.service.ExecutionContextService;
+import org.jboss.bpm.api.service.ProcessDefinitionService;
import org.jboss.bpm.api.service.ProcessService;
import org.jboss.bpm.api.service.internal.AbstractProcessDefinitionService;
import org.jbpm.JbpmContext;
import org.jbpm.db.GraphSession;
import org.jbpm.integration.spec.model.ProcessDefinitionImpl;
+import org.jbpm.integration.spec.runtime.InvocationProxy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -47,7 +49,7 @@
* @author thomas.diesler at jboss.com
* @since 18-Jun-2008
*/
-public class ProcessDefinitionServiceImpl extends AbstractProcessDefinitionService implements MutableService
+public class ProcessDefinitionServiceImpl extends AbstractProcessDefinitionService implements ProcessDefinitionService, MutableService
{
// Provide logging
final static Logger log = LoggerFactory.getLogger(ProcessDefinitionServiceImpl.class);
@@ -72,6 +74,7 @@
if (oldProcDef != null)
{
procDef = new ProcessDefinitionImpl(getProcessEngine(), oldProcDef);
+ procDef = InvocationProxy.newInstance((ProcessDefinitionImpl)procDef, ProcessDefinition.class);
}
}
finally
@@ -105,25 +108,26 @@
public ProcessDefinition registerProcessDefinition(ProcessDefinition procDef)
{
- log.debug("registerProcessDefinition: " + procDef);
-
ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
ExecutionContext bpmContext = ctxService.getExecutionContext(true);
try
{
+ log.debug("registerProcessDefinition: " + procDef);
+
if (getProcessDefinition(procDef.getKey()) != null)
throw new IllegalStateException("Process definition already registered: " + procDef);
JbpmContext jbpmContext = bpmContext.getAttachment(JbpmContext.class);
- ProcessDefinitionImpl procDefImpl = (ProcessDefinitionImpl)procDef;
- jbpmContext.deployProcessDefinition(procDefImpl.getOldProcessDefinition());
+ ProcessDefinitionImpl procDefImpl = InvocationProxy.getUnderlying(procDef, ProcessDefinitionImpl.class);
+ jbpmContext.deployProcessDefinition(procDefImpl.getDelegate());
+
+ procDef = InvocationProxy.newInstance(procDefImpl, ProcessDefinition.class);
+ return procDef;
}
finally
{
bpmContext.close();
}
-
- return procDef;
}
public boolean unregisterProcessDefinition(ObjectName procDefID)
@@ -144,10 +148,8 @@
for (ObjectName procID : procService.getProcesses(procDefID, null))
procService.unregisterProcess(procID);
- ProcessDefinitionImpl procDefImpl = (ProcessDefinitionImpl)procDef;
- long oldID = procDefImpl.getOldProcessDefinition().getId();
JbpmContext jbpmContext = bpmContext.getAttachment(JbpmContext.class);
- jbpmContext.getGraphSession().deleteProcessDefinition(oldID);
+ jbpmContext.getGraphSession().deleteProcessDefinition(adaptKey(procDefID));
removed = true;
}
}
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ProcessServiceImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ProcessServiceImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ProcessServiceImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -38,11 +38,14 @@
import org.jboss.bpm.api.runtime.ExecutionContext;
import org.jboss.bpm.api.service.ExecutionContextService;
import org.jboss.bpm.api.service.ProcessDefinitionService;
+import org.jboss.bpm.api.service.ProcessService;
import org.jboss.bpm.api.service.internal.AbstractProcessService;
import org.jbpm.JbpmContext;
import org.jbpm.db.GraphSession;
import org.jbpm.graph.exe.ProcessInstance;
+import org.jbpm.integration.spec.model.ProcessDefinitionImpl;
import org.jbpm.integration.spec.model.ProcessImpl;
+import org.jbpm.integration.spec.runtime.InvocationProxy;
import org.jbpm.integration.spec.runtime.NodeInterceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -53,7 +56,7 @@
* @author thomas.diesler at jboss.com
* @since 18-Jun-2008
*/
-public class ProcessServiceImpl extends AbstractProcessService implements MutableService
+public class ProcessServiceImpl extends AbstractProcessService implements ProcessService, MutableService
{
// Provide logging
final static Logger log = LoggerFactory.getLogger(ProcessServiceImpl.class);
@@ -87,7 +90,7 @@
public Process getProcess(ObjectName procID)
{
Process proc = null;
-
+
ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
ExecutionContext bpmContext = ctxService.getExecutionContext(true);
try
@@ -98,6 +101,7 @@
if (oldProc != null)
{
proc = new ProcessImpl(getProcessEngine(), oldProc);
+ proc = InvocationProxy.newInstance((ProcessImpl)proc, Process.class);
}
}
finally
@@ -114,7 +118,7 @@
public Set<ObjectName> getProcesses()
{
Set<ObjectName> procs = new HashSet<ObjectName>();
-
+
ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
ExecutionContext bpmContext = ctxService.getExecutionContext(true);
try
@@ -149,7 +153,7 @@
public Set<ObjectName> getProcesses(ObjectName procDefID, ProcessStatus status)
{
Set<ObjectName> procs = new HashSet<ObjectName>();
-
+
ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
ExecutionContext bpmContext = ctxService.getExecutionContext(true);
try
@@ -174,12 +178,10 @@
/**
* Register a Process.
*/
- public ObjectName registerProcess(Process proc)
+ public Process registerProcess(Process proc)
{
log.debug("registerProcess: " + proc);
- ObjectName procID;
-
ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
ExecutionContext bpmContext = ctxService.getExecutionContext(true);
try
@@ -187,30 +189,37 @@
if (getProcess(proc.getKey()) != null)
throw new IllegalStateException("Process already registered: " + proc);
- ProcessImpl procImpl = (ProcessImpl)proc;
ProcessStatus procStatus = proc.getProcessStatus();
- ProcessDefinition procDef = proc.getProcessDefinition();
-
if (procStatus != ProcessStatus.None)
throw new IllegalStateException("Cannot register process in state: " + procStatus);
+ ProcessDefinition procDef = proc.getProcessDefinition();
+
// Register the process definition if needed
ProcessDefinitionService procDefService = getProcessEngine().getService(ProcessDefinitionService.class);
if (procDefService.getProcessDefinition(procDef.getKey()) == null)
procDefService.registerProcessDefinition(procDef);
+
+ ProcessImpl procImpl = InvocationProxy.getUnderlying(proc, ProcessImpl.class);
+ ProcessInstance procInst = procImpl.getDelegate();
- // Save the Process instance
- bpmContext.getAttachment(JbpmContext.class).save(procImpl.getOldProcessInstance());
+ // Make sure the process definition from this session is associated with the process instance
+ procDef = procDefService.getProcessDefinition(procDef.getKey());
+ ProcessDefinitionImpl procDefImpl = InvocationProxy.getUnderlying(procDef, ProcessDefinitionImpl.class);
+ procInst.setProcessDefinition(procDefImpl.getDelegate());
+ // Save the ProcessInstance
+ JbpmContext jbpmContext = bpmContext.getAttachment(JbpmContext.class);
+ jbpmContext.save(procInst);
+
procImpl.setProcessStatus(ProcessStatus.Ready);
- procID = proc.getKey();
+ proc = InvocationProxy.newInstance(procImpl, Process.class);
+ return proc;
}
finally
{
bpmContext.close();
}
-
- return procID;
}
/**
@@ -219,7 +228,7 @@
public boolean unregisterProcess(ObjectName procID)
{
boolean removed = false;
-
+
ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
ExecutionContext bpmContext = ctxService.getExecutionContext(true);
try
@@ -229,9 +238,9 @@
{
log.debug("unregisterProcess: " + proc);
- ProcessImpl procImpl = (ProcessImpl)proc;
+ ProcessImpl procImpl = InvocationProxy.getUnderlying(proc, ProcessImpl.class);
GraphSession graphSession = bpmContext.getAttachment(JbpmContext.class).getGraphSession();
- graphSession.deleteProcessInstance(procImpl.getOldProcessInstance());
+ graphSession.deleteProcessInstance(procImpl.getDelegate());
removed = true;
}
}
@@ -260,7 +269,7 @@
}
return itor;
}
-
+
private Long adaptKey(ObjectName key)
{
String id = key.getKeyProperty("id");
Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/task/TaskImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/task/TaskImpl.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/task/TaskImpl.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -33,6 +33,7 @@
import org.jboss.bpm.api.runtime.Token;
import org.jboss.bpm.api.service.ExecutionService;
import org.jboss.bpm.api.task.Task;
+import org.jbpm.integration.spec.runtime.InvocationProxy;
import org.jbpm.integration.spec.runtime.TokenImpl;
import org.jbpm.taskmgmt.exe.PooledActor;
import org.jbpm.taskmgmt.exe.TaskInstance;
@@ -83,8 +84,8 @@
ExecutionService exService = engine.getService(ExecutionService.class);
for (Token auxTok : exService.getTokens())
{
- TokenImpl tokenImpl = (TokenImpl)auxTok;
- if (tokenImpl.getOldToken().getId() == tokenId)
+ TokenImpl tokenImpl = InvocationProxy.getUnderlying(auxTok, TokenImpl.class);
+ if (tokenImpl.getDelegate().getId() == tokenId)
{
token = auxTok;
break;
Modified: jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/deployment/DeploymentPARTest.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/deployment/DeploymentPARTest.java 2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/deployment/DeploymentPARTest.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -34,6 +34,7 @@
import org.jboss.bpm.api.model.ProcessDefinition;
import org.jboss.bpm.api.runtime.Token;
import org.jboss.bpm.api.service.DeploymentService;
+import org.jboss.bpm.api.service.ProcessService;
import org.jboss.bpm.api.service.TaskService;
import org.jboss.bpm.api.task.Task;
import org.jboss.bpm.api.test.APITestCase;
@@ -55,32 +56,43 @@
ProcessDefinition procDef = depService.deploy(dep);
assertNotNull("ProcDef not null", procDef);
+
+ Process proc = procDef.newInstance();
- Process proc = procDef.newInstance();
+ /*
Token token = proc.startProcess();
+
+ assertEquals("start", token.getCurrentNode().getName());
+ assertEquals(0, token.getChildTokens().size());
+
+ token.signal();
assertEquals("fork1", token.getCurrentNode().getName());
assertEquals(2, token.getChildTokens().size());
// Get the child tokens
- Map<String,Token> childToks = new HashMap<String, Token>();
+ Token childOne = getChildToken(token, "Review Order");
+ assertNotNull("Review Order", childOne);
+
+ Token childTwo = getChildToken(token, "Prepare shipping");
+ assertNotNull("Review Order", childTwo);
+
+ TaskService taskService = getProcessEngine().getService(TaskService.class);
+ assertEquals(2, taskService.getTasksByProcess(proc.getKey()).size());
+*/
+ // Undeploy the process
+ assertTrue("Undeploy successful", depService.undeploy(dep));
+ }
+
+ private Token getChildToken(Token token, String nodeName)
+ {
+ Map<String, Token> childToks = new HashMap<String, Token>();
Iterator<Token> itTok = token.getChildTokens().iterator();
while (itTok.hasNext())
{
Token child = itTok.next();
childToks.put(child.getCurrentNode().getName(), child);
}
- Token childOne = childToks.get("Prepare shipping");
- Token childTwo = childToks.get("Review Order");
-
- assertNotNull("Prepare shipping", childOne);
- assertNotNull("Review Order", childTwo);
-
- TaskService taskService = getProcessEngine().getService(TaskService.class);
- List<Task> tasks = taskService.getTasksByActor("sales");
- System.out.println(tasks);
-
- // Undeploy the process
- assertTrue("Undeploy successful", depService.undeploy(dep));
+ return childToks.get(nodeName);
}
}
Added: jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/task/TaskTest.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/task/TaskTest.java (rev 0)
+++ jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/task/TaskTest.java 2008-12-05 11:14:56 UTC (rev 3220)
@@ -0,0 +1,310 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.test.integration.spec.task;
+
+// $Id$
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.jboss.bpm.api.deployment.Deployment;
+import org.jboss.bpm.api.deployment.SimpleDeployment;
+import org.jboss.bpm.api.model.Process;
+import org.jboss.bpm.api.model.ProcessDefinition;
+import org.jboss.bpm.api.service.DeploymentService;
+import org.jboss.bpm.api.test.APITestCase;
+import org.jbpm.JbpmConfiguration;
+import org.jbpm.JbpmContext;
+import org.jbpm.db.GraphSession;
+import org.jbpm.graph.def.ActionHandler;
+import org.jbpm.graph.exe.ExecutionContext;
+import org.jbpm.graph.exe.ProcessInstance;
+import org.jbpm.taskmgmt.exe.TaskInstance;
+
+/**
+ * This uses the API to do the same as the EndTasksDbTest
+ *
+ * @author thomas.diesler at jboss.com
+ * @since 03-Dec-2008
+ */
+public class TaskTest extends APITestCase
+{
+ private JbpmConfiguration jbpmConfiguration;
+ private JbpmContext jbpmContext;
+ private GraphSession graphSession;
+
+ public void testCancelOld()
+ {
+ org.jbpm.graph.def.ProcessDefinition processDefinition = org.jbpm.graph.def.ProcessDefinition.parseXmlString(
+ "<process-definition name='endtasksprocess'>" +
+ " <start-state>" +
+ " <transition to='approval' />" +
+ " </start-state>" +
+ " <task-node name='approval' end-tasks='true'>" +
+ " <task name='approve' description='Review order'>" +
+ " <assignment pooled-actors='reviewers' />" +
+ " </task>" +
+ " <transition name='approve' to='process'>" +
+ " <action class='"+Buzz.class.getName()+"' />" +
+ " </transition>" +
+ " <transition name='cancel' to='cancelled'/>" +
+ " </task-node>" +
+ " <state name='process' />" +
+ " <state name='cancelled' />" +
+ "</process-definition>"
+ );
+
+ jbpmContext = createJbpmContext();
+
+ jbpmContext.deployProcessDefinition(processDefinition);
+ ProcessInstance processInstance = jbpmContext.newProcessInstance("endtasksprocess");
+
+ processInstance = saveAndReload(processInstance);
+
+ processInstance.signal();
+ assertEquals("approval", processInstance.getRootToken().getNode().getName());
+
+ processInstance = saveAndReload(processInstance);
+
+ processInstance.signal("cancel");
+ assertEquals("cancelled", processInstance.getRootToken().getNode().getName());
+
+ jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
+ jbpmContext.close();
+ }
+
+ public void _testCancel()
+ {
+ Deployment procDefDeployment = new SimpleDeployment(
+ "<process-definition name='endtasksprocess' xmlns='urn:jbpm.org:jpdl-3.2'>" +
+ " <start-state>" +
+ " <transition to='approval' />" +
+ " </start-state>" +
+ " <task-node name='approval' end-tasks='true'>" +
+ " <task name='approve' description='Review order'>" +
+ " <assignment pooled-actors='reviewers' />" +
+ " </task>" +
+ " <transition name='approve' to='process'>" +
+ " <action class='" + Buzz.class.getName() + "' />" +
+ " </transition>" +
+ " <transition name='cancel' to='cancelled'/>" +
+ " </task-node>" +
+ " <state name='process' />" +
+ " <state name='cancelled' />" +
+ "</process-definition>"
+ );
+
+ DeploymentService depService = getProcessEngine().getService(DeploymentService.class);
+ ProcessDefinition procDef = depService.deploy(procDefDeployment);
+
+ Process proc = procDef.newInstance();
+ proc.startProcess();
+
+ assertEquals("approval", proc.getRootToken().getCurrentNode().getName());
+ proc.getRootToken().signal("cancel");
+ assertEquals("cancelled", proc.getRootToken().getCurrentNode().getName());
+
+ depService.undeploy(procDefDeployment);
+ }
+
+ public void _testApprove()
+ {
+ jbpmContext = createJbpmContext();
+ graphSession = jbpmContext.getGraphSession();
+
+ org.jbpm.graph.def.ProcessDefinition processDefinition = org.jbpm.graph.def.ProcessDefinition.parseXmlString(
+ "<process-definition name='endtasksprocess'>" +
+ " <start-state>" +
+ " <transition to='approval' />" +
+ " </start-state>" +
+ " <task-node name='approval' end-tasks='true'>" +
+ " <task name='approve' description='Review order'>" +
+ " <assignment pooled-actors='reviewers' />" +
+ " </task>" +
+ " <transition name='approve' to='process'/>" +
+ " <transition name='reject' to='cancelled'/>" +
+ " <transition name='cancel' to='cancelled'/>" +
+ " </task-node>" +
+ " <state name='process' />" +
+ " <state name='cancelled' />" +
+ "</process-definition>"
+ );
+ jbpmContext.deployProcessDefinition(processDefinition);
+ try
+ {
+ newTransaction();
+
+ ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("endtasksprocess");
+ processInstance.signal();
+
+ processInstance = saveAndReload(processInstance);
+
+ assertEquals("approval", processInstance.getRootToken().getNode().getName());
+ TaskInstance taskInstance = (TaskInstance)processInstance.getTaskMgmtInstance().getTaskInstances().iterator().next();
+
+ taskInstance.end("approve");
+ assertEquals("process", processInstance.getRootToken().getNode().getName());
+ }
+ finally
+ {
+ jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
+ jbpmContext.close();
+ }
+ }
+
+ public void _testReject()
+ {
+ jbpmContext = createJbpmContext();
+ graphSession = jbpmContext.getGraphSession();
+
+ org.jbpm.graph.def.ProcessDefinition processDefinition = org.jbpm.graph.def.ProcessDefinition.parseXmlString(
+ "<process-definition name='endtasksprocess'>" +
+ " <start-state>" +
+ " <transition to='approval' />" +
+ " </start-state>" +
+ " <task-node name='approval' end-tasks='true'>" +
+ " <task name='approve' description='Review order'>" +
+ " <assignment pooled-actors='reviewers' />" +
+ " </task>" +
+ " <transition name='approve' to='process'/>" +
+ " <transition name='reject' to='cancelled'/>" +
+ " <transition name='cancel' to='cancelled'/>" +
+ " </task-node>" +
+ " <state name='process' />" +
+ " <state name='cancelled' />" +
+ "</process-definition>"
+ );
+ jbpmContext.deployProcessDefinition(processDefinition);
+ try
+ {
+ newTransaction();
+
+ ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("endtasksprocess");
+ processInstance.signal();
+
+ processInstance = saveAndReload(processInstance);
+
+ assertEquals("approval", processInstance.getRootToken().getNode().getName());
+ TaskInstance taskInstance = (TaskInstance)processInstance.getTaskMgmtInstance().getTaskInstances().iterator().next();
+
+ taskInstance.end("reject");
+ assertEquals("cancelled", processInstance.getRootToken().getNode().getName());
+ }
+ finally
+ {
+ jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
+ jbpmContext.close();
+ }
+ }
+
+ public void _testTaskInstancesAfterCancellation()
+ {
+ jbpmContext = createJbpmContext();
+ graphSession = jbpmContext.getGraphSession();
+
+ org.jbpm.graph.def.ProcessDefinition processDefinition = org.jbpm.graph.def.ProcessDefinition.parseXmlString(
+ "<process-definition name='endtasksprocess'>" +
+ " <start-state>" +
+ " <transition to='approval' />" +
+ " </start-state>" +
+ " <task-node name='approval' end-tasks='true'>" +
+ " <task name='approve' description='Review order'>" +
+ " <assignment pooled-actors='reviewers' />" +
+ " </task>" +
+ " <transition name='approve' to='process'/>" +
+ " <transition name='reject' to='cancelled'/>" +
+ " <transition name='cancel' to='cancelled'/>" +
+ " </task-node>" +
+ " <state name='process' />" +
+ " <state name='cancelled' />" +
+ "</process-definition>"
+ );
+ jbpmContext.deployProcessDefinition(processDefinition);
+ try
+ {
+ newTransaction();
+
+ ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("endtasksprocess");
+ processInstance.signal();
+
+ processInstance = saveAndReload(processInstance);
+ processInstance.signal("cancel");
+
+ Collection taskInstances = processInstance.getTaskMgmtInstance().getTaskInstances();
+ Iterator iter = taskInstances.iterator();
+ while(iter.hasNext()) {
+ TaskInstance taskInstance = (TaskInstance) iter.next();
+ assertTrue(taskInstance.getName()+" ended", taskInstance.hasEnded());
+ assertFalse(taskInstance.getName()+" not cancelled", taskInstance.isCancelled());
+ assertFalse(taskInstance.getName()+" not blocking", taskInstance.isBlocking());
+ assertFalse(taskInstance.getName()+" not signalling", taskInstance.isSignalling());
+ }
+ }
+ finally
+ {
+ jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
+ jbpmContext.close();
+ }
+ }
+
+ public static class Buzz implements ActionHandler
+ {
+ private static final long serialVersionUID = 1L;
+
+ public void execute(ExecutionContext executionContext) throws Exception
+ {
+ throw new RuntimeException("buzz");
+ }
+ }
+
+ private JbpmContext createJbpmContext()
+ {
+ return getJbpmConfiguration().createJbpmContext();
+ }
+
+ private ProcessInstance saveAndReload(ProcessInstance pi)
+ {
+ if (jbpmContext == null)
+ jbpmContext = createJbpmContext();
+
+ jbpmContext.save(pi);
+ newTransaction();
+ return graphSession.loadProcessInstance(pi.getId());
+ }
+
+ private void newTransaction()
+ {
+ if (jbpmContext != null)
+ jbpmContext.close();
+
+ jbpmContext = createJbpmContext();
+ graphSession = jbpmContext.getGraphSession();
+ }
+
+ private JbpmConfiguration getJbpmConfiguration()
+ {
+ if (jbpmConfiguration == null)
+ jbpmConfiguration = JbpmConfiguration.getInstance();
+
+ return jbpmConfiguration;
+ }
+}
Property changes on: jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/task/TaskTest.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
More information about the jbpm-commits
mailing list