Author: tom.baeyens(a)jboss.com
Date: 2009-09-29 09:23:38 -0400 (Tue, 29 Sep 2009)
New Revision: 5671
Added:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/ClassLoaderContext.java
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/deploymentclassloading/
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/deploymentclassloading/CustomActivity.java
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/deploymentclassloading/CustomEventListener.java
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/deploymentclassloading/DeploymentClassLoadingTest.java
jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/deploymentclassloading/
jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/deploymentclassloading/jbpm.cfg.xml
Modified:
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionBinding.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionHandlerActivity.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/EventListenerBinding.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/jobexecutor/AcquireJobsCmd.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/jobexecutor/DispatcherThread.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/jobexecutor/GetNextDueDateCmd.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/jobexecutor/JobExecutor.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ActivityImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/EventImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/EventListenerReference.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExceptionHandlerImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ObservableElementImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ProcessElementImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/repository/DeploymentClassLoader.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/repository/RepositoryCache.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/repository/RepositoryCacheImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/repository/RepositorySessionImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/ReflectUtil.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/JobExecutorBinding.java
Log:
JBPM-2430 classloading cleanup and added deployment classloading for user classes
Modified:
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionBinding.java
===================================================================
---
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionBinding.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionBinding.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -23,11 +23,9 @@
import java.util.List;
-import org.jbpm.api.jpdl.DecisionHandler;
import org.jbpm.pvm.internal.model.ActivityImpl;
import org.jbpm.pvm.internal.model.TransitionImpl;
import org.jbpm.pvm.internal.util.XmlUtil;
-import org.jbpm.pvm.internal.wire.WireContext;
import org.jbpm.pvm.internal.wire.binding.ObjectBinding;
import org.jbpm.pvm.internal.wire.descriptor.ExpressionEvaluatorDescriptor;
import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
@@ -70,8 +68,7 @@
DecisionHandlerActivity decisionHandlerActivity = new DecisionHandlerActivity();
ObjectDescriptor decisionHandlerDescriptor = (ObjectDescriptor)
objectBinding.parse(handlerElement, parse, wireParser);
- DecisionHandler decisionHandler = (DecisionHandler)
WireContext.create(decisionHandlerDescriptor);
- decisionHandlerActivity.setDecisionHandler(decisionHandler);
+ decisionHandlerActivity.setDecisionHandlerDescriptor(decisionHandlerDescriptor);
return decisionHandlerActivity;
}
Modified:
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionHandlerActivity.java
===================================================================
---
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionHandlerActivity.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionHandlerActivity.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -22,14 +22,16 @@
package org.jbpm.jpdl.internal.activity;
import org.jbpm.api.JbpmException;
+import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.activity.ActivityExecution;
import org.jbpm.api.jpdl.DecisionHandler;
import org.jbpm.pvm.internal.env.EnvironmentImpl;
import org.jbpm.pvm.internal.model.Activity;
import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
import org.jbpm.pvm.internal.model.Transition;
+import org.jbpm.pvm.internal.util.ReflectUtil;
import org.jbpm.pvm.internal.wire.Descriptor;
-import org.jbpm.pvm.internal.wire.WireContext;
/**
* @author Tom Baeyens
@@ -39,6 +41,7 @@
private static final long serialVersionUID = 1L;
protected String decisionHandlerName;
+ protected Descriptor decisionHandlerDescriptor;
protected DecisionHandler decisionHandler;
public void execute(ActivityExecution execution) {
@@ -51,9 +54,10 @@
String transitionName = null;
DecisionHandler usedDecisionHandler = null;
- if (decisionHandler!=null) {
- usedDecisionHandler = decisionHandler;
+ if (decisionHandlerDescriptor!=null) {
+ usedDecisionHandler = getDecisionHandler(activity.getProcessDefinition());
+
} else if (decisionHandlerName!=null) {
EnvironmentImpl environment = EnvironmentImpl.getCurrent();
Object object = environment.get(decisionHandlerName);
@@ -80,10 +84,22 @@
execution.take(transition);
}
+ public synchronized DecisionHandler getDecisionHandler(ProcessDefinition
processDefinition) {
+ if ( (decisionHandlerDescriptor!=null)
+ && (decisionHandler==null)
+ ) {
+ decisionHandler = (DecisionHandler)
ReflectUtil.instantiateUserCode(decisionHandlerDescriptor, (ProcessDefinitionImpl)
processDefinition);
+ }
+ return decisionHandler;
+ }
+
public void setDecisionHandlerName(String decisionHandlerName) {
this.decisionHandlerName = decisionHandlerName;
}
public void setDecisionHandler(DecisionHandler decisionHandler) {
this.decisionHandler = decisionHandler;
}
+ public void setDecisionHandlerDescriptor(Descriptor decisionHandlerDescriptor) {
+ this.decisionHandlerDescriptor = decisionHandlerDescriptor;
+ }
}
Modified:
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/EventListenerBinding.java
===================================================================
---
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/EventListenerBinding.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/EventListenerBinding.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -24,6 +24,7 @@
import org.jbpm.api.listener.EventListener;
import org.jbpm.jpdl.internal.xml.JpdlParser;
import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.JbpmClassNotFoundException;
import org.jbpm.pvm.internal.wire.WireContext;
import org.jbpm.pvm.internal.xml.Parse;
import org.jbpm.pvm.internal.xml.Parser;
@@ -40,9 +41,14 @@
}
public Object parse(Element element, Parse parse, Parser parser) {
- Descriptor descriptor = JpdlParser.parseObjectDescriptor(element, parse);
- EventListener eventListener = (EventListener) WireContext.create(descriptor);
- return eventListener;
+ Descriptor eventListenerDescriptor = JpdlParser.parseObjectDescriptor(element,
parse);
+ try {
+ EventListener eventListener = (EventListener)
WireContext.create(eventListenerDescriptor);
+ return eventListener;
+
+ } catch (JbpmClassNotFoundException e) {
+ return eventListenerDescriptor;
+ }
}
}
Modified:
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java
===================================================================
---
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -62,7 +62,6 @@
import org.jbpm.pvm.internal.task.AssignableDefinitionImpl;
import org.jbpm.pvm.internal.task.SwimlaneDefinitionImpl;
import org.jbpm.pvm.internal.task.TaskDefinitionImpl;
-import org.jbpm.pvm.internal.util.ReflectUtil;
import org.jbpm.pvm.internal.util.XmlUtil;
import org.jbpm.pvm.internal.wire.Descriptor;
import org.jbpm.pvm.internal.wire.WireContext;
@@ -177,11 +176,7 @@
public Object parseDocumentElement(Element documentElement, Parse parse) {
List<ProcessDefinitionImpl> processDefinitions = new
ArrayList<ProcessDefinitionImpl>();
- JpdlProcessDefinition processDefinition = new JpdlProcessDefinition();
-// if (processDefinition==null) {
-// processDefinition = new JpdlProcessDefinition();
-// parse.setDocumentObject(processDefinition);
-// }
+ JpdlProcessDefinition processDefinition = instantiateNewJpdlProcessDefinition();
processDefinitions.add(processDefinition);
@@ -244,6 +239,10 @@
return processDefinitions;
}
+ protected JpdlProcessDefinition instantiateNewJpdlProcessDefinition() {
+ return new JpdlProcessDefinition();
+ }
+
protected void resolveTransitionDestinations(Parse parse, JpdlProcessDefinition
processDefinition, UnresolvedTransitions unresolvedTransitions) {
for (UnresolvedTransition unresolvedTransition: unresolvedTransitions.list) {
unresolvedTransition.resolve(processDefinition, parse);
@@ -389,8 +388,15 @@
for (Element eventListenerElement: XmlUtil.elements(element)) {
JpdlBinding eventBinding = (JpdlBinding) getBinding(eventListenerElement,
CATEGORY_EVENT_LISTENER);
if (eventBinding!=null) {
- EventListener eventListener = (EventListener)
eventBinding.parse(eventListenerElement, parse, this);
- EventListenerReference eventListenerReference =
event.createEventListenerReference(eventListener);
+ EventListenerReference eventListenerReference = null;
+ Object parseResult = eventBinding.parse(eventListenerElement, parse, this);
+ if (parseResult instanceof EventListener) {
+ EventListener eventListener = (EventListener) parseResult;
+ eventListenerReference = event.createEventListenerReference(eventListener);
+ } else {
+ Descriptor eventListenerDescriptor = (Descriptor) parseResult;
+ eventListenerReference =
event.createEventListenerReference(eventListenerDescriptor);
+ }
if (XmlUtil.attributeBoolean(eventListenerElement, "propagation",
false, parse, false)) {
eventListenerReference.setPropagationEnabled(true);
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/jobexecutor/AcquireJobsCmd.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/jobexecutor/AcquireJobsCmd.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/jobexecutor/AcquireJobsCmd.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -58,13 +58,13 @@
Collection<JobImpl<?>> acquiredJobs = new
ArrayList<JobImpl<?>>();
DbSession dbSession = environment.get(DbSession.class);
- log.debug("start querying first acquirable job...");
+ if (log.isTraceEnabled()) log.trace("start querying first acquirable
job...");
JobImpl<?> job = dbSession.findFirstAcquirableJob();
if (job!=null) {
if (job.isExclusive()) {
- log.trace("exclusive acquirable job found ("+job+"). querying
for other exclusive jobs to lock them all in one tx...");
+ if (log.isTraceEnabled()) log.trace("exclusive acquirable job found
("+job+"). querying for other exclusive jobs to lock them all in one
tx...");
List<JobImpl<?>> otherExclusiveJobs =
dbSession.findExclusiveJobs(job.getProcessInstance());
acquiredJobs.addAll(otherExclusiveJobs);
} else {
@@ -73,16 +73,16 @@
for (JobImpl<?> acquiredJob: acquiredJobs) {
long lockExpirationTime =
System.currentTimeMillis()+jobExecutor.getLockMillis();
- log.trace("trying to obtain a lock for '"+acquiredJob+"'
with exp "+timeFormat.format(new Date(lockExpirationTime)));
+ if (log.isTraceEnabled()) log.trace("trying to obtain a lock for
'"+acquiredJob+"' with exp "+timeFormat.format(new
Date(lockExpirationTime)));
acquiredJob.acquire(jobExecutor.getName(), new Date(lockExpirationTime));
acquiredJobDbids.add(acquiredJob.getDbid());
}
} else {
- log.trace("no acquirable jobs in job table");
+ if (log.isTraceEnabled()) log.trace("no acquirable jobs in job
table");
}
- log.debug("locking jobs "+acquiredJobDbids);
+ if (log.isTraceEnabled()) log.trace("locking jobs "+acquiredJobDbids);
} catch (Exception e) {
// if jboss is still booting exceptions that are due to improper
@@ -95,5 +95,4 @@
return acquiredJobDbids;
}
-
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/jobexecutor/DispatcherThread.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/jobexecutor/DispatcherThread.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/jobexecutor/DispatcherThread.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -77,9 +77,9 @@
if (waitPeriod > 0) {
synchronized (semaphore) {
if (!checkForNewJobs) {
- log.debug(getName()+" will wait for max "+waitPeriod+"ms
on "+jobExecutor);
+ log.trace(getName()+" will wait for max "+waitPeriod+"ms
on "+jobExecutor);
semaphore.wait(waitPeriod);
- log.debug(getName()+" woke up");
+ log.trace(getName()+" woke up");
} else {
log.debug("skipped wait because new message arrived");
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/jobexecutor/GetNextDueDateCmd.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/jobexecutor/GetNextDueDateCmd.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/jobexecutor/GetNextDueDateCmd.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -48,13 +48,13 @@
public Date execute(Environment environment) throws Exception {
Date nextDueDate = null;
- log.debug("getting next due date...");
+ if (log.isTraceEnabled()) log.trace("getting next due date...");
DbSession dbSession = environment.get(DbSession.class);
JobImpl<?> job = dbSession.findFirstDueJob();
if (job!=null) {
nextDueDate = job.getDueDate();
}
- log.debug("next due date is "+nextDueDate);
+ if (log.isTraceEnabled()) log.trace("next due date is "+nextDueDate);
return nextDueDate;
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/jobexecutor/JobExecutor.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/jobexecutor/JobExecutor.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/jobexecutor/JobExecutor.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -83,8 +83,12 @@
isActive = true;
log.trace("starting thread pool for job executor
'"+name+"'...");
- threadPool = new ThreadPoolExecutor(nbrOfThreads, nbrOfThreads, 0L,
TimeUnit.MILLISECONDS,
- new ArrayBlockingQueue<Runnable>(nbrOfThreads),
JobRejectionHandler.INSTANCE);
+ threadPool = new ThreadPoolExecutor(nbrOfThreads,
+ nbrOfThreads,
+ 0L,
+ TimeUnit.MILLISECONDS,
+ new
ArrayBlockingQueue<Runnable>(nbrOfThreads),
+ JobRejectionHandler.INSTANCE);
log.trace("starting dispatcher thread for job executor
'"+name+"'...");
dispatcherThread = new DispatcherThread(this);
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ActivityImpl.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ActivityImpl.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ActivityImpl.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -27,8 +27,8 @@
import java.util.Map;
import org.jbpm.api.activity.ActivityBehaviour;
+import org.jbpm.pvm.internal.util.ReflectUtil;
import org.jbpm.pvm.internal.wire.Descriptor;
-import org.jbpm.pvm.internal.wire.WireContext;
/**
* @author Tom Baeyens
@@ -358,7 +358,7 @@
return activityBehaviour;
}
if (activityBehaviourDescriptor!=null) {
- ActivityBehaviour createdBehaviour = (ActivityBehaviour)
WireContext.create(activityBehaviourDescriptor);
+ ActivityBehaviour createdBehaviour = (ActivityBehaviour)
ReflectUtil.instantiateUserCode(activityBehaviourDescriptor, processDefinition);
if (!isActivityBehaviourStateful) {
activityBehaviour = createdBehaviour;
}
@@ -366,7 +366,7 @@
}
return null;
}
-
+
// getters and setters //////////////////////////////////////////////////////
public ObservableElementImpl getParent() {
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/EventImpl.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/EventImpl.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/EventImpl.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -52,6 +52,7 @@
listenerReferences = new ArrayList<EventListenerReference>();
}
EventListenerReference activityReference = new EventListenerReference();
+ activityReference.setProcessDefinition(processDefinition);
listenerReferences.add(activityReference);
return activityReference;
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/EventListenerReference.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/EventListenerReference.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/EventListenerReference.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -22,8 +22,8 @@
package org.jbpm.pvm.internal.model;
import org.jbpm.api.listener.EventListener;
+import org.jbpm.pvm.internal.util.ReflectUtil;
import org.jbpm.pvm.internal.wire.Descriptor;
-import org.jbpm.pvm.internal.wire.WireContext;
/**
* @author Tom Baeyens
@@ -60,7 +60,7 @@
return eventListener;
}
if (eventListenerDescriptor!=null) {
- EventListener createdEventListener = (EventListener)
WireContext.create(eventListenerDescriptor);
+ EventListener createdEventListener = (EventListener)
ReflectUtil.instantiateUserCode(eventListenerDescriptor, processDefinition);
if (!isEventListenerStateful) {
eventListener = createdEventListener;
}
@@ -68,7 +68,7 @@
}
return null;
}
-
+
// getters and setters //////////////////////////////////////////////////////
public Continuation getContinuation() {
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExceptionHandlerImpl.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExceptionHandlerImpl.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExceptionHandlerImpl.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -46,6 +46,7 @@
protected long dbid;
protected int dbversion;
+ protected ProcessDefinitionImpl processDefinition;
protected String exceptionClassName;
protected boolean isTransactional;
protected boolean isRethrowMasked;
@@ -72,6 +73,7 @@
eventListenerReferences = new ArrayList<EventListenerReference>();
}
EventListenerReference eventListenerReference = new EventListenerReference();
+ eventListenerReference.setProcessDefinition(processDefinition);
eventListenerReferences.add(eventListenerReference);
return eventListenerReference;
}
@@ -253,4 +255,10 @@
public void setEventListenerReferences(List<EventListenerReference>
eventListenerReferences) {
this.eventListenerReferences = eventListenerReferences;
}
+ public ProcessDefinitionImpl getProcessDefinition() {
+ return processDefinition;
+ }
+ public void setProcessDefinition(ProcessDefinitionImpl processDefinition) {
+ this.processDefinition = processDefinition;
+ }
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ObservableElementImpl.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ObservableElementImpl.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ObservableElementImpl.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -60,6 +60,7 @@
EventImpl event = new EventImpl();
event.setObservableElement(this);
event.setName(eventName);
+ event.setProcessDefinition(processDefinition);
return addEvent(event);
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ProcessElementImpl.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ProcessElementImpl.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ProcessElementImpl.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -59,6 +59,7 @@
if (exceptionHandlers==null) {
exceptionHandlers = new ArrayList<ExceptionHandlerImpl>();
}
+ exceptionHandler.setProcessDefinition(processDefinition);
exceptionHandlers.add(exceptionHandler);
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/repository/DeploymentClassLoader.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/repository/DeploymentClassLoader.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/repository/DeploymentClassLoader.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -30,6 +30,8 @@
import java.net.URLStreamHandler;
import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.session.RepositorySession;
import org.jbpm.pvm.internal.util.IoUtil;
@@ -38,26 +40,31 @@
*/
public class DeploymentClassLoader extends ClassLoader {
- private DeploymentImpl deployment = null;
+ private String deploymentId = null;
- public DeploymentClassLoader(ClassLoader parent, DeploymentImpl deployment ) {
+ public DeploymentClassLoader(ClassLoader parent, String deploymentId ) {
super(parent);
- this.deployment = deployment;
+ this.deploymentId = deploymentId;
}
public URL findResource(String name) {
URL url = null;
- byte[] bytes = deployment.getBytes(name);
+ byte[] bytes = getDeployment().getBytes(name);
if (bytes!=null) {
InputStream inputStream = new ByteArrayInputStream(bytes);
try {
- url = new URL(null, "jbpm://"+deployment.getDbid()+"/"+name,
new BytesUrlStreamHandler(inputStream));
+ url = new URL(null, "jbpm://"+deploymentId+"/"+name, new
BytesUrlStreamHandler(inputStream));
} catch (MalformedURLException e) {
throw new JbpmException("couldn't create url", e);
}
}
return url;
}
+
+ protected DeploymentImpl getDeployment() {
+ RepositorySession repositorySession =
EnvironmentImpl.getFromCurrent(RepositorySession.class);
+ return repositorySession.getDeployment(deploymentId);
+ }
public static class BytesUrlStreamHandler extends URLStreamHandler {
InputStream inputStream;
@@ -86,7 +93,7 @@
Class clazz = null;
String fileName = name.replace( '.', '/' ) + ".class";
- byte[] bytes = deployment.getBytes(fileName);
+ byte[] bytes = getDeployment().getBytes(fileName);
if (bytes!=null) {
try {
InputStream inputStream = new ByteArrayInputStream(bytes);
@@ -109,7 +116,7 @@
}
if (clazz==null) {
- throw new ClassNotFoundException("class '"+name+"' could not
be found in jbpm "+deployment);
+ throw new ClassNotFoundException("class '"+name+"' could not
be found in deployment "+deploymentId);
}
return clazz;
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/repository/RepositoryCache.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/repository/RepositoryCache.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/repository/RepositoryCache.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -35,4 +35,7 @@
Set<String> getCachedDeploymentIds();
void remove(String deploymentId);
void clear();
+
+ DeploymentClassLoader getDeploymentClassLoader(String deploymentId, ClassLoader
original);
+ void setDeploymentClassLoader(String deploymentId, ClassLoader original,
DeploymentClassLoader deploymentClassLoader);
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/repository/RepositoryCacheImpl.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/repository/RepositoryCacheImpl.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/repository/RepositoryCacheImpl.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -21,8 +21,10 @@
*/
package org.jbpm.pvm.internal.repository;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -33,6 +35,7 @@
public class RepositoryCacheImpl implements RepositoryCache {
Map<String, Map<String, Object>> deployments = new HashMap<String,
Map<String,Object>>();
+ Map<Object, DeploymentClassLoader> deploymentClassLoaders = new
HashMap<Object, DeploymentClassLoader>();
public Object get(String deploymentId, String objectName) {
Map<String, Object> deploymentObjects = deployments.get(deploymentId);
@@ -74,4 +77,20 @@
public void clear() {
deployments = new HashMap<String, Map<String,Object>>();
}
+
+ public DeploymentClassLoader getDeploymentClassLoader(String deploymentId, ClassLoader
original) {
+ Object key = getDeploymentClassLoaderKey(deploymentId, original);
+ return deploymentClassLoaders.get(key);
+ }
+
+ public void setDeploymentClassLoader(String deploymentId, ClassLoader original,
DeploymentClassLoader deploymentClassLoader) {
+ deploymentClassLoaders.put(getDeploymentClassLoaderKey(deploymentId, original),
deploymentClassLoader);
+ }
+
+ protected Object getDeploymentClassLoaderKey(String deploymentId, ClassLoader original)
{
+ List<Object> key = new ArrayList<Object>();
+ key.add(deploymentId);
+ key.add(original);
+ return key;
+ }
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/repository/RepositorySessionImpl.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/repository/RepositorySessionImpl.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/repository/RepositorySessionImpl.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -32,7 +32,6 @@
import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessDefinitionQuery;
import org.jbpm.internal.log.Log;
-import org.jbpm.pvm.internal.env.EnvironmentImpl;
import org.jbpm.pvm.internal.id.DbidGenerator;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
Added:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/ClassLoaderContext.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/ClassLoaderContext.java
(rev 0)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/ClassLoaderContext.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -0,0 +1,30 @@
+/*
+ * 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.pvm.internal.util;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ClassLoaderContext {
+
+}
Property changes on:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/ClassLoaderContext.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/ReflectUtil.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/ReflectUtil.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/ReflectUtil.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -9,6 +9,12 @@
import org.jbpm.api.JbpmException;
import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.repository.DeploymentClassLoader;
+import org.jbpm.pvm.internal.repository.RepositoryCache;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
import org.jbpm.pvm.internal.wire.descriptor.ArgDescriptor;
public abstract class ReflectUtil {
@@ -270,4 +276,40 @@
}
return className;
}
+
+ public static ClassLoader installDeploymentClassLoader(ProcessDefinitionImpl
processDefinition) {
+ String deploymentId = processDefinition.getDeploymentId();
+ if (deploymentId==null) {
+ return null;
+ }
+
+ Thread currentThread = Thread.currentThread();
+ ClassLoader original = currentThread.getContextClassLoader();
+
+ RepositoryCache repositoryCache =
EnvironmentImpl.getFromCurrent(RepositoryCache.class);
+ DeploymentClassLoader deploymentClassLoader =
repositoryCache.getDeploymentClassLoader(deploymentId, original);
+ if (deploymentClassLoader==null) {
+ deploymentClassLoader = new DeploymentClassLoader(original, deploymentId);
+ repositoryCache.setDeploymentClassLoader(deploymentId, original,
deploymentClassLoader);
+ }
+
+ currentThread.setContextClassLoader(deploymentClassLoader);
+
+ return original;
+ }
+
+ public static void uninstallDeploymentClassLoader(ClassLoader original) {
+ if (original!=null) {
+ Thread.currentThread().setContextClassLoader(original);
+ }
+ }
+
+ public static Object instantiateUserCode(Descriptor descriptor, ProcessDefinitionImpl
processDefinition) {
+ ClassLoader classLoader =
ReflectUtil.installDeploymentClassLoader(processDefinition);
+ try {
+ return WireContext.create(descriptor);
+ } finally {
+ ReflectUtil.uninstallDeploymentClassLoader(classLoader);
+ }
+ }
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/JobExecutorBinding.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/JobExecutorBinding.java 2009-09-28
08:47:12 UTC (rev 5670)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/JobExecutorBinding.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -61,7 +61,7 @@
);
} else {
descriptor.addInjection("commandService",
- new ContextTypeRefDescriptor(CommandService.class)
+ new ReferenceDescriptor(CommandService.NAME_TX_REQUIRED_COMMAND_SERVICE)
);
}
Added:
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/deploymentclassloading/CustomActivity.java
===================================================================
---
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/deploymentclassloading/CustomActivity.java
(rev 0)
+++
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/deploymentclassloading/CustomActivity.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -0,0 +1,34 @@
+/*
+ * 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.deploymentclassloading;
+
+import org.jbpm.api.activity.ActivityBehaviour;
+import org.jbpm.api.activity.ActivityExecution;
+
+public class CustomActivity implements ActivityBehaviour {
+
+ private static final long serialVersionUID = 1L;
+
+ public void execute(ActivityExecution execution) throws Exception {
+ execution.setVariable("CustomActivity", "Executed");
+ }
+}
Property changes on:
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/deploymentclassloading/CustomActivity.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/deploymentclassloading/CustomEventListener.java
===================================================================
---
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/deploymentclassloading/CustomEventListener.java
(rev 0)
+++
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/deploymentclassloading/CustomEventListener.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -0,0 +1,39 @@
+/*
+ * 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.deploymentclassloading;
+
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.api.listener.EventListenerExecution;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CustomEventListener implements EventListener {
+
+ private static final long serialVersionUID = 1L;
+
+ public void notify(EventListenerExecution execution) throws Exception {
+ execution.setVariable("CustomEventListener", "Executed");
+ }
+}
+
\ No newline at end of file
Property changes on:
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/deploymentclassloading/CustomEventListener.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/deploymentclassloading/DeploymentClassLoadingTest.java
===================================================================
---
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/deploymentclassloading/DeploymentClassLoadingTest.java
(rev 0)
+++
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/deploymentclassloading/DeploymentClassLoadingTest.java 2009-09-29
13:23:38 UTC (rev 5671)
@@ -0,0 +1,118 @@
+/*
+ * 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.deploymentclassloading;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+
+import org.jbpm.pvm.internal.util.IoUtil;
+import org.jbpm.test.JbpmCustomCfgTestCase;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DeploymentClassLoadingTest extends JbpmCustomCfgTestCase {
+
+ static String testClassesDir =
+ DeploymentClassLoadingTest.class
+ .getProtectionDomain()
+ .getCodeSource()
+ .getLocation()
+ .getFile();
+
+ public void testCustomEventListener() throws Exception {
+ String originalFileName =
testClassesDir+"org/jbpm/test/deploymentclassloading/CustomEventListener.class";
+ File originalFile = new File(originalFileName);
+
+ FileInputStream fileInputStream = new FileInputStream(originalFileName);
+ byte[] classBytes = IoUtil.readBytes(fileInputStream);
+ fileInputStream.close();
+
+ String hiddenFileName = originalFileName+".hiddenFromTestClasspath";
+ File hiddenFile = new File(hiddenFileName);
+ assertTrue(originalFile.renameTo(hiddenFile));
+
+ try {
+ String deploymentDbid = repositoryService.createDeployment()
+ .addResourceFromString("xmlstring.jpdl.xml",
+ "<process
name='CustomEventListenerClassLoading'>" +
+ " <start>" +
+ " <transition to='wait'>" +
+ " <event-listener
class='org.jbpm.test.deploymentclassloading.CustomEventListener' />" +
+ " </transition>" +
+ " </start>" +
+ " <state name='wait' />" +
+ "</process>" )
+
.addResourceFromInputStream("org/jbpm/test/deploymentclassloading/CustomEventListener.class",
new ByteArrayInputStream(classBytes))
+ .deploy();
+
+ registerDeployment(deploymentDbid);
+
+ String processInstanceId =
executionService.startProcessInstanceByKey("CustomEventListenerClassLoading").getId();
+
+ assertEquals("Executed", executionService.getVariable(processInstanceId,
"CustomEventListener"));
+
+ } finally {
+ hiddenFile.renameTo(originalFile);
+ }
+ }
+
+ public void testCustomActivityBehaviour() throws Exception {
+ String originalFileName =
testClassesDir+"org/jbpm/test/deploymentclassloading/CustomActivity.class";
+ File originalFile = new File(originalFileName);
+
+ FileInputStream fileInputStream = new FileInputStream(originalFileName);
+ byte[] classBytes = IoUtil.readBytes(fileInputStream);
+ fileInputStream.close();
+
+ String hiddenFileName = originalFileName+".hiddenFromTestClasspath";
+ File hiddenFile = new File(hiddenFileName);
+ assertTrue(originalFile.renameTo(hiddenFile));
+ try {
+
+ String deploymentDbid = repositoryService.createDeployment()
+ .addResourceFromString("xmlstring.jpdl.xml",
+ "<process name='CustomActivityClassLoading'>" +
+ " <start>" +
+ " <transition to='c' />" +
+ " </start>" +
+ " <custom name='c'
class='org.jbpm.test.deploymentclassloading.CustomActivity'>" +
+ " <transition to='wait' />" +
+ " </custom>" +
+ " <state name='wait' />" +
+ "</process>" )
+
.addResourceFromInputStream("org/jbpm/test/deploymentclassloading/CustomActivity.class",
new ByteArrayInputStream(classBytes))
+ .deploy();
+
+ registerDeployment(deploymentDbid);
+
+ String processInstanceId =
executionService.startProcessInstanceByKey("CustomActivityClassLoading").getId();
+
+ assertEquals("Executed", executionService.getVariable(processInstanceId,
"CustomActivity"));
+
+ } finally {
+ hiddenFile.renameTo(originalFile);
+ }
+ }
+}
Property changes on:
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/deploymentclassloading/DeploymentClassLoadingTest.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/deploymentclassloading/jbpm.cfg.xml
===================================================================
---
jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/deploymentclassloading/jbpm.cfg.xml
(rev 0)
+++
jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/deploymentclassloading/jbpm.cfg.xml 2009-09-29
13:23:38 UTC (rev 5671)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<jbpm-configuration>
+
+ <import resource="jbpm.default.cfg.xml" />
+ <import resource="jbpm.businesscalendar.cfg.xml" />
+ <import resource="jbpm.tx.hibernate.cfg.xml" />
+ <import resource="jbpm.jpdl.cfg.xml" />
+ <import resource="jbpm.identity.cfg.xml" />
+
+</jbpm-configuration>
Property changes on:
jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/deploymentclassloading/jbpm.cfg.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain