[jbpm-commits] JBoss JBPM SVN: r6231 - jbpm3/branches/jbpm-3.2-soa/modules/simulation/src/main/java/org/jbpm/sim/jpdl.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Mar 18 17:41:24 EDT 2010


Author: alex.guizar at jboss.com
Date: 2010-03-18 17:41:23 -0400 (Thu, 18 Mar 2010)
New Revision: 6231

Modified:
   jbpm3/branches/jbpm-3.2-soa/modules/simulation/src/main/java/org/jbpm/sim/jpdl/SimAction.java
Log:
fix sim action not properly setting up a process class loader

Modified: jbpm3/branches/jbpm-3.2-soa/modules/simulation/src/main/java/org/jbpm/sim/jpdl/SimAction.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/simulation/src/main/java/org/jbpm/sim/jpdl/SimAction.java	2010-03-18 20:29:41 UTC (rev 6230)
+++ jbpm3/branches/jbpm-3.2-soa/modules/simulation/src/main/java/org/jbpm/sim/jpdl/SimAction.java	2010-03-18 21:41:23 UTC (rev 6231)
@@ -1,48 +1,50 @@
 package org.jbpm.sim.jpdl;
 
 import org.dom4j.Element;
+
+import org.jbpm.JbpmConfiguration;
 import org.jbpm.graph.def.Action;
 import org.jbpm.graph.exe.ExecutionContext;
 import org.jbpm.jpdl.xml.JpdlXmlReader;
 
 /**
- * The SimAction class adds behavior to check, if the action should be executed in a simulation run.
+ * The SimAction class adds behavior to check, if the action should be executed
+ * in a simulation run.
  * 
  * Default behavior is: not execute.
  * 
  * To execute an action during a simulation run, you have to configure either
- * the attribute <b>simulation</b> with the value 'execute' or to add a 
- * <simulation-class> element, which defines a special handler for the simulation.
+ * the attribute <b>simulation</b> with the value 'execute' or to add a
+ * <simulation-class> element, which defines a special handler for the
+ * simulation.
  * 
- *  Another way is to define not a <action>, but a <simulation-action>, which is only
- *  executed in simulation runs
+ * Another way is to define not a <action>, but a <simulation-action>, which is
+ * only executed in simulation runs
  * 
  * @author bernd.ruecker at camunda.com
  */
 public class SimAction extends Action {
 
   private static final long serialVersionUID = 1L;
-  
-  private boolean simulate = false;
-  
-  private boolean simulationHandlerChecked = false;
 
+  private boolean simulate;
+  private boolean simulationHandlerChecked;
+
   public void read(Element actionElement, JpdlXmlReader jpdlReader) {
     super.read(actionElement, jpdlReader);
 
     String simulation = actionElement.attributeValue("simulation");
-    if ( "execute".equals(simulation)
-         || "simulation-action".equals(actionElement.getQName().getName())
-       ) {
+    if ("execute".equals(simulation)
+      || "simulation-action".equals(actionElement.getQName().getName())) {
       simulate = true;
     }
-    
+
     String simulationClass = actionElement.attributeValue("simulation-class");
-    if (simulationClass!=null) {
+    if (simulationClass != null) {
       simulate = true;
       actionDelegation.setClassName(simulationClass);
       // don't use same configuration in this case
-      // if the user wants the same configurations, he has to use a own 
+      // if the user wants the same configurations, he has to use a own
       // SimulationAction
       // TODO: Maybe make some configuration property for this?
       actionDelegation.setConfiguration(null);
@@ -52,35 +54,51 @@
   public void execute(ExecutionContext executionContext) throws Exception {
     // check if the delegation class implements one of the simulation interfaces
     if (!simulationHandlerChecked) {
-      Object delegation = actionDelegation.getInstance();
+      Thread currentThread = Thread.currentThread();
+      ClassLoader contextClassLoader = currentThread.getContextClassLoader();
+      try {
+        // set context class loader correctly for delegation class
+        // (https://jira.jboss.org/jira/browse/JBPM-1448)
+        ClassLoader processClassLoader =
+          JbpmConfiguration.getProcessClassLoader(executionContext.getProcessDefinition());
+        currentThread.setContextClassLoader(processClassLoader);
 
-      // if the SimulationHandler is implemented, change the action to call the simExecute instead
-      if (SimulationHandler.class.isAssignableFrom( delegation.getClass() )) {
-        simulate = true;
-        referencedAction = new ActionHandlerDelegation( (SimulationHandler)delegation );
+        Object delegation = actionDelegation.getInstance();
+
+        // if the SimulationHandler is implemented, change the action to call
+        // the simExecute instead
+        if (delegation instanceof SimulationHandler) {
+          simulate = true;
+          referencedAction = new ActionHandlerDelegation((SimulationHandler) delegation);
+        }
+        // if the SimulationNoop is implemented skip execution completely
+        else if (delegation instanceof SimulationNoop) {
+          simulate = false;
+        }
+        simulationHandlerChecked = true;
       }
-      // if the SimulationNoop is implemented skip execution completely
-      else if (SimulationNoop.class.isAssignableFrom( delegation.getClass() ))
-        simulate = false;
-      simulationHandlerChecked = true;
+      finally {
+        currentThread.setContextClassLoader(contextClassLoader);
+      }
     }
 
     if (simulate) {
       super.execute(executionContext);
     }
   }
-  
+
   private class ActionHandlerDelegation extends Action {
-    
+
     private SimulationHandler delegate;
 
     private static final long serialVersionUID = 1L;
-    
+
     public ActionHandlerDelegation(SimulationHandler delegate) {
       this.delegate = delegate;
     }
+
     public void execute(ExecutionContext executionContext) throws Exception {
       delegate.simExecute(executionContext);
-    }    
+    }
   }
 }



More information about the jbpm-commits mailing list