Author: camunda
Date: 2008-10-08 07:09:58 -0400 (Wed, 08 Oct 2008)
New Revision: 2507
Added:
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/NotInParAction.java
Modified:
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessArchiveDeploymentDbTest.java
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessLoadedActionHandler.java
Log:
JBPM-1404
added testcase for uncorrect ProcessClassLoader (in the area of
https://jira.jboss.org/jira/browse/JBPM-1404)
Added: jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/NotInParAction.java
===================================================================
--- jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/NotInParAction.java
(rev 0)
+++
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/NotInParAction.java 2008-10-08
11:09:58 UTC (rev 2507)
@@ -0,0 +1,20 @@
+package org.jbpm.jpdl.par;
+
+import org.jbpm.graph.def.ActionHandler;
+import org.jbpm.graph.exe.ExecutionContext;
+
+public class NotInParAction implements ActionHandler {
+
+ public void execute(ExecutionContext executionContext) throws Exception {
+ // create new action without specifying classloader
+ // should use the ProcessClassLoader specified as ContextClassLoader
+ // this can be verified later on
+ ProcessArchiveDeploymentDbTest.resourceActionInstance =
+
Thread.currentThread().getContextClassLoader().loadClass("org.jbpm.jpdl.par.ResourceAction").newInstance();
+
+ // TODO: why doesn't the following work? I thought it is delegated to
+ // the context class loader? But it seems not that easy?
+ // ProcessArchiveDeploymentDbTest.resourceActionInstance = new ResourceAction();
+ }
+
+}
Modified:
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessArchiveDeploymentDbTest.java
===================================================================
---
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessArchiveDeploymentDbTest.java 2008-10-08
11:06:20 UTC (rev 2506)
+++
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessArchiveDeploymentDbTest.java 2008-10-08
11:09:58 UTC (rev 2507)
@@ -23,6 +23,7 @@
import java.io.File;
import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -35,6 +36,7 @@
import org.jbpm.db.AbstractDbTestCase;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
+import org.jbpm.instantiation.ProcessClassLoader;
import org.jbpm.taskmgmt.def.Task;
import org.jbpm.taskmgmt.def.TaskMgmtDefinition;
import org.jbpm.util.ClassLoaderUtil;
@@ -245,6 +247,59 @@
resourceActionInstance = null;
}
+ /**
+ * start process with action, which itselfs loads an action via "new
ResourceAction()".
+ * This action is checked if it gets loaded by the ProcessClassLoader
+ * correctly (which should be set as ContextClassLoader)
+ *
+ * TODO: doesn't yet test the right thing, looks like the Action
+ * first tries its own classloader (which is a ProcessClassLoader)
+ * and thus it works even without the ContextClassLoader set.
+ */
+ public void testProcessClassLoaderAsContextClassLoader() throws Exception {
+ // create a process archive file and save it to disk
+ String fileName = getTestClassesDir() + "/resource.process";
+ FileOutputStream fileOutputStream = new FileOutputStream(fileName);
+ ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
+ addEntry(zipOutputStream, "processdefinition.xml",
"org/jbpm/jpdl/par/classloadingprocess.xml");
+ addEntry(zipOutputStream, "classes/org/jbpm/jpdl/par/ResourceAction.class",
"org/jbpm/jpdl/par/ResourceAction.class");
+ addEntry(zipOutputStream,
"classes/org/jbpm/jpdl/par/ProcessLoadedActionHandler.class",
"org/jbpm/jpdl/par/ProcessLoadedActionHandler.class");
+ zipOutputStream.close();
+
+ // deploy the saved process file
+ ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(fileName));
+ ProcessDefinition processDefinition =
ProcessDefinition.parseParZipInputStream(zipInputStream);
+
+ // rename the resources to force usage of the process classloader by preventing that
they will be found in the test classpath
+ String classOriginalName1 = getTestClassesDir() +
"org/jbpm/jpdl/par/ResourceAction.class";
+ String classTmpName1 = classOriginalName1 + ".hiddenFromTestClasspath";
+ String classOriginalName2 = getTestClassesDir() +
"org/jbpm/jpdl/par/ProcessLoadedActionHandler.class";
+ String classTmpName2 = classOriginalName2 + ".hiddenFromTestClasspath";
+
+ // move the files
+ assertTrue(new File(classOriginalName1).renameTo(new File(classTmpName1)));
+ assertTrue(new File(classOriginalName2).renameTo(new File(classTmpName2)));
+
+ try {
+ jbpmContext.deployProcessDefinition(processDefinition);
+ try {
+ newTransaction();
+
+ ProcessInstance processInstance = jbpmContext.newProcessInstance("the
deployable process");
+ processInstance.signal();
+ } finally {
+
jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
+ }
+ } finally {
+ // put the files back into original position
+ new File(classTmpName1).renameTo(new File(classOriginalName1));
+ new File(classTmpName2).renameTo(new File(classOriginalName2));
+ }
+
+ assertEquals(ProcessClassLoader.class,
resourceActionInstance.getClass().getClassLoader().getClass());
+ resourceActionInstance = null;
+ }
+
private static void addEntry(ZipOutputStream zipOutputStream, String entryName, String
resource) throws IOException
{
InputStream inputStream = ClassLoaderUtil.getStream(resource);
Modified:
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessLoadedActionHandler.java
===================================================================
---
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessLoadedActionHandler.java 2008-10-08
11:06:20 UTC (rev 2506)
+++
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessLoadedActionHandler.java 2008-10-08
11:09:58 UTC (rev 2507)
@@ -32,5 +32,10 @@
// notify the ProcessArchiveClassLoadingTest that this
// class has been executed
ProcessArchiveClassLoadingDbTest.isLoadedActionHandlerExecuted = true;
+
+ // create new action without specifying classloader
+ // should use the ProcessClassLoader specified as ContextClassLoader
+ // this can be verified later on
+ new NotInParAction().execute(executionContext);
}
}