JBoss JBPM SVN: r2630 - jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par.
by do-not-reply@jboss.org
Author: tom.baeyens(a)jboss.com
Date: 2008-10-27 12:18:55 -0400 (Mon, 27 Oct 2008)
New Revision: 2630
Modified:
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessArchiveClassLoadingDbTest.java
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ResourceAction.java
Log:
[JBPM-1448] reworked classloading tests, re-added package information
Modified: jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessArchiveClassLoadingDbTest.java
===================================================================
--- jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessArchiveClassLoadingDbTest.java 2008-10-27 16:03:08 UTC (rev 2629)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessArchiveClassLoadingDbTest.java 2008-10-27 16:18:55 UTC (rev 2630)
@@ -21,113 +21,194 @@
*/
package org.jbpm.jpdl.par;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.jbpm.db.AbstractDbTestCase;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.util.ClassLoaderUtil;
import org.jbpm.util.IoUtil;
-public class ProcessArchiveClassLoadingDbTest extends AbstractDbTestCase
-{
+public class ProcessArchiveClassLoadingDbTest extends AbstractDbTestCase {
- public static boolean isLoadedActionHandlerExecuted = false;
+ public static Log log = LogFactory.getLog(ProcessArchiveClassLoadingDbTest.class);
- String getTestClassesDir()
- {
+ String getTestClassesDir() {
return ProcessArchiveDeploymentDbTest.class.getProtectionDomain().getCodeSource().getLocation().getFile();
}
- public void testProcessClassLoading() throws Exception
- {
- // first we read the processLoadedActionHandlerClassBytes from the file system
- InputStream inputStream = ClassLoaderUtil.getStream("org/jbpm/jpdl/par/ProcessLoadedActionHandler.class");
- byte[] processLoadedActionHandlerClassBytes = IoUtil.readBytes(inputStream);
- inputStream.close();
+ public void testExecuteResourceUsingProcess() throws Exception {
+ // create a process archive
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ZipOutputStream zipOutputStream = new ZipOutputStream(baos);
+ addEntry(zipOutputStream, "processdefinition.xml", "org/jbpm/jpdl/par/resourceprocess.xml");
+ addEntry(zipOutputStream, "classes/org/jbpm/jpdl/par/ResourceAction.class", "org/jbpm/jpdl/par/ResourceAction.class");
+ addEntry(zipOutputStream, "classes/org/jbpm/jpdl/par/classresource.txt", "org/jbpm/jpdl/par/classresource.txt");
+ addEntry(zipOutputStream, "archiveresource.txt", "org/jbpm/jpdl/par/archiveresource.txt");
+ zipOutputStream.close();
+ byte[] zipBytes = baos.toByteArray();
- // then, we delete the ProcessLoadedActionHandler from the
- // test classes dir, thereby removing it from this class's classloader
- String classFileName = getTestClassesDir() + "/org/jbpm/jpdl/par/ProcessLoadedActionHandler.class";
- if (!new File(classFileName).delete())
- {
- fail("couldn't delete " + classFileName);
+ // move the files
+ String classOriginalName = getTestClassesDir() + "org/jbpm/jpdl/par/ResourceAction.class";
+ String classTmpName = classOriginalName + ".hiddenFromTestClasspath";
+ assertTrue(new File(classOriginalName).renameTo(new File(classTmpName)));
+
+ String resourceOriginalName = getTestClassesDir() + "org/jbpm/jpdl/par/classresource.txt";
+ String resourceTmpName = resourceOriginalName + ".hiddenFromTestClasspath";
+ assertTrue(new File(resourceOriginalName).renameTo(new File(resourceTmpName)));
+
+ String archiveResourceOriginalName = getTestClassesDir() + "org/jbpm/jpdl/par/archiveresource.txt";
+ String archiveResourceTmpName = archiveResourceOriginalName + ".hiddenFromTestClasspath";
+ assertTrue(new File(archiveResourceOriginalName).renameTo(new File(archiveResourceTmpName)));
+
+ try {
+ ClassLoader testClassLoader = ProcessArchiveClassLoadingDbTest.class.getClassLoader();
+ assertNull(testClassLoader.getResource("org/jbpm/jpdl/par/classresource.txt"));
+ assertNull(testClassLoader.getResource("org/jbpm/jpdl/par/archiveresource.txt"));
+ try {
+ testClassLoader.loadClass("org.jbpm.jpdl.par.ResourceAction");
+ fail("expected exception");
+ } catch (ClassNotFoundException e) {
+ // OK
+ }
+
+ // deploy the process archive
+ ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(zipBytes));
+ ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zipInputStream);
+ jbpmContext.deployProcessDefinition(processDefinition);
+ try {
+ newTransaction();
+
+ ProcessInstance processInstance = jbpmContext.newProcessInstance("resourceprocess");
+ processInstance.signal();
+ } finally {
+ jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
+ }
+ } finally {
+ // put the files back into original position
+ new File(classTmpName).renameTo(new File(classOriginalName));
+ new File(resourceTmpName).renameTo(new File(resourceOriginalName));
+ new File(archiveResourceTmpName).renameTo(new File(archiveResourceOriginalName));
}
+ }
- try
- {
- try
- {
- // now, we gonna check if the ProcessArchiveDeployerDbTest is in the classpath of
- // this test
- ProcessArchiveClassLoadingDbTest.class.getClassLoader().loadClass("org.jbpm.jpdl.par.ProcessLoadedActionHandler");
+ public void testInstantiateClassInArchive() throws Exception {
+ // create a process archive
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ZipOutputStream zipOutputStream = new ZipOutputStream(baos);
+ addEntry(zipOutputStream, "processdefinition.xml", "org/jbpm/jpdl/par/instantiateprocess.xml");
+ addEntry(zipOutputStream, "classes/org/jbpm/jpdl/par/InstantiateAction.class", "org/jbpm/jpdl/par/InstantiateAction.class");
+ addEntry(zipOutputStream, "classes/org/jbpm/jpdl/par/InstantiateClass.class", "org/jbpm/jpdl/par/InstantiateClass.class");
+ zipOutputStream.close();
+ byte[] zipBytes = baos.toByteArray();
+
+ // move the files
+ String instantiateActionOriginalName = getTestClassesDir() + "org/jbpm/jpdl/par/InstantiateAction.class";
+ String instantiateActionTmpName = instantiateActionOriginalName + ".hiddenFromTestClasspath";
+ assertTrue(new File(instantiateActionOriginalName).renameTo(new File(instantiateActionTmpName)));
+
+ String instantiateClassOriginalName = getTestClassesDir() + "org/jbpm/jpdl/par/InstantiateClass.class";
+ String instantiateClassTmpName = instantiateClassOriginalName + ".hiddenFromTestClasspath";
+ assertTrue(new File(instantiateClassOriginalName).renameTo(new File(instantiateClassTmpName)));
+
+ try {
+ ClassLoader testClassLoader = ProcessArchiveClassLoadingDbTest.class.getClassLoader();
+ try {
+ testClassLoader.loadClass("org.jbpm.jpdl.par.InstantiateAction");
fail("expected exception");
+ } catch (ClassNotFoundException e) {
+ // OK
}
- catch (ClassNotFoundException e)
- {
+ try {
+ testClassLoader.loadClass("org.jbpm.jpdl.par.InstantiateClass");
+ fail("expected exception");
+ } catch (ClassNotFoundException e) {
// OK
}
- // next we create a process archive that includes the class file we just
- // deleted from the file system.
- String fileName = getTestClassesDir() + "/testarchive3.par";
- 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/ProcessLoadedActionHandler.class", processLoadedActionHandlerClassBytes);
- zipOutputStream.close();
+ // deploy the process archive
+ ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(zipBytes));
+ ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zipInputStream);
+ jbpmContext.deployProcessDefinition(processDefinition);
+ try {
+ newTransaction();
- // and then, the process archive is deployed in the jbpm database
- ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(fileName));
+ ProcessInstance processInstance = jbpmContext.newProcessInstance("instantiateprocess");
+ processInstance.signal();
+
+ } finally {
+ jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
+ }
+ } finally {
+ // put the files back into original position
+ new File(instantiateActionTmpName).renameTo(new File(instantiateActionOriginalName));
+ new File(instantiateClassTmpName).renameTo(new File(instantiateClassOriginalName));
+ }
+ }
+
+ public void testInstantiateClassOutsideArchive() throws Exception {
+ // create a process archive
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ZipOutputStream zipOutputStream = new ZipOutputStream(baos);
+ addEntry(zipOutputStream, "processdefinition.xml", "org/jbpm/jpdl/par/instantiateprocess.xml");
+ addEntry(zipOutputStream, "classes/org/jbpm/jpdl/par/InstantiateAction.class", "org/jbpm/jpdl/par/InstantiateAction.class");
+ zipOutputStream.close();
+ byte[] zipBytes = baos.toByteArray();
+
+ // move the files
+ String instantiateActionOriginalName = getTestClassesDir() + "org/jbpm/jpdl/par/InstantiateAction.class";
+ String instantiateActionTmpName = instantiateActionOriginalName + ".hiddenFromTestClasspath";
+ assertTrue(new File(instantiateActionOriginalName).renameTo(new File(instantiateActionTmpName)));
+
+ try {
+ ClassLoader testClassLoader = ProcessArchiveClassLoadingDbTest.class.getClassLoader();
+ try {
+ testClassLoader.loadClass("org.jbpm.jpdl.par.InstantiateAction");
+ fail("expected exception");
+ } catch (ClassNotFoundException e) {
+ // OK
+ }
+ // InstantiateClass should be visible on the test classpath
+ testClassLoader.loadClass("org.jbpm.jpdl.par.InstantiateClass");
+
+ // deploy the process archive
+ ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(zipBytes));
ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zipInputStream);
jbpmContext.deployProcessDefinition(processDefinition);
- try
- {
+ try {
newTransaction();
- List allProcessDefinitions = graphSession.findAllProcessDefinitions();
- assertEquals(1, allProcessDefinitions.size());
- processDefinition = (ProcessDefinition)allProcessDefinitions.get(0);
- ProcessInstance processInstance = new ProcessInstance(processDefinition);
+ ProcessInstance processInstance = jbpmContext.newProcessInstance("instantiateprocess");
processInstance.signal();
- assertTrue(isLoadedActionHandlerExecuted);
- }
- finally
- {
+ } finally {
jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
}
-
+ } finally {
+ // put the files back into original position
+ new File(instantiateActionTmpName).renameTo(new File(instantiateActionOriginalName));
}
- finally
- {
- FileOutputStream fileOutputStream = new FileOutputStream(classFileName);
- fileOutputStream.write(processLoadedActionHandlerClassBytes);
- fileOutputStream.flush();
- fileOutputStream.close();
- }
}
- private static void addEntry(ZipOutputStream zipOutputStream, String entryName, String resource) throws IOException
- {
+ private static void addEntry(ZipOutputStream zipOutputStream, String entryName, String resource) throws IOException {
InputStream inputStream = ClassLoaderUtil.getStream(resource);
byte[] bytes = IoUtil.readBytes(inputStream);
addEntry(zipOutputStream, entryName, bytes);
+ inputStream.close();
}
- private static void addEntry(ZipOutputStream zipOutputStream, String entryName, byte[] content) throws IOException
- {
+ private static void addEntry(ZipOutputStream zipOutputStream, String entryName, byte[] content) throws IOException {
ZipEntry zipEntry = new ZipEntry(entryName);
zipOutputStream.putNextEntry(zipEntry);
zipOutputStream.write(content);
}
-
}
Modified: jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ResourceAction.java
===================================================================
--- jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ResourceAction.java 2008-10-27 16:03:08 UTC (rev 2629)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ResourceAction.java 2008-10-27 16:18:55 UTC (rev 2630)
@@ -1,3 +1,24 @@
+/*
+ * 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.jpdl.par;
import java.io.BufferedReader;
@@ -5,97 +26,105 @@
import java.io.InputStreamReader;
import java.net.URL;
+import junit.framework.TestCase;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;
-public class ResourceAction implements ActionHandler
-{
+public class ResourceAction implements ActionHandler {
private static final long serialVersionUID = 1L;
+
+ public static Log log = LogFactory.getLog(ProcessArchiveClassLoadingDbTest.class);
- public void execute(ExecutionContext executionContext) throws Exception
- {
- // remember action class instance
- ProcessArchiveDeploymentDbTest.resourceActionInstance = this;
-
- // class resources
+ public void execute(ExecutionContext executionContext) throws Exception {
+ TestCase.assertEquals("org.jbpm.jpdl.par", getClass().getPackage().getName());
+
URL resource = getClass().getResource("classresource.txt");
InputStream stream = resource.openStream();
- ProcessArchiveDeploymentDbTest.classResourceUrl = read(stream);
+ String classResourceUrl = read(stream);
+ TestCase.assertEquals("the class resource content", classResourceUrl);
stream = getClass().getResourceAsStream("classresource.txt");
- ProcessArchiveDeploymentDbTest.classResourceStream = read(stream);
+ String classResourceStream = read(stream);
+ TestCase.assertEquals("the class resource content", classResourceStream);
- resource = ResourceAction.class.getClassLoader().getResource("org/jbpm/jpdl/par/classresource.txt");
+ ClassLoader resourceActionClassLoader = ResourceAction.class.getClassLoader();
+ log.info("resource action classloader: " + getClass().getClassLoader());
+ log.info("parent of resource action classloader: " + getClass().getClassLoader().getParent());
+ resource = resourceActionClassLoader.getResource("org/jbpm/jpdl/par/classresource.txt");
stream = resource.openStream();
- ProcessArchiveDeploymentDbTest.classLoaderResourceUrl = read(stream);
+ String classLoaderResourceUrl = read(stream);
+ TestCase.assertEquals("the class resource content", classLoaderResourceUrl);
- stream = ResourceAction.class.getClassLoader().getResourceAsStream("org/jbpm/jpdl/par/classresource.txt");
- ProcessArchiveDeploymentDbTest.classLoaderResourceStream = read(stream);
+ stream = resourceActionClassLoader.getResourceAsStream("org/jbpm/jpdl/par/classresource.txt");
+ String classLoaderResourceStream = read(stream);
+ TestCase.assertEquals("the class resource content", classLoaderResourceStream);
- // archive resources
-
resource = getClass().getResource("//archiveresource.txt");
stream = resource.openStream();
- ProcessArchiveDeploymentDbTest.archiveResourceUrl = read(stream);
+ String archiveResourceUrl = read(stream);
+ TestCase.assertEquals("the archive resource content", archiveResourceUrl);
stream = getClass().getResourceAsStream("//archiveresource.txt");
- ProcessArchiveDeploymentDbTest.archiveResourceStream = read(stream);
+ String archiveResourceStream = read(stream);
+ TestCase.assertEquals("the archive resource content", archiveResourceStream);
- resource = ResourceAction.class.getClassLoader().getResource("//archiveresource.txt");
+ resource = resourceActionClassLoader.getResource("//archiveresource.txt");
stream = resource.openStream();
- ProcessArchiveDeploymentDbTest.archiveClassLoaderResourceUrl = read(stream);
+ String archiveClassLoaderResourceUrl = read(stream);
+ TestCase.assertEquals("the archive resource content", archiveClassLoaderResourceUrl);
- stream = ResourceAction.class.getClassLoader().getResourceAsStream("//archiveresource.txt");
- ProcessArchiveDeploymentDbTest.archiveClassLoaderResourceStream = read(stream);
+ stream = resourceActionClassLoader.getResourceAsStream("//archiveresource.txt");
+ String archiveClassLoaderResourceStream = read(stream);
+ TestCase.assertEquals("the archive resource content", archiveClassLoaderResourceStream);
- // unexisting resources
- try
- {
- ProcessArchiveDeploymentDbTest.unexistingClassResourceStream = getClass().getResourceAsStream("unexistingresource.txt");
+ ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ log.info("resource action context classloader: " + contextClassLoader);
+ log.info("parent of resource action context classloader: " + contextClassLoader.getParent());
+ resource = contextClassLoader.getResource("//archiveresource.txt");
+ stream = resource.openStream();
+ String contextClassLoaderResourceUrl = read(stream);
+ TestCase.assertEquals("the archive resource content", contextClassLoaderResourceUrl);
+
+ stream = contextClassLoader.getResourceAsStream("//archiveresource.txt");
+ String contextClassLoaderResourceStream = read(stream);
+ TestCase.assertEquals("the archive resource content", contextClassLoaderResourceStream);
+
+ try {
+ getClass().getResourceAsStream("unexistingresource.txt");
+ } catch (RuntimeException e) {
+ // ok
}
- catch (RuntimeException e)
- {
- // ignore
+
+ try {
+ resourceActionClassLoader.getResourceAsStream("org/jbpm/jpdl/par/unexistingresource.txt");
+ } catch (RuntimeException e) {
+ // ok
}
-
- try
- {
- ProcessArchiveDeploymentDbTest.unexistingClassLoaderResourceStream = ResourceAction.class.getClassLoader().getResourceAsStream("org/jbpm/jpdl/par/unexistingresource.txt");
+
+ try {
+ getClass().getResourceAsStream("//unexistingarchiveresource.txt");
+ } catch (RuntimeException e) {
+ // ok
}
- catch (RuntimeException e)
- {
- // ignore
+ try {
+ resourceActionClassLoader.getResourceAsStream("//unexistingarchiveresource.txt");
+ } catch (RuntimeException e) {
+ // ok
}
-
- try
- {
- ProcessArchiveDeploymentDbTest.unexistingArchiveResourceStream = getClass().getResourceAsStream("//unexistingarchiveresource.txt");
- }
- catch (RuntimeException e)
- {
- // ignore
- }
- try
- {
- ProcessArchiveDeploymentDbTest.unexistingArchiveLoaderResourceStream = ResourceAction.class.getClassLoader().getResourceAsStream("//unexistingarchiveresource.txt");
- }
- catch (RuntimeException e)
- {
- // ignore
- }
}
-
- private String read(InputStream resourceAsStream) throws Exception
- {
+
+ static String read(InputStream resourceAsStream) throws Exception {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resourceAsStream));
StringBuffer buffer = new StringBuffer();
String l;
- while ((l = bufferedReader.readLine()) != null)
- {
+ while ((l = bufferedReader.readLine()) != null) {
buffer.append(l);
}
return buffer.toString();
}
-}
+}
\ No newline at end of file
17 years, 6 months
JBoss JBPM SVN: r2629 - in jbpm3/trunk/modules/core: src/main/java/org/jbpm/instantiation and 2 other directories.
by do-not-reply@jboss.org
Author: tom.baeyens(a)jboss.com
Date: 2008-10-27 12:03:08 -0400 (Mon, 27 Oct 2008)
New Revision: 2629
Added:
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/InstantiateAction.java
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/InstantiateClass.java
jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/archiveresource.txt
jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/classresource.txt
jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/instantiateprocess.xml
Removed:
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/NotInParAction.java
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessLoadedActionHandler.java
jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/archiveresource.txt
jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/classloadingprocess.xml
jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/classresource.txt
Modified:
jbpm3/trunk/modules/core/pom.xml
jbpm3/trunk/modules/core/src/main/java/org/jbpm/instantiation/ProcessClassLoader.java
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessArchiveDeploymentDbTest.java
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessClassLoaderTest.java
Log:
[JBPM-1448] reworked classloading tests, re-added package information
Modified: jbpm3/trunk/modules/core/pom.xml
===================================================================
--- jbpm3/trunk/modules/core/pom.xml 2008-10-27 15:53:40 UTC (rev 2628)
+++ jbpm3/trunk/modules/core/pom.xml 2008-10-27 16:03:08 UTC (rev 2629)
@@ -222,8 +222,9 @@
<exclude>org/jbpm/perf/StateUpdateTest.java</exclude>
<!-- https://jira.jboss.org/jira/browse/JBPM-1724 -->
<exclude>org/jbpm/seam/SeamPageFlowTest.java</exclude>
- <!-- https://jira.jboss.org/jira/browse/JBPM-1448 -->
- <exclude>org/jbpm/jpdl/par/ProcessArchiveDeploymentDbTest.java</exclude>
+ <!-- https://jira.jboss.org/jira/browse/JBPM-1709 -->
+ <exclude>org/jbpm/scheduler/exe/TimerDbTest.java</exclude>
+ <exclude>org/jbpm/taskmgmt/exe/TaskTimerExecutionDbTest.java</exclude>
</excludes>
</configuration>
</plugin>
@@ -257,8 +258,9 @@
<exclude>org/jbpm/perf/StateUpdateTest.java</exclude>
<!-- https://jira.jboss.org/jira/browse/JBPM-1724 -->
<exclude>org/jbpm/seam/SeamPageFlowTest.java</exclude>
- <!-- https://jira.jboss.org/jira/browse/JBPM-1448 -->
- <exclude>org/jbpm/jpdl/par/ProcessArchiveDeploymentDbTest.java</exclude>
+ <!-- https://jira.jboss.org/jira/browse/JBPM-1709 -->
+ <exclude>org/jbpm/scheduler/exe/TimerDbTest.java</exclude>
+ <exclude>org/jbpm/taskmgmt/exe/TaskTimerExecutionDbTest.java</exclude>
</excludes>
</configuration>
</plugin>
@@ -294,8 +296,9 @@
<exclude>org/jbpm/seam/SeamPageFlowTest.java</exclude>
<!-- https://jira.jboss.org/jira/browse/JBPM-1735 -->
<exclude>org/jbpm/graph/node/ProcessStateDbTest.java</exclude>
- <!-- https://jira.jboss.org/jira/browse/JBPM-1448 -->
- <exclude>org/jbpm/jpdl/par/ProcessArchiveDeploymentDbTest.java</exclude>
+ <!-- https://jira.jboss.org/jira/browse/JBPM-1709 -->
+ <exclude>org/jbpm/scheduler/exe/TimerDbTest.java</exclude>
+ <exclude>org/jbpm/taskmgmt/exe/TaskTimerExecutionDbTest.java</exclude>
</excludes>
</configuration>
</plugin>
@@ -334,8 +337,9 @@
<exclude>org/jbpm/graph/exe/SubProcessPlusConcurrencyDbTest.java</exclude>
<!-- https://jira.jboss.org/jira/browse/JBPM-1782 -->
<exclude>org/jbpm/jpdl/exe/JoinExecutionDbTest.java</exclude>
- <!-- https://jira.jboss.org/jira/browse/JBPM-1448 -->
- <exclude>org/jbpm/jpdl/par/ProcessArchiveDeploymentDbTest.java</exclude>
+ <!-- https://jira.jboss.org/jira/browse/JBPM-1709 -->
+ <exclude>org/jbpm/scheduler/exe/TimerDbTest.java</exclude>
+ <exclude>org/jbpm/taskmgmt/exe/TaskTimerExecutionDbTest.java</exclude>
</excludes>
</configuration>
</plugin>
@@ -371,8 +375,9 @@
<exclude>org/jbpm/seam/SeamPageFlowTest.java</exclude>
<!-- https://jira.jboss.org/jira/browse/JBPM-1764 -->
<exclude>org/jbpm/job/executor/JobExecutorDbTest</exclude>
- <!-- https://jira.jboss.org/jira/browse/JBPM-1448 -->
- <exclude>org/jbpm/jpdl/par/ProcessArchiveDeploymentDbTest.java</exclude>
+ <!-- https://jira.jboss.org/jira/browse/JBPM-1709 -->
+ <exclude>org/jbpm/scheduler/exe/TimerDbTest.java</exclude>
+ <exclude>org/jbpm/taskmgmt/exe/TaskTimerExecutionDbTest.java</exclude>
</excludes>
</configuration>
</plugin>
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/instantiation/ProcessClassLoader.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/instantiation/ProcessClassLoader.java 2008-10-27 15:53:40 UTC (rev 2628)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/instantiation/ProcessClassLoader.java 2008-10-27 16:03:08 UTC (rev 2629)
@@ -115,15 +115,14 @@
// Add the package information
// see https://jira.jboss.org/jira/browse/JBPM-1404
- // not necessary! Test passes without it?
-// final int packageIndex = name.lastIndexOf('.');
-// if (packageIndex != -1) {
-// final String packageName = name.substring(0, packageIndex);
-// final Package classPackage = getPackage(packageName);
-// if (classPackage == null) {
-// definePackage(packageName, null, null, null, null, null, null, null);
-// }
-// }
+ final int packageIndex = name.lastIndexOf('.');
+ if (packageIndex != -1) {
+ final String packageName = name.substring(0, packageIndex);
+ final Package classPackage = getPackage(packageName);
+ if (classPackage == null) {
+ definePackage(packageName, null, null, null, null, null, null, null);
+ }
+ }
}
if (clazz==null) {
Added: jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/InstantiateAction.java
===================================================================
--- jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/InstantiateAction.java (rev 0)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/InstantiateAction.java 2008-10-27 16:03:08 UTC (rev 2629)
@@ -0,0 +1,14 @@
+package org.jbpm.jpdl.par;
+
+import org.jbpm.graph.def.ActionHandler;
+import org.jbpm.graph.exe.ExecutionContext;
+
+public class InstantiateAction implements ActionHandler {
+
+ private static final long serialVersionUID = 1L;
+
+ public void execute(ExecutionContext executionContext) throws Exception {
+ new InstantiateClass();
+ }
+
+}
Added: jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/InstantiateClass.java
===================================================================
--- jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/InstantiateClass.java (rev 0)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/InstantiateClass.java 2008-10-27 16:03:08 UTC (rev 2629)
@@ -0,0 +1,4 @@
+package org.jbpm.jpdl.par;
+
+public class InstantiateClass {
+}
Deleted: 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 2008-10-27 15:53:40 UTC (rev 2628)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/NotInParAction.java 2008-10-27 16:03:08 UTC (rev 2629)
@@ -1,20 +0,0 @@
-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-27 15:53:40 UTC (rev 2628)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessArchiveDeploymentDbTest.java 2008-10-27 16:03:08 UTC (rev 2629)
@@ -21,6 +21,8 @@
*/
package org.jbpm.jpdl.par;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@@ -52,26 +54,26 @@
public void testDeployProcess() throws Exception
{
- // create a process archive file and save it to disk
- String fileName = getTestClassesDir() + "/testarchive.process";
- FileOutputStream fileOutputStream = new FileOutputStream(fileName);
- ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
+ // create a process archive
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ZipOutputStream zipOutputStream = new ZipOutputStream(baos);
addEntry(zipOutputStream, "processdefinition.xml", "org/jbpm/jpdl/par/deployableprocess.xml");
zipOutputStream.close();
+ byte[] zipBytes = baos.toByteArray();
- // deploy the saved process file
- ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(fileName));
+ // deploy the process archive
+ ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(zipBytes));
ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zipInputStream);
jbpmContext.deployProcessDefinition(processDefinition);
-
- newTransaction();
-
- List allProcessDefinitions = graphSession.findAllProcessDefinitions();
- assertEquals(1, allProcessDefinitions.size());
- processDefinition = (ProcessDefinition)allProcessDefinitions.get(0);
try
{
+ newTransaction();
+
+ List allProcessDefinitions = graphSession.findAllProcessDefinitions();
+ assertEquals(1, allProcessDefinitions.size());
+
+ processDefinition = (ProcessDefinition)allProcessDefinitions.get(0);
assertEquals("the deployable process", processDefinition.getName());
}
finally
@@ -82,19 +84,18 @@
public void testDeployProcessWithFile() throws Exception
{
- // create a process archive file and save it to disk
- String fileName = getTestClassesDir() + "/testarchive.process";
- FileOutputStream fileOutputStream = new FileOutputStream(fileName);
- ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
+ // create a process archive
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ZipOutputStream zipOutputStream = new ZipOutputStream(baos);
addEntry(zipOutputStream, "processdefinition.xml", "org/jbpm/jpdl/par/deployableprocess.xml");
addEntry(zipOutputStream, "classes/org/jbpm/jpdl/par/ProcessArchiveDeploymentDbTest.class", "org/jbpm/jpdl/par/ProcessArchiveDeploymentDbTest.class");
zipOutputStream.close();
+ byte[] zipBytes = baos.toByteArray();
- // deploy the saved process file
- ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(fileName));
-
+ ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(zipBytes));
ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zipInputStream);
jbpmContext.deployProcessDefinition(processDefinition);
+
try
{
newTransaction();
@@ -115,21 +116,22 @@
public void testDeployTwoVersionOfProcess() throws Exception
{
- // create a process archive file and save it to disk
- String fileName = getTestClassesDir() + "/testarchive.process";
- FileOutputStream fileOutputStream = new FileOutputStream(fileName);
- ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
+ // create a process archive
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ZipOutputStream zipOutputStream = new ZipOutputStream(baos);
addEntry(zipOutputStream, "processdefinition.xml", "org/jbpm/jpdl/par/deployableprocess.xml");
zipOutputStream.close();
+ byte[] zipBytes = baos.toByteArray();
- // deploy the saved process file
- ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(fileName));
+ // deploy the saved process archive
+ ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(zipBytes));
ProcessDefinition processDefinitionOne = ProcessDefinition.parseParZipInputStream(zipInputStream);
jbpmContext.deployProcessDefinition(processDefinitionOne);
+
newTransaction();
// deploy the saved process file again
- zipInputStream = new ZipInputStream(new FileInputStream(fileName));
+ zipInputStream = new ZipInputStream(new ByteArrayInputStream(zipBytes));
ProcessDefinition processDefinitionTwo = ProcessDefinition.parseParZipInputStream(zipInputStream);
jbpmContext.deployProcessDefinition(processDefinitionTwo);
@@ -147,165 +149,6 @@
}
}
- public static String classResourceUrl = null;
- public static String classResourceStream = null;
- public static String classLoaderResourceUrl = null;
- public static String classLoaderResourceStream = null;
- public static String archiveResourceUrl = null;
- public static String archiveResourceStream = null;
- public static String archiveClassLoaderResourceUrl = null;
- public static String archiveClassLoaderResourceStream = null;
- public static InputStream unexistingClassResourceStream = null;
- public static InputStream unexistingClassLoaderResourceStream = null;
- public static InputStream unexistingArchiveResourceStream = null;
- public static InputStream unexistingArchiveLoaderResourceStream = null;
-
- public static Object resourceActionInstance = null;
-
- public void testExecuteResourceUsingProcess() 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/resourceprocess.xml");
- addEntry(zipOutputStream, "classes/org/jbpm/jpdl/par/ResourceAction.class", "org/jbpm/jpdl/par/ResourceAction.class");
- addEntry(zipOutputStream, "classes/org/jbpm/jpdl/par/classresource.txt", "org/jbpm/jpdl/par/classresource.txt");
- addEntry(zipOutputStream, "archiveresource.txt", "org/jbpm/jpdl/par/archiveresource.txt");
- zipOutputStream.close();
-
- // rename the resources to force usage of the process classloader by preventing that they will be found in the test classpath
- String classOriginalName = getTestClassesDir() + "org/jbpm/jpdl/par/ResourceAction.class";
- String classTmpName = classOriginalName + ".hiddenFromTestClasspath";
- String resourceOriginalName = getTestClassesDir() + "org/jbpm/jpdl/par/classresource.txt";
- String resourceTmpName = resourceOriginalName + ".hiddenFromTestClasspath";
- // move the files
- assertTrue(new File(classOriginalName).renameTo(new File(classTmpName)));
- assertTrue(new File(resourceOriginalName).renameTo(new File(resourceTmpName)));
-
- try
- {
- // deploy the saved process file
- ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(fileName));
- ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zipInputStream);
- jbpmContext.deployProcessDefinition(processDefinition);
- try
- {
- newTransaction();
-
- ProcessInstance processInstance = jbpmContext.newProcessInstance("resourceprocess");
-
- classResourceUrl = null;
- classResourceStream = null;
- classLoaderResourceUrl = null;
- classLoaderResourceStream = null;
-
- archiveResourceUrl = null;
- archiveResourceStream = null;
- archiveClassLoaderResourceUrl = null;
- archiveClassLoaderResourceStream = null;
-
- unexistingClassResourceStream = null;
- unexistingClassLoaderResourceStream = null;
- unexistingArchiveResourceStream = null;
- unexistingArchiveLoaderResourceStream = null;
-
- resourceActionInstance = null;
-
- processInstance.signal();
- }
- finally
- {
- jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
- }
- }
- finally
- {
- // put the files back into original position
- new File(classTmpName).renameTo(new File(classOriginalName));
- new File(resourceTmpName).renameTo(new File(resourceOriginalName));
- }
-
- assertEquals("the class resource content", classResourceUrl);
- assertEquals("the class resource content", classResourceStream);
- assertEquals("the class resource content", classLoaderResourceUrl);
- assertEquals("the class resource content", classLoaderResourceStream);
-
- assertEquals("the archive resource content", archiveResourceUrl);
- assertEquals("the archive resource content", archiveResourceStream);
- assertEquals("the archive resource content", archiveClassLoaderResourceUrl);
- assertEquals("the archive resource content", archiveClassLoaderResourceStream);
-
- assertNull(unexistingClassResourceStream);
- assertNull(unexistingClassLoaderResourceStream);
- assertNull(unexistingArchiveResourceStream);
- assertNull(unexistingArchiveLoaderResourceStream);
-
- // test if package information are set correctly
- // see https://jira.jboss.org/jira/browse/JBPM-1404
- assertEquals("org.jbpm.jpdl.par", resourceActionInstance.getClass().getPackage().getName());
- 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;
- }
-
- // TODO: do the same thing when using the context class loader
- // and check, that the hierarchy is correct ProcessClassLoader -> ContextClassLoader
- // and not ProcessClassLoader -> ProcessClassLoader -> ContextClassLoader
- // assertEquals(Thread.currentThread().getContextClassLoader(), resourceActionInstance.getClass().getClassLoader().getParent());
-
-
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/ProcessClassLoaderTest.java
===================================================================
--- jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessClassLoaderTest.java 2008-10-27 15:53:40 UTC (rev 2628)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessClassLoaderTest.java 2008-10-27 16:03:08 UTC (rev 2629)
@@ -9,6 +9,7 @@
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.instantiation.ConfigurableClassloadersTest;
import org.jbpm.instantiation.ProcessClassLoader;
+import org.jbpm.util.ClassLoaderUtil;
/**
* Test case for ProcessClassLoader hierarchy and setting the ContextClassLoader correctly.
@@ -29,8 +30,8 @@
return getParent().loadClass(ContextLoadedAction.class.getName());
}
else if ("TestContextClassLoader-knows-where-to-find-ContextLoadedExceptionAction".equals(name)) {
- return getParent().loadClass(ContextLoadedExceptionAction.class.getName());
- }
+ return getParent().loadClass(ContextLoadedExceptionAction.class.getName());
+ }
return null;
}
}
@@ -44,28 +45,64 @@
originalClassLoader = Thread.currentThread().getContextClassLoader();
}
- /**
- * test using the context class loader for jbpm. Setting an own context class loader,
- * so we know if it was used.
- *
- * Classloading hierarchy should be
- * ProcessClassloader -> TestContextClassLoader -> Thread.currentContextClassLoader
- */
+ public static class DefaultLoadedAction implements ActionHandler {
+
+ public void execute(ExecutionContext executionContext) throws Exception {
+ ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ assertSame(ProcessClassLoader.class, contextClassLoader.getClass());
+
+ // verify that the default uses the jbpm-lib-classloader
+ assertSame(ClassLoaderUtil.class.getClassLoader(), contextClassLoader.getParent());
+
+ contextLoadedActionInvocations++;
+ }
+ }
+
+ /** DOES NOT configure usage of the context classloader. So this tests the default (backwards compatible) behaviour.
+ * so the classloading hierarchy of DefaultLoadedAction should be
+ * ProcessClassloader -> jbpm-lib classloader */
+ public void testDefaultClassLoader() {
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
+ "<process-definition>" +
+ " <start-state name='start'>" +
+ " <transition to='state'>" +
+ " <action class='org.jbpm.jpdl.par.ProcessClassLoaderTest$DefaultLoadedAction' />" +
+ " </transition>" +
+ " </start-state>" +
+ " <state name='state'>" +
+ " <transition to='end'/>" +
+ " </state>" +
+ "</process-definition>"
+ );
+
+ // create the process instance
+ ProcessInstance processInstance = new ProcessInstance(processDefinition);
+ processInstance.signal();
+
+ assertEquals(1, contextLoadedActionInvocations);
+ }
+
+
public static class ContextLoadedAction implements ActionHandler {
- public void execute(ExecutionContext executionContext) throws Exception {
- ClassLoader processClassLoader = Thread.currentThread().getContextClassLoader();
- assertSame(ProcessClassLoader.class, processClassLoader.getClass());
-
- ClassLoader testContextClassLoader = processClassLoader.getParent();
- assertSame(TestContextClassLoader.class, testContextClassLoader.getClass());
-
- assertSame(originalClassLoader, testContextClassLoader.getParent());
-
- contextLoadedActionInvocations++;
- }
+
+ public void execute(ExecutionContext executionContext) throws Exception {
+ ClassLoader processClassLoader = Thread.currentThread().getContextClassLoader();
+ assertSame(ProcessClassLoader.class, processClassLoader.getClass());
+
+ ClassLoader testContextClassLoader = processClassLoader.getParent();
+ assertSame(TestContextClassLoader.class, testContextClassLoader.getClass());
+
+ assertSame(originalClassLoader, testContextClassLoader.getParent());
+
+ contextLoadedActionInvocations++;
+ }
}
+
+ /** configures usage of the context classloader
+ * so the classloading hierarchy of ContextLoadedAction should be
+ * ProcessClassloader -> TestContextClassLoader -> Thread.currentContextClassLoader */
public void testContextClassLoader() {
-
+
JbpmConfiguration jbpmConfiguration = JbpmConfiguration.parseXmlString(
"<jbpm-configuration>" +
" <string name='jbpm.classLoader' value='context' />" +
@@ -87,7 +124,6 @@
" <state name='state'>" +
" <transition to='end'/>" +
" </state>" +
- " <end-state name='end'/>" +
"</process-definition>"
);
@@ -103,60 +139,7 @@
jbpmContext.close();
}
}
-
- /**
- * a second test use the default configuration and verify the
- * classloader hierarchy inside of the action. The action class should
- * be referenced properly. No test context classloader should be installed.
- * The hierarchy in the action should be:
- * ProcessClassLoader ---> ClassLoader.getSystemClassLoader()
- */
- public static class DefaultLoadedAction implements ActionHandler {
- public void execute(ExecutionContext executionContext) throws Exception {
- ClassLoader processClassLoader = Thread.currentThread()
- .getContextClassLoader();
- assertSame(ProcessClassLoader.class, processClassLoader.getClass());
- assertSame(originalClassLoader, processClassLoader.getParent());
- assertSame(ClassLoader.getSystemClassLoader(), processClassLoader.getParent());
-
- contextLoadedActionInvocations++;
- }
- }
- public void testDefaultClassLoader() {
- JbpmConfiguration jbpmConfiguration = JbpmConfiguration.parseXmlString(
- "<jbpm-configuration>" +
- " <string name='jbpm.classLoader' value='jbpm' />" +
- "</jbpm-configuration>"
- );
-
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- try {
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
- "<process-definition>" +
- " <start-state name='start'>" +
- " <transition to='state'>" +
- " <action class='org.jbpm.jpdl.par.ProcessClassLoaderTest$DefaultLoadedAction' />" +
- " </transition>" +
- " </start-state>" +
- " <state name='state'>" +
- " <transition to='end'/>" +
- " </state>" +
- " <end-state name='end'/>" +
- "</process-definition>"
- );
-
- // create the process instance
- ProcessInstance processInstance = new ProcessInstance(processDefinition);
- processInstance.signal();
-
- assertEquals(1, contextLoadedActionInvocations);
- } finally {
- Thread.currentThread().setContextClassLoader(originalClassLoader);
- jbpmContext.close();
- }
- }
-
/**
* a third test should set the testcontextClassLoader in the test and then
* let the action throw an exception. Then it should be verified that the
@@ -164,58 +147,57 @@
* from a copy of the testContextClassLoader
*/
public static class ContextLoadedExceptionAction implements ActionHandler {
- public void execute(ExecutionContext executionContext) throws Exception {
- ClassLoader processClassLoader = Thread.currentThread().getContextClassLoader();
- assertSame(ProcessClassLoader.class, processClassLoader.getClass());
-
- ClassLoader testContextClassLoader = processClassLoader.getParent();
- assertSame(TestContextClassLoader.class, testContextClassLoader.getClass());
-
- assertSame(originalClassLoader, testContextClassLoader.getParent());
-
- contextLoadedActionInvocations++;
-
- throw new Exception("simulate exception");
- }
+ public void execute(ExecutionContext executionContext) throws Exception {
+ ClassLoader processClassLoader = Thread.currentThread().getContextClassLoader();
+ assertSame(ProcessClassLoader.class, processClassLoader.getClass());
+
+ ClassLoader testContextClassLoader = processClassLoader.getParent();
+ assertSame(TestContextClassLoader.class, testContextClassLoader.getClass());
+
+ assertSame(originalClassLoader, testContextClassLoader.getParent());
+
+ contextLoadedActionInvocations++;
+
+ throw new Exception("simulate exception");
+ }
}
public void testContextClassLoaderException() {
- JbpmConfiguration jbpmConfiguration = JbpmConfiguration.parseXmlString(
- "<jbpm-configuration>" +
- " <string name='jbpm.classLoader' value='context' />" +
- "</jbpm-configuration>"
- );
-
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- TestContextClassLoader testContextClassLoader = new TestContextClassLoader(originalClassLoader);
- try {
- Thread.currentThread().setContextClassLoader(testContextClassLoader);
-
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
- "<process-definition>" +
- " <start-state name='start'>" +
- " <transition to='state'>" +
- " <action class='TestContextClassLoader-knows-where-to-find-ContextLoadedExceptionAction' />" +
- " </transition>" +
- " </start-state>" +
- " <state name='state'>" +
- " <transition to='end'/>" +
- " </state>" +
- " <end-state name='end'/>" +
- "</process-definition>"
- );
-
- // create the process instance
- ProcessInstance processInstance = new ProcessInstance(processDefinition);
- processInstance.signal();
-
- } catch(Exception ex) {
- assertEquals(1, contextLoadedActionInvocations);
- assertEquals("simulate exception", ex.getMessage());
- assertSame(testContextClassLoader, Thread.currentThread().getContextClassLoader());
-
- } finally {
- Thread.currentThread().setContextClassLoader(originalClassLoader);
- jbpmContext.close();
- }
- }
+ JbpmConfiguration jbpmConfiguration = JbpmConfiguration.parseXmlString(
+ "<jbpm-configuration>" +
+ " <string name='jbpm.classLoader' value='context' />" +
+ "</jbpm-configuration>"
+ );
+
+ JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
+ TestContextClassLoader testContextClassLoader = new TestContextClassLoader(originalClassLoader);
+ try {
+ Thread.currentThread().setContextClassLoader(testContextClassLoader);
+
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
+ "<process-definition>" +
+ " <start-state name='start'>" +
+ " <transition to='state'>" +
+ " <action class='TestContextClassLoader-knows-where-to-find-ContextLoadedExceptionAction' />" +
+ " </transition>" +
+ " </start-state>" +
+ " <state name='state'>" +
+ " <transition to='end'/>" +
+ " </state>" +
+ "</process-definition>"
+ );
+
+ // create the process instance
+ ProcessInstance processInstance = new ProcessInstance(processDefinition);
+ processInstance.signal();
+
+ } catch(Exception ex) {
+ assertEquals(1, contextLoadedActionInvocations);
+ assertEquals("simulate exception", ex.getMessage());
+ assertSame(testContextClassLoader, Thread.currentThread().getContextClassLoader());
+
+ } finally {
+ Thread.currentThread().setContextClassLoader(originalClassLoader);
+ jbpmContext.close();
+ }
+ }
}
Deleted: 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-27 15:53:40 UTC (rev 2628)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/jpdl/par/ProcessLoadedActionHandler.java 2008-10-27 16:03:08 UTC (rev 2629)
@@ -1,41 +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.jpdl.par;
-
-import org.jbpm.graph.def.ActionHandler;
-import org.jbpm.graph.exe.ExecutionContext;
-
-public class ProcessLoadedActionHandler implements ActionHandler {
-
- private static final long serialVersionUID = 1L;
-
- public void execute(ExecutionContext executionContext) throws Exception {
- // 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);
- }
-}
Deleted: jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/archiveresource.txt
===================================================================
--- jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/archiveresource.txt 2008-10-27 15:53:40 UTC (rev 2628)
+++ jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/archiveresource.txt 2008-10-27 16:03:08 UTC (rev 2629)
@@ -1 +0,0 @@
-the archive resource content
Added: jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/archiveresource.txt
===================================================================
--- jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/archiveresource.txt (rev 0)
+++ jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/archiveresource.txt 2008-10-27 16:03:08 UTC (rev 2629)
@@ -0,0 +1 @@
+the archive resource content
Property changes on: jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/archiveresource.txt
___________________________________________________________________
Name: svn:mergeinfo
+
Deleted: jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/classloadingprocess.xml
===================================================================
--- jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/classloadingprocess.xml 2008-10-27 15:53:40 UTC (rev 2628)
+++ jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/classloadingprocess.xml 2008-10-27 16:03:08 UTC (rev 2629)
@@ -1,8 +0,0 @@
-<process-definition name="the deployable process">
- <start-state>
- <transition to="end">
- <action class="org.jbpm.jpdl.par.ProcessLoadedActionHandler" />
- </transition>
- </start-state>
- <end-state name="end" />
-</process-definition>
Deleted: jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/classresource.txt
===================================================================
--- jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/classresource.txt 2008-10-27 15:53:40 UTC (rev 2628)
+++ jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/classresource.txt 2008-10-27 16:03:08 UTC (rev 2629)
@@ -1 +0,0 @@
-the class resource content
Added: jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/classresource.txt
===================================================================
--- jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/classresource.txt (rev 0)
+++ jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/classresource.txt 2008-10-27 16:03:08 UTC (rev 2629)
@@ -0,0 +1 @@
+the class resource content
Property changes on: jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/classresource.txt
___________________________________________________________________
Name: svn:mergeinfo
+
Added: jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/instantiateprocess.xml
===================================================================
--- jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/instantiateprocess.xml (rev 0)
+++ jbpm3/trunk/modules/core/src/test/resources/org/jbpm/jpdl/par/instantiateprocess.xml 2008-10-27 16:03:08 UTC (rev 2629)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<process-definition name="instantiateprocess">
+
+ <start-state name="start">
+ <transition to="end">
+ <action class="org.jbpm.jpdl.par.InstantiateAction" />
+ </transition>
+ </start-state>
+
+ <end-state name="end" />
+
+</process-definition>
\ No newline at end of file
17 years, 6 months
JBoss JBPM SVN: r2628 - projects/gwt-console/trunk.
by do-not-reply@jboss.org
Author: heiko.braun(a)jboss.com
Date: 2008-10-27 11:53:40 -0400 (Mon, 27 Oct 2008)
New Revision: 2628
Modified:
projects/gwt-console/trunk/License.html
Log:
Update License.html to reflect jMaki inclusion
Modified: projects/gwt-console/trunk/License.html
===================================================================
--- projects/gwt-console/trunk/License.html 2008-10-27 15:49:45 UTC (rev 2627)
+++ projects/gwt-console/trunk/License.html 2008-10-27 15:53:40 UTC (rev 2628)
@@ -1,49 +1,49 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
-<meta http-equiv="content-type" content="text/html; charset=utf-8">
+ <meta http-equiv="content-type" content="text/html; charset=utf-8">
-<title>jBPM GWT-Console License Information</title>
+ <title>jBPM GWT-Console License Information</title>
-<style type="text/css">
+ <style type="text/css">
-p.heading {
- font-weight: bold;
-}
+ p.heading {
+ font-weight: bold;
+ }
-.licenses {
- border-collapse: separate;
-}
+ .licenses {
+ border-collapse: separate;
+ }
-.licenses th {
- text-align: left;
- background-color: #ccccff;
- padding: 3px;
-}
+ .licenses th {
+ text-align: left;
+ background-color: #ccccff;
+ padding: 3px;
+ }
-.licenses td {
- background-color: #f4f4f4;
- padding: 3px;
- text-align: left;
- vertical-align: top;
-}
+ .licenses td {
+ background-color: #f4f4f4;
+ padding: 3px;
+ text-align: left;
+ vertical-align: top;
+ }
-.licenses tr.even td {
- background-color: #eeeeee;
-}
+ .licenses tr.even td {
+ background-color: #eeeeee;
+ }
-</style></head>
+ </style></head>
<body>
-
+
<div id="body">
-<h1>jBPM GWT-Console License Information</h1>
+ <h1>jBPM GWT-Console License Information</h1>
-<p>
+ <p>
<pre>
JBoss, Home of Professional Open Source.
Copyright 2006, Red Hat Middleware LLC, and individual contributors
@@ -65,53 +65,60 @@
Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA, or see the FSF site: http://www.fsf.org.
</pre>
-</p>
+ </p>
<a name="licenses"></a>
-<h2>LICENSE INFORMATION REGARDING RELATED THIRD-PARTY SOFTWARE</h2>
+ <h2>LICENSE INFORMATION REGARDING RELATED THIRD-PARTY SOFTWARE</h2>
-<p>The jBPM GWT-Console relies on the following third party software.
- Below is the location and license information :
-</p>
+ <p>The jBPM GWT-Console relies on the following third party software.
+ Below is the location and license information :
+ </p>
-<table class="licenses">
- <tbody><tr>
- <th>Package</th>
- <th>License</th>
- <th>Details</th>
- </tr>
+ <table class="licenses">
+ <tbody><tr>
+ <th>Package</th>
+ <th>License</th>
+ <th>Details</th>
+ </tr>
- <tr>
- <td class="package"><a href="http://code.google.com/webtoolkit/">Google Web Toolkit</a></td>
- <td class="license"><a href="http://code.google.com/webtoolkit/terms.html">Apache License v.
-2.0</a></td>
- <td class="location"><a
-href="http://code.google.com/webtoolkit/">http://code.google.com/webtoolkit/</a></td>
- </tr>
- <tr>
- <td class="package"><a href="http://www.extjs.com/">Ext 2.0</a></td>
+ <tr>
+ <td class="package"><a href="http://code.google.com/webtoolkit/">Google Web Toolkit</a></td>
+ <td class="license"><a href="http://code.google.com/webtoolkit/terms.html">Apache License v.
+ 2.0</a></td>
+ <td class="location"><a
+ href="http://code.google.com/webtoolkit/">http://code.google.com/webtoolkit/</a></td>
+ </tr>
+ <tr>
+ <td class="package"><a href="http://www.extjs.com/">Ext 2.0</a></td>
- <td class="license">Ext has <a href="http://extjs.com/license">several licensing options</a>
-available to fit a variety of needs. LGPL 3.0 is one of them.</td>
- <td class="location"><a href="http://extjs.com/download">http://extjs.com/download</a></td>
- </tr>
- <tr>
- <td class="package"><a href="http://code.google.com/p/gwt-ext/">GWT-Ext 2.0.5</a></td>
- <td class="license"><a href="http://code.google.com/p/gwt-ext/">GNU Lesser General Public Licence (LGPL), v 3.0</a>.</td>
+ <td class="license">Ext has <a href="http://extjs.com/license">several licensing options</a>
+ available to fit a variety of needs. LGPL 3.0 is one of them.</td>
+ <td class="location"><a href="http://extjs.com/download">http://extjs.com/download</a></td>
+ </tr>
+ <tr>
+ <td class="package"><a href="http://code.google.com/p/gwt-ext/">GWT-Ext 2.0.5</a></td>
+ <td class="license"><a href="http://code.google.com/p/gwt-ext/">GNU Lesser General Public Licence (LGPL), v 3.0</a>.</td>
- <td class="location"><a
-href="http://code.google.com/p/gwt-ext/">http://code.google.com/p/gwt-ext/</a></td>
- </tr>
- <tr>
- <td class="package"><a href="http://gwt-widget.sourceforge.net/">GWT-Widgets</a></td>
- <td class="license"><a href="http://gwt-widget.sourceforge.net/">Apache License v. 2.0</a>.</td>
+ <td class="location"><a
+ href="http://code.google.com/p/gwt-ext/">http://code.google.com/p/gwt-ext/</a></td>
+ </tr>
+ <tr>
+ <td class="package"><a href="http://gwt-widget.sourceforge.net/">GWT-Widgets</a></td>
+ <td class="license"><a href="http://gwt-widget.sourceforge.net/">Apache License v. 2.0</a>.</td>
- <td class="location"><a href="http://gwt-widget.sourceforge.net/">http://gwt-widget.sourceforge.net/</a></td>
- </tr>
+ <td class="location"><a href="http://gwt-widget.sourceforge.net/">http://gwt-widget.sourceforge.net/</a></td>
+ </tr>
-</tbody></table>
+ <tr>
+ <td class="package"><a href="https://ajax.dev.java.net/">jMaki</a></td>
+ <td class="license"><a href="http://developers.sun.com/berkeley_license.html">Berkeley</a>.</td>
-</div>
+ <td class="location"><a href="https://ajax.dev.java.net/">https://ajax.dev.java.net/</a></td>
+ </tr>
+ </tbody></table>
+
+</div>
+
</body></html>
17 years, 6 months
JBoss JBPM SVN: r2627 - in projects/gwt-console/trunk: war/src/main/java/jmaki/xhp and 4 other directories.
by do-not-reply@jboss.org
Author: heiko.braun(a)jboss.com
Date: 2008-10-27 11:49:45 -0400 (Mon, 27 Oct 2008)
New Revision: 2627
Added:
projects/gwt-console/trunk/gwt-console.iml
projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/DeferredExecution.java
projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/GwtTestDTOParser.java
Modified:
projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/HttpClient.java
projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxy.java
projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxyServlet.java
projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Authentication.java
projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/ConsoleView.java
projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionList.java
projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionListEditor.java
projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessImageView.java
projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceList.java
projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListEditor.java
projects/gwt-console/trunk/war/src/main/resources/jmaki/xhp/xhp.json
projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/GwtTestApplication.java
Log:
Added passthrough capabilities and default proxy configuration to XmlHttpProxy. Configure URLBuilder according to GWT.isScript()
Added: projects/gwt-console/trunk/gwt-console.iml
===================================================================
--- projects/gwt-console/trunk/gwt-console.iml (rev 0)
+++ projects/gwt-console/trunk/gwt-console.iml 2008-10-27 15:49:45 UTC (rev 2627)
@@ -0,0 +1,555 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module version="4" relativePaths="true" type="JAVA_MODULE">
+ <component name="ModuleRootManager" />
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
+ <exclude-output />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/rpc/src/main/java" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/server/src/main/java" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/server/src/main/resources" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/war/src/main/java" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/war/src/main/resources" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/war/src/test/java" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/war/src/test/resources" isTestSource="true" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.slf4j:slf4j-simple:jar:1.5.2:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/slf4j/slf4j-simple/1.5.2/slf4j-simple-1.5.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: nekohtml:nekohtml:jar:0.9.4:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/nekohtml/nekohtml/0.9.4/nekohtml-0.9.4.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.apache.derby:derby:jar:10.2.1.6:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/apache/derby/derby/10.2.1.6/derby-10.2.1.6.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: javax.xml.stream:stax-api:jar:1.0-2:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/javax/xml/stream/stax-api/1.0-2/stax-api-1.0-2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: poi:poi:jar:2.5.1-final-20040804:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/poi/poi/2.5.1-final-20040804/poi-2.5.1-final-20040804.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: asm:asm:jar:1.5.3:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/asm/asm/1.5.3/asm-1.5.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: commons-httpclient:commons-httpclient:jar:3.1:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: com.google.gwt:gwt-servlet:jar:1.5.2:runtime">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/com/google/gwt/gwt-servlet/1.5.2/gwt-servlet-1.5.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: com.google.gwt:gchart:jar:2.2:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/com/google/gwt/gchart/2.2/gchart-2.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: xml-apis:xml-apis:jar:1.3.03:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/xml-apis/xml-apis/1.3.03/xml-apis-1.3.03.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: net.sf.ehcache:ehcache:jar:1.2.3:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/net/sf/ehcache/ehcache/1.2.3/ehcache-1.2.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.slf4j:slf4j-api:jar:1.5.2:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/slf4j/slf4j-api/1.5.2/slf4j-api-1.5.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: com.sun.xml.stream:sjsxp:jar:1.0.1:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/com/sun/xml/stream/sjsxp/1.0.1/sjsxp-1.0.1.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.jbpm.jbpm3:jbpm-core:jar:3.3.0-SNAPSHOT:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/jbpm/jbpm3/jbpm-core/3.3.0-SNAPSHOT/jbpm-core-3.3.0-SNAPSHOT.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/jbpm/jbpm3/jbpm-core/3.3.0-SNAPSHOT/jbpm-core-3.3.0-SNAPSHOT-sources.jar!/" />
+ </SOURCES>
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: cglib:cglib:jar:2.1_3:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/cglib/cglib/2.1_3/cglib-2.1_3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.apache.jackrabbit:jackrabbit-text-extractors:jar:1.4:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/apache/jackrabbit/jackrabbit-text-extractors/1.4/jackrabbit-text-extractors-1.4.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: asm:asm-attrs:jar:1.5.3:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/asm/asm-attrs/1.5.3/asm-attrs-1.5.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.apache.jackrabbit:jackrabbit-api:jar:1.4:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/apache/jackrabbit/jackrabbit-api/1.4/jackrabbit-api-1.4.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: javax.mail:mail:jar:1.4:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/javax/mail/mail/1.4/mail-1.4.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: tjws:webserver:jar:1.3.3:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/tjws/webserver/1.3.3/webserver-1.3.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.jyaml:jyaml:jar:1.3:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/jyaml/jyaml/1.3/jyaml-1.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: commons-collections:commons-collections:jar:2.1.1:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/commons-collections/commons-collections/2.1.1/commons-collections-2.1.1.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.jboss.resteasy:jaxrs-api:jar:1.0-beta-8:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/jboss/resteasy/jaxrs-api/1.0-beta-8/jaxrs-api-1.0-beta-8.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: com.google.gwt:gwt-user:jar:1.5.2:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/com/google/gwt/gwt-user/1.5.2/gwt-user-1.5.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.apache.jackrabbit:jackrabbit-spi-commons:jar:1.4:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/apache/jackrabbit/jackrabbit-spi-commons/1.4/jackrabbit-spi-commons-1.4.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: com.sun.xml.bind:jaxb-impl:jar:2.1.2:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/com/sun/xml/bind/jaxb-impl/2.1.2/jaxb-impl-2.1.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.apache.ant:ant-launcher:jar:1.7.0:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/apache/ant/ant-launcher/1.7.0/ant-launcher-1.7.0.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.apache.jackrabbit:jackrabbit-spi:jar:1.4:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/apache/jackrabbit/jackrabbit-spi/1.4/jackrabbit-spi-1.4.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: javax.xml.bind:jaxb-api:jar:2.1:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/javax/xml/bind/jaxb-api/2.1/jaxb-api-2.1.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: concurrent:concurrent:jar:1.3.4:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/concurrent/concurrent/1.3.4/concurrent-1.3.4.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.apache.jackrabbit:jackrabbit-core:jar:1.4.5:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/apache/jackrabbit/jackrabbit-core/1.4.5/jackrabbit-core-1.4.5.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: javax.transaction:jta:jar:1.0.1B:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/javax/transaction/jta/1.0.1B/jta-1.0.1B.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: junit:junit:jar:3.8.1:test">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.apache.ant:ant:jar:1.7.0:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/apache/ant/ant/1.7.0/ant-1.7.0.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: commons-logging:commons-logging:jar:1.1.1:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.hibernate:hibernate:jar:3.2.6.ga:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/hibernate/hibernate/3.2.6.ga/hibernate-3.2.6.ga.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: com.google.gwt:gwt-dev:jar:mac:1.5.2:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/com/google/gwt/gwt-dev/1.5.2/gwt-dev-1.5.2-mac.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: bsh:bsh:jar:1.3.0:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/bsh/bsh/1.3.0/bsh-1.3.0.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: antlr:antlr:jar:2.7.6:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/antlr/antlr/2.7.6/antlr-2.7.6.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: commons-io:commons-io:jar:1.3.2:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/commons-io/commons-io/1.3.2/commons-io-1.3.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: commons-fileupload:commons-fileupload:jar:1.2.1:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/commons-fileupload/commons-fileupload/1.2.1/commons-fileupload-1.2.1.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: javax.servlet:servlet-api:jar:2.5:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/javax/servlet/servlet-api/2.5/servlet-api-2.5.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: javax.annotation:jsr250-api:jar:1.0:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.jbpm.jbpm3:jbpm-enterprise-beans:jar:3.3.0-SNAPSHOT:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/jbpm/jbpm3/jbpm-enterprise-beans/3.3.0-SNAPSHOT/jbpm-enterprise-beans-3.3.0-SNAPSHOT.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/jbpm/jbpm3/jbpm-enterprise-beans/3.3.0-SNAPSHOT/jbpm-enterprise-beans-3.3.0-SNAPSHOT-sources.jar!/" />
+ </SOURCES>
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: pdfbox:pdfbox:jar:0.6.4:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/pdfbox/pdfbox/0.6.4/pdfbox-0.6.4.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: commons-codec:commons-codec:jar:1.2:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/commons-codec/commons-codec/1.2/commons-codec-1.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: javax.activation:activation:jar:1.1:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/javax/activation/activation/1.1/activation-1.1.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: com.sun.xml.fastinfoset:FastInfoset:jar:1.2.2:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.2/FastInfoset-1.2.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: javax.ejb:ejb-api:jar:3.0:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/javax/ejb/ejb-api/3.0/ejb-api-3.0.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: xerces:xercesImpl:jar:2.8.1:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/xerces/xercesImpl/2.8.1/xercesImpl-2.8.1.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: dom4j:dom4j:jar:1.6.1:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.codehaus.jettison:jettison:jar:1.0.1:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/codehaus/jettison/jettison/1.0.1/jettison-1.0.1.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.apache.jackrabbit:jackrabbit-jcr-commons:jar:1.4:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/apache/jackrabbit/jackrabbit-jcr-commons/1.4/jackrabbit-jcr-commons-1.4.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.jboss.resteasy:resteasy-jaxrs:jar:1.0-beta-8:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/jboss/resteasy/resteasy-jaxrs/1.0-beta-8/resteasy-jaxrs-1.0-beta-8.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.apache.lucene:lucene-core:jar:2.2.0:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/apache/lucene/lucene-core/2.2.0/lucene-core-2.2.0.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: com.google.code.gson:gson:jar:1.2.2:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/com/google/code/gson/gson/1.2.2/gson-1.2.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.textmining:tm-extractors:jar:0.4:provided">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/textmining/tm-extractors/0.4/tm-extractors-0.4.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: org.scannotation:scannotation:jar:1.0.2:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/org/scannotation/scannotation/1.0.2/scannotation-1.0.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library name="M2 Dep: com.gwtext:gwtext:jar:2.0.5:compile">
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../../../../../.m2/repository/com/gwtext/gwtext/2.0.5/gwtext-2.0.5.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntryProperties />
+ </component>
+</module>
+
Modified: projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/HttpClient.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/HttpClient.java 2008-10-27 11:34:07 UTC (rev 2626)
+++ projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/HttpClient.java 2008-10-27 15:49:45 UTC (rev 2627)
@@ -33,20 +33,26 @@
* @param url URL string
* @param headers Map
*/
- public HttpClient(String phost,
- int pport,
- String url,
- Map headers,
- String method)
- throws MalformedURLException {
- if (phost != null && pport != -1) {
+ public HttpClient(
+ String phost,
+ int pport,
+ String url,
+ Map headers,
+ String method)
+ throws MalformedURLException
+ {
+ if (phost != null && pport != -1)
+ {
this.isProxy = true;
}
+
this.proxyHost = phost;
this.proxyPort = pport;
+
if (url.trim().startsWith("https:")) {
isHttps = true;
}
+
this.urlConnection = getURLConnection(url);
try {
this.urlConnection.setRequestMethod(method);
@@ -88,7 +94,7 @@
if (phost != null && pport != -1) {
this.isProxy = true;
}
-
+
this.proxyHost = phost;
this.proxyPort = pport;
if (url.trim().startsWith("https:")) {
@@ -129,6 +135,7 @@
private HttpURLConnection getURLConnection(String str)
throws MalformedURLException {
try {
+
if (isHttps) {
/* when communicating with the server which has unsigned or invalid
* certificate (https), SSLException or IOException is thrown.
@@ -140,12 +147,16 @@
System.setProperty("https.proxyHost", proxyHost);
System.setProperty("https.proxyPort", proxyPort + "");
}
- } else {
- if (isProxy) {
+ }
+ else
+ {
+ if (isProxy)
+ {
System.setProperty("http.proxyHost", proxyHost);
System.setProperty("http.proxyPort", proxyPort + "");
}
}
+
URL url = new URL(str);
HttpURLConnection uc = (HttpURLConnection)url.openConnection();
// if this header has not been set by a request set the user agent.
@@ -156,12 +167,15 @@
uc.setRequestProperty("user-agent", ua);
}
return uc;
- } catch (MalformedURLException me) {
+ }
+ catch (MalformedURLException me)
+ {
throw new MalformedURLException(str + " is not a valid URL");
- } catch (Exception e) {
- e.printStackTrace();
- return null;
}
+ catch (Exception e)
+ {
+ throw new RuntimeException("Unknown error creating UrlConnection: " + e);
+ }
}
/**
Modified: projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxy.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxy.java 2008-10-27 11:34:07 UTC (rev 2626)
+++ projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxy.java 2008-10-27 15:49:45 UTC (rev 2627)
@@ -130,10 +130,12 @@
HttpClient httpclient = null;
- if (userName != null &&
- password != null) {
+ if (userName != null && password != null)
+ {
httpclient = new HttpClient(proxyHost, proxyPort, urlString, headers, method, userName, password);
- } else {
+ }
+ else
+ {
httpclient = new HttpClient(proxyHost, proxyPort, urlString, headers, method);
}
Modified: projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxyServlet.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxyServlet.java 2008-10-27 11:34:07 UTC (rev 2626)
+++ projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxyServlet.java 2008-10-27 15:49:45 UTC (rev 2627)
@@ -68,7 +68,7 @@
if (requireSessionString != null) {
if ("false".equals(requireSessionString)) {
requireSession = false;
- getLogger().severe("XmlHttpProxyServlet: intialization. Session requirement disabled.");
+ getLogger().severe("XmlHttpProxyServlet: intialization. Session requirement disabled.");
} else if ("true".equals(requireSessionString)) {
requireSession = true;
getLogger().severe("XmlHttpProxyServlet: intialization. Session requirement enabled.");
@@ -162,14 +162,14 @@
PrintWriter writer = null;
String serviceKey = null;
/*try {
- BufferedReader in = req.getReader();
- String line = null;
- while ((line = in.readLine()) != null) {
- if (bodyContent == null) bodyContent = new StringBuffer();
- bodyContent.append(line);
- }
- } catch (Exception e) {
- } */
+ BufferedReader in = req.getReader();
+ String line = null;
+ while ((line = in.readLine()) != null) {
+ if (bodyContent == null) bodyContent = new StringBuffer();
+ bodyContent.append(line);
+ }
+ } catch (Exception e) {
+ } */
try
{
@@ -205,6 +205,7 @@
String callback = req.getParameter("callback");
String urlParams = req.getParameter("urlparams");
String countString = req.getParameter("count");
+ boolean passthrough = false;
// encode the url to prevent spaces from being passed along
if (urlParams != null) {
urlParams = urlParams.replace(' ', '+');
@@ -232,30 +233,48 @@
}
try
{
-
- if (services.has(serviceKey))
+ String actualServiceKey = serviceKey != null ? serviceKey : "default";
+ if (services.has(actualServiceKey))
{
- JSONObject service = services.getJSONObject(serviceKey);
- // default to the service default if no url parameters are specified
- if (urlParams == null && service.has("defaultURLParams")) {
- urlParams = service.getString("defaultURLParams");
- }
+ JSONObject service = services.getJSONObject(actualServiceKey);
String serviceURL = service.getString("url");
- // build the URL
- if (urlParams != null && serviceURL.indexOf("?") == -1){
- serviceURL += "?";
- } else if (urlParams != null) {
- serviceURL += "&";
- }
- String apikey = "";
+ if(null==serviceURL)
+ throw new IllegalArgumentException("xhp.json: service url is mising");
+
+ if (service.has("passthrough")) passthrough =
+ Boolean.valueOf(service.getString("passthrough"));
if (service.has("username")) userName = service.getString("username");
if (service.has("password")) password = service.getString("password");
+ String apikey = "";
if (service.has("apikey")) apikey = service.getString("apikey");
- urlString = serviceURL + apikey;
- if (urlParams != null) urlString += "&" + urlParams;
- if (service.has("xslStyleSheet")) {
- xslURLString = service.getString("xslStyleSheet");
+ if (service.has("xslStyleSheet")) xslURLString = service.getString("xslStyleSheet");
+
+ // default to the service default if no url parameters are specified
+ if(!passthrough)
+ {
+ if (urlParams == null && service.has("defaultURLParams")) {
+ urlParams = service.getString("defaultURLParams");
+ }
+
+ // build the URL
+ if (urlParams != null && serviceURL.indexOf("?") == -1){
+ serviceURL += "?";
+ } else if (urlParams != null) {
+ serviceURL += "&";
+ }
+
+ urlString = serviceURL + apikey;
+ if (urlParams != null) urlString += "&" + urlParams;
}
+
+ if(passthrough)
+ {
+ // override service url and url params
+ String path = req.getPathInfo();
+ path = path.substring(path.indexOf("xhp/")+3, path.length());
+
+ urlString = serviceURL + path + "?" + req.getQueryString();
+ }
}
else
{
@@ -320,13 +339,23 @@
}
}
}
- if (!isPost) {
+
+ getLogger().info("XmlHttpProxy target url: " + urlString);
+
+ if (!isPost)
+ {
xhp.processRequest(urlString, out, xslInputStream, paramsMap, headers, method, userName, password);
- } else {
- if (bodyContent == null) getLogger().info("XmlHttpProxyServlet attempting to post to url " + urlString + " with no body content");
- xhp.doPost(urlString, out, xslInputStream, paramsMap, headers, bodyContent.toString(), req.getContentType(), userName, password);
}
- } catch (Exception iox) {
+ else
+ {
+ final String content = bodyContent != null ? bodyContent.toString() : "";
+ if (bodyContent == null)
+ getLogger().info("XmlHttpProxyServlet attempting to post to url " + urlString + " with no body content");
+ xhp.doPost(urlString, out, xslInputStream, paramsMap, headers, content, req.getContentType(), userName, password);
+ }
+ }
+ catch (Exception iox)
+ {
iox.printStackTrace();
getLogger().severe("XmlHttpProxyServlet: caught " + iox);
res.setStatus(500);
@@ -338,12 +367,14 @@
ix.printStackTrace();
}
return;
- } finally {
- try {
+ }
+ finally
+ {
+ try
+ {
if (out != null) out.close();
if (writer != null) writer.close();
- } catch (java.io.IOException iox){
- }
+ } catch (java.io.IOException iox){}
}
}
@@ -378,8 +409,8 @@
}
}
serviceURL = serviceURL.substring(0, start) +
- replace +
- serviceURL.substring(end + 1, serviceURL.length());
+ replace +
+ serviceURL.substring(end + 1, serviceURL.length());
}
// call recursively to process more than one instance of a ${ in the serviceURL
if (serviceURL.indexOf("${") != -1) serviceURL = processURL(serviceURL, req, res);
@@ -408,7 +439,7 @@
return true;
}
} catch (Exception ex) {
- getLogger().severe("XmlHttpProxyServlet error checking configuration: " + ex);
+ getLogger().severe("XmlHttpProxyServlet error checking configuration: " + ex);
}
return false;
}
Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Authentication.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Authentication.java 2008-10-27 11:34:07 UTC (rev 2626)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Authentication.java 2008-10-27 15:49:45 UTC (rev 2627)
@@ -82,16 +82,13 @@
public void onResponseReceived(Request request, Response response)
{
- System.out.println("! Auth Success");
// parse roles
rolesAssigned = DTOParser.parseRolesAssigned(response.getText());
if(callback!=null) callback.onLoginSuccess(request, response);
}
public void onError(Request request, Throwable t)
- {
- System.out.println("! Auth failed");
-
+ {
// auth failed
if(callback!=null)
callback.onLoginFailed(request, t);
Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/ConsoleView.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/ConsoleView.java 2008-10-27 11:34:07 UTC (rev 2626)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/ConsoleView.java 2008-10-27 15:49:45 UTC (rev 2627)
@@ -51,7 +51,7 @@
private HeaderPanel header;
private MainMenu mainMenu;
private EditorPanel editorPanel;
- private URLBuilder URLBuilder = new URLBuilder( "http://localhost:8080", "gwt-console-server");
+ private URLBuilder urlBuilder;
private String[] rolesAssigned = new String[] {};
public final static String[] KNOWN_ROLES = {"admin", "user"};
@@ -63,6 +63,11 @@
public ConsoleView()
{
+ if(!GWT.isScript()) // hosted mode used proxy by default
+ urlBuilder = new URLBuilder(GWT.getModuleBaseURL(), "xhp");
+ else
+ urlBuilder = new URLBuilder( "http://localhost:8080", "gwt-console-server"); // TODO: make configureable
+
Panel mainPanel = createMainPanel();
assembleMainApplication(mainPanel);
forceLogin(mainPanel);
@@ -136,54 +141,41 @@
window.setCloseAction(Window.CLOSE);
final Button submitBtn = new Button("Login",
- new ButtonListenerAdapter()
- {
- public void onClick(Button button, EventObject e)
- {
+ new ButtonListenerAdapter()
+ {
+ public void onClick(Button button, EventObject e)
+ {
+ String url = getUrlBuilder().getUserInRoleURL(KNOWN_ROLES);
+ final Authentication authentication = new Authentication(url);
+ authentication.setCallback(
+ new Authentication.AuthCallback()
+ {
- if(GWT.isScript())
- {
- String url = getRestURL().getUserInRoleURL(KNOWN_ROLES);
- final Authentication authentication = new Authentication(url);
- authentication.setCallback(
- new Authentication.AuthCallback()
- {
+ public void onLoginSuccess(Request request, Response response)
+ {
+ // parse roles
+ rolesAssigned = authentication.getRolesAssigned().toArray(new String[] {});
- public void onLoginSuccess(Request request, Response response)
- {
- // parse roles
- rolesAssigned = authentication.getRolesAssigned().toArray(new String[] {});
+ // display main console
+ window.close();
+ mainPanel.show();
+ mainPanel.doLayout();
+ }
- // display main console
- window.close();
- mainPanel.show();
- mainPanel.doLayout();
- }
+ public void onLoginFailed(Request request, Throwable t)
+ {
+ // auth failed
+ setError("Authentication failed.");
+ t.printStackTrace(System.out);
+ }
+ }
+ );
- public void onLoginFailed(Request request, Throwable t)
- {
- // auth failed
- setError("Authentication failed.");
- t.printStackTrace(System.out);
- }
- }
- );
+ authentication.doLogin();
- authentication.doLogin();
- }
- else
- {
- // hosted mode roles grant any role
- // will popup BASIC Auth windows when required
- rolesAssigned = KNOWN_ROLES;
+ }
+ });
- window.close();
- mainPanel.show();
- mainPanel.doLayout();
- }
- }
- });
-
panel.add(submitBtn);
BorderLayoutData centerData = new BorderLayoutData(RegionPosition.CENTER);
@@ -206,9 +198,9 @@
return editorPanel.hasEditor(id);
}
- public URLBuilder getRestURL()
+ public URLBuilder getUrlBuilder()
{
- return URLBuilder;
+ return this.urlBuilder;
}
public void showEditor(String id)
Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionList.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionList.java 2008-10-27 11:34:07 UTC (rev 2626)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionList.java 2008-10-27 15:49:45 UTC (rev 2627)
@@ -47,7 +47,7 @@
private static String getResourceUrl(ConsoleView view)
{
- return view.getRestURL().getProcessDefinitionURL();
+ return view.getUrlBuilder().getProcessDefinitionURL();
}
protected ColumnModel createColumnModel()
@@ -105,7 +105,7 @@
if("yes".equals( btnID) )
{
ProcessDefinition proc = (ProcessDefinition)row2ProcessMap.get(row);
- String url = view.getRestURL().getRemoveDefinitionURL(proc.getProcessId());
+ String url = view.getUrlBuilder().getRemoveDefinitionURL(proc.getProcessId());
RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, url);
try
Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionListEditor.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionListEditor.java 2008-10-27 11:34:07 UTC (rev 2626)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionListEditor.java 2008-10-27 15:49:45 UTC (rev 2627)
@@ -98,7 +98,7 @@
public void onClick(Button button, EventObject e)
{
formPanel.getForm().submit(
- view.getRestURL().getUploadDefinitionURL(), null,
+ view.getUrlBuilder().getUploadDefinitionURL(), null,
Connection.POST, "Uploading definition ...", false);
}
});
Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessImageView.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessImageView.java 2008-10-27 11:34:07 UTC (rev 2626)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessImageView.java 2008-10-27 15:49:45 UTC (rev 2627)
@@ -91,7 +91,7 @@
private void loadActiveNodeInfo()
{
- String url = view.getRestURL().getActiveNodeInfoURL(this.instance.getInstanceId());
+ String url = view.getUrlBuilder().getActiveNodeInfoURL(this.instance.getInstanceId());
System.out.println("Loading activeNodeInfo: " + url);
JSONRequest.get(url,
@@ -131,7 +131,7 @@
this.activeNodeInfo = activeNodeInfo;
DiagramNodeInfo activeNode = activeNodeInfo.getActiveNode();
- String imageUrl = view.getRestURL().getProcessImageURL(instance.getParentId());
+ String imageUrl = view.getUrlBuilder().getProcessImageURL(instance.getParentId());
HTML html = new HTML(
"<div id=\"imageContainer\" style=\"position:relative;top:-1;left:-1;height:"+activeNodeInfo.getHeight()+"px;width:"+activeNodeInfo.getWidth()+"px\">" +
Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceList.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceList.java 2008-10-27 11:34:07 UTC (rev 2626)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceList.java 2008-10-27 15:49:45 UTC (rev 2627)
@@ -81,7 +81,7 @@
{
ProcessInstance instance = row2InstanceMap.get(row);
instance.setState(ProcessInstance.STATE.ENDED);
- String url = view.getRestURL().getStateChangeURL(instance.getInstanceId(), instance.getState());
+ String url = view.getUrlBuilder().getStateChangeURL(instance.getInstanceId(), instance.getState());
RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, url);
try
@@ -127,7 +127,7 @@
{
if("yes".equals( btnID) )
{
- String url = view.getRestURL().getStartNewInstanceURL(parent.getProcessId());
+ String url = view.getUrlBuilder().getStartNewInstanceURL(parent.getProcessId());
RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, url);
try
@@ -226,7 +226,7 @@
private static String getResourceUrl(ConsoleView view, long parentId)
{
- return view.getRestURL().getProcessInstanceURL(parentId);
+ return view.getUrlBuilder().getProcessInstanceURL(parentId);
}
}
Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListEditor.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListEditor.java 2008-10-27 11:34:07 UTC (rev 2626)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListEditor.java 2008-10-27 15:49:45 UTC (rev 2627)
@@ -206,7 +206,7 @@
private void persistStateChange()
{
- RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, view.getRestURL().getStateChangeURL(
+ RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, view.getUrlBuilder().getStateChangeURL(
selectedInstance.getInstanceId(), selectedInstance.getState())
);
Modified: projects/gwt-console/trunk/war/src/main/resources/jmaki/xhp/xhp.json
===================================================================
--- projects/gwt-console/trunk/war/src/main/resources/jmaki/xhp/xhp.json 2008-10-27 11:34:07 UTC (rev 2626)
+++ projects/gwt-console/trunk/war/src/main/resources/jmaki/xhp/xhp.json 2008-10-27 15:49:45 UTC (rev 2627)
@@ -1,8 +1,14 @@
{"xhp": {
"version": "1.1",
"services": [
+ {"id": "default",
+ "url":"http://localhost:8080/gwt-console-server",
+ "passthrough":true,
+ "username":"admin",
+ "password":"admin"
+ },
{"id": "jboss",
- "url":"http://localhost:8080",
+ "url":"http://localhost:8080/gwt-console-server",
"passthrough":true
}
]
Added: projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/DeferredExecution.java
===================================================================
--- projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/DeferredExecution.java (rev 0)
+++ projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/DeferredExecution.java 2008-10-27 15:49:45 UTC (rev 2627)
@@ -0,0 +1,26 @@
+/*
+ * 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.jboss.bpm.console.client;
+
+public interface DeferredExecution {
+ void execute();
+}
Modified: projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/GwtTestApplication.java
===================================================================
--- projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/GwtTestApplication.java 2008-10-27 11:34:07 UTC (rev 2626)
+++ projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/GwtTestApplication.java 2008-10-27 15:49:45 UTC (rev 2627)
@@ -22,78 +22,78 @@
package org.jboss.bpm.console.client;
import com.google.gwt.junit.client.GWTTestCase;
-import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Timer;
-import com.gwtext.client.widgets.ComponentMgr;
-import org.jboss.bpm.console.client.process.ProcessDefinitionListEditor;
-import org.jboss.bpm.console.client.process.ProcessDefinitionList;
-import org.jboss.bpm.console.client.model.ProcessDefinition;
+import com.google.gwt.http.client.Request;
+import com.google.gwt.http.client.Response;
-import java.util.List;
-
/**
* @author Heiko.Braun <heiko.braun(a)jboss.com>
*/
public class GwtTestApplication extends GWTTestCase
{
- private static Application application = null;
+ private static Application application = null;
- public String getModuleName()
- {
- return "org.jboss.bpm.console.Application";
- }
+ public String getModuleName()
+ {
+ return "org.jboss.bpm.console.Application";
+ }
- protected void gwtSetUp() throws Exception
- {
- super.gwtSetUp();
- if(null==application)
- {
- application = new Application();
- application.onModuleLoad();
- }
+ protected void gwtSetUp() throws Exception
+ {
+ super.gwtSetUp();
+ if(null==application)
+ {
+ application = new Application();
+ application.onModuleLoad();
+ }
- }
+ }
- public void testInitialisation()
- {
- ConsoleView view = application.getConsoleView();
- assertNotNull("View not initialized", view);
+ public void testAuthentication()
+ {
+ final ConsoleView view = application.getConsoleView();
+ assertNotNull("View not initialized", view);
+ DeferredExecution authTestPiece = new DeferredExecution()
+ {
+ public void execute() {
- Timer timer = new Timer()
- {
- public void run()
- {
- System.out.println("! Execute timer");
- URLBuilder urlBuilder = new URLBuilder(GWT.getModuleBaseURL(), "xhp");
- String inRoleURL = urlBuilder.getUserInRoleURL(ConsoleView.KNOWN_ROLES);
- Authentication auth = new Authentication(inRoleURL+"&id=jboss");
- auth.doLogin("admin", "admin");
- System.out.println("Assigned roles: " + auth.getRolesAssigned() );
- finishTest();
- }
- };
-
- timer.schedule(200);
- delayTestFinish(500);
- }
+ String inRoleURL = view.getUrlBuilder().getUserInRoleURL(ConsoleView.KNOWN_ROLES);
+ final Authentication auth = new Authentication(inRoleURL);
+ auth.setCallback(
+ new Authentication.AuthCallback() {
- /*ProcessDefinitionListEditor procListEditor =
- (ProcessDefinitionListEditor)ComponentMgr.getComponent(ProcessDefinitionListEditor.ID);
- assertNotNull("ProcessDefinitionListEditor not initialized", procListEditor);
+ public void onLoginSuccess(Request request, Response response) {
+ System.out.println("Assigned roles: " + auth.getRolesAssigned() );
+ }
- // load process definitions
- ProcessDefinitionList procDefList = procListEditor.getProcessDefinitionList();
- procDefList.reloadStore();
+ public void onLoginFailed(Request request, Throwable t) {
- List<ProcessDefinition> available = procDefList.getAvailableProcessDefinitions();
- assertFalse("No process definitions available", available.isEmpty());
+ throw new RuntimeException("Login failed", t);
+ }
+ }
+ );
+ auth.doLogin();
+ }
+ };
- for(ProcessDefinition def : available)
- {
- System.out.println(def);
- } */
-
+ deferredExec(authTestPiece);
+ }
+
+ private void deferredExec(final DeferredExecution testPiece) {
+ Timer timer = new Timer()
+ {
+ public void run()
+ {
+
+ testPiece.execute();
+ finishTest();
+ }
+ };
+
+ timer.schedule(300);
+ delayTestFinish(500);
+ }
}
Added: projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/GwtTestDTOParser.java
===================================================================
--- projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/GwtTestDTOParser.java (rev 0)
+++ projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/GwtTestDTOParser.java 2008-10-27 15:49:45 UTC (rev 2627)
@@ -0,0 +1,45 @@
+/*
+ * 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.jboss.bpm.console.client;
+
+import com.google.gwt.junit.client.GWTTestCase;
+import org.jboss.bpm.console.client.model.DTOParser;
+
+import java.util.List;
+
+
+public class GwtTestDTOParser extends GWTTestCase {
+
+ public String getModuleName() {
+ return "org.jboss.bpm.console.Application";
+ }
+
+ public void testRolesAssgnedParsing()
+ {
+
+ // {"roles":[{"assigned":true,"role":"admin"},{"assigned":true,"role":"user"}]}
+
+ String json = "{\"roles\":[{\"assigned\":true,\"role\":\"admin\"},{\"assigned\":true,\"role\":\"user\"}]}";
+ List<String> roles = DTOParser.parseRolesAssigned(json);
+ assertTrue(roles.size() == 2);
+ }
+}
17 years, 6 months
JBoss JBPM SVN: r2626 - in projects/gwt-console/trunk: war and 3 other directories.
by do-not-reply@jboss.org
Author: heiko.braun(a)jboss.com
Date: 2008-10-27 07:34:07 -0400 (Mon, 27 Oct 2008)
New Revision: 2626
Added:
projects/gwt-console/trunk/war/src/main/java/org/json/
projects/gwt-console/trunk/war/src/main/java/org/json/CDL.java
projects/gwt-console/trunk/war/src/main/java/org/json/Cookie.java
projects/gwt-console/trunk/war/src/main/java/org/json/CookieList.java
projects/gwt-console/trunk/war/src/main/java/org/json/HTTP.java
projects/gwt-console/trunk/war/src/main/java/org/json/HTTPTokener.java
projects/gwt-console/trunk/war/src/main/java/org/json/JSONArray.java
projects/gwt-console/trunk/war/src/main/java/org/json/JSONException.java
projects/gwt-console/trunk/war/src/main/java/org/json/JSONML.java
projects/gwt-console/trunk/war/src/main/java/org/json/JSONObject.java
projects/gwt-console/trunk/war/src/main/java/org/json/JSONString.java
projects/gwt-console/trunk/war/src/main/java/org/json/JSONStringer.java
projects/gwt-console/trunk/war/src/main/java/org/json/JSONTokener.java
projects/gwt-console/trunk/war/src/main/java/org/json/JSONWriter.java
projects/gwt-console/trunk/war/src/main/java/org/json/Test.java
projects/gwt-console/trunk/war/src/main/java/org/json/XML.java
projects/gwt-console/trunk/war/src/main/java/org/json/XMLTokener.java
Modified:
projects/gwt-console/trunk/pom.xml
projects/gwt-console/trunk/war/pom.xml
projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/HttpClient.java
Log:
Added json-lib to sources. Removed the previous httpProxy servlet dependency
Modified: projects/gwt-console/trunk/pom.xml
===================================================================
--- projects/gwt-console/trunk/pom.xml 2008-10-27 10:39:30 UTC (rev 2625)
+++ projects/gwt-console/trunk/pom.xml 2008-10-27 11:34:07 UTC (rev 2626)
@@ -27,6 +27,7 @@
<jbpm.version>3.3.0-SNAPSHOT</jbpm.version>
<javax.jaxb.version>2.1</javax.jaxb.version>
<javax.ejb.version>3.0</javax.ejb.version>
+ <junit.version>3.8.1</junit.version>
</properties>
<modules>
@@ -102,6 +103,12 @@
<version>${javax.ejb.version}</version>
</dependency>
<dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>${junit.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>${resteasy.version}</version>
Modified: projects/gwt-console/trunk/war/pom.xml
===================================================================
--- projects/gwt-console/trunk/war/pom.xml 2008-10-27 10:39:30 UTC (rev 2625)
+++ projects/gwt-console/trunk/war/pom.xml 2008-10-27 11:34:07 UTC (rev 2626)
@@ -1,213 +1,206 @@
<?xml version="1.0" encoding="UTF-8"?>
<project>
- <modelVersion>4.0.0</modelVersion>
- <name>JBoss jBPM3 - GWT Console (WAR)</name>
- <groupId>org.jbpm.jbpm3</groupId>
- <artifactId>gwt-console</artifactId>
- <packaging>war</packaging>
+ <modelVersion>4.0.0</modelVersion>
+ <name>JBoss jBPM3 - GWT Console (WAR)</name>
+ <groupId>org.jbpm.jbpm3</groupId>
+ <artifactId>gwt-console</artifactId>
+ <packaging>war</packaging>
- <!-- Parent -->
- <parent>
- <groupId>org.jbpm.jbpm3</groupId>
- <artifactId>gwt-console-parent</artifactId>
- <version>1.0.0-SNAPSHOT</version>
- <relativePath>../pom.xml</relativePath>
- </parent>
+ <!-- Parent -->
+ <parent>
+ <groupId>org.jbpm.jbpm3</groupId>
+ <artifactId>gwt-console-parent</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
- <!-- Dependencies -->
- <dependencies>
+ <!-- Dependencies -->
+ <dependencies>
- <dependency>
- <groupId>org.jbpm.jbpm3</groupId>
- <artifactId>gwt-console-rpc</artifactId>
- <version>${version}</version>
- </dependency>
+ <dependency>
+ <groupId>org.jbpm.jbpm3</groupId>
+ <artifactId>gwt-console-rpc</artifactId>
+ <version>${version}</version>
+ </dependency>
- <dependency>
- <groupId>com.google.gwt</groupId>
- <artifactId>gwt-servlet</artifactId>
- <version>${gwt.version}</version>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>com.google.gwt</groupId>
- <artifactId>gwt-user</artifactId>
- <version>${gwt.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>com.google.gwt</groupId>
- <artifactId>gwt-dev</artifactId>
- <version>${gwt.version}</version>
- <classifier>${platform}-libs</classifier>
- <type>zip</type>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>com.google.gwt</groupId>
- <artifactId>gwt-dev</artifactId>
- <version>${gwt.version}</version>
- <classifier>${platform}</classifier>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>com.gwtext</groupId>
- <artifactId>gwtext</artifactId>
- </dependency>
- <dependency>
- <groupId>com.google.gwt</groupId>
- <artifactId>gchart</artifactId>
- </dependency>
+ <dependency>
+ <groupId>com.google.gwt</groupId>
+ <artifactId>gwt-servlet</artifactId>
+ <version>${gwt.version}</version>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.gwt</groupId>
+ <artifactId>gwt-user</artifactId>
+ <version>${gwt.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.gwt</groupId>
+ <artifactId>gwt-dev</artifactId>
+ <version>${gwt.version}</version>
+ <classifier>${platform}-libs</classifier>
+ <type>zip</type>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.gwt</groupId>
+ <artifactId>gwt-dev</artifactId>
+ <version>${gwt.version}</version>
+ <classifier>${platform}</classifier>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.gwtext</groupId>
+ <artifactId>gwtext</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.google.gwt</groupId>
+ <artifactId>gchart</artifactId>
+ </dependency>
- <dependency>
- <groupId>javax.xml.stream</groupId>
- <artifactId>stax-api</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>javax.activation</groupId>
- <artifactId>activation</artifactId>
- <scope>provided</scope>
- </dependency>
+ <dependency>
+ <groupId>javax.xml.stream</groupId>
+ <artifactId>stax-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.activation</groupId>
+ <artifactId>activation</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
- <dependency>
- <groupId>com.servletsuite</groupId>
- <artifactId>httpProxy</artifactId>
- <version>1.0</version>
- </dependency>
-
- <dependency>
- <groupId>org.json</groupId>
- <artifactId>org.json</artifactId>
- <version>0.0.1</version>
- </dependency>
-
- </dependencies>
- <!-- Plugins -->
- <build>
- <plugins>
- <plugin>
- <groupId>com.totsp.gwt</groupId>
- <artifactId>maven-googlewebtoolkit2-plugin</artifactId>
- <version>2.0-beta24</version>
- <configuration>
- <logLevel>INFO</logLevel>
- <compileTargets><value>org.jboss.bpm.console.Application</value></compileTargets>
- <runTarget>org.jboss.bpm.console.Application/Application.html</runTarget>
- <style>DETAILED</style>
- <noServer>false</noServer>
- <extraJvmArgs>-Xmx256M -Xms256M</extraJvmArgs>
- <!-- this parameter is VERY important with automatic mode -
- has to match the version in your declared deps
- if this is set incorrect, or left out and default does not match
- (default is 1.5.2 for 2.0-beta23) you will have mysterious errors
- -->
- <gwtVersion>${gwt.version}</gwtVersion>
- </configuration>
- <executions>
- <execution>
- <goals>
- <goal>mergewebxml</goal>
- <goal>compile</goal>
- <goal>gwt</goal>
- <goal>test</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <!-- Use the dependency plugin to unpack gwt-dev-PLATFORM-libs.zip -->
- <!--
+ <!-- Plugins -->
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>com.totsp.gwt</groupId>
+ <artifactId>maven-googlewebtoolkit2-plugin</artifactId>
+ <version>2.0-beta24</version>
+ <configuration>
+ <logLevel>INFO</logLevel>
+ <compileTargets><value>org.jboss.bpm.console.Application</value></compileTargets>
+ <runTarget>org.jboss.bpm.console.Application/Application.html</runTarget>
+ <style>DETAILED</style>
+ <noServer>false</noServer>
+ <extraJvmArgs>-Xmx256M -Xms256M</extraJvmArgs>
+ <!-- this parameter is VERY important with automatic mode -
+ has to match the version in your declared deps
+ if this is set incorrect, or left out and default does not match
+ (default is 1.5.2 for 2.0-beta23) you will have mysterious errors
+ -->
+ <gwtVersion>${gwt.version}</gwtVersion>
+ </configuration>
+ <executions>
+ <execution>
+ <goals>
+ <goal>mergewebxml</goal>
+ <goal>compile</goal>
+ <goal>gwt</goal>
+ <goal>test</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <!-- Use the dependency plugin to unpack gwt-dev-PLATFORM-libs.zip -->
+ <!--
(this is a replacement for the old "automatic" mode - useful if you
don't have GWT installed already, or you just want a maven way to
handle gwt deps)
-->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <executions>
- <execution>
- <id>unpack</id>
- <phase>compile</phase>
- <goals>
- <goal>unpack</goal>
- </goals>
- <configuration>
- <artifactItems>
- <artifactItem>
- <groupId>com.google.gwt</groupId>
- <artifactId>gwt-dev</artifactId>
- <version>${gwtVersion}</version>
- <classifier>${platform}-libs</classifier>
- <type>zip</type>
- <overWrite>false</overWrite>
- <outputDirectory>${settings.localRepository}/com/google/gwt/gwt-dev/${gwtVersion}</outputDirectory>
- </artifactItem>
- </artifactItems>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <!--
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>unpack</id>
+ <phase>compile</phase>
+ <goals>
+ <goal>unpack</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>com.google.gwt</groupId>
+ <artifactId>gwt-dev</artifactId>
+ <version>${gwtVersion}</version>
+ <classifier>${platform}-libs</classifier>
+ <type>zip</type>
+ <overWrite>false</overWrite>
+ <outputDirectory>${settings.localRepository}/com/google/gwt/gwt-dev/${gwtVersion}</outputDirectory>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <!--
If you want to use the target/web.xml file mergewebxml produces,
tell the war plugin to use it
-->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-war-plugin</artifactId>
- <configuration>
- <webXml>target/web.xml</webXml>
- <warSourceExcludes>.gwt-tmp/**</warSourceExcludes>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <configuration>
- <source>1.5</source>
- <target>1.5</target>
- </configuration>
- </plugin>
- </plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-war-plugin</artifactId>
+ <configuration>
+ <webXml>target/web.xml</webXml>
+ <warSourceExcludes>.gwt-tmp/**</warSourceExcludes>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.5</source>
+ <target>1.5</target>
+ </configuration>
+ </plugin>
+ </plugins>
- </build>
+ </build>
- <!-- profiles (with activation per platform) -->
- <profiles>
- <profile>
- <id>gwt-dev-windows</id>
- <properties>
- <platform>windows</platform>
- </properties>
- <activation>
- <activeByDefault>true</activeByDefault>
- <os>
- <family>windows</family>
- </os>
- </activation>
- </profile>
- <profile>
- <id>gwt-dev-mac</id>
- <properties>
- <platform>mac</platform>
- </properties>
- <activation>
- <activeByDefault>false</activeByDefault>
- <os>
- <family>mac</family>
- </os>
- </activation>
- </profile>
- <profile>
- <id>gwt-dev-linux</id>
- <properties>
- <platform>linux</platform>
- </properties>
- <activation>
- <activeByDefault>false</activeByDefault>
- <os>
- <name>linux</name>
- </os>
- </activation>
- </profile>
- </profiles>
+ <!-- profiles (with activation per platform) -->
+ <profiles>
+ <profile>
+ <id>gwt-dev-windows</id>
+ <properties>
+ <platform>windows</platform>
+ </properties>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ <os>
+ <family>windows</family>
+ </os>
+ </activation>
+ </profile>
+ <profile>
+ <id>gwt-dev-mac</id>
+ <properties>
+ <platform>mac</platform>
+ </properties>
+ <activation>
+ <activeByDefault>false</activeByDefault>
+ <os>
+ <family>mac</family>
+ </os>
+ </activation>
+ </profile>
+ <profile>
+ <id>gwt-dev-linux</id>
+ <properties>
+ <platform>linux</platform>
+ </properties>
+ <activation>
+ <activeByDefault>false</activeByDefault>
+ <os>
+ <name>linux</name>
+ </os>
+ </activation>
+ </profile>
+ </profiles>
</project>
Modified: projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/HttpClient.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/HttpClient.java 2008-10-27 10:39:30 UTC (rev 2625)
+++ projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/HttpClient.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -19,222 +19,224 @@
*/
public class HttpClient {
- private static Logger logger;
- private String proxyHost = null;
- private int proxyPort = -1;
- private boolean isHttps = false;
- private boolean isProxy = false;
- private HttpURLConnection urlConnection = null;
- private Map headers;
+ private static Logger logger;
+ private String proxyHost = null;
+ private int proxyPort = -1;
+ private boolean isHttps = false;
+ private boolean isProxy = false;
+ private HttpURLConnection urlConnection = null;
+ private Map headers;
- /**
- * @param phost PROXY host name
- * @param pport PROXY port string
- * @param url URL string
- * @param headers Map
- */
- public HttpClient(String phost,
- int pport,
- String url,
- Map headers,
- String method)
- throws MalformedURLException {
- if (phost != null && pport != -1) {
- this.isProxy = true;
- }
- this.proxyHost = phost;
- this.proxyPort = pport;
- if (url.trim().startsWith("https:")) {
- isHttps = true;
- }
- this.urlConnection = getURLConnection(url);
- try {
- this.urlConnection.setRequestMethod(method);
- } catch (java.net.ProtocolException pe) {
- HttpClient.getLogger().severe("Unable protocol method to " + method + " : " + pe);
- }
- this.headers = headers;
- // seat headers
- if (headers != null) {
- Iterator it = headers.keySet().iterator();
- if (it != null) {
- while (it.hasNext()) {
- String key = (String)it.next();
- String value = (String)headers.get(key);
- this.urlConnection.setRequestProperty (key, value);
- }
- }
- }
- }
-
- /**
- * @param phost PROXY host name
- * @param pport PROXY port string
- * @param url URL string
- * @param headers Map
- * @param userName string
- * @param password string
- */
- public HttpClient(String phost,
- int pport,
- String url,
- Map headers,
- String method,
- String userName,
- String password)
- throws MalformedURLException {
- try {
- if (phost != null && pport != -1) {
+ /**
+ * @param phost PROXY host name
+ * @param pport PROXY port string
+ * @param url URL string
+ * @param headers Map
+ */
+ public HttpClient(String phost,
+ int pport,
+ String url,
+ Map headers,
+ String method)
+ throws MalformedURLException {
+ if (phost != null && pport != -1) {
this.isProxy = true;
- }
- this.proxyHost = phost;
- this.proxyPort = pport;
- if (url.trim().startsWith("https:")) {
+ }
+ this.proxyHost = phost;
+ this.proxyPort = pport;
+ if (url.trim().startsWith("https:")) {
isHttps = true;
- }
- this.urlConnection = getURLConnection(url);
- try {
+ }
+ this.urlConnection = getURLConnection(url);
+ try {
this.urlConnection.setRequestMethod(method);
- } catch (java.net.ProtocolException pe) {
+ } catch (java.net.ProtocolException pe) {
HttpClient.getLogger().severe("Unable protocol method to " + method + " : " + pe);
- }
- // set basic authentication information
- String auth = userName + ":" + password;
- String encoded = new sun.misc.BASE64Encoder().encode (auth.getBytes());
- // set basic authorization
- this.urlConnection.setRequestProperty ("Authorization", "Basic " + encoded);
- this.headers = headers;
- // seat headers
- if (headers != null) {
- Iterator it = headers.entrySet().iterator();
+ }
+ this.headers = headers;
+ // seat headers
+ if (headers != null) {
+ Iterator it = headers.keySet().iterator();
if (it != null) {
- while (it.hasNext()) {
- String key = (String)it.next();
- String value = (String)headers.get(key);
- this.urlConnection.setRequestProperty (key, value);
- }
+ while (it.hasNext()) {
+ String key = (String)it.next();
+ String value = (String)headers.get(key);
+ this.urlConnection.setRequestProperty (key, value);
+ }
}
- }
- } catch (Exception ex) {
- HttpClient.getLogger().severe("Unable to set basic authorization for " + userName + " : " +ex);
- }
- }
+ }
+ }
- /**
- * private method to get the URLConnection
- * @param str URL string
- */
- private HttpURLConnection getURLConnection(String str)
- throws MalformedURLException {
- try {
- if (isHttps) {
- /* when communicating with the server which has unsigned or invalid
- * certificate (https), SSLException or IOException is thrown.
- * the following line is a hack to avoid that
- */
- Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
- System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
- if (isProxy) {
- System.setProperty("https.proxyHost", proxyHost);
- System.setProperty("https.proxyPort", proxyPort + "");
+ /**
+ * @param phost PROXY host name
+ * @param pport PROXY port string
+ * @param url URL string
+ * @param headers Map
+ * @param userName string
+ * @param password string
+ */
+ public HttpClient(String phost,
+ int pport,
+ String url,
+ Map headers,
+ String method,
+ String userName,
+ String password)
+ throws MalformedURLException {
+ try
+ {
+ if (phost != null && pport != -1) {
+ this.isProxy = true;
}
- } else {
- if (isProxy) {
- System.setProperty("http.proxyHost", proxyHost);
- System.setProperty("http.proxyPort", proxyPort + "");
+
+ this.proxyHost = phost;
+ this.proxyPort = pport;
+ if (url.trim().startsWith("https:")) {
+ isHttps = true;
}
- }
- URL url = new URL(str);
- HttpURLConnection uc = (HttpURLConnection)url.openConnection();
- // if this header has not been set by a request set the user agent.
- if (headers == null ||
- (headers != null && headers.get("user-agent") == null)) {
- // set user agent to mimic a common browser
- String ua="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)";
- uc.setRequestProperty("user-agent", ua);
- }
- return uc;
- } catch (MalformedURLException me) {
- throw new MalformedURLException(str + " is not a valid URL");
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
+ this.urlConnection = getURLConnection(url);
+ try {
+ this.urlConnection.setRequestMethod(method);
+ } catch (java.net.ProtocolException pe) {
+ HttpClient.getLogger().severe("Unable protocol method to " + method + " : " + pe);
+ }
+ // set basic authentication information
+ String auth = userName + ":" + password;
+ String encoded = new sun.misc.BASE64Encoder().encode (auth.getBytes());
+ // set basic authorization
+ this.urlConnection.setRequestProperty ("Authorization", "Basic " + encoded);
+ this.headers = headers;
+ // seat headers
+ if (headers != null) {
+ Iterator it = headers.entrySet().iterator();
+ if (it != null) {
+ while (it.hasNext()) {
+ String key = (String)it.next();
+ String value = (String)headers.get(key);
+ this.urlConnection.setRequestProperty (key, value);
+ }
+ }
+ }
+ } catch (Exception ex) {
+ HttpClient.getLogger().severe("Unable to set basic authorization for " + userName + " : " +ex);
+ }
+ }
- /**
- * returns the inputstream from URLConnection
- * @return InputStream
- */
- public InputStream getInputStream() {
- try {
- return (this.urlConnection.getInputStream());
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
+ /**
+ * private method to get the URLConnection
+ * @param str URL string
+ */
+ private HttpURLConnection getURLConnection(String str)
+ throws MalformedURLException {
+ try {
+ if (isHttps) {
+ /* when communicating with the server which has unsigned or invalid
+ * certificate (https), SSLException or IOException is thrown.
+ * the following line is a hack to avoid that
+ */
+ Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
+ System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
+ if (isProxy) {
+ System.setProperty("https.proxyHost", proxyHost);
+ System.setProperty("https.proxyPort", proxyPort + "");
+ }
+ } else {
+ if (isProxy) {
+ System.setProperty("http.proxyHost", proxyHost);
+ System.setProperty("http.proxyPort", proxyPort + "");
+ }
+ }
+ URL url = new URL(str);
+ HttpURLConnection uc = (HttpURLConnection)url.openConnection();
+ // if this header has not been set by a request set the user agent.
+ if (headers == null ||
+ (headers != null && headers.get("user-agent") == null)) {
+ // set user agent to mimic a common browser
+ String ua="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)";
+ uc.setRequestProperty("user-agent", ua);
+ }
+ return uc;
+ } catch (MalformedURLException me) {
+ throw new MalformedURLException(str + " is not a valid URL");
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
- /**
- * return the OutputStream from URLConnection
- * @return OutputStream
- */
- public OutputStream getOutputStream() {
+ /**
+ * returns the inputstream from URLConnection
+ * @return InputStream
+ */
+ public InputStream getInputStream() {
+ try {
+ return (this.urlConnection.getInputStream());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
- try {
- return (this.urlConnection.getOutputStream());
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
+ /**
+ * return the OutputStream from URLConnection
+ * @return OutputStream
+ */
+ public OutputStream getOutputStream() {
- /**
- * posts data to the inputstream and returns the InputStream.
- * @param postData data to be posted. must be url-encoded already.
- * @param contentType allows you to set the contentType of the request.
- * @return InputStream input stream from URLConnection
- */
- public InputStream doPost(String postData, String contentType) {
- this.urlConnection.setDoOutput(true);
- if (contentType != null) this.urlConnection.setRequestProperty( "Content-type", contentType );
+ try {
+ return (this.urlConnection.getOutputStream());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
- OutputStream os = this.getOutputStream();
- PrintStream ps = new PrintStream(os);
- ps.print(postData);
- ps.close();
- return (this.getInputStream());
- }
+ /**
+ * posts data to the inputstream and returns the InputStream.
+ * @param postData data to be posted. must be url-encoded already.
+ * @param contentType allows you to set the contentType of the request.
+ * @return InputStream input stream from URLConnection
+ */
+ public InputStream doPost(String postData, String contentType) {
+ this.urlConnection.setDoOutput(true);
+ if (contentType != null) this.urlConnection.setRequestProperty( "Content-type", contentType );
- public String getContentEncoding() {
- if (this.urlConnection == null) return null;
- return (this.urlConnection.getContentEncoding());
- }
- public int getContentLength() {
- if (this.urlConnection == null) return -1;
- return (this.urlConnection.getContentLength());
- }
- public String getContentType() {
- if (this.urlConnection == null) return null;
- return (this.urlConnection.getContentType());
- }
- public long getDate() {
- if (this.urlConnection == null) return -1;
- return (this.urlConnection.getDate());
- }
- public String getHeader(String name) {
- if (this.urlConnection == null) return null;
- return (this.urlConnection.getHeaderField(name));
- }
- public long getIfModifiedSince() {
- if (this.urlConnection == null) return -1;
- return (this.urlConnection.getIfModifiedSince());
- }
+ OutputStream os = this.getOutputStream();
+ PrintStream ps = new PrintStream(os);
+ ps.print(postData);
+ ps.close();
+ return (this.getInputStream());
+ }
- public static Logger getLogger() {
- if (logger == null) {
- logger = Logger.getLogger("jmaki.xhp.Log");
- }
- return logger;
- }
+ public String getContentEncoding() {
+ if (this.urlConnection == null) return null;
+ return (this.urlConnection.getContentEncoding());
+ }
+ public int getContentLength() {
+ if (this.urlConnection == null) return -1;
+ return (this.urlConnection.getContentLength());
+ }
+ public String getContentType() {
+ if (this.urlConnection == null) return null;
+ return (this.urlConnection.getContentType());
+ }
+ public long getDate() {
+ if (this.urlConnection == null) return -1;
+ return (this.urlConnection.getDate());
+ }
+ public String getHeader(String name) {
+ if (this.urlConnection == null) return null;
+ return (this.urlConnection.getHeaderField(name));
+ }
+ public long getIfModifiedSince() {
+ if (this.urlConnection == null) return -1;
+ return (this.urlConnection.getIfModifiedSince());
+ }
+
+ public static Logger getLogger() {
+ if (logger == null) {
+ logger = Logger.getLogger("jmaki.xhp.Log");
+ }
+ return logger;
+ }
}
\ No newline at end of file
Added: projects/gwt-console/trunk/war/src/main/java/org/json/CDL.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/CDL.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/CDL.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -0,0 +1,261 @@
+package org.json;
+
+/*
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+/**
+ * This provides static methods to convert comma delimited text into a
+ * JSONArray, and to covert a JSONArray into comma delimited text. Comma
+ * delimited text is a very popular format for data interchange. It is
+ * understood by most database, spreadsheet, and organizer programs.
+ * <p>
+ * Each row of text represents a row in a table or a data record. Each row
+ * ends with a NEWLINE character. Each row contains one or more values.
+ * Values are separated by commas. A value can contain any character except
+ * for comma, unless is is wrapped in single quotes or double quotes.
+ * <p>
+ * The first row usually contains the names of the columns.
+ * <p>
+ * A comma delimited list can be converted into a JSONArray of JSONObjects.
+ * The names for the elements in the JSONObjects can be taken from the names
+ * in the first row.
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class CDL {
+
+ /**
+ * Get the next value. The value can be wrapped in quotes. The value can
+ * be empty.
+ * @param x A JSONTokener of the source text.
+ * @return The value string, or null if empty.
+ * @throws JSONException if the quoted string is badly formed.
+ */
+ private static String getValue(JSONTokener x) throws JSONException {
+ char c;
+ do {
+ c = x.next();
+ } while (c == ' ' || c == '\t');
+ switch (c) {
+ case 0:
+ return null;
+ case '"':
+ case '\'':
+ return x.nextString(c);
+ case ',':
+ x.back();
+ return "";
+ default:
+ x.back();
+ return x.nextTo(',');
+ }
+ }
+
+ /**
+ * Produce a JSONArray of strings from a row of comma delimited values.
+ * @param x A JSONTokener of the source text.
+ * @return A JSONArray of strings.
+ * @throws JSONException
+ */
+ public static JSONArray rowToJSONArray(JSONTokener x) throws JSONException {
+ JSONArray ja = new JSONArray();
+ for (;;) {
+ String value = getValue(x);
+ if (value == null || (ja.length() == 0 && value.length() == 0)) {
+ return null;
+ }
+ ja.put(value);
+ for (;;) {
+ char c = x.next();
+ if (c == ',') {
+ break;
+ }
+ if (c != ' ') {
+ if (c == '\n' || c == '\r' || c == 0) {
+ return ja;
+ }
+ throw x.syntaxError("Bad character '" + c + "' (" +
+ (int)c + ").");
+ }
+ }
+ }
+ }
+
+ /**
+ * Produce a JSONObject from a row of comma delimited text, using a
+ * parallel JSONArray of strings to provides the names of the elements.
+ * @param names A JSONArray of names. This is commonly obtained from the
+ * first row of a comma delimited text file using the rowToJSONArray
+ * method.
+ * @param x A JSONTokener of the source text.
+ * @return A JSONObject combining the names and values.
+ * @throws JSONException
+ */
+ public static JSONObject rowToJSONObject(JSONArray names, JSONTokener x)
+ throws JSONException {
+ JSONArray ja = rowToJSONArray(x);
+ return ja != null ? ja.toJSONObject(names) : null;
+ }
+
+ /**
+ * Produce a JSONArray of JSONObjects from a comma delimited text string,
+ * using the first row as a source of names.
+ * @param string The comma delimited text.
+ * @return A JSONArray of JSONObjects.
+ * @throws JSONException
+ */
+ public static JSONArray toJSONArray(String string) throws JSONException {
+ return toJSONArray(new JSONTokener(string));
+ }
+
+ /**
+ * Produce a JSONArray of JSONObjects from a comma delimited text string,
+ * using the first row as a source of names.
+ * @param x The JSONTokener containing the comma delimited text.
+ * @return A JSONArray of JSONObjects.
+ * @throws JSONException
+ */
+ public static JSONArray toJSONArray(JSONTokener x) throws JSONException {
+ return toJSONArray(rowToJSONArray(x), x);
+ }
+
+ /**
+ * Produce a JSONArray of JSONObjects from a comma delimited text string
+ * using a supplied JSONArray as the source of element names.
+ * @param names A JSONArray of strings.
+ * @param string The comma delimited text.
+ * @return A JSONArray of JSONObjects.
+ * @throws JSONException
+ */
+ public static JSONArray toJSONArray(JSONArray names, String string)
+ throws JSONException {
+ return toJSONArray(names, new JSONTokener(string));
+ }
+
+ /**
+ * Produce a JSONArray of JSONObjects from a comma delimited text string
+ * using a supplied JSONArray as the source of element names.
+ * @param names A JSONArray of strings.
+ * @param x A JSONTokener of the source text.
+ * @return A JSONArray of JSONObjects.
+ * @throws JSONException
+ */
+ public static JSONArray toJSONArray(JSONArray names, JSONTokener x)
+ throws JSONException {
+ if (names == null || names.length() == 0) {
+ return null;
+ }
+ JSONArray ja = new JSONArray();
+ for (;;) {
+ JSONObject jo = rowToJSONObject(names, x);
+ if (jo == null) {
+ break;
+ }
+ ja.put(jo);
+ }
+ if (ja.length() == 0) {
+ return null;
+ }
+ return ja;
+ }
+
+
+ /**
+ * Produce a comma delimited text row from a JSONArray. Values containing
+ * the comma character will be quoted.
+ * @param ja A JSONArray of strings.
+ * @return A string ending in NEWLINE.
+ */
+ public static String rowToString(JSONArray ja) {
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < ja.length(); i += 1) {
+ if (i > 0) {
+ sb.append(',');
+ }
+ Object o = ja.opt(i);
+ if (o != null) {
+ String s = o.toString();
+ if (s.indexOf(',') >= 0) {
+ if (s.indexOf('"') >= 0) {
+ sb.append('\'');
+ sb.append(s);
+ sb.append('\'');
+ } else {
+ sb.append('"');
+ sb.append(s);
+ sb.append('"');
+ }
+ } else {
+ sb.append(s);
+ }
+ }
+ }
+ sb.append('\n');
+ return sb.toString();
+
+ }
+
+ /**
+ * Produce a comma delimited text from a JSONArray of JSONObjects. The
+ * first row will be a list of names obtained by inspecting the first
+ * JSONObject.
+ * @param ja A JSONArray of JSONObjects.
+ * @return A comma delimited text.
+ * @throws JSONException
+ */
+ public static String toString(JSONArray ja) throws JSONException {
+ JSONObject jo = ja.optJSONObject(0);
+ if (jo != null) {
+ JSONArray names = jo.names();
+ if (names != null) {
+ return rowToString(names) + toString(names, ja);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Produce a comma delimited text from a JSONArray of JSONObjects using
+ * a provided list of names. The list of names is not included in the
+ * output.
+ * @param names A JSONArray of strings.
+ * @param ja A JSONArray of JSONObjects.
+ * @return A comma delimited text.
+ * @throws JSONException
+ */
+ public static String toString(JSONArray names, JSONArray ja)
+ throws JSONException {
+ if (names == null || names.length() == 0) {
+ return null;
+ }
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < ja.length(); i += 1) {
+ JSONObject jo = ja.optJSONObject(i);
+ if (jo != null) {
+ sb.append(rowToString(jo.toJSONArray(names)));
+ }
+ }
+ return sb.toString();
+ }
+}
Added: projects/gwt-console/trunk/war/src/main/java/org/json/Cookie.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/Cookie.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/Cookie.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -0,0 +1,169 @@
+package org.json;
+
+/*
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+/**
+ * Convert a web browser cookie specification to a JSONObject and back.
+ * JSON and Cookies are both notations for name/value pairs.
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class Cookie {
+
+ /**
+ * Produce a copy of a string in which the characters '+', '%', '=', ';'
+ * and control characters are replaced with "%hh". This is a gentle form
+ * of URL encoding, attempting to cause as little distortion to the
+ * string as possible. The characters '=' and ';' are meta characters in
+ * cookies. By convention, they are escaped using the URL-encoding. This is
+ * only a convention, not a standard. Often, cookies are expected to have
+ * encoded values. We encode '=' and ';' because we must. We encode '%' and
+ * '+' because they are meta characters in URL encoding.
+ * @param string The source string.
+ * @return The escaped result.
+ */
+ public static String escape(String string) {
+ char c;
+ String s = string.trim();
+ StringBuffer sb = new StringBuffer();
+ int len = s.length();
+ for (int i = 0; i < len; i += 1) {
+ c = s.charAt(i);
+ if (c < ' ' || c == '+' || c == '%' || c == '=' || c == ';') {
+ sb.append('%');
+ sb.append(Character.forDigit((char)((c >>> 4) & 0x0f), 16));
+ sb.append(Character.forDigit((char)(c & 0x0f), 16));
+ } else {
+ sb.append(c);
+ }
+ }
+ return sb.toString();
+ }
+
+
+ /**
+ * Convert a cookie specification string into a JSONObject. The string
+ * will contain a name value pair separated by '='. The name and the value
+ * will be unescaped, possibly converting '+' and '%' sequences. The
+ * cookie properties may follow, separated by ';', also represented as
+ * name=value (except the secure property, which does not have a value).
+ * The name will be stored under the key "name", and the value will be
+ * stored under the key "value". This method does not do checking or
+ * validation of the parameters. It only converts the cookie string into
+ * a JSONObject.
+ * @param string The cookie specification string.
+ * @return A JSONObject containing "name", "value", and possibly other
+ * members.
+ * @throws JSONException
+ */
+ public static JSONObject toJSONObject(String string) throws JSONException {
+ String n;
+ JSONObject o = new JSONObject();
+ Object v;
+ JSONTokener x = new JSONTokener(string);
+ o.put("name", x.nextTo('='));
+ x.next('=');
+ o.put("value", x.nextTo(';'));
+ x.next();
+ while (x.more()) {
+ n = unescape(x.nextTo("=;"));
+ if (x.next() != '=') {
+ if (n.equals("secure")) {
+ v = Boolean.TRUE;
+ } else {
+ throw x.syntaxError("Missing '=' in cookie parameter.");
+ }
+ } else {
+ v = unescape(x.nextTo(';'));
+ x.next();
+ }
+ o.put(n, v);
+ }
+ return o;
+ }
+
+
+ /**
+ * Convert a JSONObject into a cookie specification string. The JSONObject
+ * must contain "name" and "value" members.
+ * If the JSONObject contains "expires", "domain", "path", or "secure"
+ * members, they will be appended to the cookie specification string.
+ * All other members are ignored.
+ * @param o A JSONObject
+ * @return A cookie specification string
+ * @throws JSONException
+ */
+ public static String toString(JSONObject o) throws JSONException {
+ StringBuffer sb = new StringBuffer();
+
+ sb.append(escape(o.getString("name")));
+ sb.append("=");
+ sb.append(escape(o.getString("value")));
+ if (o.has("expires")) {
+ sb.append(";expires=");
+ sb.append(o.getString("expires"));
+ }
+ if (o.has("domain")) {
+ sb.append(";domain=");
+ sb.append(escape(o.getString("domain")));
+ }
+ if (o.has("path")) {
+ sb.append(";path=");
+ sb.append(escape(o.getString("path")));
+ }
+ if (o.optBoolean("secure")) {
+ sb.append(";secure");
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Convert <code>%</code><i>hh</i> sequences to single characters, and
+ * convert plus to space.
+ * @param s A string that may contain
+ * <code>+</code> <small>(plus)</small> and
+ * <code>%</code><i>hh</i> sequences.
+ * @return The unescaped string.
+ */
+ public static String unescape(String s) {
+ int len = s.length();
+ StringBuffer b = new StringBuffer();
+ for (int i = 0; i < len; ++i) {
+ char c = s.charAt(i);
+ if (c == '+') {
+ c = ' ';
+ } else if (c == '%' && i + 2 < len) {
+ int d = JSONTokener.dehexchar(s.charAt(i + 1));
+ int e = JSONTokener.dehexchar(s.charAt(i + 2));
+ if (d >= 0 && e >= 0) {
+ c = (char)(d * 16 + e);
+ i += 2;
+ }
+ }
+ b.append(c);
+ }
+ return b.toString();
+ }
+}
Added: projects/gwt-console/trunk/war/src/main/java/org/json/CookieList.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/CookieList.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/CookieList.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -0,0 +1,90 @@
+package org.json;
+
+/*
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+import java.util.Iterator;
+
+/**
+ * Convert a web browser cookie list string to a JSONObject and back.
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class CookieList {
+
+ /**
+ * Convert a cookie list into a JSONObject. A cookie list is a sequence
+ * of name/value pairs. The names are separated from the values by '='.
+ * The pairs are separated by ';'. The names and the values
+ * will be unescaped, possibly converting '+' and '%' sequences.
+ *
+ * To add a cookie to a cooklist,
+ * cookielistJSONObject.put(cookieJSONObject.getString("name"),
+ * cookieJSONObject.getString("value"));
+ * @param string A cookie list string
+ * @return A JSONObject
+ * @throws JSONException
+ */
+ public static JSONObject toJSONObject(String string) throws JSONException {
+ JSONObject o = new JSONObject();
+ JSONTokener x = new JSONTokener(string);
+ while (x.more()) {
+ String name = Cookie.unescape(x.nextTo('='));
+ x.next('=');
+ o.put(name, Cookie.unescape(x.nextTo(';')));
+ x.next();
+ }
+ return o;
+ }
+
+
+ /**
+ * Convert a JSONObject into a cookie list. A cookie list is a sequence
+ * of name/value pairs. The names are separated from the values by '='.
+ * The pairs are separated by ';'. The characters '%', '+', '=', and ';'
+ * in the names and values are replaced by "%hh".
+ * @param o A JSONObject
+ * @return A cookie list string
+ * @throws JSONException
+ */
+ public static String toString(JSONObject o) throws JSONException {
+ boolean b = false;
+ Iterator keys = o.keys();
+ String s;
+ StringBuffer sb = new StringBuffer();
+ while (keys.hasNext()) {
+ s = keys.next().toString();
+ if (!o.isNull(s)) {
+ if (b) {
+ sb.append(';');
+ }
+ sb.append(Cookie.escape(s));
+ sb.append("=");
+ sb.append(Cookie.escape(o.getString(s)));
+ b = true;
+ }
+ }
+ return sb.toString();
+ }
+}
Added: projects/gwt-console/trunk/war/src/main/java/org/json/HTTP.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/HTTP.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/HTTP.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -0,0 +1,163 @@
+package org.json;
+
+/*
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+import java.util.Iterator;
+
+/**
+ * Convert an HTTP header to a JSONObject and back.
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class HTTP {
+
+ /** Carriage return/line feed. */
+ public static final String CRLF = "\r\n";
+
+ /**
+ * Convert an HTTP header string into a JSONObject. It can be a request
+ * header or a response header. A request header will contain
+ * <pre>{
+ * Method: "POST" (for example),
+ * "Request-URI": "/" (for example),
+ * "HTTP-Version": "HTTP/1.1" (for example)
+ * }</pre>
+ * A response header will contain
+ * <pre>{
+ * "HTTP-Version": "HTTP/1.1" (for example),
+ * "Status-Code": "200" (for example),
+ * "Reason-Phrase": "OK" (for example)
+ * }</pre>
+ * In addition, the other parameters in the header will be captured, using
+ * the HTTP field names as JSON names, so that <pre>
+ * Date: Sun, 26 May 2002 18:06:04 GMT
+ * Cookie: Q=q2=PPEAsg--; B=677gi6ouf29bn&b=2&f=s
+ * Cache-Control: no-cache</pre>
+ * become
+ * <pre>{...
+ * Date: "Sun, 26 May 2002 18:06:04 GMT",
+ * Cookie: "Q=q2=PPEAsg--; B=677gi6ouf29bn&b=2&f=s",
+ * "Cache-Control": "no-cache",
+ * ...}</pre>
+ * It does no further checking or conversion. It does not parse dates.
+ * It does not do '%' transforms on URLs.
+ * @param string An HTTP header string.
+ * @return A JSONObject containing the elements and attributes
+ * of the XML string.
+ * @throws JSONException
+ */
+ public static JSONObject toJSONObject(String string) throws JSONException {
+ JSONObject o = new JSONObject();
+ HTTPTokener x = new HTTPTokener(string);
+ String t;
+
+ t = x.nextToken();
+ if (t.toUpperCase().startsWith("HTTP")) {
+
+// Response
+
+ o.put("HTTP-Version", t);
+ o.put("Status-Code", x.nextToken());
+ o.put("Reason-Phrase", x.nextTo('\0'));
+ x.next();
+
+ } else {
+
+// Request
+
+ o.put("Method", t);
+ o.put("Request-URI", x.nextToken());
+ o.put("HTTP-Version", x.nextToken());
+ }
+
+// Fields
+
+ while (x.more()) {
+ String name = x.nextTo(':');
+ x.next(':');
+ o.put(name, x.nextTo('\0'));
+ x.next();
+ }
+ return o;
+ }
+
+
+ /**
+ * Convert a JSONObject into an HTTP header. A request header must contain
+ * <pre>{
+ * Method: "POST" (for example),
+ * "Request-URI": "/" (for example),
+ * "HTTP-Version": "HTTP/1.1" (for example)
+ * }</pre>
+ * A response header must contain
+ * <pre>{
+ * "HTTP-Version": "HTTP/1.1" (for example),
+ * "Status-Code": "200" (for example),
+ * "Reason-Phrase": "OK" (for example)
+ * }</pre>
+ * Any other members of the JSONObject will be output as HTTP fields.
+ * The result will end with two CRLF pairs.
+ * @param o A JSONObject
+ * @return An HTTP header string.
+ * @throws JSONException if the object does not contain enough
+ * information.
+ */
+ public static String toString(JSONObject o) throws JSONException {
+ Iterator keys = o.keys();
+ String s;
+ StringBuffer sb = new StringBuffer();
+ if (o.has("Status-Code") && o.has("Reason-Phrase")) {
+ sb.append(o.getString("HTTP-Version"));
+ sb.append(' ');
+ sb.append(o.getString("Status-Code"));
+ sb.append(' ');
+ sb.append(o.getString("Reason-Phrase"));
+ } else if (o.has("Method") && o.has("Request-URI")) {
+ sb.append(o.getString("Method"));
+ sb.append(' ');
+ sb.append('"');
+ sb.append(o.getString("Request-URI"));
+ sb.append('"');
+ sb.append(' ');
+ sb.append(o.getString("HTTP-Version"));
+ } else {
+ throw new JSONException("Not enough material for an HTTP header.");
+ }
+ sb.append(CRLF);
+ while (keys.hasNext()) {
+ s = keys.next().toString();
+ if (!s.equals("HTTP-Version") && !s.equals("Status-Code") &&
+ !s.equals("Reason-Phrase") && !s.equals("Method") &&
+ !s.equals("Request-URI") && !o.isNull(s)) {
+ sb.append(s);
+ sb.append(": ");
+ sb.append(o.getString(s));
+ sb.append(CRLF);
+ }
+ }
+ sb.append(CRLF);
+ return sb.toString();
+ }
+}
Added: projects/gwt-console/trunk/war/src/main/java/org/json/HTTPTokener.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/HTTPTokener.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/HTTPTokener.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -0,0 +1,77 @@
+package org.json;
+
+/*
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+/**
+ * The HTTPTokener extends the JSONTokener to provide additional methods
+ * for the parsing of HTTP headers.
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class HTTPTokener extends JSONTokener {
+
+ /**
+ * Construct an XMLTokener from a string.
+ * @param s A source string.
+ */
+ public HTTPTokener(String s) {
+ super(s);
+ }
+
+
+ /**
+ * Get the next token or string. This is used in parsing HTTP headers.
+ * @throws JSONException
+ * @return A String.
+ */
+ public String nextToken() throws JSONException {
+ char c;
+ char q;
+ StringBuffer sb = new StringBuffer();
+ do {
+ c = next();
+ } while (Character.isWhitespace(c));
+ if (c == '"' || c == '\'') {
+ q = c;
+ for (;;) {
+ c = next();
+ if (c < ' ') {
+ throw syntaxError("Unterminated string.");
+ }
+ if (c == q) {
+ return sb.toString();
+ }
+ sb.append(c);
+ }
+ }
+ for (;;) {
+ if (c == 0 || Character.isWhitespace(c)) {
+ return sb.toString();
+ }
+ sb.append(c);
+ c = next();
+ }
+ }
+}
Added: projects/gwt-console/trunk/war/src/main/java/org/json/JSONArray.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/JSONArray.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/JSONArray.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -0,0 +1,936 @@
+package org.json;
+
+/*
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+import java.io.IOException;
+import java.io.Writer;
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * A JSONArray is an ordered sequence of values. Its external text form is a
+ * string wrapped in square brackets with commas separating the values. The
+ * internal form is an object having <code>get</code> and <code>opt</code>
+ * methods for accessing the values by index, and <code>put</code> methods for
+ * adding or replacing values. The values can be any of these types:
+ * <code>Boolean</code>, <code>JSONArray</code>, <code>JSONObject</code>,
+ * <code>Number</code>, <code>String</code>, or the
+ * <code>JSONObject.NULL object</code>.
+ * <p>
+ * The constructor can convert a JSON text into a Java object. The
+ * <code>toString</code> method converts to JSON text.
+ * <p>
+ * A <code>get</code> method returns a value if one can be found, and throws an
+ * exception if one cannot be found. An <code>opt</code> method returns a
+ * default value instead of throwing an exception, and so is useful for
+ * obtaining optional values.
+ * <p>
+ * The generic <code>get()</code> and <code>opt()</code> methods return an
+ * object which you can cast or query for type. There are also typed
+ * <code>get</code> and <code>opt</code> methods that do type checking and type
+ * coersion for you.
+ * <p>
+ * The texts produced by the <code>toString</code> methods strictly conform to
+ * JSON syntax rules. The constructors are more forgiving in the texts they will
+ * accept:
+ * <ul>
+ * <li>An extra <code>,</code> <small>(comma)</small> may appear just
+ * before the closing bracket.</li>
+ * <li>The <code>null</code> value will be inserted when there
+ * is <code>,</code> <small>(comma)</small> elision.</li>
+ * <li>Strings may be quoted with <code>'</code> <small>(single
+ * quote)</small>.</li>
+ * <li>Strings do not need to be quoted at all if they do not begin with a quote
+ * or single quote, and if they do not contain leading or trailing spaces,
+ * and if they do not contain any of these characters:
+ * <code>{ } [ ] / \ : , = ; #</code> and if they do not look like numbers
+ * and if they are not the reserved words <code>true</code>,
+ * <code>false</code>, or <code>null</code>.</li>
+ * <li>Values can be separated by <code>;</code> <small>(semicolon)</small> as
+ * well as by <code>,</code> <small>(comma)</small>.</li>
+ * <li>Numbers may have the <code>0-</code> <small>(octal)</small> or
+ * <code>0x-</code> <small>(hex)</small> prefix.</li>
+ * <li>Comments written in the slashshlash, slashstar, and hash conventions
+ * will be ignored.</li>
+ * </ul>
+
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class JSONArray {
+
+
+ /**
+ * The arrayList where the JSONArray's properties are kept.
+ */
+ private ArrayList myArrayList;
+
+
+ /**
+ * Construct an empty JSONArray.
+ */
+ public JSONArray() {
+ this.myArrayList = new ArrayList();
+ }
+
+ /**
+ * Construct a JSONArray from a JSONTokener.
+ * @param x A JSONTokener
+ * @throws JSONException If there is a syntax error.
+ */
+ public JSONArray(JSONTokener x) throws JSONException {
+ this();
+ char c = x.nextClean();
+ char q;
+ if (c == '[') {
+ q = ']';
+ } else if (c == '(') {
+ q = ')';
+ } else {
+ throw x.syntaxError("A JSONArray text must start with '['");
+ }
+ if (x.nextClean() == ']') {
+ return;
+ }
+ x.back();
+ for (;;) {
+ if (x.nextClean() == ',') {
+ x.back();
+ this.myArrayList.add(null);
+ } else {
+ x.back();
+ this.myArrayList.add(x.nextValue());
+ }
+ c = x.nextClean();
+ switch (c) {
+ case ';':
+ case ',':
+ if (x.nextClean() == ']') {
+ return;
+ }
+ x.back();
+ break;
+ case ']':
+ case ')':
+ if (q != c) {
+ throw x.syntaxError("Expected a '" + new Character(q) + "'");
+ }
+ return;
+ default:
+ throw x.syntaxError("Expected a ',' or ']'");
+ }
+ }
+ }
+
+
+ /**
+ * Construct a JSONArray from a source JSON text.
+ * @param source A string that begins with
+ * <code>[</code> <small>(left bracket)</small>
+ * and ends with <code>]</code> <small>(right bracket)</small>.
+ * @throws JSONException If there is a syntax error.
+ */
+ public JSONArray(String source) throws JSONException {
+ this(new JSONTokener(source));
+ }
+
+
+ /**
+ * Construct a JSONArray from a Collection.
+ * @param collection A Collection.
+ */
+ public JSONArray(Collection collection) {
+ this.myArrayList = (collection == null) ?
+ new ArrayList() :
+ new ArrayList(collection);
+ }
+
+ /**
+ * Construct a JSONArray from a collection of beans.
+ * The collection should have Java Beans.
+ *
+ * @throws JSONException If not an array.
+ */
+
+ public JSONArray(Collection collection,boolean includeSuperClass) {
+ this.myArrayList = new ArrayList();
+ if(collection != null) {
+ for (Iterator iter = collection.iterator(); iter.hasNext();) {
+ this.myArrayList.add(new JSONObject(iter.next(),includeSuperClass));
+ }
+ }
+ }
+
+
+ /**
+ * Construct a JSONArray from an array
+ * @throws JSONException If not an array.
+ */
+ public JSONArray(Object array) throws JSONException {
+ this();
+ if (array.getClass().isArray()) {
+ int length = Array.getLength(array);
+ for (int i = 0; i < length; i += 1) {
+ this.put(Array.get(array, i));
+ }
+ } else {
+ throw new JSONException("JSONArray initial value should be a string or collection or array.");
+ }
+ }
+
+ /**
+ * Construct a JSONArray from an array with a bean.
+ * The array should have Java Beans.
+ *
+ * @throws JSONException If not an array.
+ */
+ public JSONArray(Object array,boolean includeSuperClass) throws JSONException {
+ this();
+ if (array.getClass().isArray()) {
+ int length = Array.getLength(array);
+ for (int i = 0; i < length; i += 1) {
+ this.put(new JSONObject(Array.get(array, i),includeSuperClass));
+ }
+ } else {
+ throw new JSONException("JSONArray initial value should be a string or collection or array.");
+ }
+ }
+
+
+
+ /**
+ * Get the object value associated with an index.
+ * @param index
+ * The index must be between 0 and length() - 1.
+ * @return An object value.
+ * @throws JSONException If there is no value for the index.
+ */
+ public Object get(int index) throws JSONException {
+ Object o = opt(index);
+ if (o == null) {
+ throw new JSONException("JSONArray[" + index + "] not found.");
+ }
+ return o;
+ }
+
+
+ /**
+ * Get the boolean value associated with an index.
+ * The string values "true" and "false" are converted to boolean.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return The truth.
+ * @throws JSONException If there is no value for the index or if the
+ * value is not convertable to boolean.
+ */
+ public boolean getBoolean(int index) throws JSONException {
+ Object o = get(index);
+ if (o.equals(Boolean.FALSE) ||
+ (o instanceof String &&
+ ((String)o).equalsIgnoreCase("false"))) {
+ return false;
+ } else if (o.equals(Boolean.TRUE) ||
+ (o instanceof String &&
+ ((String)o).equalsIgnoreCase("true"))) {
+ return true;
+ }
+ throw new JSONException("JSONArray[" + index + "] is not a Boolean.");
+ }
+
+
+ /**
+ * Get the double value associated with an index.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return The value.
+ * @throws JSONException If the key is not found or if the value cannot
+ * be converted to a number.
+ */
+ public double getDouble(int index) throws JSONException {
+ Object o = get(index);
+ try {
+ return o instanceof Number ?
+ ((Number)o).doubleValue() :
+ Double.valueOf((String)o).doubleValue();
+ } catch (Exception e) {
+ throw new JSONException("JSONArray[" + index +
+ "] is not a number.");
+ }
+ }
+
+
+ /**
+ * Get the int value associated with an index.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return The value.
+ * @throws JSONException If the key is not found or if the value cannot
+ * be converted to a number.
+ * if the value cannot be converted to a number.
+ */
+ public int getInt(int index) throws JSONException {
+ Object o = get(index);
+ return o instanceof Number ?
+ ((Number)o).intValue() : (int)getDouble(index);
+ }
+
+
+ /**
+ * Get the JSONArray associated with an index.
+ * @param index The index must be between 0 and length() - 1.
+ * @return A JSONArray value.
+ * @throws JSONException If there is no value for the index. or if the
+ * value is not a JSONArray
+ */
+ public JSONArray getJSONArray(int index) throws JSONException {
+ Object o = get(index);
+ if (o instanceof JSONArray) {
+ return (JSONArray)o;
+ }
+ throw new JSONException("JSONArray[" + index +
+ "] is not a JSONArray.");
+ }
+
+
+ /**
+ * Get the JSONObject associated with an index.
+ * @param index subscript
+ * @return A JSONObject value.
+ * @throws JSONException If there is no value for the index or if the
+ * value is not a JSONObject
+ */
+ public JSONObject getJSONObject(int index) throws JSONException {
+ Object o = get(index);
+ if (o instanceof JSONObject) {
+ return (JSONObject)o;
+ }
+ throw new JSONException("JSONArray[" + index +
+ "] is not a JSONObject.");
+ }
+
+
+ /**
+ * Get the long value associated with an index.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return The value.
+ * @throws JSONException If the key is not found or if the value cannot
+ * be converted to a number.
+ */
+ public long getLong(int index) throws JSONException {
+ Object o = get(index);
+ return o instanceof Number ?
+ ((Number)o).longValue() : (long)getDouble(index);
+ }
+
+
+ /**
+ * Get the string associated with an index.
+ * @param index The index must be between 0 and length() - 1.
+ * @return A string value.
+ * @throws JSONException If there is no value for the index.
+ */
+ public String getString(int index) throws JSONException {
+ return get(index).toString();
+ }
+
+
+ /**
+ * Determine if the value is null.
+ * @param index The index must be between 0 and length() - 1.
+ * @return true if the value at the index is null, or if there is no value.
+ */
+ public boolean isNull(int index) {
+ return JSONObject.NULL.equals(opt(index));
+ }
+
+
+ /**
+ * Make a string from the contents of this JSONArray. The
+ * <code>separator</code> string is inserted between each element.
+ * Warning: This method assumes that the data structure is acyclical.
+ * @param separator A string that will be inserted between the elements.
+ * @return a string.
+ * @throws JSONException If the array contains an invalid number.
+ */
+ public String join(String separator) throws JSONException {
+ int len = length();
+ StringBuffer sb = new StringBuffer();
+
+ for (int i = 0; i < len; i += 1) {
+ if (i > 0) {
+ sb.append(separator);
+ }
+ sb.append(JSONObject.valueToString(this.myArrayList.get(i)));
+ }
+ return sb.toString();
+ }
+
+
+ /**
+ * Get the number of elements in the JSONArray, included nulls.
+ *
+ * @return The length (or size).
+ */
+ public int length() {
+ return this.myArrayList.size();
+ }
+
+
+ /**
+ * Get the optional object value associated with an index.
+ * @param index The index must be between 0 and length() - 1.
+ * @return An object value, or null if there is no
+ * object at that index.
+ */
+ public Object opt(int index) {
+ return (index < 0 || index >= length()) ?
+ null : this.myArrayList.get(index);
+ }
+
+
+ /**
+ * Get the optional boolean value associated with an index.
+ * It returns false if there is no value at that index,
+ * or if the value is not Boolean.TRUE or the String "true".
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return The truth.
+ */
+ public boolean optBoolean(int index) {
+ return optBoolean(index, false);
+ }
+
+
+ /**
+ * Get the optional boolean value associated with an index.
+ * It returns the defaultValue if there is no value at that index or if
+ * it is not a Boolean or the String "true" or "false" (case insensitive).
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @param defaultValue A boolean default.
+ * @return The truth.
+ */
+ public boolean optBoolean(int index, boolean defaultValue) {
+ try {
+ return getBoolean(index);
+ } catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+
+ /**
+ * Get the optional double value associated with an index.
+ * NaN is returned if there is no value for the index,
+ * or if the value is not a number and cannot be converted to a number.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return The value.
+ */
+ public double optDouble(int index) {
+ return optDouble(index, Double.NaN);
+ }
+
+
+ /**
+ * Get the optional double value associated with an index.
+ * The defaultValue is returned if there is no value for the index,
+ * or if the value is not a number and cannot be converted to a number.
+ *
+ * @param index subscript
+ * @param defaultValue The default value.
+ * @return The value.
+ */
+ public double optDouble(int index, double defaultValue) {
+ try {
+ return getDouble(index);
+ } catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+
+ /**
+ * Get the optional int value associated with an index.
+ * Zero is returned if there is no value for the index,
+ * or if the value is not a number and cannot be converted to a number.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return The value.
+ */
+ public int optInt(int index) {
+ return optInt(index, 0);
+ }
+
+
+ /**
+ * Get the optional int value associated with an index.
+ * The defaultValue is returned if there is no value for the index,
+ * or if the value is not a number and cannot be converted to a number.
+ * @param index The index must be between 0 and length() - 1.
+ * @param defaultValue The default value.
+ * @return The value.
+ */
+ public int optInt(int index, int defaultValue) {
+ try {
+ return getInt(index);
+ } catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+
+ /**
+ * Get the optional JSONArray associated with an index.
+ * @param index subscript
+ * @return A JSONArray value, or null if the index has no value,
+ * or if the value is not a JSONArray.
+ */
+ public JSONArray optJSONArray(int index) {
+ Object o = opt(index);
+ return o instanceof JSONArray ? (JSONArray)o : null;
+ }
+
+
+ /**
+ * Get the optional JSONObject associated with an index.
+ * Null is returned if the key is not found, or null if the index has
+ * no value, or if the value is not a JSONObject.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return A JSONObject value.
+ */
+ public JSONObject optJSONObject(int index) {
+ Object o = opt(index);
+ return o instanceof JSONObject ? (JSONObject)o : null;
+ }
+
+
+ /**
+ * Get the optional long value associated with an index.
+ * Zero is returned if there is no value for the index,
+ * or if the value is not a number and cannot be converted to a number.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return The value.
+ */
+ public long optLong(int index) {
+ return optLong(index, 0);
+ }
+
+
+ /**
+ * Get the optional long value associated with an index.
+ * The defaultValue is returned if there is no value for the index,
+ * or if the value is not a number and cannot be converted to a number.
+ * @param index The index must be between 0 and length() - 1.
+ * @param defaultValue The default value.
+ * @return The value.
+ */
+ public long optLong(int index, long defaultValue) {
+ try {
+ return getLong(index);
+ } catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+
+ /**
+ * Get the optional string value associated with an index. It returns an
+ * empty string if there is no value at that index. If the value
+ * is not a string and is not null, then it is coverted to a string.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return A String value.
+ */
+ public String optString(int index) {
+ return optString(index, "");
+ }
+
+
+ /**
+ * Get the optional string associated with an index.
+ * The defaultValue is returned if the key is not found.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @param defaultValue The default value.
+ * @return A String value.
+ */
+ public String optString(int index, String defaultValue) {
+ Object o = opt(index);
+ return o != null ? o.toString() : defaultValue;
+ }
+
+
+ /**
+ * Append a boolean value. This increases the array's length by one.
+ *
+ * @param value A boolean value.
+ * @return this.
+ */
+ public JSONArray put(boolean value) {
+ put(value ? Boolean.TRUE : Boolean.FALSE);
+ return this;
+ }
+
+
+ /**
+ * Put a value in the JSONArray, where the value will be a
+ * JSONArray which is produced from a Collection.
+ * @param value A Collection value.
+ * @return this.
+ */
+ public JSONArray put(Collection value) {
+ put(new JSONArray(value));
+ return this;
+ }
+
+
+ /**
+ * Append a double value. This increases the array's length by one.
+ *
+ * @param value A double value.
+ * @throws JSONException if the value is not finite.
+ * @return this.
+ */
+ public JSONArray put(double value) throws JSONException {
+ Double d = new Double(value);
+ JSONObject.testValidity(d);
+ put(d);
+ return this;
+ }
+
+
+ /**
+ * Append an int value. This increases the array's length by one.
+ *
+ * @param value An int value.
+ * @return this.
+ */
+ public JSONArray put(int value) {
+ put(new Integer(value));
+ return this;
+ }
+
+
+ /**
+ * Append an long value. This increases the array's length by one.
+ *
+ * @param value A long value.
+ * @return this.
+ */
+ public JSONArray put(long value) {
+ put(new Long(value));
+ return this;
+ }
+
+
+ /**
+ * Put a value in the JSONArray, where the value will be a
+ * JSONObject which is produced from a Map.
+ * @param value A Map value.
+ * @return this.
+ */
+ public JSONArray put(Map value) {
+ put(new JSONObject(value));
+ return this;
+ }
+
+
+ /**
+ * Append an object value. This increases the array's length by one.
+ * @param value An object value. The value should be a
+ * Boolean, Double, Integer, JSONArray, JSONObject, Long, or String, or the
+ * JSONObject.NULL object.
+ * @return this.
+ */
+ public JSONArray put(Object value) {
+ this.myArrayList.add(value);
+ return this;
+ }
+
+
+ /**
+ * Put or replace a boolean value in the JSONArray. If the index is greater
+ * than the length of the JSONArray, then null elements will be added as
+ * necessary to pad it out.
+ * @param index The subscript.
+ * @param value A boolean value.
+ * @return this.
+ * @throws JSONException If the index is negative.
+ */
+ public JSONArray put(int index, boolean value) throws JSONException {
+ put(index, value ? Boolean.TRUE : Boolean.FALSE);
+ return this;
+ }
+
+
+ /**
+ * Put a value in the JSONArray, where the value will be a
+ * JSONArray which is produced from a Collection.
+ * @param index The subscript.
+ * @param value A Collection value.
+ * @return this.
+ * @throws JSONException If the index is negative or if the value is
+ * not finite.
+ */
+ public JSONArray put(int index, Collection value) throws JSONException {
+ put(index, new JSONArray(value));
+ return this;
+ }
+
+
+ /**
+ * Put or replace a double value. If the index is greater than the length of
+ * the JSONArray, then null elements will be added as necessary to pad
+ * it out.
+ * @param index The subscript.
+ * @param value A double value.
+ * @return this.
+ * @throws JSONException If the index is negative or if the value is
+ * not finite.
+ */
+ public JSONArray put(int index, double value) throws JSONException {
+ put(index, new Double(value));
+ return this;
+ }
+
+
+ /**
+ * Put or replace an int value. If the index is greater than the length of
+ * the JSONArray, then null elements will be added as necessary to pad
+ * it out.
+ * @param index The subscript.
+ * @param value An int value.
+ * @return this.
+ * @throws JSONException If the index is negative.
+ */
+ public JSONArray put(int index, int value) throws JSONException {
+ put(index, new Integer(value));
+ return this;
+ }
+
+
+ /**
+ * Put or replace a long value. If the index is greater than the length of
+ * the JSONArray, then null elements will be added as necessary to pad
+ * it out.
+ * @param index The subscript.
+ * @param value A long value.
+ * @return this.
+ * @throws JSONException If the index is negative.
+ */
+ public JSONArray put(int index, long value) throws JSONException {
+ put(index, new Long(value));
+ return this;
+ }
+
+
+ /**
+ * Put a value in the JSONArray, where the value will be a
+ * JSONObject which is produced from a Map.
+ * @param index The subscript.
+ * @param value The Map value.
+ * @return this.
+ * @throws JSONException If the index is negative or if the the value is
+ * an invalid number.
+ */
+ public JSONArray put(int index, Map value) throws JSONException {
+ put(index, new JSONObject(value));
+ return this;
+ }
+
+
+ /**
+ * Put or replace an object value in the JSONArray. If the index is greater
+ * than the length of the JSONArray, then null elements will be added as
+ * necessary to pad it out.
+ * @param index The subscript.
+ * @param value The value to put into the array. The value should be a
+ * Boolean, Double, Integer, JSONArray, JSONObject, Long, or String, or the
+ * JSONObject.NULL object.
+ * @return this.
+ * @throws JSONException If the index is negative or if the the value is
+ * an invalid number.
+ */
+ public JSONArray put(int index, Object value) throws JSONException {
+ JSONObject.testValidity(value);
+ if (index < 0) {
+ throw new JSONException("JSONArray[" + index + "] not found.");
+ }
+ if (index < length()) {
+ this.myArrayList.set(index, value);
+ } else {
+ while (index != length()) {
+ put(JSONObject.NULL);
+ }
+ put(value);
+ }
+ return this;
+ }
+
+
+ /**
+ * Produce a JSONObject by combining a JSONArray of names with the values
+ * of this JSONArray.
+ * @param names A JSONArray containing a list of key strings. These will be
+ * paired with the values.
+ * @return A JSONObject, or null if there are no names or if this JSONArray
+ * has no values.
+ * @throws JSONException If any of the names are null.
+ */
+ public JSONObject toJSONObject(JSONArray names) throws JSONException {
+ if (names == null || names.length() == 0 || length() == 0) {
+ return null;
+ }
+ JSONObject jo = new JSONObject();
+ for (int i = 0; i < names.length(); i += 1) {
+ jo.put(names.getString(i), this.opt(i));
+ }
+ return jo;
+ }
+
+
+ /**
+ * Make a JSON text of this JSONArray. For compactness, no
+ * unnecessary whitespace is added. If it is not possible to produce a
+ * syntactically correct JSON text then null will be returned instead. This
+ * could occur if the array contains an invalid number.
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ *
+ * @return a printable, displayable, transmittable
+ * representation of the array.
+ */
+ public String toString() {
+ try {
+ return '[' + join(",") + ']';
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+
+ /**
+ * Make a prettyprinted JSON text of this JSONArray.
+ * Warning: This method assumes that the data structure is acyclical.
+ * @param indentFactor The number of spaces to add to each level of
+ * indentation.
+ * @return a printable, displayable, transmittable
+ * representation of the object, beginning
+ * with <code>[</code> <small>(left bracket)</small> and ending
+ * with <code>]</code> <small>(right bracket)</small>.
+ * @throws JSONException
+ */
+ public String toString(int indentFactor) throws JSONException {
+ return toString(indentFactor, 0);
+ }
+
+
+ /**
+ * Make a prettyprinted JSON text of this JSONArray.
+ * Warning: This method assumes that the data structure is acyclical.
+ * @param indentFactor The number of spaces to add to each level of
+ * indentation.
+ * @param indent The indention of the top level.
+ * @return a printable, displayable, transmittable
+ * representation of the array.
+ * @throws JSONException
+ */
+ String toString(int indentFactor, int indent) throws JSONException {
+ int len = length();
+ if (len == 0) {
+ return "[]";
+ }
+ int i;
+ StringBuffer sb = new StringBuffer("[");
+ if (len == 1) {
+ sb.append(JSONObject.valueToString(this.myArrayList.get(0),
+ indentFactor, indent));
+ } else {
+ int newindent = indent + indentFactor;
+ sb.append('\n');
+ for (i = 0; i < len; i += 1) {
+ if (i > 0) {
+ sb.append(",\n");
+ }
+ for (int j = 0; j < newindent; j += 1) {
+ sb.append(' ');
+ }
+ sb.append(JSONObject.valueToString(this.myArrayList.get(i),
+ indentFactor, newindent));
+ }
+ sb.append('\n');
+ for (i = 0; i < indent; i += 1) {
+ sb.append(' ');
+ }
+ }
+ sb.append(']');
+ return sb.toString();
+ }
+
+
+ /**
+ * Write the contents of the JSONArray as JSON text to a writer.
+ * For compactness, no whitespace is added.
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ *
+ * @return The writer.
+ * @throws JSONException
+ */
+ public Writer write(Writer writer) throws JSONException {
+ try {
+ boolean b = false;
+ int len = length();
+
+ writer.write('[');
+
+ for (int i = 0; i < len; i += 1) {
+ if (b) {
+ writer.write(',');
+ }
+ Object v = this.myArrayList.get(i);
+ if (v instanceof JSONObject) {
+ ((JSONObject)v).write(writer);
+ } else if (v instanceof JSONArray) {
+ ((JSONArray)v).write(writer);
+ } else {
+ writer.write(JSONObject.valueToString(v));
+ }
+ b = true;
+ }
+ writer.write(']');
+ return writer;
+ } catch (IOException e) {
+ throw new JSONException(e);
+ }
+ }
+}
\ No newline at end of file
Added: projects/gwt-console/trunk/war/src/main/java/org/json/JSONException.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/JSONException.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/JSONException.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -0,0 +1,27 @@
+package org.json;
+
+/**
+ * The JSONException is thrown by the JSON.org classes then things are amiss.
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class JSONException extends Exception {
+ private Throwable cause;
+
+ /**
+ * Constructs a JSONException with an explanatory message.
+ * @param message Detail about the reason for the exception.
+ */
+ public JSONException(String message) {
+ super(message);
+ }
+
+ public JSONException(Throwable t) {
+ super(t.getMessage());
+ this.cause = t;
+ }
+
+ public Throwable getCause() {
+ return this.cause;
+ }
+}
Added: projects/gwt-console/trunk/war/src/main/java/org/json/JSONML.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/JSONML.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/JSONML.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -0,0 +1,447 @@
+package org.json;
+
+/*
+Copyright (c) 2008 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+import java.util.Iterator;
+
+
+/**
+ * This provides static methods to convert an XML text into a JSONArray or
+ * JSONObject, and to covert a JSONArray or JSONObject into an XML text using
+ * the JsonML transform.
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class JSONML {
+
+ /**
+ * Parse XML values and store them in a JSONArray.
+ * @param x The XMLTokener containing the source string.
+ * @param arrayForm true if array form, false if object form.
+ * @param ja The JSONArray that is containing the current tag or null
+ * if we are at the outermost level.
+ * @return A JSONArray if the value is the outermost tag, otherwise null.
+ * @throws JSONException
+ */
+ private static Object parse(XMLTokener x, boolean arrayForm,
+ JSONArray ja) throws JSONException {
+ String attribute;
+ char c;
+ String closeTag = null;
+ int i;
+ JSONArray newja = null;
+ JSONObject newjo = null;
+ Object token;
+ String tagName = null;
+
+// Test for and skip past these forms:
+// <!-- ... -->
+// <![ ... ]]>
+// <! ... >
+// <? ... ?>
+
+ while (true) {
+ token = x.nextContent();
+ if (token == XML.LT) {
+ token = x.nextToken();
+ if (token instanceof Character) {
+ if (token == XML.SLASH) {
+
+// Close tag </
+
+ token = x.nextToken();
+ if (!(token instanceof String)) {
+ throw new JSONException(
+ "Expected a closing name instead of '" +
+ token + "'.");
+ }
+ if (x.nextToken() != XML.GT) {
+ throw x.syntaxError("Misshaped close tag");
+ }
+ return token;
+ } else if (token == XML.BANG) {
+
+// <!
+
+ c = x.next();
+ if (c == '-') {
+ if (x.next() == '-') {
+ x.skipPast("-->");
+ }
+ x.back();
+ } else if (c == '[') {
+ token = x.nextToken();
+ if (token.equals("CDATA") && x.next() == '[') {
+ if (ja != null) {
+ ja.put(x.nextCDATA());
+ }
+ } else {
+ throw x.syntaxError("Expected 'CDATA['");
+ }
+ } else {
+ i = 1;
+ do {
+ token = x.nextMeta();
+ if (token == null) {
+ throw x.syntaxError("Missing '>' after '<!'.");
+ } else if (token == XML.LT) {
+ i += 1;
+ } else if (token == XML.GT) {
+ i -= 1;
+ }
+ } while (i > 0);
+ }
+ } else if (token == XML.QUEST) {
+
+// <?
+
+ x.skipPast("?>");
+ } else {
+ throw x.syntaxError("Misshaped tag");
+ }
+
+// Open tag <
+
+ } else {
+ if (!(token instanceof String)) {
+ throw x.syntaxError("Bad tagName '" + token + "'.");
+ }
+ tagName = (String)token;
+ newja = new JSONArray();
+ newjo = new JSONObject();
+ if (arrayForm) {
+ newja.put(tagName);
+ if (ja != null) {
+ ja.put(newja);
+ }
+ } else {
+ newjo.put("tagName", tagName);
+ if (ja != null) {
+ ja.put(newjo);
+ }
+ }
+ token = null;
+ for (;;) {
+ if (token == null) {
+ token = x.nextToken();
+ }
+ if (token == null) {
+ throw x.syntaxError("Misshaped tag");
+ }
+ if (!(token instanceof String)) {
+ break;
+ }
+
+// attribute = value
+
+ attribute = (String)token;
+ if (!arrayForm && (attribute == "tagName" || attribute == "childNode")) {
+ throw x.syntaxError("Reserved attribute.");
+ }
+ token = x.nextToken();
+ if (token == XML.EQ) {
+ token = x.nextToken();
+ if (!(token instanceof String)) {
+ throw x.syntaxError("Missing value");
+ }
+ newjo.accumulate(attribute, JSONObject.stringToValue((String)token));
+ token = null;
+ } else {
+ newjo.accumulate(attribute, "");
+ }
+ }
+ if (arrayForm && newjo.length() > 0) {
+ newja.put(newjo);
+ }
+
+// Empty tag <.../>
+
+ if (token == XML.SLASH) {
+ if (x.nextToken() != XML.GT) {
+ throw x.syntaxError("Misshaped tag");
+ }
+ if (ja == null) {
+ return arrayForm ? newja : newjo;
+ }
+
+// Content, between <...> and </...>
+
+ } else {
+ if (token != XML.GT) {
+ throw x.syntaxError("Misshaped tag");
+ }
+ closeTag = (String)parse(x, arrayForm, newja);
+ if (closeTag != null) {
+ if (!closeTag.equals(tagName)) {
+ throw x.syntaxError("Mismatched '" + tagName +
+ "' and '" + closeTag + "'");
+ }
+ tagName = null;
+ if (!arrayForm && newja.length() > 0) {
+ newjo.put("childNodes", newja);
+ }
+ if (ja == null) {
+ return arrayForm ? newja : newjo;
+ }
+ }
+ }
+ }
+ } else {
+ if (ja != null) {
+ ja.put(token instanceof String ?
+ JSONObject.stringToValue((String)token) : token);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Convert a well-formed (but not necessarily valid) XML string into a
+ * JSONArray using the JsonML transform. Each XML tag is represented as
+ * a JSONArray in which the first element is the tag name. If the tag has
+ * attributes, then the second element will be JSONObject containing the
+ * name/value pairs. If the tag contains children, then strings and
+ * JSONArrays will represent the child tags.
+ * Comments, prologs, DTDs, and <code><[ [ ]]></code> are ignored.
+ * @param string The source string.
+ * @return A JSONArray containing the structured data from the XML string.
+ * @throws JSONException
+ */
+ public static JSONArray toJSONArray(String string) throws JSONException {
+ return toJSONArray(new XMLTokener(string));
+ }
+
+
+ /**
+ * Convert a well-formed (but not necessarily valid) XML string into a
+ * JSONArray using the JsonML transform. Each XML tag is represented as
+ * a JSONArray in which the first element is the tag name. If the tag has
+ * attributes, then the second element will be JSONObject containing the
+ * name/value pairs. If the tag contains children, then strings and
+ * JSONArrays will represent the child content and tags.
+ * Comments, prologs, DTDs, and <code><[ [ ]]></code> are ignored.
+ * @param x An XMLTokener.
+ * @return A JSONArray containing the structured data from the XML string.
+ * @throws JSONException
+ */
+ public static JSONArray toJSONArray(XMLTokener x) throws JSONException {
+ return (JSONArray)parse(x, true, null);
+ }
+
+
+
+ /**
+ * Convert a well-formed (but not necessarily valid) XML string into a
+ * JSONObject using the JsonML transform. Each XML tag is represented as
+ * a JSONObject with a "tagName" property. If the tag has attributes, then
+ * the attributes will be in the JSONObject as properties. If the tag
+ * contains children, the object will have a "childNodes" property which
+ * will be an array of strings and JsonML JSONObjects.
+
+ * Comments, prologs, DTDs, and <code><[ [ ]]></code> are ignored.
+ * @param x An XMLTokener of the XML source text.
+ * @return A JSONObject containing the structured data from the XML string.
+ * @throws JSONException
+ */
+ public static JSONObject toJSONObject(XMLTokener x) throws JSONException {
+ return (JSONObject)parse(x, false, null);
+ }
+ /**
+ * Convert a well-formed (but not necessarily valid) XML string into a
+ * JSONObject using the JsonML transform. Each XML tag is represented as
+ * a JSONObject with a "tagName" property. If the tag has attributes, then
+ * the attributes will be in the JSONObject as properties. If the tag
+ * contains children, the object will have a "childNodes" property which
+ * will be an array of strings and JsonML JSONObjects.
+
+ * Comments, prologs, DTDs, and <code><[ [ ]]></code> are ignored.
+ * @param string The XML source text.
+ * @return A JSONObject containing the structured data from the XML string.
+ * @throws JSONException
+ */
+ public static JSONObject toJSONObject(String string) throws JSONException {
+ return toJSONObject(new XMLTokener(string));
+ }
+
+
+ /**
+ * Reverse the JSONML transformation, making an XML text from a JSONArray.
+ * @param ja A JSONArray.
+ * @return An XML string.
+ * @throws JSONException
+ */
+ public static String toString(JSONArray ja) throws JSONException {
+ Object e;
+ int i;
+ JSONObject jo;
+ String k;
+ Iterator keys;
+ int length;
+ StringBuffer sb = new StringBuffer();
+ String tagName;
+ String v;
+
+// Emit <tagName
+
+ tagName = ja.getString(0);
+ XML.noSpace(tagName);
+ tagName = XML.escape(tagName);
+ sb.append('<');
+ sb.append(tagName);
+
+ e = ja.opt(1);
+ if (e instanceof JSONObject) {
+ i = 2;
+ jo = (JSONObject)e;
+
+// Emit the attributes
+
+ keys = jo.keys();
+ while (keys.hasNext()) {
+ k = keys.next().toString();
+ XML.noSpace(k);
+ v = jo.optString(k);
+ if (v != null) {
+ sb.append(' ');
+ sb.append(XML.escape(k));
+ sb.append('=');
+ sb.append('"');
+ sb.append(XML.escape(v));
+ sb.append('"');
+ }
+ }
+ } else {
+ i = 1;
+ }
+
+//Emit content in body
+
+ length = ja.length();
+ if (i >= length) {
+ sb.append('/');
+ sb.append('>');
+ } else {
+ sb.append('>');
+ do {
+ e = ja.get(i);
+ i += 1;
+ if (e != null) {
+ if (e instanceof String) {
+ sb.append(XML.escape(e.toString()));
+ } else if (e instanceof JSONObject) {
+ sb.append(toString((JSONObject)e));
+ } else if (e instanceof JSONArray) {
+ sb.append(toString((JSONArray)e));
+ }
+ }
+ } while (i < length);
+ sb.append('<');
+ sb.append('/');
+ sb.append(tagName);
+ sb.append('>');
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Reverse the JSONML transformation, making an XML text from a JSONObject.
+ * The JSONObject must contain a "tagName" property. If it has children,
+ * then it must have a "childNodes" property containing an array of objects.
+ * The other properties are attributes with string values.
+ * @param jo A JSONObject.
+ * @return An XML string.
+ * @throws JSONException
+ */
+ public static String toString(JSONObject jo) throws JSONException {
+ StringBuffer sb = new StringBuffer();
+ Object e;
+ int i;
+ JSONArray ja;
+ String k;
+ Iterator keys;
+ int len;
+ String tagName;
+ String v;
+
+//Emit <tagName
+
+ tagName = jo.optString("tagName");
+ if (tagName == null) {
+ return XML.escape(jo.toString());
+ }
+ XML.noSpace(tagName);
+ tagName = XML.escape(tagName);
+ sb.append('<');
+ sb.append(tagName);
+
+//Emit the attributes
+
+ keys = jo.keys();
+ while (keys.hasNext()) {
+ k = keys.next().toString();
+ if (!k.equals("tagName") && !k.equals("childNodes")) {
+ XML.noSpace(k);
+ v = jo.optString(k);
+ if (v != null) {
+ sb.append(' ');
+ sb.append(XML.escape(k));
+ sb.append('=');
+ sb.append('"');
+ sb.append(XML.escape(v));
+ sb.append('"');
+ }
+ }
+ }
+
+//Emit content in body
+
+ ja = jo.optJSONArray("childNodes");
+ if (ja == null) {
+ sb.append('/');
+ sb.append('>');
+ } else {
+ sb.append('>');
+ len = ja.length();
+ for (i = 0; i < len; i += 1) {
+ e = ja.get(i);
+ if (e != null) {
+ if (e instanceof String) {
+ sb.append(XML.escape(e.toString()));
+ } else if (e instanceof JSONObject) {
+ sb.append(toString((JSONObject)e));
+ } else if (e instanceof JSONArray) {
+ sb.append(toString((JSONArray)e));
+ }
+ }
+ }
+ sb.append('<');
+ sb.append('/');
+ sb.append(tagName);
+ sb.append('>');
+ }
+ return sb.toString();
+ }
+}
\ No newline at end of file
Added: projects/gwt-console/trunk/war/src/main/java/org/json/JSONObject.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/JSONObject.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/JSONObject.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -0,0 +1,1550 @@
+package org.json;
+
+/*
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+import java.io.IOException;
+import java.io.Writer;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeSet;
+
+/**
+ * A JSONObject is an unordered collection of name/value pairs. Its
+ * external form is a string wrapped in curly braces with colons between the
+ * names and values, and commas between the values and names. The internal form
+ * is an object having <code>get</code> and <code>opt</code> methods for
+ * accessing the values by name, and <code>put</code> methods for adding or
+ * replacing values by name. The values can be any of these types:
+ * <code>Boolean</code>, <code>JSONArray</code>, <code>JSONObject</code>,
+ * <code>Number</code>, <code>String</code>, or the <code>JSONObject.NULL</code>
+ * object. A JSONObject constructor can be used to convert an external form
+ * JSON text into an internal form whose values can be retrieved with the
+ * <code>get</code> and <code>opt</code> methods, or to convert values into a
+ * JSON text using the <code>put</code> and <code>toString</code> methods.
+ * A <code>get</code> method returns a value if one can be found, and throws an
+ * exception if one cannot be found. An <code>opt</code> method returns a
+ * default value instead of throwing an exception, and so is useful for
+ * obtaining optional values.
+ * <p>
+ * The generic <code>get()</code> and <code>opt()</code> methods return an
+ * object, which you can cast or query for type. There are also typed
+ * <code>get</code> and <code>opt</code> methods that do type checking and type
+ * coercion for you.
+ * <p>
+ * The <code>put</code> methods adds values to an object. For example, <pre>
+ * myString = new JSONObject().put("JSON", "Hello, World!").toString();</pre>
+ * produces the string <code>{"JSON": "Hello, World"}</code>.
+ * <p>
+ * The texts produced by the <code>toString</code> methods strictly conform to
+ * the JSON syntax rules.
+ * The constructors are more forgiving in the texts they will accept:
+ * <ul>
+ * <li>An extra <code>,</code> <small>(comma)</small> may appear just
+ * before the closing brace.</li>
+ * <li>Strings may be quoted with <code>'</code> <small>(single
+ * quote)</small>.</li>
+ * <li>Strings do not need to be quoted at all if they do not begin with a quote
+ * or single quote, and if they do not contain leading or trailing spaces,
+ * and if they do not contain any of these characters:
+ * <code>{ } [ ] / \ : , = ; #</code> and if they do not look like numbers
+ * and if they are not the reserved words <code>true</code>,
+ * <code>false</code>, or <code>null</code>.</li>
+ * <li>Keys can be followed by <code>=</code> or <code>=></code> as well as
+ * by <code>:</code>.</li>
+ * <li>Values can be followed by <code>;</code> <small>(semicolon)</small> as
+ * well as by <code>,</code> <small>(comma)</small>.</li>
+ * <li>Numbers may have the <code>0-</code> <small>(octal)</small> or
+ * <code>0x-</code> <small>(hex)</small> prefix.</li>
+ * </ul>
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class JSONObject {
+
+ /**
+ * JSONObject.NULL is equivalent to the value that JavaScript calls null,
+ * whilst Java's null is equivalent to the value that JavaScript calls
+ * undefined.
+ */
+ private static final class Null {
+
+ /**
+ * There is only intended to be a single instance of the NULL object,
+ * so the clone method returns itself.
+ * @return NULL.
+ */
+ protected final Object clone() {
+ return this;
+ }
+
+
+ /**
+ * A Null object is equal to the null value and to itself.
+ * @param object An object to test for nullness.
+ * @return true if the object parameter is the JSONObject.NULL object
+ * or null.
+ */
+ public boolean equals(Object object) {
+ return object == null || object == this;
+ }
+
+
+ /**
+ * Get the "null" string value.
+ * @return The string "null".
+ */
+ public String toString() {
+ return "null";
+ }
+ }
+
+
+ /**
+ * The map where the JSONObject's properties are kept.
+ */
+ private Map map;
+
+
+ /**
+ * It is sometimes more convenient and less ambiguous to have a
+ * <code>NULL</code> object than to use Java's <code>null</code> value.
+ * <code>JSONObject.NULL.equals(null)</code> returns <code>true</code>.
+ * <code>JSONObject.NULL.toString()</code> returns <code>"null"</code>.
+ */
+ public static final Object NULL = new Null();
+
+
+ /**
+ * Construct an empty JSONObject.
+ */
+ public JSONObject() {
+ this.map = new HashMap();
+ }
+
+
+ /**
+ * Construct a JSONObject from a subset of another JSONObject.
+ * An array of strings is used to identify the keys that should be copied.
+ * Missing keys are ignored.
+ * @param jo A JSONObject.
+ * @param names An array of strings.
+ * @exception JSONException If a value is a non-finite number or if a name is duplicated.
+ */
+ public JSONObject(JSONObject jo, String[] names) throws JSONException {
+ this();
+ for (int i = 0; i < names.length; i += 1) {
+ putOnce(names[i], jo.opt(names[i]));
+ }
+ }
+
+
+ /**
+ * Construct a JSONObject from a JSONTokener.
+ * @param x A JSONTokener object containing the source string.
+ * @throws JSONException If there is a syntax error in the source string
+ * or a duplicated key.
+ */
+ public JSONObject(JSONTokener x) throws JSONException {
+ this();
+ char c;
+ String key;
+
+ if (x.nextClean() != '{') {
+ throw x.syntaxError("A JSONObject text must begin with '{'");
+ }
+ for (;;) {
+ c = x.nextClean();
+ switch (c) {
+ case 0:
+ throw x.syntaxError("A JSONObject text must end with '}'");
+ case '}':
+ return;
+ default:
+ x.back();
+ key = x.nextValue().toString();
+ }
+
+ /*
+ * The key is followed by ':'. We will also tolerate '=' or '=>'.
+ */
+
+ c = x.nextClean();
+ if (c == '=') {
+ if (x.next() != '>') {
+ x.back();
+ }
+ } else if (c != ':') {
+ throw x.syntaxError("Expected a ':' after a key");
+ }
+ putOnce(key, x.nextValue());
+
+ /*
+ * Pairs are separated by ','. We will also tolerate ';'.
+ */
+
+ switch (x.nextClean()) {
+ case ';':
+ case ',':
+ if (x.nextClean() == '}') {
+ return;
+ }
+ x.back();
+ break;
+ case '}':
+ return;
+ default:
+ throw x.syntaxError("Expected a ',' or '}'");
+ }
+ }
+ }
+
+
+ /**
+ * Construct a JSONObject from a Map.
+ *
+ * @param map A map object that can be used to initialize the contents of
+ * the JSONObject.
+ */
+ public JSONObject(Map map) {
+ this.map = (map == null) ? new HashMap() : map;
+ }
+
+ /**
+ * Construct a JSONObject from a Map.
+ *
+ * Note: Use this constructor when the map contains <key,bean>.
+ *
+ * @param map - A map with Key-Bean data.
+ * @param includeSuperClass - Tell whether to include the super class properties.
+ */
+ public JSONObject(Map map, boolean includeSuperClass) {
+ this.map = new HashMap();
+ if (map != null){
+ for (Iterator i = map.entrySet().iterator(); i.hasNext(); ) {
+ Map.Entry e = (Map.Entry)i.next();
+ this.map.put(e.getKey(), new JSONObject(e.getValue(), includeSuperClass));
+ }
+ }
+ }
+
+
+ /**
+ * Construct a JSONObject from an Object using bean getters.
+ * It reflects on all of the public methods of the object.
+ * For each of the methods with no parameters and a name starting
+ * with <code>"get"</code> or <code>"is"</code> followed by an uppercase letter,
+ * the method is invoked, and a key and the value returned from the getter method
+ * are put into the new JSONObject.
+ *
+ * The key is formed by removing the <code>"get"</code> or <code>"is"</code> prefix. If the second remaining
+ * character is not upper case, then the first
+ * character is converted to lower case.
+ *
+ * For example, if an object has a method named <code>"getName"</code>, and
+ * if the result of calling <code>object.getName()</code> is <code>"Larry Fine"</code>,
+ * then the JSONObject will contain <code>"name": "Larry Fine"</code>.
+ *
+ * @param bean An object that has getter methods that should be used
+ * to make a JSONObject.
+ */
+ public JSONObject(Object bean) {
+ this();
+ populateInternalMap(bean, false);
+ }
+
+
+ /**
+ * Construct JSONObject from the given bean. This will also create JSONObject
+ * for all internal object (List, Map, Inner Objects) of the provided bean.
+ *
+ * -- See Documentation of JSONObject(Object bean) also.
+ *
+ * @param bean An object that has getter methods that should be used
+ * to make a JSONObject.
+ * @param includeSuperClass - Tell whether to include the super class properties.
+ */
+ public JSONObject(Object bean, boolean includeSuperClass) {
+ this();
+ populateInternalMap(bean, includeSuperClass);
+ }
+
+ private void populateInternalMap(Object bean, boolean includeSuperClass){
+ Class klass = bean.getClass();
+
+ //If klass.getSuperClass is System class then includeSuperClass = false;
+
+ if (klass.getClassLoader() == null) {
+ includeSuperClass = false;
+ }
+
+ Method[] methods = (includeSuperClass) ?
+ klass.getMethods() : klass.getDeclaredMethods();
+ for (int i = 0; i < methods.length; i += 1) {
+ try {
+ Method method = methods[i];
+ String name = method.getName();
+ String key = "";
+ if (name.startsWith("get")) {
+ key = name.substring(3);
+ } else if (name.startsWith("is")) {
+ key = name.substring(2);
+ }
+ if (key.length() > 0 &&
+ Character.isUpperCase(key.charAt(0)) &&
+ method.getParameterTypes().length == 0) {
+ if (key.length() == 1) {
+ key = key.toLowerCase();
+ } else if (!Character.isUpperCase(key.charAt(1))) {
+ key = key.substring(0, 1).toLowerCase() +
+ key.substring(1);
+ }
+
+ Object result = method.invoke(bean, (Object[])null);
+ if (result == null){
+ map.put(key, NULL);
+ }else if (result.getClass().isArray()) {
+ map.put(key, new JSONArray(result,includeSuperClass));
+ }else if (result instanceof Collection) { //List or Set
+ map.put(key, new JSONArray((Collection)result,includeSuperClass));
+ }else if (result instanceof Map) {
+ map.put(key, new JSONObject((Map)result,includeSuperClass));
+ }else if (isStandardProperty(result.getClass())) { //Primitives, String and Wrapper
+ map.put(key, result);
+ }else{
+ if (result.getClass().getPackage().getName().startsWith("java") ||
+ result.getClass().getClassLoader() == null) {
+ map.put(key, result.toString());
+ } else { //User defined Objects
+ map.put(key, new JSONObject(result,includeSuperClass));
+ }
+ }
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ private boolean isStandardProperty(Class clazz) {
+ return clazz.isPrimitive() ||
+ clazz.isAssignableFrom(Byte.class) ||
+ clazz.isAssignableFrom(Short.class) ||
+ clazz.isAssignableFrom(Integer.class) ||
+ clazz.isAssignableFrom(Long.class) ||
+ clazz.isAssignableFrom(Float.class) ||
+ clazz.isAssignableFrom(Double.class) ||
+ clazz.isAssignableFrom(Character.class) ||
+ clazz.isAssignableFrom(String.class) ||
+ clazz.isAssignableFrom(Boolean.class);
+ }
+
+ /**
+ * Construct a JSONObject from an Object, using reflection to find the
+ * public members. The resulting JSONObject's keys will be the strings
+ * from the names array, and the values will be the field values associated
+ * with those keys in the object. If a key is not found or not visible,
+ * then it will not be copied into the new JSONObject.
+ * @param object An object that has fields that should be used to make a
+ * JSONObject.
+ * @param names An array of strings, the names of the fields to be obtained
+ * from the object.
+ */
+ public JSONObject(Object object, String names[]) {
+ this();
+ Class c = object.getClass();
+ for (int i = 0; i < names.length; i += 1) {
+ String name = names[i];
+ try {
+ putOpt(name, c.getField(name).get(object));
+ } catch (Exception e) {
+ /* forget about it */
+ }
+ }
+ }
+
+
+ /**
+ * Construct a JSONObject from a source JSON text string.
+ * This is the most commonly used JSONObject constructor.
+ * @param source A string beginning
+ * with <code>{</code> <small>(left brace)</small> and ending
+ * with <code>}</code> <small>(right brace)</small>.
+ * @exception JSONException If there is a syntax error in the source
+ * string or a duplicated key.
+ */
+ public JSONObject(String source) throws JSONException {
+ this(new JSONTokener(source));
+ }
+
+
+ /**
+ * Accumulate values under a key. It is similar to the put method except
+ * that if there is already an object stored under the key then a
+ * JSONArray is stored under the key to hold all of the accumulated values.
+ * If there is already a JSONArray, then the new value is appended to it.
+ * In contrast, the put method replaces the previous value.
+ * @param key A key string.
+ * @param value An object to be accumulated under the key.
+ * @return this.
+ * @throws JSONException If the value is an invalid number
+ * or if the key is null.
+ */
+ public JSONObject accumulate(String key, Object value)
+ throws JSONException {
+ testValidity(value);
+ Object o = opt(key);
+ if (o == null) {
+ put(key, value instanceof JSONArray ?
+ new JSONArray().put(value) :
+ value);
+ } else if (o instanceof JSONArray) {
+ ((JSONArray)o).put(value);
+ } else {
+ put(key, new JSONArray().put(o).put(value));
+ }
+ return this;
+ }
+
+
+ /**
+ * Append values to the array under a key. If the key does not exist in the
+ * JSONObject, then the key is put in the JSONObject with its value being a
+ * JSONArray containing the value parameter. If the key was already
+ * associated with a JSONArray, then the value parameter is appended to it.
+ * @param key A key string.
+ * @param value An object to be accumulated under the key.
+ * @return this.
+ * @throws JSONException If the key is null or if the current value
+ * associated with the key is not a JSONArray.
+ */
+ public JSONObject append(String key, Object value)
+ throws JSONException {
+ testValidity(value);
+ Object o = opt(key);
+ if (o == null) {
+ put(key, new JSONArray().put(value));
+ } else if (o instanceof JSONArray) {
+ put(key, ((JSONArray)o).put(value));
+ } else {
+ throw new JSONException("JSONObject[" + key +
+ "] is not a JSONArray.");
+ }
+ return this;
+ }
+
+
+ /**
+ * Produce a string from a double. The string "null" will be returned if
+ * the number is not finite.
+ * @param d A double.
+ * @return A String.
+ */
+ static public String doubleToString(double d) {
+ if (Double.isInfinite(d) || Double.isNaN(d)) {
+ return "null";
+ }
+
+// Shave off trailing zeros and decimal point, if possible.
+
+ String s = Double.toString(d);
+ if (s.indexOf('.') > 0 && s.indexOf('e') < 0 && s.indexOf('E') < 0) {
+ while (s.endsWith("0")) {
+ s = s.substring(0, s.length() - 1);
+ }
+ if (s.endsWith(".")) {
+ s = s.substring(0, s.length() - 1);
+ }
+ }
+ return s;
+ }
+
+
+ /**
+ * Get the value object associated with a key.
+ *
+ * @param key A key string.
+ * @return The object associated with the key.
+ * @throws JSONException if the key is not found.
+ */
+ public Object get(String key) throws JSONException {
+ Object o = opt(key);
+ if (o == null) {
+ throw new JSONException("JSONObject[" + quote(key) +
+ "] not found.");
+ }
+ return o;
+ }
+
+
+ /**
+ * Get the boolean value associated with a key.
+ *
+ * @param key A key string.
+ * @return The truth.
+ * @throws JSONException
+ * if the value is not a Boolean or the String "true" or "false".
+ */
+ public boolean getBoolean(String key) throws JSONException {
+ Object o = get(key);
+ if (o.equals(Boolean.FALSE) ||
+ (o instanceof String &&
+ ((String)o).equalsIgnoreCase("false"))) {
+ return false;
+ } else if (o.equals(Boolean.TRUE) ||
+ (o instanceof String &&
+ ((String)o).equalsIgnoreCase("true"))) {
+ return true;
+ }
+ throw new JSONException("JSONObject[" + quote(key) +
+ "] is not a Boolean.");
+ }
+
+
+ /**
+ * Get the double value associated with a key.
+ * @param key A key string.
+ * @return The numeric value.
+ * @throws JSONException if the key is not found or
+ * if the value is not a Number object and cannot be converted to a number.
+ */
+ public double getDouble(String key) throws JSONException {
+ Object o = get(key);
+ try {
+ return o instanceof Number ?
+ ((Number)o).doubleValue() :
+ Double.valueOf((String)o).doubleValue();
+ } catch (Exception e) {
+ throw new JSONException("JSONObject[" + quote(key) +
+ "] is not a number.");
+ }
+ }
+
+
+ /**
+ * Get the int value associated with a key. If the number value is too
+ * large for an int, it will be clipped.
+ *
+ * @param key A key string.
+ * @return The integer value.
+ * @throws JSONException if the key is not found or if the value cannot
+ * be converted to an integer.
+ */
+ public int getInt(String key) throws JSONException {
+ Object o = get(key);
+ return o instanceof Number ?
+ ((Number)o).intValue() : (int)getDouble(key);
+ }
+
+
+ /**
+ * Get the JSONArray value associated with a key.
+ *
+ * @param key A key string.
+ * @return A JSONArray which is the value.
+ * @throws JSONException if the key is not found or
+ * if the value is not a JSONArray.
+ */
+ public JSONArray getJSONArray(String key) throws JSONException {
+ Object o = get(key);
+ if (o instanceof JSONArray) {
+ return (JSONArray)o;
+ }
+ throw new JSONException("JSONObject[" + quote(key) +
+ "] is not a JSONArray.");
+ }
+
+
+ /**
+ * Get the JSONObject value associated with a key.
+ *
+ * @param key A key string.
+ * @return A JSONObject which is the value.
+ * @throws JSONException if the key is not found or
+ * if the value is not a JSONObject.
+ */
+ public JSONObject getJSONObject(String key) throws JSONException {
+ Object o = get(key);
+ if (o instanceof JSONObject) {
+ return (JSONObject)o;
+ }
+ throw new JSONException("JSONObject[" + quote(key) +
+ "] is not a JSONObject.");
+ }
+
+
+ /**
+ * Get the long value associated with a key. If the number value is too
+ * long for a long, it will be clipped.
+ *
+ * @param key A key string.
+ * @return The long value.
+ * @throws JSONException if the key is not found or if the value cannot
+ * be converted to a long.
+ */
+ public long getLong(String key) throws JSONException {
+ Object o = get(key);
+ return o instanceof Number ?
+ ((Number)o).longValue() : (long)getDouble(key);
+ }
+
+
+ /**
+ * Get an array of field names from a JSONObject.
+ *
+ * @return An array of field names, or null if there are no names.
+ */
+ public static String[] getNames(JSONObject jo) {
+ int length = jo.length();
+ if (length == 0) {
+ return null;
+ }
+ Iterator i = jo.keys();
+ String[] names = new String[length];
+ int j = 0;
+ while (i.hasNext()) {
+ names[j] = (String)i.next();
+ j += 1;
+ }
+ return names;
+ }
+
+
+ /**
+ * Get an array of field names from an Object.
+ *
+ * @return An array of field names, or null if there are no names.
+ */
+ public static String[] getNames(Object object) {
+ if (object == null) {
+ return null;
+ }
+ Class klass = object.getClass();
+ Field[] fields = klass.getFields();
+ int length = fields.length;
+ if (length == 0) {
+ return null;
+ }
+ String[] names = new String[length];
+ for (int i = 0; i < length; i += 1) {
+ names[i] = fields[i].getName();
+ }
+ return names;
+ }
+
+
+ /**
+ * Get the string associated with a key.
+ *
+ * @param key A key string.
+ * @return A string which is the value.
+ * @throws JSONException if the key is not found.
+ */
+ public String getString(String key) throws JSONException {
+ return get(key).toString();
+ }
+
+
+ /**
+ * Determine if the JSONObject contains a specific key.
+ * @param key A key string.
+ * @return true if the key exists in the JSONObject.
+ */
+ public boolean has(String key) {
+ return this.map.containsKey(key);
+ }
+
+
+ /**
+ * Determine if the value associated with the key is null or if there is
+ * no value.
+ * @param key A key string.
+ * @return true if there is no value associated with the key or if
+ * the value is the JSONObject.NULL object.
+ */
+ public boolean isNull(String key) {
+ return JSONObject.NULL.equals(opt(key));
+ }
+
+
+ /**
+ * Get an enumeration of the keys of the JSONObject.
+ *
+ * @return An iterator of the keys.
+ */
+ public Iterator keys() {
+ return this.map.keySet().iterator();
+ }
+
+
+ /**
+ * Get the number of keys stored in the JSONObject.
+ *
+ * @return The number of keys in the JSONObject.
+ */
+ public int length() {
+ return this.map.size();
+ }
+
+
+ /**
+ * Produce a JSONArray containing the names of the elements of this
+ * JSONObject.
+ * @return A JSONArray containing the key strings, or null if the JSONObject
+ * is empty.
+ */
+ public JSONArray names() {
+ JSONArray ja = new JSONArray();
+ Iterator keys = keys();
+ while (keys.hasNext()) {
+ ja.put(keys.next());
+ }
+ return ja.length() == 0 ? null : ja;
+ }
+
+ /**
+ * Produce a string from a Number.
+ * @param n A Number
+ * @return A String.
+ * @throws JSONException If n is a non-finite number.
+ */
+ static public String numberToString(Number n)
+ throws JSONException {
+ if (n == null) {
+ throw new JSONException("Null pointer");
+ }
+ testValidity(n);
+
+// Shave off trailing zeros and decimal point, if possible.
+
+ String s = n.toString();
+ if (s.indexOf('.') > 0 && s.indexOf('e') < 0 && s.indexOf('E') < 0) {
+ while (s.endsWith("0")) {
+ s = s.substring(0, s.length() - 1);
+ }
+ if (s.endsWith(".")) {
+ s = s.substring(0, s.length() - 1);
+ }
+ }
+ return s;
+ }
+
+
+ /**
+ * Get an optional value associated with a key.
+ * @param key A key string.
+ * @return An object which is the value, or null if there is no value.
+ */
+ public Object opt(String key) {
+ return key == null ? null : this.map.get(key);
+ }
+
+
+ /**
+ * Get an optional boolean associated with a key.
+ * It returns false if there is no such key, or if the value is not
+ * Boolean.TRUE or the String "true".
+ *
+ * @param key A key string.
+ * @return The truth.
+ */
+ public boolean optBoolean(String key) {
+ return optBoolean(key, false);
+ }
+
+
+ /**
+ * Get an optional boolean associated with a key.
+ * It returns the defaultValue if there is no such key, or if it is not
+ * a Boolean or the String "true" or "false" (case insensitive).
+ *
+ * @param key A key string.
+ * @param defaultValue The default.
+ * @return The truth.
+ */
+ public boolean optBoolean(String key, boolean defaultValue) {
+ try {
+ return getBoolean(key);
+ } catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+
+ /**
+ * Put a key/value pair in the JSONObject, where the value will be a
+ * JSONArray which is produced from a Collection.
+ * @param key A key string.
+ * @param value A Collection value.
+ * @return this.
+ * @throws JSONException
+ */
+ public JSONObject put(String key, Collection value) throws JSONException {
+ put(key, new JSONArray(value));
+ return this;
+ }
+
+
+ /**
+ * Get an optional double associated with a key,
+ * or NaN if there is no such key or if its value is not a number.
+ * If the value is a string, an attempt will be made to evaluate it as
+ * a number.
+ *
+ * @param key A string which is the key.
+ * @return An object which is the value.
+ */
+ public double optDouble(String key) {
+ return optDouble(key, Double.NaN);
+ }
+
+
+ /**
+ * Get an optional double associated with a key, or the
+ * defaultValue if there is no such key or if its value is not a number.
+ * If the value is a string, an attempt will be made to evaluate it as
+ * a number.
+ *
+ * @param key A key string.
+ * @param defaultValue The default.
+ * @return An object which is the value.
+ */
+ public double optDouble(String key, double defaultValue) {
+ try {
+ Object o = opt(key);
+ return o instanceof Number ? ((Number)o).doubleValue() :
+ new Double((String)o).doubleValue();
+ } catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+
+ /**
+ * Get an optional int value associated with a key,
+ * or zero if there is no such key or if the value is not a number.
+ * If the value is a string, an attempt will be made to evaluate it as
+ * a number.
+ *
+ * @param key A key string.
+ * @return An object which is the value.
+ */
+ public int optInt(String key) {
+ return optInt(key, 0);
+ }
+
+
+ /**
+ * Get an optional int value associated with a key,
+ * or the default if there is no such key or if the value is not a number.
+ * If the value is a string, an attempt will be made to evaluate it as
+ * a number.
+ *
+ * @param key A key string.
+ * @param defaultValue The default.
+ * @return An object which is the value.
+ */
+ public int optInt(String key, int defaultValue) {
+ try {
+ return getInt(key);
+ } catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+
+ /**
+ * Get an optional JSONArray associated with a key.
+ * It returns null if there is no such key, or if its value is not a
+ * JSONArray.
+ *
+ * @param key A key string.
+ * @return A JSONArray which is the value.
+ */
+ public JSONArray optJSONArray(String key) {
+ Object o = opt(key);
+ return o instanceof JSONArray ? (JSONArray)o : null;
+ }
+
+
+ /**
+ * Get an optional JSONObject associated with a key.
+ * It returns null if there is no such key, or if its value is not a
+ * JSONObject.
+ *
+ * @param key A key string.
+ * @return A JSONObject which is the value.
+ */
+ public JSONObject optJSONObject(String key) {
+ Object o = opt(key);
+ return o instanceof JSONObject ? (JSONObject)o : null;
+ }
+
+
+ /**
+ * Get an optional long value associated with a key,
+ * or zero if there is no such key or if the value is not a number.
+ * If the value is a string, an attempt will be made to evaluate it as
+ * a number.
+ *
+ * @param key A key string.
+ * @return An object which is the value.
+ */
+ public long optLong(String key) {
+ return optLong(key, 0);
+ }
+
+
+ /**
+ * Get an optional long value associated with a key,
+ * or the default if there is no such key or if the value is not a number.
+ * If the value is a string, an attempt will be made to evaluate it as
+ * a number.
+ *
+ * @param key A key string.
+ * @param defaultValue The default.
+ * @return An object which is the value.
+ */
+ public long optLong(String key, long defaultValue) {
+ try {
+ return getLong(key);
+ } catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+
+ /**
+ * Get an optional string associated with a key.
+ * It returns an empty string if there is no such key. If the value is not
+ * a string and is not null, then it is coverted to a string.
+ *
+ * @param key A key string.
+ * @return A string which is the value.
+ */
+ public String optString(String key) {
+ return optString(key, "");
+ }
+
+
+ /**
+ * Get an optional string associated with a key.
+ * It returns the defaultValue if there is no such key.
+ *
+ * @param key A key string.
+ * @param defaultValue The default.
+ * @return A string which is the value.
+ */
+ public String optString(String key, String defaultValue) {
+ Object o = opt(key);
+ return o != null ? o.toString() : defaultValue;
+ }
+
+
+ /**
+ * Put a key/boolean pair in the JSONObject.
+ *
+ * @param key A key string.
+ * @param value A boolean which is the value.
+ * @return this.
+ * @throws JSONException If the key is null.
+ */
+ public JSONObject put(String key, boolean value) throws JSONException {
+ put(key, value ? Boolean.TRUE : Boolean.FALSE);
+ return this;
+ }
+
+
+ /**
+ * Put a key/double pair in the JSONObject.
+ *
+ * @param key A key string.
+ * @param value A double which is the value.
+ * @return this.
+ * @throws JSONException If the key is null or if the number is invalid.
+ */
+ public JSONObject put(String key, double value) throws JSONException {
+ put(key, new Double(value));
+ return this;
+ }
+
+
+ /**
+ * Put a key/int pair in the JSONObject.
+ *
+ * @param key A key string.
+ * @param value An int which is the value.
+ * @return this.
+ * @throws JSONException If the key is null.
+ */
+ public JSONObject put(String key, int value) throws JSONException {
+ put(key, new Integer(value));
+ return this;
+ }
+
+
+ /**
+ * Put a key/long pair in the JSONObject.
+ *
+ * @param key A key string.
+ * @param value A long which is the value.
+ * @return this.
+ * @throws JSONException If the key is null.
+ */
+ public JSONObject put(String key, long value) throws JSONException {
+ put(key, new Long(value));
+ return this;
+ }
+
+
+ /**
+ * Put a key/value pair in the JSONObject, where the value will be a
+ * JSONObject which is produced from a Map.
+ * @param key A key string.
+ * @param value A Map value.
+ * @return this.
+ * @throws JSONException
+ */
+ public JSONObject put(String key, Map value) throws JSONException {
+ put(key, new JSONObject(value));
+ return this;
+ }
+
+
+ /**
+ * Put a key/value pair in the JSONObject. If the value is null,
+ * then the key will be removed from the JSONObject if it is present.
+ * @param key A key string.
+ * @param value An object which is the value. It should be of one of these
+ * types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
+ * or the JSONObject.NULL object.
+ * @return this.
+ * @throws JSONException If the value is non-finite number
+ * or if the key is null.
+ */
+ public JSONObject put(String key, Object value) throws JSONException {
+ if (key == null) {
+ throw new JSONException("Null key.");
+ }
+ if (value != null) {
+ testValidity(value);
+ this.map.put(key, value);
+ } else {
+ remove(key);
+ }
+ return this;
+ }
+
+
+ /**
+ * Put a key/value pair in the JSONObject, but only if the key and the
+ * value are both non-null, and only if there is not already a member
+ * with that name.
+ * @param key
+ * @param value
+ * @return his.
+ * @throws JSONException if the key is a duplicate
+ */
+ public JSONObject putOnce(String key, Object value) throws JSONException {
+ if (key != null && value != null) {
+ if (opt(key) != null) {
+ throw new JSONException("Duplicate key \"" + key + "\"");
+ }
+ put(key, value);
+ }
+ return this;
+ }
+
+
+ /**
+ * Put a key/value pair in the JSONObject, but only if the
+ * key and the value are both non-null.
+ * @param key A key string.
+ * @param value An object which is the value. It should be of one of these
+ * types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
+ * or the JSONObject.NULL object.
+ * @return this.
+ * @throws JSONException If the value is a non-finite number.
+ */
+ public JSONObject putOpt(String key, Object value) throws JSONException {
+ if (key != null && value != null) {
+ put(key, value);
+ }
+ return this;
+ }
+
+
+ /**
+ * Produce a string in double quotes with backslash sequences in all the
+ * right places. A backslash will be inserted within </, allowing JSON
+ * text to be delivered in HTML. In JSON text, a string cannot contain a
+ * control character or an unescaped quote or backslash.
+ * @param string A String
+ * @return A String correctly formatted for insertion in a JSON text.
+ */
+ public static String quote(String string) {
+ if (string == null || string.length() == 0) {
+ return "\"\"";
+ }
+
+ char b;
+ char c = 0;
+ int i;
+ int len = string.length();
+ StringBuffer sb = new StringBuffer(len + 4);
+ String t;
+
+ sb.append('"');
+ for (i = 0; i < len; i += 1) {
+ b = c;
+ c = string.charAt(i);
+ switch (c) {
+ case '\\':
+ case '"':
+ sb.append('\\');
+ sb.append(c);
+ break;
+ case '/':
+ if (b == '<') {
+ sb.append('\\');
+ }
+ sb.append(c);
+ break;
+ case '\b':
+ sb.append("\\b");
+ break;
+ case '\t':
+ sb.append("\\t");
+ break;
+ case '\n':
+ sb.append("\\n");
+ break;
+ case '\f':
+ sb.append("\\f");
+ break;
+ case '\r':
+ sb.append("\\r");
+ break;
+ default:
+ if (c < ' ' || (c >= '\u0080' && c < '\u00a0') ||
+ (c >= '\u2000' && c < '\u2100')) {
+ t = "000" + Integer.toHexString(c);
+ sb.append("\\u" + t.substring(t.length() - 4));
+ } else {
+ sb.append(c);
+ }
+ }
+ }
+ sb.append('"');
+ return sb.toString();
+ }
+
+ /**
+ * Remove a name and its value, if present.
+ * @param key The name to be removed.
+ * @return The value that was associated with the name,
+ * or null if there was no value.
+ */
+ public Object remove(String key) {
+ return this.map.remove(key);
+ }
+
+ /**
+ * Get an enumeration of the keys of the JSONObject.
+ * The keys will be sorted alphabetically.
+ *
+ * @return An iterator of the keys.
+ */
+ public Iterator sortedKeys() {
+ return new TreeSet(this.map.keySet()).iterator();
+ }
+
+ /**
+ * Try to convert a string into a number, boolean, or null. If the string
+ * can't be converted, return the string.
+ * @param s A String.
+ * @return A simple JSON value.
+ */
+ static public Object stringToValue(String s) {
+ if (s.equals("")) {
+ return s;
+ }
+ if (s.equalsIgnoreCase("true")) {
+ return Boolean.TRUE;
+ }
+ if (s.equalsIgnoreCase("false")) {
+ return Boolean.FALSE;
+ }
+ if (s.equalsIgnoreCase("null")) {
+ return JSONObject.NULL;
+ }
+
+ /*
+ * If it might be a number, try converting it. We support the 0- and 0x-
+ * conventions. If a number cannot be produced, then the value will just
+ * be a string. Note that the 0-, 0x-, plus, and implied string
+ * conventions are non-standard. A JSON parser is free to accept
+ * non-JSON forms as long as it accepts all correct JSON forms.
+ */
+
+ char b = s.charAt(0);
+ if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+') {
+ if (b == '0') {
+ if (s.length() > 2 &&
+ (s.charAt(1) == 'x' || s.charAt(1) == 'X')) {
+ try {
+ return new Integer(Integer.parseInt(s.substring(2),
+ 16));
+ } catch (Exception e) {
+ /* Ignore the error */
+ }
+ } else {
+ try {
+ return new Integer(Integer.parseInt(s, 8));
+ } catch (Exception e) {
+ /* Ignore the error */
+ }
+ }
+ }
+ try {
+ return new Integer(s);
+ } catch (Exception e) {
+ try {
+ return new Long(s);
+ } catch (Exception f) {
+ try {
+ return new Double(s);
+ } catch (Exception g) {
+ /* Ignore the error */
+ }
+ }
+ }
+ }
+ return s;
+ }
+
+
+ /**
+ * Throw an exception if the object is an NaN or infinite number.
+ * @param o The object to test.
+ * @throws JSONException If o is a non-finite number.
+ */
+ static void testValidity(Object o) throws JSONException {
+ if (o != null) {
+ if (o instanceof Double) {
+ if (((Double)o).isInfinite() || ((Double)o).isNaN()) {
+ throw new JSONException(
+ "JSON does not allow non-finite numbers.");
+ }
+ } else if (o instanceof Float) {
+ if (((Float)o).isInfinite() || ((Float)o).isNaN()) {
+ throw new JSONException(
+ "JSON does not allow non-finite numbers.");
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Produce a JSONArray containing the values of the members of this
+ * JSONObject.
+ * @param names A JSONArray containing a list of key strings. This
+ * determines the sequence of the values in the result.
+ * @return A JSONArray of values.
+ * @throws JSONException If any of the values are non-finite numbers.
+ */
+ public JSONArray toJSONArray(JSONArray names) throws JSONException {
+ if (names == null || names.length() == 0) {
+ return null;
+ }
+ JSONArray ja = new JSONArray();
+ for (int i = 0; i < names.length(); i += 1) {
+ ja.put(this.opt(names.getString(i)));
+ }
+ return ja;
+ }
+
+ /**
+ * Make a JSON text of this JSONObject. For compactness, no whitespace
+ * is added. If this would not result in a syntactically correct JSON text,
+ * then null will be returned instead.
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ *
+ * @return a printable, displayable, portable, transmittable
+ * representation of the object, beginning
+ * with <code>{</code> <small>(left brace)</small> and ending
+ * with <code>}</code> <small>(right brace)</small>.
+ */
+ public String toString() {
+ try {
+ Iterator keys = keys();
+ StringBuffer sb = new StringBuffer("{");
+
+ while (keys.hasNext()) {
+ if (sb.length() > 1) {
+ sb.append(',');
+ }
+ Object o = keys.next();
+ sb.append(quote(o.toString()));
+ sb.append(':');
+ sb.append(valueToString(this.map.get(o)));
+ }
+ sb.append('}');
+ return sb.toString();
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+
+ /**
+ * Make a prettyprinted JSON text of this JSONObject.
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ * @param indentFactor The number of spaces to add to each level of
+ * indentation.
+ * @return a printable, displayable, portable, transmittable
+ * representation of the object, beginning
+ * with <code>{</code> <small>(left brace)</small> and ending
+ * with <code>}</code> <small>(right brace)</small>.
+ * @throws JSONException If the object contains an invalid number.
+ */
+ public String toString(int indentFactor) throws JSONException {
+ return toString(indentFactor, 0);
+ }
+
+
+ /**
+ * Make a prettyprinted JSON text of this JSONObject.
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ * @param indentFactor The number of spaces to add to each level of
+ * indentation.
+ * @param indent The indentation of the top level.
+ * @return a printable, displayable, transmittable
+ * representation of the object, beginning
+ * with <code>{</code> <small>(left brace)</small> and ending
+ * with <code>}</code> <small>(right brace)</small>.
+ * @throws JSONException If the object contains an invalid number.
+ */
+ String toString(int indentFactor, int indent) throws JSONException {
+ int j;
+ int n = length();
+ if (n == 0) {
+ return "{}";
+ }
+ Iterator keys = sortedKeys();
+ StringBuffer sb = new StringBuffer("{");
+ int newindent = indent + indentFactor;
+ Object o;
+ if (n == 1) {
+ o = keys.next();
+ sb.append(quote(o.toString()));
+ sb.append(": ");
+ sb.append(valueToString(this.map.get(o), indentFactor,
+ indent));
+ } else {
+ while (keys.hasNext()) {
+ o = keys.next();
+ if (sb.length() > 1) {
+ sb.append(",\n");
+ } else {
+ sb.append('\n');
+ }
+ for (j = 0; j < newindent; j += 1) {
+ sb.append(' ');
+ }
+ sb.append(quote(o.toString()));
+ sb.append(": ");
+ sb.append(valueToString(this.map.get(o), indentFactor,
+ newindent));
+ }
+ if (sb.length() > 1) {
+ sb.append('\n');
+ for (j = 0; j < indent; j += 1) {
+ sb.append(' ');
+ }
+ }
+ }
+ sb.append('}');
+ return sb.toString();
+ }
+
+
+ /**
+ * Make a JSON text of an Object value. If the object has an
+ * value.toJSONString() method, then that method will be used to produce
+ * the JSON text. The method is required to produce a strictly
+ * conforming text. If the object does not contain a toJSONString
+ * method (which is the most common case), then a text will be
+ * produced by other means. If the value is an array or Collection,
+ * then a JSONArray will be made from it and its toJSONString method
+ * will be called. If the value is a MAP, then a JSONObject will be made
+ * from it and its toJSONString method will be called. Otherwise, the
+ * value's toString method will be called, and the result will be quoted.
+ *
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ * @param value The value to be serialized.
+ * @return a printable, displayable, transmittable
+ * representation of the object, beginning
+ * with <code>{</code> <small>(left brace)</small> and ending
+ * with <code>}</code> <small>(right brace)</small>.
+ * @throws JSONException If the value is or contains an invalid number.
+ */
+ static String valueToString(Object value) throws JSONException {
+ if (value == null || value.equals(null)) {
+ return "null";
+ }
+ if (value instanceof JSONString) {
+ Object o;
+ try {
+ o = ((JSONString)value).toJSONString();
+ } catch (Exception e) {
+ throw new JSONException(e);
+ }
+ if (o instanceof String) {
+ return (String)o;
+ }
+ throw new JSONException("Bad value from toJSONString: " + o);
+ }
+ if (value instanceof Number) {
+ return numberToString((Number) value);
+ }
+ if (value instanceof Boolean || value instanceof JSONObject ||
+ value instanceof JSONArray) {
+ return value.toString();
+ }
+ if (value instanceof Map) {
+ return new JSONObject((Map)value).toString();
+ }
+ if (value instanceof Collection) {
+ return new JSONArray((Collection)value).toString();
+ }
+ if (value.getClass().isArray()) {
+ return new JSONArray(value).toString();
+ }
+ return quote(value.toString());
+ }
+
+
+ /**
+ * Make a prettyprinted JSON text of an object value.
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ * @param value The value to be serialized.
+ * @param indentFactor The number of spaces to add to each level of
+ * indentation.
+ * @param indent The indentation of the top level.
+ * @return a printable, displayable, transmittable
+ * representation of the object, beginning
+ * with <code>{</code> <small>(left brace)</small> and ending
+ * with <code>}</code> <small>(right brace)</small>.
+ * @throws JSONException If the object contains an invalid number.
+ */
+ static String valueToString(Object value, int indentFactor, int indent)
+ throws JSONException {
+ if (value == null || value.equals(null)) {
+ return "null";
+ }
+ try {
+ if (value instanceof JSONString) {
+ Object o = ((JSONString)value).toJSONString();
+ if (o instanceof String) {
+ return (String)o;
+ }
+ }
+ } catch (Exception e) {
+ /* forget about it */
+ }
+ if (value instanceof Number) {
+ return numberToString((Number) value);
+ }
+ if (value instanceof Boolean) {
+ return value.toString();
+ }
+ if (value instanceof JSONObject) {
+ return ((JSONObject)value).toString(indentFactor, indent);
+ }
+ if (value instanceof JSONArray) {
+ return ((JSONArray)value).toString(indentFactor, indent);
+ }
+ if (value instanceof Map) {
+ return new JSONObject((Map)value).toString(indentFactor, indent);
+ }
+ if (value instanceof Collection) {
+ return new JSONArray((Collection)value).toString(indentFactor, indent);
+ }
+ if (value.getClass().isArray()) {
+ return new JSONArray(value).toString(indentFactor, indent);
+ }
+ return quote(value.toString());
+ }
+
+
+ /**
+ * Write the contents of the JSONObject as JSON text to a writer.
+ * For compactness, no whitespace is added.
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ *
+ * @return The writer.
+ * @throws JSONException
+ */
+ public Writer write(Writer writer) throws JSONException {
+ try {
+ boolean b = false;
+ Iterator keys = keys();
+ writer.write('{');
+
+ while (keys.hasNext()) {
+ if (b) {
+ writer.write(',');
+ }
+ Object k = keys.next();
+ writer.write(quote(k.toString()));
+ writer.write(':');
+ Object v = this.map.get(k);
+ if (v instanceof JSONObject) {
+ ((JSONObject)v).write(writer);
+ } else if (v instanceof JSONArray) {
+ ((JSONArray)v).write(writer);
+ } else {
+ writer.write(valueToString(v));
+ }
+ b = true;
+ }
+ writer.write('}');
+ return writer;
+ } catch (IOException e) {
+ throw new JSONException(e);
+ }
+ }
+}
\ No newline at end of file
Added: projects/gwt-console/trunk/war/src/main/java/org/json/JSONString.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/JSONString.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/JSONString.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -0,0 +1,18 @@
+package org.json;
+/**
+ * The <code>JSONString</code> interface allows a <code>toJSONString()</code>
+ * method so that a class can change the behavior of
+ * <code>JSONObject.toString()</code>, <code>JSONArray.toString()</code>,
+ * and <code>JSONWriter.value(</code>Object<code>)</code>. The
+ * <code>toJSONString</code> method will be used instead of the default behavior
+ * of using the Object's <code>toString()</code> method and quoting the result.
+ */
+public interface JSONString {
+ /**
+ * The <code>toJSONString</code> method allows a class to produce its own JSON
+ * serialization.
+ *
+ * @return A strictly syntactically correct JSON text.
+ */
+ public String toJSONString();
+}
Added: projects/gwt-console/trunk/war/src/main/java/org/json/JSONStringer.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/JSONStringer.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/JSONStringer.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -0,0 +1,78 @@
+package org.json;
+
+/*
+Copyright (c) 2006 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+import java.io.StringWriter;
+
+/**
+ * JSONStringer provides a quick and convenient way of producing JSON text.
+ * The texts produced strictly conform to JSON syntax rules. No whitespace is
+ * added, so the results are ready for transmission or storage. Each instance of
+ * JSONStringer can produce one JSON text.
+ * <p>
+ * A JSONStringer instance provides a <code>value</code> method for appending
+ * values to the
+ * text, and a <code>key</code>
+ * method for adding keys before values in objects. There are <code>array</code>
+ * and <code>endArray</code> methods that make and bound array values, and
+ * <code>object</code> and <code>endObject</code> methods which make and bound
+ * object values. All of these methods return the JSONWriter instance,
+ * permitting cascade style. For example, <pre>
+ * myString = new JSONStringer()
+ * .object()
+ * .key("JSON")
+ * .value("Hello, World!")
+ * .endObject()
+ * .toString();</pre> which produces the string <pre>
+ * {"JSON":"Hello, World!"}</pre>
+ * <p>
+ * The first method called must be <code>array</code> or <code>object</code>.
+ * There are no methods for adding commas or colons. JSONStringer adds them for
+ * you. Objects and arrays can be nested up to 20 levels deep.
+ * <p>
+ * This can sometimes be easier than using a JSONObject to build a string.
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class JSONStringer extends JSONWriter {
+ /**
+ * Make a fresh JSONStringer. It can be used to build one JSON text.
+ */
+ public JSONStringer() {
+ super(new StringWriter());
+ }
+
+ /**
+ * Return the JSON text. This method is used to obtain the product of the
+ * JSONStringer instance. It will return <code>null</code> if there was a
+ * problem in the construction of the JSON text (such as the calls to
+ * <code>array</code> were not properly balanced with calls to
+ * <code>endArray</code>).
+ * @return The JSON text.
+ */
+ public String toString() {
+ return this.mode == 'd' ? this.writer.toString() : null;
+ }
+}
Added: projects/gwt-console/trunk/war/src/main/java/org/json/JSONTokener.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/JSONTokener.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/JSONTokener.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -0,0 +1,422 @@
+package org.json;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+
+/*
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+/**
+ * A JSONTokener takes a source string and extracts characters and tokens from
+ * it. It is used by the JSONObject and JSONArray constructors to parse
+ * JSON source strings.
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class JSONTokener {
+
+ private int index;
+ private Reader reader;
+ private char lastChar;
+ private boolean useLastChar;
+
+
+ /**
+ * Construct a JSONTokener from a string.
+ *
+ * @param reader A reader.
+ */
+ public JSONTokener(Reader reader) {
+ this.reader = reader.markSupported() ?
+ reader : new BufferedReader(reader);
+ this.useLastChar = false;
+ this.index = 0;
+ }
+
+
+ /**
+ * Construct a JSONTokener from a string.
+ *
+ * @param s A source string.
+ */
+ public JSONTokener(String s) {
+ this(new StringReader(s));
+ }
+
+
+ /**
+ * Back up one character. This provides a sort of lookahead capability,
+ * so that you can test for a digit or letter before attempting to parse
+ * the next number or identifier.
+ */
+ public void back() throws JSONException {
+ if (useLastChar || index <= 0) {
+ throw new JSONException("Stepping back two steps is not supported");
+ }
+ index -= 1;
+ useLastChar = true;
+ }
+
+
+
+ /**
+ * Get the hex value of a character (base16).
+ * @param c A character between '0' and '9' or between 'A' and 'F' or
+ * between 'a' and 'f'.
+ * @return An int between 0 and 15, or -1 if c was not a hex digit.
+ */
+ public static int dehexchar(char c) {
+ if (c >= '0' && c <= '9') {
+ return c - '0';
+ }
+ if (c >= 'A' && c <= 'F') {
+ return c - ('A' - 10);
+ }
+ if (c >= 'a' && c <= 'f') {
+ return c - ('a' - 10);
+ }
+ return -1;
+ }
+
+
+ /**
+ * Determine if the source string still contains characters that next()
+ * can consume.
+ * @return true if not yet at the end of the source.
+ */
+ public boolean more() throws JSONException {
+ char nextChar = next();
+ if (nextChar == 0) {
+ return false;
+ }
+ back();
+ return true;
+ }
+
+
+ /**
+ * Get the next character in the source string.
+ *
+ * @return The next character, or 0 if past the end of the source string.
+ */
+ public char next() throws JSONException {
+ if (this.useLastChar) {
+ this.useLastChar = false;
+ if (this.lastChar != 0) {
+ this.index += 1;
+ }
+ return this.lastChar;
+ }
+ int c;
+ try {
+ c = this.reader.read();
+ } catch (IOException exc) {
+ throw new JSONException(exc);
+ }
+
+ if (c <= 0) { // End of stream
+ this.lastChar = 0;
+ return 0;
+ }
+ this.index += 1;
+ this.lastChar = (char) c;
+ return this.lastChar;
+ }
+
+
+ /**
+ * Consume the next character, and check that it matches a specified
+ * character.
+ * @param c The character to match.
+ * @return The character.
+ * @throws JSONException if the character does not match.
+ */
+ public char next(char c) throws JSONException {
+ char n = next();
+ if (n != c) {
+ throw syntaxError("Expected '" + c + "' and instead saw '" +
+ n + "'");
+ }
+ return n;
+ }
+
+
+ /**
+ * Get the next n characters.
+ *
+ * @param n The number of characters to take.
+ * @return A string of n characters.
+ * @throws JSONException
+ * Substring bounds error if there are not
+ * n characters remaining in the source string.
+ */
+ public String next(int n) throws JSONException {
+ if (n == 0) {
+ return "";
+ }
+
+ char[] buffer = new char[n];
+ int pos = 0;
+
+ if (this.useLastChar) {
+ this.useLastChar = false;
+ buffer[0] = this.lastChar;
+ pos = 1;
+ }
+
+ try {
+ int len;
+ while ((pos < n) && ((len = reader.read(buffer, pos, n - pos)) != -1)) {
+ pos += len;
+ }
+ } catch (IOException exc) {
+ throw new JSONException(exc);
+ }
+ this.index += pos;
+
+ if (pos < n) {
+ throw syntaxError("Substring bounds error");
+ }
+
+ this.lastChar = buffer[n - 1];
+ return new String(buffer);
+ }
+
+
+ /**
+ * Get the next char in the string, skipping whitespace.
+ * @throws JSONException
+ * @return A character, or 0 if there are no more characters.
+ */
+ public char nextClean() throws JSONException {
+ for (;;) {
+ char c = next();
+ if (c == 0 || c > ' ') {
+ return c;
+ }
+ }
+ }
+
+
+ /**
+ * Return the characters up to the next close quote character.
+ * Backslash processing is done. The formal JSON format does not
+ * allow strings in single quotes, but an implementation is allowed to
+ * accept them.
+ * @param quote The quoting character, either
+ * <code>"</code> <small>(double quote)</small> or
+ * <code>'</code> <small>(single quote)</small>.
+ * @return A String.
+ * @throws JSONException Unterminated string.
+ */
+ public String nextString(char quote) throws JSONException {
+ char c;
+ StringBuffer sb = new StringBuffer();
+ for (;;) {
+ c = next();
+ switch (c) {
+ case 0:
+ case '\n':
+ case '\r':
+ throw syntaxError("Unterminated string");
+ case '\\':
+ c = next();
+ switch (c) {
+ case 'b':
+ sb.append('\b');
+ break;
+ case 't':
+ sb.append('\t');
+ break;
+ case 'n':
+ sb.append('\n');
+ break;
+ case 'f':
+ sb.append('\f');
+ break;
+ case 'r':
+ sb.append('\r');
+ break;
+ case 'u':
+ sb.append((char)Integer.parseInt(next(4), 16));
+ break;
+ case 'x' :
+ sb.append((char) Integer.parseInt(next(2), 16));
+ break;
+ default:
+ sb.append(c);
+ }
+ break;
+ default:
+ if (c == quote) {
+ return sb.toString();
+ }
+ sb.append(c);
+ }
+ }
+ }
+
+
+ /**
+ * Get the text up but not including the specified character or the
+ * end of line, whichever comes first.
+ * @param d A delimiter character.
+ * @return A string.
+ */
+ public String nextTo(char d) throws JSONException {
+ StringBuffer sb = new StringBuffer();
+ for (;;) {
+ char c = next();
+ if (c == d || c == 0 || c == '\n' || c == '\r') {
+ if (c != 0) {
+ back();
+ }
+ return sb.toString().trim();
+ }
+ sb.append(c);
+ }
+ }
+
+
+ /**
+ * Get the text up but not including one of the specified delimiter
+ * characters or the end of line, whichever comes first.
+ * @param delimiters A set of delimiter characters.
+ * @return A string, trimmed.
+ */
+ public String nextTo(String delimiters) throws JSONException {
+ char c;
+ StringBuffer sb = new StringBuffer();
+ for (;;) {
+ c = next();
+ if (delimiters.indexOf(c) >= 0 || c == 0 ||
+ c == '\n' || c == '\r') {
+ if (c != 0) {
+ back();
+ }
+ return sb.toString().trim();
+ }
+ sb.append(c);
+ }
+ }
+
+
+ /**
+ * Get the next value. The value can be a Boolean, Double, Integer,
+ * JSONArray, JSONObject, Long, or String, or the JSONObject.NULL object.
+ * @throws JSONException If syntax error.
+ *
+ * @return An object.
+ */
+ public Object nextValue() throws JSONException {
+ char c = nextClean();
+ String s;
+
+ switch (c) {
+ case '"':
+ case '\'':
+ return nextString(c);
+ case '{':
+ back();
+ return new JSONObject(this);
+ case '[':
+ case '(':
+ back();
+ return new JSONArray(this);
+ }
+
+ /*
+ * Handle unquoted text. This could be the values true, false, or
+ * null, or it can be a number. An implementation (such as this one)
+ * is allowed to also accept non-standard forms.
+ *
+ * Accumulate characters until we reach the end of the text or a
+ * formatting character.
+ */
+
+ StringBuffer sb = new StringBuffer();
+ while (c >= ' ' && ",:]}/\\\"[{;=#".indexOf(c) < 0) {
+ sb.append(c);
+ c = next();
+ }
+ back();
+
+ s = sb.toString().trim();
+ if (s.equals("")) {
+ throw syntaxError("Missing value");
+ }
+ return JSONObject.stringToValue(s);
+ }
+
+
+ /**
+ * Skip characters until the next character is the requested character.
+ * If the requested character is not found, no characters are skipped.
+ * @param to A character to skip to.
+ * @return The requested character, or zero if the requested character
+ * is not found.
+ */
+ public char skipTo(char to) throws JSONException {
+ char c;
+ try {
+ int startIndex = this.index;
+ reader.mark(Integer.MAX_VALUE);
+ do {
+ c = next();
+ if (c == 0) {
+ reader.reset();
+ this.index = startIndex;
+ return c;
+ }
+ } while (c != to);
+ } catch (IOException exc) {
+ throw new JSONException(exc);
+ }
+
+ back();
+ return c;
+ }
+
+ /**
+ * Make a JSONException to signal a syntax error.
+ *
+ * @param message The error message.
+ * @return A JSONException object, suitable for throwing
+ */
+ public JSONException syntaxError(String message) {
+ return new JSONException(message + toString());
+ }
+
+
+ /**
+ * Make a printable string of this JSONTokener.
+ *
+ * @return " at character [this.index]"
+ */
+ public String toString() {
+ return " at character " + index;
+ }
+}
\ No newline at end of file
Added: projects/gwt-console/trunk/war/src/main/java/org/json/JSONWriter.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/JSONWriter.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/JSONWriter.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -0,0 +1,323 @@
+package org.json;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/*
+Copyright (c) 2006 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+/**
+ * JSONWriter provides a quick and convenient way of producing JSON text.
+ * The texts produced strictly conform to JSON syntax rules. No whitespace is
+ * added, so the results are ready for transmission or storage. Each instance of
+ * JSONWriter can produce one JSON text.
+ * <p>
+ * A JSONWriter instance provides a <code>value</code> method for appending
+ * values to the
+ * text, and a <code>key</code>
+ * method for adding keys before values in objects. There are <code>array</code>
+ * and <code>endArray</code> methods that make and bound array values, and
+ * <code>object</code> and <code>endObject</code> methods which make and bound
+ * object values. All of these methods return the JSONWriter instance,
+ * permitting a cascade style. For example, <pre>
+ * new JSONWriter(myWriter)
+ * .object()
+ * .key("JSON")
+ * .value("Hello, World!")
+ * .endObject();</pre> which writes <pre>
+ * {"JSON":"Hello, World!"}</pre>
+ * <p>
+ * The first method called must be <code>array</code> or <code>object</code>.
+ * There are no methods for adding commas or colons. JSONWriter adds them for
+ * you. Objects and arrays can be nested up to 20 levels deep.
+ * <p>
+ * This can sometimes be easier than using a JSONObject to build a string.
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class JSONWriter {
+ private static final int maxdepth = 20;
+
+ /**
+ * The comma flag determines if a comma should be output before the next
+ * value.
+ */
+ private boolean comma;
+
+ /**
+ * The current mode. Values:
+ * 'a' (array),
+ * 'd' (done),
+ * 'i' (initial),
+ * 'k' (key),
+ * 'o' (object).
+ */
+ protected char mode;
+
+ /**
+ * The object/array stack.
+ */
+ private JSONObject stack[];
+
+ /**
+ * The stack top index. A value of 0 indicates that the stack is empty.
+ */
+ private int top;
+
+ /**
+ * The writer that will receive the output.
+ */
+ protected Writer writer;
+
+ /**
+ * Make a fresh JSONWriter. It can be used to build one JSON text.
+ */
+ public JSONWriter(Writer w) {
+ this.comma = false;
+ this.mode = 'i';
+ this.stack = new JSONObject[maxdepth];
+ this.top = 0;
+ this.writer = w;
+ }
+
+ /**
+ * Append a value.
+ * @param s A string value.
+ * @return this
+ * @throws JSONException If the value is out of sequence.
+ */
+ private JSONWriter append(String s) throws JSONException {
+ if (s == null) {
+ throw new JSONException("Null pointer");
+ }
+ if (this.mode == 'o' || this.mode == 'a') {
+ try {
+ if (this.comma && this.mode == 'a') {
+ this.writer.write(',');
+ }
+ this.writer.write(s);
+ } catch (IOException e) {
+ throw new JSONException(e);
+ }
+ if (this.mode == 'o') {
+ this.mode = 'k';
+ }
+ this.comma = true;
+ return this;
+ }
+ throw new JSONException("Value out of sequence.");
+ }
+
+ /**
+ * Begin appending a new array. All values until the balancing
+ * <code>endArray</code> will be appended to this array. The
+ * <code>endArray</code> method must be called to mark the array's end.
+ * @return this
+ * @throws JSONException If the nesting is too deep, or if the object is
+ * started in the wrong place (for example as a key or after the end of the
+ * outermost array or object).
+ */
+ public JSONWriter array() throws JSONException {
+ if (this.mode == 'i' || this.mode == 'o' || this.mode == 'a') {
+ this.push(null);
+ this.append("[");
+ this.comma = false;
+ return this;
+ }
+ throw new JSONException("Misplaced array.");
+ }
+
+ /**
+ * End something.
+ * @param m Mode
+ * @param c Closing character
+ * @return this
+ * @throws JSONException If unbalanced.
+ */
+ private JSONWriter end(char m, char c) throws JSONException {
+ if (this.mode != m) {
+ throw new JSONException(m == 'o' ? "Misplaced endObject." :
+ "Misplaced endArray.");
+ }
+ this.pop(m);
+ try {
+ this.writer.write(c);
+ } catch (IOException e) {
+ throw new JSONException(e);
+ }
+ this.comma = true;
+ return this;
+ }
+
+ /**
+ * End an array. This method most be called to balance calls to
+ * <code>array</code>.
+ * @return this
+ * @throws JSONException If incorrectly nested.
+ */
+ public JSONWriter endArray() throws JSONException {
+ return this.end('a', ']');
+ }
+
+ /**
+ * End an object. This method most be called to balance calls to
+ * <code>object</code>.
+ * @return this
+ * @throws JSONException If incorrectly nested.
+ */
+ public JSONWriter endObject() throws JSONException {
+ return this.end('k', '}');
+ }
+
+ /**
+ * Append a key. The key will be associated with the next value. In an
+ * object, every value must be preceded by a key.
+ * @param s A key string.
+ * @return this
+ * @throws JSONException If the key is out of place. For example, keys
+ * do not belong in arrays or if the key is null.
+ */
+ public JSONWriter key(String s) throws JSONException {
+ if (s == null) {
+ throw new JSONException("Null key.");
+ }
+ if (this.mode == 'k') {
+ try {
+ if (this.comma) {
+ this.writer.write(',');
+ }
+ stack[top - 1].putOnce(s, Boolean.TRUE);
+ this.writer.write(JSONObject.quote(s));
+ this.writer.write(':');
+ this.comma = false;
+ this.mode = 'o';
+ return this;
+ } catch (IOException e) {
+ throw new JSONException(e);
+ }
+ }
+ throw new JSONException("Misplaced key.");
+ }
+
+
+ /**
+ * Begin appending a new object. All keys and values until the balancing
+ * <code>endObject</code> will be appended to this object. The
+ * <code>endObject</code> method must be called to mark the object's end.
+ * @return this
+ * @throws JSONException If the nesting is too deep, or if the object is
+ * started in the wrong place (for example as a key or after the end of the
+ * outermost array or object).
+ */
+ public JSONWriter object() throws JSONException {
+ if (this.mode == 'i') {
+ this.mode = 'o';
+ }
+ if (this.mode == 'o' || this.mode == 'a') {
+ this.append("{");
+ this.push(new JSONObject());
+ this.comma = false;
+ return this;
+ }
+ throw new JSONException("Misplaced object.");
+
+ }
+
+
+ /**
+ * Pop an array or object scope.
+ * @param c The scope to close.
+ * @throws JSONException If nesting is wrong.
+ */
+ private void pop(char c) throws JSONException {
+ if (this.top <= 0) {
+ throw new JSONException("Nesting error.");
+ }
+ char m = this.stack[this.top - 1] == null ? 'a' : 'k';
+ if (m != c) {
+ throw new JSONException("Nesting error.");
+ }
+ this.top -= 1;
+ this.mode = this.top == 0 ? 'd' : this.stack[this.top - 1] == null ? 'a' : 'k';
+ }
+
+ /**
+ * Push an array or object scope.
+ * @param c The scope to open.
+ * @throws JSONException If nesting is too deep.
+ */
+ private void push(JSONObject jo) throws JSONException {
+ if (this.top >= maxdepth) {
+ throw new JSONException("Nesting too deep.");
+ }
+ this.stack[this.top] = jo;
+ this.mode = jo == null ? 'a' : 'k';
+ this.top += 1;
+ }
+
+
+ /**
+ * Append either the value <code>true</code> or the value
+ * <code>false</code>.
+ * @param b A boolean.
+ * @return this
+ * @throws JSONException
+ */
+ public JSONWriter value(boolean b) throws JSONException {
+ return this.append(b ? "true" : "false");
+ }
+
+ /**
+ * Append a double value.
+ * @param d A double.
+ * @return this
+ * @throws JSONException If the number is not finite.
+ */
+ public JSONWriter value(double d) throws JSONException {
+ return this.value(new Double(d));
+ }
+
+ /**
+ * Append a long value.
+ * @param l A long.
+ * @return this
+ * @throws JSONException
+ */
+ public JSONWriter value(long l) throws JSONException {
+ return this.append(Long.toString(l));
+ }
+
+
+ /**
+ * Append an object value.
+ * @param o The object to append. It can be null, or a Boolean, Number,
+ * String, JSONObject, or JSONArray, or an object with a toJSONString()
+ * method.
+ * @return this
+ * @throws JSONException If the value is out of sequence.
+ */
+ public JSONWriter value(Object o) throws JSONException {
+ return this.append(JSONObject.valueToString(o));
+ }
+}
Added: projects/gwt-console/trunk/war/src/main/java/org/json/Test.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/Test.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/Test.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -0,0 +1,619 @@
+package org.json;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+import java.io.StringWriter;
+
+/**
+ * Test class. This file is not formally a member of the org.json library.
+ * It is just a casual test tool.
+ */
+public class Test {
+
+ /**
+ * Entry point.
+ * @param args
+ */
+ public static void main(String args[]) {
+ Iterator it;
+ JSONArray a;
+ JSONObject j;
+ JSONStringer jj;
+ String s;
+
+/**
+ * Obj is a typical class that implements JSONString. It also
+ * provides some beanie methods that can be used to
+ * construct a JSONObject. It also demonstrates constructing
+ * a JSONObject with an array of names.
+ */
+ class Obj implements JSONString {
+ public String aString;
+ public double aNumber;
+ public boolean aBoolean;
+
+ public Obj(String string, double n, boolean b) {
+ this.aString = string;
+ this.aNumber = n;
+ this.aBoolean = b;
+ }
+
+ public double getNumber() {
+ return this.aNumber;
+ }
+
+ public String getString() {
+ return this.aString;
+ }
+
+ public boolean isBoolean() {
+ return this.aBoolean;
+ }
+
+ public String getBENT() {
+ return "All uppercase key";
+ }
+
+ public String getX() {
+ return "x";
+ }
+
+ public String toJSONString() {
+ return "{" + JSONObject.quote(this.aString) + ":" +
+ JSONObject.doubleToString(this.aNumber) + "}";
+ }
+ public String toString() {
+ return this.getString() + " " + this.getNumber() + " " +
+ this.isBoolean() + "." + this.getBENT() + " " + this.getX();
+ }
+ }
+
+ Obj obj = new Obj("A beany object", 42, true);
+
+ try {
+ j = XML.toJSONObject("<![CDATA[This is a collection of test patterns and examples for org.json.]]> Ignore the stuff past the end. ");
+ System.out.println(j.toString());
+
+ s = "<recipe name=\"bread\" prep_time=\"5 mins\" cook_time=\"3 hours\"> <title>Basic bread</title> <ingredient amount=\"8\" unit=\"dL\">Flour</ingredient> <ingredient amount=\"10\" unit=\"grams\">Yeast</ingredient> <ingredient amount=\"4\" unit=\"dL\" state=\"warm\">Water</ingredient> <ingredient amount=\"1\" unit=\"teaspoon\">Salt</ingredient> <instructions> <step>Mix all ingredients together.</step> <step>Knead thoroughly.</step> <step>Cover with a cloth, and leave for one hour in warm room.</step> <step>Knead again.</step> <step>Place in a bread baking tin.</step> <step>Cover with a cloth, and leave for one hour in warm room.</step> <step>Bake in the oven at 180(degrees)C for 30 minutes.</step> </instructions> </recipe> ";
+ j = XML.toJSONObject(s);
+ System.out.println(j.toString(4));
+ System.out.println();
+
+ j = JSONML.toJSONObject(s);
+ System.out.println(j.toString());
+ System.out.println(JSONML.toString(j));
+ System.out.println();
+
+ a = JSONML.toJSONArray(s);
+ System.out.println(a.toString(4));
+ System.out.println(JSONML.toString(a));
+ System.out.println();
+
+ s = "<div id=\"demo\" class=\"JSONML\"><p>JSONML is a transformation between <b>JSON</b> and <b>XML</b> that preserves ordering of document features.</p><p>JSONML can work with JSON arrays or JSON objects.</p><p>Three<br/>little<br/>words</p></div>";
+ j = JSONML.toJSONObject(s);
+ System.out.println(j.toString(4));
+ System.out.println(JSONML.toString(j));
+ System.out.println();
+
+ a = JSONML.toJSONArray(s);
+ System.out.println(a.toString(4));
+ System.out.println(JSONML.toString(a));
+ System.out.println();
+
+ s = "<person created=\"2006-11-11T19:23\" modified=\"2006-12-31T23:59\">\n <firstName>Robert</firstName>\n <lastName>Smith</lastName>\n <address type=\"home\">\n <street>12345 Sixth Ave</street>\n <city>Anytown</city>\n <state>CA</state>\n <postalCode>98765-4321</postalCode>\n </address>\n </person>";
+ j = XML.toJSONObject(s);
+ System.out.println(j.toString(4));
+
+ j = new JSONObject(obj);
+ System.out.println(j.toString());
+
+ s = "{ \"entity\": { \"imageURL\": \"\", \"name\": \"IXXXXXXXXXXXXX\", \"id\": 12336, \"ratingCount\": null, \"averageRating\": null } }";
+ j = new JSONObject(s);
+ System.out.println(j.toString(2));
+
+ jj = new JSONStringer();
+ s = jj
+ .object()
+ .key("single")
+ .value("MARIE HAA'S")
+ .key("Johnny")
+ .value("MARIE HAA\\'S")
+ .key("foo")
+ .value("bar")
+ .key("baz")
+ .array()
+ .object()
+ .key("quux")
+ .value("Thanks, Josh!")
+ .endObject()
+ .endArray()
+ .key("obj keys")
+ .value(JSONObject.getNames(obj))
+ .endObject()
+ .toString();
+ System.out.println(s);
+
+ System.out.println(new JSONStringer()
+ .object()
+ .key("a")
+ .array()
+ .array()
+ .array()
+ .value("b")
+ .endArray()
+ .endArray()
+ .endArray()
+ .endObject()
+ .toString());
+
+ jj = new JSONStringer();
+ jj.array();
+ jj.value(1);
+ jj.array();
+ jj.value(null);
+ jj.array();
+ jj.object();
+ jj.key("empty-array").array().endArray();
+ jj.key("answer").value(42);
+ jj.key("null").value(null);
+ jj.key("false").value(false);
+ jj.key("true").value(true);
+ jj.key("big").value(123456789e+88);
+ jj.key("small").value(123456789e-88);
+ jj.key("empty-object").object().endObject();
+ jj.key("long");
+ jj.value(9223372036854775807L);
+ jj.endObject();
+ jj.value("two");
+ jj.endArray();
+ jj.value(true);
+ jj.endArray();
+ jj.value(98.6);
+ jj.value(-100.0);
+ jj.object();
+ jj.endObject();
+ jj.object();
+ jj.key("one");
+ jj.value(1.00);
+ jj.endObject();
+ jj.value(obj);
+ jj.endArray();
+ System.out.println(jj.toString());
+
+ System.out.println(new JSONArray(jj.toString()).toString(4));
+
+ int ar[] = {1, 2, 3};
+ JSONArray ja = new JSONArray(ar);
+ System.out.println(ja.toString());
+
+ String sa[] = {"aString", "aNumber", "aBoolean"};
+ j = new JSONObject(obj, sa);
+ j.put("Testing JSONString interface", obj);
+ System.out.println(j.toString(4));
+
+ j = new JSONObject("{slashes: '///', closetag: '</script>', backslash:'\\\\', ei: {quotes: '\"\\''},eo: {a: '\"quoted\"', b:\"don't\"}, quotes: [\"'\", '\"']}");
+ System.out.println(j.toString(2));
+ System.out.println(XML.toString(j));
+ System.out.println("");
+
+ j = new JSONObject(
+ "{foo: [true, false,9876543210, 0.0, 1.00000001, 1.000000000001, 1.00000000000000001," +
+ " .00000000000000001, 2.00, 0.1, 2e100, -32,[],{}, \"string\"], " +
+ " to : null, op : 'Good'," +
+ "ten:10} postfix comment");
+ j.put("String", "98.6");
+ j.put("JSONObject", new JSONObject());
+ j.put("JSONArray", new JSONArray());
+ j.put("int", 57);
+ j.put("double", 123456789012345678901234567890.);
+ j.put("true", true);
+ j.put("false", false);
+ j.put("null", JSONObject.NULL);
+ j.put("bool", "true");
+ j.put("zero", -0.0);
+ j.put("\\u2028", "\u2028");
+ j.put("\\u2029", "\u2029");
+ a = j.getJSONArray("foo");
+ a.put(666);
+ a.put(2001.99);
+ a.put("so \"fine\".");
+ a.put("so <fine>.");
+ a.put(true);
+ a.put(false);
+ a.put(new JSONArray());
+ a.put(new JSONObject());
+ j.put("keys", JSONObject.getNames(j));
+ System.out.println(j.toString(4));
+ System.out.println(XML.toString(j));
+
+ System.out.println("String: " + j.getDouble("String"));
+ System.out.println(" bool: " + j.getBoolean("bool"));
+ System.out.println(" to: " + j.getString("to"));
+ System.out.println(" true: " + j.getString("true"));
+ System.out.println(" foo: " + j.getJSONArray("foo"));
+ System.out.println(" op: " + j.getString("op"));
+ System.out.println(" ten: " + j.getInt("ten"));
+ System.out.println(" oops: " + j.optBoolean("oops"));
+
+ s = "<xml one = 1 two=' \"2\" '><five></five>First \u0009<content><five></five> This is \"content\". <three> 3 </three>JSON does not preserve the sequencing of elements and contents.<three> III </three> <three> T H R E E</three><four/>Content text is an implied structure in XML. <six content=\"6\"/>JSON does not have implied structure:<seven>7</seven>everything is explicit.<![CDATA[CDATA blocks<are><supported>!]]></xml>";
+ j = XML.toJSONObject(s);
+ System.out.println(j.toString(2));
+ System.out.println(XML.toString(j));
+ System.out.println("");
+
+ ja = JSONML.toJSONArray(s);
+ System.out.println(ja.toString(4));
+ System.out.println(JSONML.toString(ja));
+ System.out.println("");
+
+ s = "<xml do='0'>uno<a re='1' mi='2'>dos<b fa='3'/>tres<c>true</c>quatro</a>cinqo<d>seis<e/></d></xml>";
+ ja = JSONML.toJSONArray(s);
+ System.out.println(ja.toString(4));
+ System.out.println(JSONML.toString(ja));
+ System.out.println("");
+
+ s = "<mapping><empty/> <class name = \"Customer\"> <field name = \"ID\" type = \"string\"> <bind-xml name=\"ID\" node=\"attribute\"/> </field> <field name = \"FirstName\" type = \"FirstName\"/> <field name = \"MI\" type = \"MI\"/> <field name = \"LastName\" type = \"LastName\"/> </class> <class name = \"FirstName\"> <field name = \"text\"> <bind-xml name = \"text\" node = \"text\"/> </field> </class> <class name = \"MI\"> <field name = \"text\"> <bind-xml name = \"text\" node = \"text\"/> </field> </class> <class name = \"LastName\"> <field name = \"text\"> <bind-xml name = \"text\" node = \"text\"/> </field> </class></mapping>";
+ j = XML.toJSONObject(s);
+
+ System.out.println(j.toString(2));
+ System.out.println(XML.toString(j));
+ System.out.println("");
+ ja = JSONML.toJSONArray(s);
+ System.out.println(ja.toString(4));
+ System.out.println(JSONML.toString(ja));
+ System.out.println("");
+
+ j = XML.toJSONObject("<?xml version=\"1.0\" ?><Book Author=\"Anonymous\"><Title>Sample Book</Title><Chapter id=\"1\">This is chapter 1. It is not very long or interesting.</Chapter><Chapter id=\"2\">This is chapter 2. Although it is longer than chapter 1, it is not any more interesting.</Chapter></Book>");
+ System.out.println(j.toString(2));
+ System.out.println(XML.toString(j));
+ System.out.println("");
+
+ j = XML.toJSONObject("<!DOCTYPE bCard 'http://www.cs.caltech.edu/~adam/schemas/bCard'><bCard><?xml default bCard firstname = '' lastname = '' company = '' email = '' homepage = ''?><bCard firstname = 'Rohit' lastname = 'Khare' company = 'MCI' email = 'khare(a)mci.net' homepage = 'http://pest.w3.org/'/><bCard firstname = 'Adam' lastname = 'Rifkin' company = 'Caltech Infospheres Project' email = 'adam(a)cs.caltech.edu' homepage = 'http://www.cs.caltech.edu/~adam/'/></bCard>");
+ System.out.println(j.toString(2));
+ System.out.println(XML.toString(j));
+ System.out.println("");
+
+ j = XML.toJSONObject("<?xml version=\"1.0\"?><customer> <firstName> <text>Fred</text> </firstName> <ID>fbs0001</ID> <lastName> <text>Scerbo</text> </lastName> <MI> <text>B</text> </MI></customer>");
+ System.out.println(j.toString(2));
+ System.out.println(XML.toString(j));
+ System.out.println("");
+
+ j = XML.toJSONObject("<!ENTITY tp-address PUBLIC '-//ABC University::Special Collections Library//TEXT (titlepage: name and address)//EN' 'tpspcoll.sgm'><list type='simple'><head>Repository Address </head><item>Special Collections Library</item><item>ABC University</item><item>Main Library, 40 Circle Drive</item><item>Ourtown, Pennsylvania</item><item>17654 USA</item></list>");
+ System.out.println(j.toString());
+ System.out.println(XML.toString(j));
+ System.out.println("");
+
+ j = XML.toJSONObject("<test intertag status=ok><empty/>deluxe<blip sweet=true>&"toot"&toot;A</blip><x>eks</x><w>bonus</w><w>bonus2</w></test>");
+ System.out.println(j.toString(2));
+ System.out.println(XML.toString(j));
+ System.out.println("");
+
+ j = HTTP.toJSONObject("GET / HTTP/1.0\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*\nAccept-Language: en-us\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90; T312461; Q312461)\nHost: www.nokko.com\nConnection: keep-alive\nAccept-encoding: gzip, deflate\n");
+ System.out.println(j.toString(2));
+ System.out.println(HTTP.toString(j));
+ System.out.println("");
+
+ j = HTTP.toJSONObject("HTTP/1.1 200 Oki Doki\nDate: Sun, 26 May 2002 17:38:52 GMT\nServer: Apache/1.3.23 (Unix) mod_perl/1.26\nKeep-Alive: timeout=15, max=100\nConnection: Keep-Alive\nTransfer-Encoding: chunked\nContent-Type: text/html\n");
+ System.out.println(j.toString(2));
+ System.out.println(HTTP.toString(j));
+ System.out.println("");
+
+ j = new JSONObject("{nix: null, nux: false, null: 'null', 'Request-URI': '/', Method: 'GET', 'HTTP-Version': 'HTTP/1.0'}");
+ System.out.println(j.toString(2));
+ System.out.println("isNull: " + j.isNull("nix"));
+ System.out.println(" has: " + j.has("nix"));
+ System.out.println(XML.toString(j));
+ System.out.println(HTTP.toString(j));
+ System.out.println("");
+
+ j = XML.toJSONObject("<?xml version='1.0' encoding='UTF-8'?>"+"\n\n"+"<SOAP-ENV:Envelope"+
+ " xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\""+
+ " xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\""+
+ " xmlns:xsd=\"http://www.w3.org/1999/XMLSchema\">"+
+ "<SOAP-ENV:Body><ns1:doGoogleSearch"+
+ " xmlns:ns1=\"urn:GoogleSearch\""+
+ " SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"+
+ "<key xsi:type=\"xsd:string\">GOOGLEKEY</key> <q"+
+ " xsi:type=\"xsd:string\">'+search+'</q> <start"+
+ " xsi:type=\"xsd:int\">0</start> <maxResults"+
+ " xsi:type=\"xsd:int\">10</maxResults> <filter"+
+ " xsi:type=\"xsd:boolean\">true</filter> <restrict"+
+ " xsi:type=\"xsd:string\"></restrict> <safeSearch"+
+ " xsi:type=\"xsd:boolean\">false</safeSearch> <lr"+
+ " xsi:type=\"xsd:string\"></lr> <ie"+
+ " xsi:type=\"xsd:string\">latin1</ie> <oe"+
+ " xsi:type=\"xsd:string\">latin1</oe>"+
+ "</ns1:doGoogleSearch>"+
+ "</SOAP-ENV:Body></SOAP-ENV:Envelope>");
+ System.out.println(j.toString(2));
+ System.out.println(XML.toString(j));
+ System.out.println("");
+
+ j = new JSONObject("{Envelope: {Body: {\"ns1:doGoogleSearch\": {oe: \"latin1\", filter: true, q: \"'+search+'\", key: \"GOOGLEKEY\", maxResults: 10, \"SOAP-ENV:encodingStyle\": \"http://schemas.xmlsoap.org/soap/encoding/\", start: 0, ie: \"latin1\", safeSearch:false, \"xmlns:ns1\": \"urn:GoogleSearch\"}}}}");
+ System.out.println(j.toString(2));
+ System.out.println(XML.toString(j));
+ System.out.println("");
+
+ j = CookieList.toJSONObject(" f%oo = b+l=ah ; o;n%40e = t.wo ");
+ System.out.println(j.toString(2));
+ System.out.println(CookieList.toString(j));
+ System.out.println("");
+
+ j = Cookie.toJSONObject("f%oo=blah; secure ;expires = April 24, 2002");
+ System.out.println(j.toString(2));
+ System.out.println(Cookie.toString(j));
+ System.out.println("");
+
+ j = new JSONObject("{script: 'It is not allowed in HTML to send a close script tag in a string<script>because it confuses browsers</script>so we insert a backslash before the /'}");
+ System.out.println(j.toString());
+ System.out.println("");
+
+ JSONTokener jt = new JSONTokener("{op:'test', to:'session', pre:1}{op:'test', to:'session', pre:2}");
+ j = new JSONObject(jt);
+ System.out.println(j.toString());
+ System.out.println("pre: " + j.optInt("pre"));
+ int i = jt.skipTo('{');
+ System.out.println(i);
+ j = new JSONObject(jt);
+ System.out.println(j.toString());
+ System.out.println("");
+
+ a = CDL.toJSONArray("No quotes, 'Single Quotes', \"Double Quotes\"\n1,'2',\"3\"\n,'It is \"good,\"', \"It works.\"\n\n");
+
+ System.out.println(CDL.toString(a));
+ System.out.println("");
+ System.out.println(a.toString(4));
+ System.out.println("");
+
+ a = new JSONArray(" [\"<escape>\", next is an implied null , , ok,] ");
+ System.out.println(a.toString());
+ System.out.println("");
+ System.out.println(XML.toString(a));
+ System.out.println("");
+
+ j = new JSONObject("{ fun => with non-standard forms ; forgiving => This package can be used to parse formats that are similar to but not stricting conforming to JSON; why=To make it easier to migrate existing data to JSON,one = [[1.00]]; uno=[[{1=>1}]];'+':+6e66 ;pluses=+++;empty = '' , 'double':0.666,true: TRUE, false: FALSE, null=NULL;[true] = [[!,@;*]]; string=> o. k. ; \r oct=0666; hex=0x666; dec=666; o=0999; noh=0x0x}");
+ System.out.println(j.toString(4));
+ System.out.println("");
+ if (j.getBoolean("true") && !j.getBoolean("false")) {
+ System.out.println("It's all good");
+ }
+
+ System.out.println("");
+ j = new JSONObject(j, new String[]{"dec", "oct", "hex", "missing"});
+ System.out.println(j.toString(4));
+
+ System.out.println("");
+ System.out.println(new JSONStringer().array().value(a).value(j).endArray());
+
+ j = new JSONObject("{string: \"98.6\", long: 2147483648, int: 2147483647, longer: 9223372036854775807, double: 9223372036854775808}");
+ System.out.println(j.toString(4));
+
+ System.out.println("\ngetInt");
+ System.out.println("int " + j.getInt("int"));
+ System.out.println("long " + j.getInt("long"));
+ System.out.println("longer " + j.getInt("longer"));
+ System.out.println("double " + j.getInt("double"));
+ System.out.println("string " + j.getInt("string"));
+
+ System.out.println("\ngetLong");
+ System.out.println("int " + j.getLong("int"));
+ System.out.println("long " + j.getLong("long"));
+ System.out.println("longer " + j.getLong("longer"));
+ System.out.println("double " + j.getLong("double"));
+ System.out.println("string " + j.getLong("string"));
+
+ System.out.println("\ngetDouble");
+ System.out.println("int " + j.getDouble("int"));
+ System.out.println("long " + j.getDouble("long"));
+ System.out.println("longer " + j.getDouble("longer"));
+ System.out.println("double " + j.getDouble("double"));
+ System.out.println("string " + j.getDouble("string"));
+
+ j.put("good sized", 9223372036854775807L);
+ System.out.println(j.toString(4));
+
+ a = new JSONArray("[2147483647, 2147483648, 9223372036854775807, 9223372036854775808]");
+ System.out.println(a.toString(4));
+
+ System.out.println("\nKeys: ");
+ it = j.keys();
+ while (it.hasNext()) {
+ s = (String)it.next();
+ System.out.println(s + ": " + j.getString(s));
+ }
+
+
+ System.out.println("\naccumulate: ");
+ j = new JSONObject();
+ j.accumulate("stooge", "Curly");
+ j.accumulate("stooge", "Larry");
+ j.accumulate("stooge", "Moe");
+ a = j.getJSONArray("stooge");
+ a.put(5, "Shemp");
+ System.out.println(j.toString(4));
+
+ System.out.println("\nwrite:");
+ System.out.println(j.write(new StringWriter()));
+
+ s = "<xml empty><a></a><a>1</a><a>22</a><a>333</a></xml>";
+ j = XML.toJSONObject(s);
+ System.out.println(j.toString(4));
+ System.out.println(XML.toString(j));
+
+ s = "<book><chapter>Content of the first chapter</chapter><chapter>Content of the second chapter <chapter>Content of the first subchapter</chapter> <chapter>Content of the second subchapter</chapter></chapter><chapter>Third Chapter</chapter></book>";
+ j = XML.toJSONObject(s);
+ System.out.println(j.toString(4));
+ System.out.println(XML.toString(j));
+
+ a = JSONML.toJSONArray(s);
+ System.out.println(a.toString(4));
+ System.out.println(JSONML.toString(a));
+
+ Collection c = null;
+ Map m = null;
+
+ j = new JSONObject(m);
+ a = new JSONArray(c);
+ j.append("stooge", "Joe DeRita");
+ j.append("stooge", "Shemp");
+ j.accumulate("stooges", "Curly");
+ j.accumulate("stooges", "Larry");
+ j.accumulate("stooges", "Moe");
+ j.accumulate("stoogearray", j.get("stooges"));
+ j.put("map", m);
+ j.put("collection", c);
+ j.put("array", a);
+ a.put(m);
+ a.put(c);
+ System.out.println(j.toString(4));
+
+ s = "{plist=Apple; AnimalSmells = { pig = piggish; lamb = lambish; worm = wormy; }; AnimalSounds = { pig = oink; lamb = baa; worm = baa; Lisa = \"Why is the worm talking like a lamb?\" } ; AnimalColors = { pig = pink; lamb = black; worm = pink; } } ";
+ j = new JSONObject(s);
+ System.out.println(j.toString(4));
+
+ s = " (\"San Francisco\", \"New York\", \"Seoul\", \"London\", \"Seattle\", \"Shanghai\")";
+ a = new JSONArray(s);
+ System.out.println(a.toString());
+
+ s = "<a ichi='1' ni='2'><b>The content of b</b> and <c san='3'>The content of c</c><d>do</d><e></e><d>re</d><f/><d>mi</d></a>";
+ j = XML.toJSONObject(s);
+
+ System.out.println(j.toString(2));
+ System.out.println(XML.toString(j));
+ System.out.println("");
+ ja = JSONML.toJSONArray(s);
+ System.out.println(ja.toString(4));
+ System.out.println(JSONML.toString(ja));
+ System.out.println("");
+
+
+ System.out.println("\nTesting Exceptions: ");
+
+ System.out.print("Exception: ");
+ try {
+ a = new JSONArray();
+ a.put(Double.NEGATIVE_INFINITY);
+ a.put(Double.NaN);
+ System.out.println(a.toString());
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ System.out.print("Exception: ");
+ try {
+ System.out.println(j.getDouble("stooge"));
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ System.out.print("Exception: ");
+ try {
+ System.out.println(j.getDouble("howard"));
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ System.out.print("Exception: ");
+ try {
+ System.out.println(j.put(null, "howard"));
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ System.out.print("Exception: ");
+ try {
+ System.out.println(a.getDouble(0));
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ System.out.print("Exception: ");
+ try {
+ System.out.println(a.get(-1));
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ System.out.print("Exception: ");
+ try {
+ System.out.println(a.put(Double.NaN));
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ System.out.print("Exception: ");
+ try {
+ j = XML.toJSONObject("<a><b> ");
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ System.out.print("Exception: ");
+ try {
+ j = XML.toJSONObject("<a></b> ");
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ System.out.print("Exception: ");
+ try {
+ j = XML.toJSONObject("<a></a ");
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ System.out.print("Exception: ");
+ try {
+ ja = new JSONArray(new Object());
+ System.out.println(ja.toString());
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+
+ System.out.print("Exception: ");
+ try {
+ s = "[)";
+ a = new JSONArray(s);
+ System.out.println(a.toString());
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+
+ System.out.print("Exception: ");
+ try {
+ s = "<xml";
+ ja = JSONML.toJSONArray(s);
+ System.out.println(ja.toString(4));
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+
+ System.out.print("Exception: ");
+ try {
+ s = "<right></wrong>";
+ ja = JSONML.toJSONArray(s);
+ System.out.println(ja.toString(4));
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+
+ System.out.print("Exception: ");
+ try {
+ s = "{\"koda\": true, \"koda\": true}";
+ j = new JSONObject(s);
+ System.out.println(j.toString(4));
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+
+ System.out.print("Exception: ");
+ try {
+ jj = new JSONStringer();
+ s = jj
+ .object()
+ .key("bosanda")
+ .value("MARIE HAA'S")
+ .key("bosanda")
+ .value("MARIE HAA\\'S")
+ .endObject()
+ .toString();
+ System.out.println(j.toString(4));
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ } catch (Exception e) {
+ System.out.println(e.toString());
+ }
+ }
+}
Added: projects/gwt-console/trunk/war/src/main/java/org/json/XML.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/XML.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/XML.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -0,0 +1,426 @@
+package org.json;
+
+/*
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+import java.util.Iterator;
+
+
+/**
+ * This provides static methods to convert an XML text into a JSONObject,
+ * and to covert a JSONObject into an XML text.
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class XML {
+
+ /** The Character '&'. */
+ public static final Character AMP = new Character('&');
+
+ /** The Character '''. */
+ public static final Character APOS = new Character('\'');
+
+ /** The Character '!'. */
+ public static final Character BANG = new Character('!');
+
+ /** The Character '='. */
+ public static final Character EQ = new Character('=');
+
+ /** The Character '>'. */
+ public static final Character GT = new Character('>');
+
+ /** The Character '<'. */
+ public static final Character LT = new Character('<');
+
+ /** The Character '?'. */
+ public static final Character QUEST = new Character('?');
+
+ /** The Character '"'. */
+ public static final Character QUOT = new Character('"');
+
+ /** The Character '/'. */
+ public static final Character SLASH = new Character('/');
+
+ /**
+ * Replace special characters with XML escapes:
+ * <pre>
+ * & <small>(ampersand)</small> is replaced by &amp;
+ * < <small>(less than)</small> is replaced by &lt;
+ * > <small>(greater than)</small> is replaced by &gt;
+ * " <small>(double quote)</small> is replaced by &quot;
+ * </pre>
+ * @param string The string to be escaped.
+ * @return The escaped string.
+ */
+ public static String escape(String string) {
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0, len = string.length(); i < len; i++) {
+ char c = string.charAt(i);
+ switch (c) {
+ case '&':
+ sb.append("&");
+ break;
+ case '<':
+ sb.append("<");
+ break;
+ case '>':
+ sb.append(">");
+ break;
+ case '"':
+ sb.append(""");
+ break;
+ default:
+ sb.append(c);
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Throw an exception if the string contains whitespace.
+ * Whitespace is not allowed in tagNames and attributes.
+ * @param string
+ * @throws JSONException
+ */
+ public static void noSpace(String string) throws JSONException {
+ int i, length = string.length();
+ if (length == 0) {
+ throw new JSONException("Empty string.");
+ }
+ for (i = 0; i < length; i += 1) {
+ if (Character.isWhitespace(string.charAt(i))) {
+ throw new JSONException("'" + string +
+ "' contains a space character.");
+ }
+ }
+ }
+
+ /**
+ * Scan the content following the named tag, attaching it to the context.
+ * @param x The XMLTokener containing the source string.
+ * @param context The JSONObject that will include the new material.
+ * @param name The tag name.
+ * @return true if the close tag is processed.
+ * @throws JSONException
+ */
+ private static boolean parse(XMLTokener x, JSONObject context,
+ String name) throws JSONException {
+ char c;
+ int i;
+ String n;
+ JSONObject o = null;
+ String s;
+ Object t;
+
+// Test for and skip past these forms:
+// <!-- ... -->
+// <! ... >
+// <![ ... ]]>
+// <? ... ?>
+// Report errors for these forms:
+// <>
+// <=
+// <<
+
+ t = x.nextToken();
+
+// <!
+
+ if (t == BANG) {
+ c = x.next();
+ if (c == '-') {
+ if (x.next() == '-') {
+ x.skipPast("-->");
+ return false;
+ }
+ x.back();
+ } else if (c == '[') {
+ t = x.nextToken();
+ if (t.equals("CDATA")) {
+ if (x.next() == '[') {
+ s = x.nextCDATA();
+ if (s.length() > 0) {
+ context.accumulate("content", s);
+ }
+ return false;
+ }
+ }
+ throw x.syntaxError("Expected 'CDATA['");
+ }
+ i = 1;
+ do {
+ t = x.nextMeta();
+ if (t == null) {
+ throw x.syntaxError("Missing '>' after '<!'.");
+ } else if (t == LT) {
+ i += 1;
+ } else if (t == GT) {
+ i -= 1;
+ }
+ } while (i > 0);
+ return false;
+ } else if (t == QUEST) {
+
+// <?
+
+ x.skipPast("?>");
+ return false;
+ } else if (t == SLASH) {
+
+// Close tag </
+
+ t = x.nextToken();
+ if (name == null) {
+ throw x.syntaxError("Mismatched close tag" + t);
+ }
+ if (!t.equals(name)) {
+ throw x.syntaxError("Mismatched " + name + " and " + t);
+ }
+ if (x.nextToken() != GT) {
+ throw x.syntaxError("Misshaped close tag");
+ }
+ return true;
+
+ } else if (t instanceof Character) {
+ throw x.syntaxError("Misshaped tag");
+
+// Open tag <
+
+ } else {
+ n = (String)t;
+ t = null;
+ o = new JSONObject();
+ for (;;) {
+ if (t == null) {
+ t = x.nextToken();
+ }
+
+// attribute = value
+
+ if (t instanceof String) {
+ s = (String)t;
+ t = x.nextToken();
+ if (t == EQ) {
+ t = x.nextToken();
+ if (!(t instanceof String)) {
+ throw x.syntaxError("Missing value");
+ }
+ o.accumulate(s, JSONObject.stringToValue((String)t));
+ t = null;
+ } else {
+ o.accumulate(s, "");
+ }
+
+// Empty tag <.../>
+
+ } else if (t == SLASH) {
+ if (x.nextToken() != GT) {
+ throw x.syntaxError("Misshaped tag");
+ }
+ context.accumulate(n, o);
+ return false;
+
+// Content, between <...> and </...>
+
+ } else if (t == GT) {
+ for (;;) {
+ t = x.nextContent();
+ if (t == null) {
+ if (n != null) {
+ throw x.syntaxError("Unclosed tag " + n);
+ }
+ return false;
+ } else if (t instanceof String) {
+ s = (String)t;
+ if (s.length() > 0) {
+ o.accumulate("content", JSONObject.stringToValue(s));
+ }
+
+// Nested element
+
+ } else if (t == LT) {
+ if (parse(x, o, n)) {
+ if (o.length() == 0) {
+ context.accumulate(n, "");
+ } else if (o.length() == 1 &&
+ o.opt("content") != null) {
+ context.accumulate(n, o.opt("content"));
+ } else {
+ context.accumulate(n, o);
+ }
+ return false;
+ }
+ }
+ }
+ } else {
+ throw x.syntaxError("Misshaped tag");
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Convert a well-formed (but not necessarily valid) XML string into a
+ * JSONObject. Some information may be lost in this transformation
+ * because JSON is a data format and XML is a document format. XML uses
+ * elements, attributes, and content text, while JSON uses unordered
+ * collections of name/value pairs and arrays of values. JSON does not
+ * does not like to distinguish between elements and attributes.
+ * Sequences of similar elements are represented as JSONArrays. Content
+ * text may be placed in a "content" member. Comments, prologs, DTDs, and
+ * <code><[ [ ]]></code> are ignored.
+ * @param string The source string.
+ * @return A JSONObject containing the structured data from the XML string.
+ * @throws JSONException
+ */
+ public static JSONObject toJSONObject(String string) throws JSONException {
+ JSONObject o = new JSONObject();
+ XMLTokener x = new XMLTokener(string);
+ while (x.more() && x.skipPast("<")) {
+ parse(x, o, null);
+ }
+ return o;
+ }
+
+
+ /**
+ * Convert a JSONObject into a well-formed, element-normal XML string.
+ * @param o A JSONObject.
+ * @return A string.
+ * @throws JSONException
+ */
+ public static String toString(Object o) throws JSONException {
+ return toString(o, null);
+ }
+
+
+ /**
+ * Convert a JSONObject into a well-formed, element-normal XML string.
+ * @param o A JSONObject.
+ * @param tagName The optional name of the enclosing tag.
+ * @return A string.
+ * @throws JSONException
+ */
+ public static String toString(Object o, String tagName)
+ throws JSONException {
+ StringBuffer b = new StringBuffer();
+ int i;
+ JSONArray ja;
+ JSONObject jo;
+ String k;
+ Iterator keys;
+ int len;
+ String s;
+ Object v;
+ if (o instanceof JSONObject) {
+
+// Emit <tagName>
+
+ if (tagName != null) {
+ b.append('<');
+ b.append(tagName);
+ b.append('>');
+ }
+
+// Loop thru the keys.
+
+ jo = (JSONObject)o;
+ keys = jo.keys();
+ while (keys.hasNext()) {
+ k = keys.next().toString();
+ v = jo.opt(k);
+ if (v == null) {
+ v = "";
+ }
+ if (v instanceof String) {
+ s = (String)v;
+ } else {
+ s = null;
+ }
+
+// Emit content in body
+
+ if (k.equals("content")) {
+ if (v instanceof JSONArray) {
+ ja = (JSONArray)v;
+ len = ja.length();
+ for (i = 0; i < len; i += 1) {
+ if (i > 0) {
+ b.append('\n');
+ }
+ b.append(escape(ja.get(i).toString()));
+ }
+ } else {
+ b.append(escape(v.toString()));
+ }
+
+// Emit an array of similar keys
+
+ } else if (v instanceof JSONArray) {
+ ja = (JSONArray)v;
+ len = ja.length();
+ for (i = 0; i < len; i += 1) {
+ b.append(toString(ja.get(i), k));
+ }
+ } else if (v.equals("")) {
+ b.append('<');
+ b.append(k);
+ b.append("/>");
+
+// Emit a new tag <k>
+
+ } else {
+ b.append(toString(v, k));
+ }
+ }
+ if (tagName != null) {
+
+// Emit the </tagname> close tag
+
+ b.append("</");
+ b.append(tagName);
+ b.append('>');
+ }
+ return b.toString();
+
+// XML does not have good support for arrays. If an array appears in a place
+// where XML is lacking, synthesize an <array> element.
+
+ } else if (o instanceof JSONArray) {
+ ja = (JSONArray)o;
+ len = ja.length();
+ for (i = 0; i < len; ++i) {
+ b.append(toString(
+ ja.opt(i), (tagName == null) ? "array" : tagName));
+ }
+ return b.toString();
+ } else {
+ s = (o == null) ? "null" : escape(o.toString());
+ return (tagName == null) ? "\"" + s + "\"" :
+ (s.length() == 0) ? "<" + tagName + "/>" :
+ "<" + tagName + ">" + s + "</" + tagName + ">";
+ }
+ }
+}
\ No newline at end of file
Added: projects/gwt-console/trunk/war/src/main/java/org/json/XMLTokener.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/XMLTokener.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/XMLTokener.java 2008-10-27 11:34:07 UTC (rev 2626)
@@ -0,0 +1,365 @@
+package org.json;
+
+/*
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+/**
+ * The XMLTokener extends the JSONTokener to provide additional methods
+ * for the parsing of XML texts.
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class XMLTokener extends JSONTokener {
+
+
+ /** The table of entity values. It initially contains Character values for
+ * amp, apos, gt, lt, quot.
+ */
+ public static final java.util.HashMap entity;
+
+ static {
+ entity = new java.util.HashMap(8);
+ entity.put("amp", XML.AMP);
+ entity.put("apos", XML.APOS);
+ entity.put("gt", XML.GT);
+ entity.put("lt", XML.LT);
+ entity.put("quot", XML.QUOT);
+ }
+
+ /**
+ * Construct an XMLTokener from a string.
+ * @param s A source string.
+ */
+ public XMLTokener(String s) {
+ super(s);
+ }
+
+ /**
+ * Get the text in the CDATA block.
+ * @return The string up to the <code>]]></code>.
+ * @throws JSONException If the <code>]]></code> is not found.
+ */
+ public String nextCDATA() throws JSONException {
+ char c;
+ int i;
+ StringBuffer sb = new StringBuffer();
+ for (;;) {
+ c = next();
+ if (c == 0) {
+ throw syntaxError("Unclosed CDATA");
+ }
+ sb.append(c);
+ i = sb.length() - 3;
+ if (i >= 0 && sb.charAt(i) == ']' &&
+ sb.charAt(i + 1) == ']' && sb.charAt(i + 2) == '>') {
+ sb.setLength(i);
+ return sb.toString();
+ }
+ }
+ }
+
+
+ /**
+ * Get the next XML outer token, trimming whitespace. There are two kinds
+ * of tokens: the '<' character which begins a markup tag, and the content
+ * text between markup tags.
+ *
+ * @return A string, or a '<' Character, or null if there is no more
+ * source text.
+ * @throws JSONException
+ */
+ public Object nextContent() throws JSONException {
+ char c;
+ StringBuffer sb;
+ do {
+ c = next();
+ } while (Character.isWhitespace(c));
+ if (c == 0) {
+ return null;
+ }
+ if (c == '<') {
+ return XML.LT;
+ }
+ sb = new StringBuffer();
+ for (;;) {
+ if (c == '<' || c == 0) {
+ back();
+ return sb.toString().trim();
+ }
+ if (c == '&') {
+ sb.append(nextEntity(c));
+ } else {
+ sb.append(c);
+ }
+ c = next();
+ }
+ }
+
+
+ /**
+ * Return the next entity. These entities are translated to Characters:
+ * <code>& ' > < "</code>.
+ * @param a An ampersand character.
+ * @return A Character or an entity String if the entity is not recognized.
+ * @throws JSONException If missing ';' in XML entity.
+ */
+ public Object nextEntity(char a) throws JSONException {
+ StringBuffer sb = new StringBuffer();
+ for (;;) {
+ char c = next();
+ if (Character.isLetterOrDigit(c) || c == '#') {
+ sb.append(Character.toLowerCase(c));
+ } else if (c == ';') {
+ break;
+ } else {
+ throw syntaxError("Missing ';' in XML entity: &" + sb);
+ }
+ }
+ String s = sb.toString();
+ Object e = entity.get(s);
+ return e != null ? e : a + s + ";";
+ }
+
+
+ /**
+ * Returns the next XML meta token. This is used for skipping over <!...>
+ * and <?...?> structures.
+ * @return Syntax characters (<code>< > / = ! ?</code>) are returned as
+ * Character, and strings and names are returned as Boolean. We don't care
+ * what the values actually are.
+ * @throws JSONException If a string is not properly closed or if the XML
+ * is badly structured.
+ */
+ public Object nextMeta() throws JSONException {
+ char c;
+ char q;
+ do {
+ c = next();
+ } while (Character.isWhitespace(c));
+ switch (c) {
+ case 0:
+ throw syntaxError("Misshaped meta tag");
+ case '<':
+ return XML.LT;
+ case '>':
+ return XML.GT;
+ case '/':
+ return XML.SLASH;
+ case '=':
+ return XML.EQ;
+ case '!':
+ return XML.BANG;
+ case '?':
+ return XML.QUEST;
+ case '"':
+ case '\'':
+ q = c;
+ for (;;) {
+ c = next();
+ if (c == 0) {
+ throw syntaxError("Unterminated string");
+ }
+ if (c == q) {
+ return Boolean.TRUE;
+ }
+ }
+ default:
+ for (;;) {
+ c = next();
+ if (Character.isWhitespace(c)) {
+ return Boolean.TRUE;
+ }
+ switch (c) {
+ case 0:
+ case '<':
+ case '>':
+ case '/':
+ case '=':
+ case '!':
+ case '?':
+ case '"':
+ case '\'':
+ back();
+ return Boolean.TRUE;
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Get the next XML Token. These tokens are found inside of angle
+ * brackets. It may be one of these characters: <code>/ > = ! ?</code> or it
+ * may be a string wrapped in single quotes or double quotes, or it may be a
+ * name.
+ * @return a String or a Character.
+ * @throws JSONException If the XML is not well formed.
+ */
+ public Object nextToken() throws JSONException {
+ char c;
+ char q;
+ StringBuffer sb;
+ do {
+ c = next();
+ } while (Character.isWhitespace(c));
+ switch (c) {
+ case 0:
+ throw syntaxError("Misshaped element");
+ case '<':
+ throw syntaxError("Misplaced '<'");
+ case '>':
+ return XML.GT;
+ case '/':
+ return XML.SLASH;
+ case '=':
+ return XML.EQ;
+ case '!':
+ return XML.BANG;
+ case '?':
+ return XML.QUEST;
+
+// Quoted string
+
+ case '"':
+ case '\'':
+ q = c;
+ sb = new StringBuffer();
+ for (;;) {
+ c = next();
+ if (c == 0) {
+ throw syntaxError("Unterminated string");
+ }
+ if (c == q) {
+ return sb.toString();
+ }
+ if (c == '&') {
+ sb.append(nextEntity(c));
+ } else {
+ sb.append(c);
+ }
+ }
+ default:
+
+// Name
+
+ sb = new StringBuffer();
+ for (;;) {
+ sb.append(c);
+ c = next();
+ if (Character.isWhitespace(c)) {
+ return sb.toString();
+ }
+ switch (c) {
+ case 0:
+ return sb.toString();
+ case '>':
+ case '/':
+ case '=':
+ case '!':
+ case '?':
+ case '[':
+ case ']':
+ back();
+ return sb.toString();
+ case '<':
+ case '"':
+ case '\'':
+ throw syntaxError("Bad character in a name");
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Skip characters until past the requested string.
+ * If it is not found, we are left at the end of the source with a result of false.
+ * @param to A string to skip past.
+ * @throws JSONException
+ */
+ public boolean skipPast(String to) throws JSONException {
+ boolean b;
+ char c;
+ int i;
+ int j;
+ int offset = 0;
+ int n = to.length();
+ char[] circle = new char[n];
+
+ /*
+ * First fill the circle buffer with as many characters as are in the
+ * to string. If we reach an early end, bail.
+ */
+
+ for (i = 0; i < n; i += 1) {
+ c = next();
+ if (c == 0) {
+ return false;
+ }
+ circle[i] = c;
+ }
+ /*
+ * We will loop, possibly for all of the remaining characters.
+ */
+ for (;;) {
+ j = offset;
+ b = true;
+ /*
+ * Compare the circle buffer with the to string.
+ */
+ for (i = 0; i < n; i += 1) {
+ if (circle[j] != to.charAt(i)) {
+ b = false;
+ break;
+ }
+ j += 1;
+ if (j >= n) {
+ j -= n;
+ }
+ }
+ /*
+ * If we exit the loop with b intact, then victory is ours.
+ */
+ if (b) {
+ return true;
+ }
+ /*
+ * Get the next character. If there isn't one, then defeat is ours.
+ */
+ c = next();
+ if (c == 0) {
+ return false;
+ }
+ /*
+ * Shove the character in the circle buffer and advance the
+ * circle offset. The offset is mod n.
+ */
+ circle[offset] = c;
+ offset += 1;
+ if (offset >= n) {
+ offset -= n;
+ }
+ }
+ }
+}
17 years, 6 months
JBoss JBPM SVN: r2625 - jbpm3/trunk/hudson.
by do-not-reply@jboss.org
Author: tom.baeyens(a)jboss.com
Date: 2008-10-27 06:39:30 -0400 (Mon, 27 Oct 2008)
New Revision: 2625
Modified:
jbpm3/trunk/hudson/ant.properties.example
jbpm3/trunk/hudson/build.xml
Log:
added tomcat executable variable
Modified: jbpm3/trunk/hudson/ant.properties.example
===================================================================
--- jbpm3/trunk/hudson/ant.properties.example 2008-10-27 09:47:51 UTC (rev 2624)
+++ jbpm3/trunk/hudson/ant.properties.example 2008-10-27 10:39:30 UTC (rev 2625)
@@ -20,6 +20,7 @@
hudson.maven.path=/usr/java/apache-maven-2.0.9
+tomcat.executable=catalina.sh
hudson.root=/usr/share/java/workspace
hudson.host=jbws.dyndns.org
hudson.admin.port=8150
Modified: jbpm3/trunk/hudson/build.xml
===================================================================
--- jbpm3/trunk/hudson/build.xml 2008-10-27 09:47:51 UTC (rev 2624)
+++ jbpm3/trunk/hudson/build.xml 2008-10-27 10:39:30 UTC (rev 2625)
@@ -191,7 +191,7 @@
<property environment="env"/>
<fail message="unset JBOSS_REPOSITORY=${env.JBOSS_REPOSITORY}" if="env.JBOSS_REPOSITORY"/>
- <exec executable="${hudson.tomcat}/bin/catalina.sh" failonerror="true" output="${hudson.target.dir}/hudson.log">
+ <exec executable="${hudson.tomcat}/bin/${tomcat.executable}" failonerror="true" output="${hudson.target.dir}/hudson.log">
<env key="CATALINA_OPTS" value="-Xmx512m -Djava.awt.headless=true"/>
<arg line="start"/>
</exec>
17 years, 6 months
JBoss JBPM SVN: r2624 - in projects/gwt-console/trunk/war: src/main/java and 10 other directories.
by do-not-reply@jboss.org
Author: heiko.braun(a)jboss.com
Date: 2008-10-27 05:47:51 -0400 (Mon, 27 Oct 2008)
New Revision: 2624
Added:
projects/gwt-console/trunk/war/XML_HTTP_PROXY.txt
projects/gwt-console/trunk/war/src/main/java/jmaki/
projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/
projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/HttpClient.java
projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxy.java
projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxyServlet.java
projects/gwt-console/trunk/war/src/main/resources/jmaki/
projects/gwt-console/trunk/war/src/main/resources/jmaki/xhp/
projects/gwt-console/trunk/war/src/main/resources/jmaki/xhp/xhp.json
Modified:
projects/gwt-console/trunk/war/pom.xml
projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Authentication.java
projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/JSONRequest.java
projects/gwt-console/trunk/war/src/main/resources/org/jboss/bpm/console/Application.gwt.xml
projects/gwt-console/trunk/war/src/main/webapp/WEB-INF/web.xml
projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/GwtTestApplication.java
Log:
start http proxy integration to simplify testing
Added: projects/gwt-console/trunk/war/XML_HTTP_PROXY.txt
===================================================================
--- projects/gwt-console/trunk/war/XML_HTTP_PROXY.txt (rev 0)
+++ projects/gwt-console/trunk/war/XML_HTTP_PROXY.txt 2008-10-27 09:47:51 UTC (rev 2624)
@@ -0,0 +1,3 @@
+See https://ajax.dev.java.net/xmlhttpproxy.html for further details.
+
+
Property changes on: projects/gwt-console/trunk/war/XML_HTTP_PROXY.txt
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Modified: projects/gwt-console/trunk/war/pom.xml
===================================================================
--- projects/gwt-console/trunk/war/pom.xml 2008-10-27 06:21:47 UTC (rev 2623)
+++ projects/gwt-console/trunk/war/pom.xml 2008-10-27 09:47:51 UTC (rev 2624)
@@ -66,10 +66,22 @@
</dependency>
<dependency>
<groupId>javax.activation</groupId>
- <artifactId>activation</artifactId>
+ <artifactId>activation</artifactId>
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>com.servletsuite</groupId>
+ <artifactId>httpProxy</artifactId>
+ <version>1.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.json</groupId>
+ <artifactId>org.json</artifactId>
+ <version>0.0.1</version>
+ </dependency>
+
</dependencies>
<!-- Plugins -->
<build>
@@ -144,6 +156,7 @@
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webXml>target/web.xml</webXml>
+ <warSourceExcludes>.gwt-tmp/**</warSourceExcludes>
</configuration>
</plugin>
<plugin>
Added: projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/HttpClient.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/HttpClient.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/HttpClient.java 2008-10-27 09:47:51 UTC (rev 2624)
@@ -0,0 +1,240 @@
+/* Copyright 2006-2008 Sun Microsystems, Inc. All rights reserved. You may not modify, use, reproduce, or distribute this software except in compliance with the terms of the License at:
+ http://developer.sun.com/berkeley_license.html
+ $Id$
+*/package jmaki.xhp;
+
+import java.io.*;
+import java.util.Map;
+import java.util.Iterator;
+import java.net.*;
+import java.util.logging.*;
+import java.security.Security;
+
+/**
+ * @author Yutaka Yoshida, Greg Murray
+ *
+ * Minimum set of HTTPclient supporting both http and https.
+ * It's aslo capable of POST, but it doesn't provide doGet because
+ * the caller can just read the inputstream.
+ */
+public class HttpClient {
+
+ private static Logger logger;
+ private String proxyHost = null;
+ private int proxyPort = -1;
+ private boolean isHttps = false;
+ private boolean isProxy = false;
+ private HttpURLConnection urlConnection = null;
+ private Map headers;
+
+ /**
+ * @param phost PROXY host name
+ * @param pport PROXY port string
+ * @param url URL string
+ * @param headers Map
+ */
+ public HttpClient(String phost,
+ int pport,
+ String url,
+ Map headers,
+ String method)
+ throws MalformedURLException {
+ if (phost != null && pport != -1) {
+ this.isProxy = true;
+ }
+ this.proxyHost = phost;
+ this.proxyPort = pport;
+ if (url.trim().startsWith("https:")) {
+ isHttps = true;
+ }
+ this.urlConnection = getURLConnection(url);
+ try {
+ this.urlConnection.setRequestMethod(method);
+ } catch (java.net.ProtocolException pe) {
+ HttpClient.getLogger().severe("Unable protocol method to " + method + " : " + pe);
+ }
+ this.headers = headers;
+ // seat headers
+ if (headers != null) {
+ Iterator it = headers.keySet().iterator();
+ if (it != null) {
+ while (it.hasNext()) {
+ String key = (String)it.next();
+ String value = (String)headers.get(key);
+ this.urlConnection.setRequestProperty (key, value);
+ }
+ }
+ }
+ }
+
+ /**
+ * @param phost PROXY host name
+ * @param pport PROXY port string
+ * @param url URL string
+ * @param headers Map
+ * @param userName string
+ * @param password string
+ */
+ public HttpClient(String phost,
+ int pport,
+ String url,
+ Map headers,
+ String method,
+ String userName,
+ String password)
+ throws MalformedURLException {
+ try {
+ if (phost != null && pport != -1) {
+ this.isProxy = true;
+ }
+ this.proxyHost = phost;
+ this.proxyPort = pport;
+ if (url.trim().startsWith("https:")) {
+ isHttps = true;
+ }
+ this.urlConnection = getURLConnection(url);
+ try {
+ this.urlConnection.setRequestMethod(method);
+ } catch (java.net.ProtocolException pe) {
+ HttpClient.getLogger().severe("Unable protocol method to " + method + " : " + pe);
+ }
+ // set basic authentication information
+ String auth = userName + ":" + password;
+ String encoded = new sun.misc.BASE64Encoder().encode (auth.getBytes());
+ // set basic authorization
+ this.urlConnection.setRequestProperty ("Authorization", "Basic " + encoded);
+ this.headers = headers;
+ // seat headers
+ if (headers != null) {
+ Iterator it = headers.entrySet().iterator();
+ if (it != null) {
+ while (it.hasNext()) {
+ String key = (String)it.next();
+ String value = (String)headers.get(key);
+ this.urlConnection.setRequestProperty (key, value);
+ }
+ }
+ }
+ } catch (Exception ex) {
+ HttpClient.getLogger().severe("Unable to set basic authorization for " + userName + " : " +ex);
+ }
+ }
+
+ /**
+ * private method to get the URLConnection
+ * @param str URL string
+ */
+ private HttpURLConnection getURLConnection(String str)
+ throws MalformedURLException {
+ try {
+ if (isHttps) {
+ /* when communicating with the server which has unsigned or invalid
+ * certificate (https), SSLException or IOException is thrown.
+ * the following line is a hack to avoid that
+ */
+ Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
+ System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
+ if (isProxy) {
+ System.setProperty("https.proxyHost", proxyHost);
+ System.setProperty("https.proxyPort", proxyPort + "");
+ }
+ } else {
+ if (isProxy) {
+ System.setProperty("http.proxyHost", proxyHost);
+ System.setProperty("http.proxyPort", proxyPort + "");
+ }
+ }
+ URL url = new URL(str);
+ HttpURLConnection uc = (HttpURLConnection)url.openConnection();
+ // if this header has not been set by a request set the user agent.
+ if (headers == null ||
+ (headers != null && headers.get("user-agent") == null)) {
+ // set user agent to mimic a common browser
+ String ua="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)";
+ uc.setRequestProperty("user-agent", ua);
+ }
+ return uc;
+ } catch (MalformedURLException me) {
+ throw new MalformedURLException(str + " is not a valid URL");
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * returns the inputstream from URLConnection
+ * @return InputStream
+ */
+ public InputStream getInputStream() {
+ try {
+ return (this.urlConnection.getInputStream());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * return the OutputStream from URLConnection
+ * @return OutputStream
+ */
+ public OutputStream getOutputStream() {
+
+ try {
+ return (this.urlConnection.getOutputStream());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * posts data to the inputstream and returns the InputStream.
+ * @param postData data to be posted. must be url-encoded already.
+ * @param contentType allows you to set the contentType of the request.
+ * @return InputStream input stream from URLConnection
+ */
+ public InputStream doPost(String postData, String contentType) {
+ this.urlConnection.setDoOutput(true);
+ if (contentType != null) this.urlConnection.setRequestProperty( "Content-type", contentType );
+
+ OutputStream os = this.getOutputStream();
+ PrintStream ps = new PrintStream(os);
+ ps.print(postData);
+ ps.close();
+ return (this.getInputStream());
+ }
+
+ public String getContentEncoding() {
+ if (this.urlConnection == null) return null;
+ return (this.urlConnection.getContentEncoding());
+ }
+ public int getContentLength() {
+ if (this.urlConnection == null) return -1;
+ return (this.urlConnection.getContentLength());
+ }
+ public String getContentType() {
+ if (this.urlConnection == null) return null;
+ return (this.urlConnection.getContentType());
+ }
+ public long getDate() {
+ if (this.urlConnection == null) return -1;
+ return (this.urlConnection.getDate());
+ }
+ public String getHeader(String name) {
+ if (this.urlConnection == null) return null;
+ return (this.urlConnection.getHeaderField(name));
+ }
+ public long getIfModifiedSince() {
+ if (this.urlConnection == null) return -1;
+ return (this.urlConnection.getIfModifiedSince());
+ }
+
+ public static Logger getLogger() {
+ if (logger == null) {
+ logger = Logger.getLogger("jmaki.xhp.Log");
+ }
+ return logger;
+ }
+}
\ No newline at end of file
Property changes on: projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/HttpClient.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxy.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxy.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxy.java 2008-10-27 09:47:51 UTC (rev 2624)
@@ -0,0 +1,389 @@
+/* Copyright 2007 You may not modify, use, reproduce, or distribute this software except in compliance with the terms of the License at:
+ http://developer.sun.com/berkeley_license.html
+ $Id$
+*/
+package jmaki.xhp;
+
+/* Copyright 2007 You may not modify, use, reproduce, or distribute this software except in compliance with the terms of the License at:
+ http://developer.sun.com/berkeley_license.html
+ $Id$
+*/
+
+import java.io.*;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.*;
+import java.util.logging.*;
+
+import javax.xml.transform.*;
+import javax.xml.transform.stream.*;
+
+import org.json.*;
+
+public class XmlHttpProxy {
+
+ public static String GET = "GET";
+ public static String POST = "POST";
+ public static String DELETE = "DELETE";
+ public static String PUT = "PUT";
+
+ private String userName = null;
+ private String password = null;
+ private static Logger logger;
+ private String proxyHost = "";
+ int proxyPort = -1;
+ private JSONObject config;
+ private static String USAGE = "Usage: -url service_URL -id service_key [-url or -id required] -xslurl xsl_url [optional] -format json|xml [optional] -callback[optional] -config [optional] -resources base_directory_containing XSL stylesheets [optional]";
+
+ public XmlHttpProxy() {}
+
+ public XmlHttpProxy(String proxyHost, int proxyPort) {
+ this.proxyHost = proxyHost;
+ this.proxyPort = proxyPort;
+ }
+
+ public XmlHttpProxy(String proxyHost, int proxyPort,
+ String userName, String password) {
+ this.proxyHost = proxyHost;
+ this.proxyPort = proxyPort;
+ this.userName = userName;
+ this.password = password;
+ }
+
+ /**
+ * This method will go out and make the call and it will apply an XSLT Transformation with the
+ * set of parameters provided.
+ *
+ * @param urlString - The URL which you are looking up
+ * @param out - The OutputStream to which the resulting document is written
+ * @param xslInputStream - An input Stream to an XSL style sheet that is provided to the XSLT processor. If set to null there will be no transformation
+ * @param paramsMap - A Map of parameters that are feed to the XSLT Processor. These params may be used when generating content. This may be set to null if no parameters are necessary.
+ * @param method - The HTTP method used.
+ *
+ */
+ public void processRequest(String urlString,
+ OutputStream out,
+ InputStream xslInputStream,
+ Map paramsMap,
+ Map headers,
+ String method,
+ String userName,
+ String password) throws IOException, MalformedURLException {
+ doProcess(urlString, out, xslInputStream, paramsMap, headers,method, null,null, userName,password);
+ }
+ /**
+ * This method will go out and make the call and it will apply an XSLT Transformation with the
+ * set of parameters provided.
+ *
+ * @param urlString - The URL which you are looking up
+ * @param out - The OutputStream to which the resulting document is written
+ *
+ */
+ public void doPost(String urlString,
+ OutputStream out,
+ InputStream xslInputStream,
+ Map paramsMap,
+ Map headers,
+ String postData,
+ String postContentType,
+ String userName,
+ String password) throws IOException, MalformedURLException {
+ doProcess(urlString, out, xslInputStream, paramsMap, headers, XmlHttpProxy.POST, postData, postContentType, userName, password);
+ }
+
+ /**
+ * This method will go out and make the call and it will apply an XSLT Transformation with the
+ * set of parameters provided.
+ *
+ * @param urlString - The URL which you are looking up
+ * @param out - The OutputStream to which the resulting document is written
+ * @param xslInputStream - An input Stream to an XSL style sheet that is provided to the XSLT processor. If set to null there will be no transformation
+ * @param paramsMap - A Map of parameters that are feed to the XSLT Processor. These params may be used when generating content. This may be set to null if no parameters are necessary.
+ * @param method - the HTTP method used.
+ * @param postData - A String of the bodyContent to be posted. A doPost will be used if this is parameter is not null.
+ * @param postContentType - The request contentType used when posting data. Will not be set if this parameter is null.
+ * @param userName - userName used for basic authorization
+ * @param password - password used for basic authorization
+ */
+ public void doProcess(String urlString,
+ OutputStream out,
+ InputStream xslInputStream,
+ Map paramsMap,
+ Map headers,
+ String method,
+ String postData,
+ String postContentType,
+ String userName,
+ String password) throws IOException, MalformedURLException {
+
+ if (paramsMap == null) {
+ paramsMap = new HashMap();
+ }
+
+ String format = (String)paramsMap.get("format");
+ if (format == null) {
+ format = "xml";
+ }
+
+ InputStream in = null;
+ BufferedOutputStream os = null;
+
+ HttpClient httpclient = null;
+
+ if (userName != null &&
+ password != null) {
+ httpclient = new HttpClient(proxyHost, proxyPort, urlString, headers, method, userName, password);
+ } else {
+ httpclient = new HttpClient(proxyHost, proxyPort, urlString, headers, method);
+ }
+
+ // post data determines whether we are going to do a get or a post
+ if (postData == null) {
+ in = httpclient.getInputStream();
+ } else {
+ in = httpclient.doPost(postData, postContentType);
+ }
+
+ // read the encoding from the incoming document and default to UTF-8
+ // if an encoding is not provided
+ String ce = httpclient.getContentEncoding();
+ if (ce == null) {
+ String ct = httpclient.getContentType();
+ if (ct != null) {
+ int idx = ct.lastIndexOf("charset=");
+ if (idx >= 0) {
+ ce = ct.substring(idx+8);
+ } else {
+ ce = "UTF-8";
+ }
+ } else {
+ ce = "UTF-8";
+ }
+ }
+ // get the content type
+ String cType = null;
+ // write out the content type
+ //http://www.ietf.org/rfc/rfc4627.txt
+ if (format.equals("json")) {
+ cType = "application/json;charset="+ce;
+ } else {
+ cType = "text/xml;charset="+ce;
+ }
+ try {
+ byte[] buffer = new byte[1024];
+ int read = 0;
+ if (xslInputStream == null) {
+ while (true) {
+ read = in.read(buffer);
+ if (read <= 0) break;
+ out.write(buffer, 0, read );
+ }
+ } else {
+ transform(in, xslInputStream, paramsMap, out, ce);
+ }
+ } catch (Exception e) {
+ getLogger().severe("XmlHttpProxy transformation error: " + e);
+ } finally {
+ try {
+ if (in != null) {
+ in.close();
+ }
+ if (out != null) {
+ out.flush();
+ out.close();
+ }
+ } catch (Exception e) {
+ // do nothing
+ }
+ }
+ }
+
+ /**
+ * Do the XSLT transformation
+ */
+ public void transform( InputStream xmlIS,
+ InputStream xslIS,
+ Map params,
+ OutputStream result,
+ String encoding) {
+ try {
+ TransformerFactory trFac = TransformerFactory.newInstance();
+ Transformer transformer = trFac.newTransformer(new StreamSource(xslIS));
+ Iterator it = params.keySet().iterator();
+ while (it.hasNext()) {
+ String key = (String)it.next();
+ transformer.setParameter(key, (String)params.get(key));
+ }
+ transformer.setOutputProperty("encoding", encoding);
+ transformer.transform(new StreamSource(xmlIS), new StreamResult(result));
+ } catch (Exception e) {
+ getLogger().severe("XmlHttpProxy: Exception with xslt " + e);
+ }
+ }
+
+ /**
+ *
+ * CLI to the XmlHttpProxy
+ */
+ public static void main(String[] args)
+ throws IOException, MalformedURLException {
+
+ getLogger().info("XmlHttpProxy 1.8");
+ XmlHttpProxy xhp = new XmlHttpProxy();
+
+ if (args.length == 0) {
+ System.out.println(USAGE);
+ }
+
+ String method = XmlHttpProxy.GET;
+ InputStream xslInputStream = null;
+ String serviceKey = null;
+ String urlString = null;
+ String xslURLString = null;
+ String format = "xml";
+ String callback = null;
+ String urlParams = null;
+ String configURLString = "xhp.json";
+ String resourceBase = "file:src/conf/META-INF/resources/xsl/";
+ String username = null;
+ String password = null;
+
+ // read in the arguments
+ int index = 0;
+ while (index < args.length) {
+ if (args[index].toLowerCase().equals("-url") && index + 1 < args.length) {
+ urlString = args[++index];
+ } else if (args[index].toLowerCase().equals("-key") && index + 1 < args.length) {
+ serviceKey = args[++index];
+ } else if (args[index].toLowerCase().equals("-id") && index + 1 < args.length) {
+ serviceKey = args[++index];
+ } else if (args[index].toLowerCase().equals("-callback") && index + 1 < args.length) {
+ callback = args[++index];
+ } else if (args[index].toLowerCase().equals("-xslurl") && index + 1 < args.length) {
+ xslURLString = args[++index];
+ } else if (args[index].toLowerCase().equals("-method") && index + 1 < args.length) {
+ method = args[++index];
+ } else if (args[index].toLowerCase().equals("-username") && index + 1 < args.length) {
+ username = args[++index];
+ } else if (args[index].toLowerCase().equals("-password") && index + 1 < args.length) {
+ password = args[++index];
+ } else if (args[index].toLowerCase().equals("-urlparams") && index + 1 < args.length) {
+ urlParams = args[++index];
+ } else if (args[index].toLowerCase().equals("-config") && index + 1 < args.length) {
+ configURLString = args[++index];
+ } else if (args[index].toLowerCase().equals("-resources") && index + 1 < args.length) {
+ resourceBase = args[++index];
+ }
+ index++;
+ }
+
+ if (serviceKey != null) {
+ try {
+ InputStream is = (new URL(configURLString)).openStream();
+ JSONObject services = loadServices(is);
+ JSONObject service = services.getJSONObject(serviceKey);
+ // default to the service default if no url parameters are specified
+ if (urlParams == null && service.has("defaultURLParams")) {
+ urlParams = service.getString("defaultURLParams");
+ }
+ String serviceURL = service.getString("url");
+ // build the URL properly
+ if (urlParams != null && serviceURL.indexOf("?") == -1){
+ serviceURL += "?";
+ } else if (urlParams != null){
+ serviceURL += "&";
+ }
+ String apiKey = "";
+ if (service.has("apikey")) apiKey = service.getString("apikey");
+ urlString = serviceURL + apiKey + "&" + urlParams;
+ if (service.has("xslStyleSheet")) {
+ xslURLString = service.getString("xslStyleSheet");
+ // check if the url is correct of if to load from the classpath
+
+ }
+ } catch (Exception ex) {
+ getLogger().severe("XmlHttpProxy Error loading service: " + ex);
+ System.exit(1);
+ }
+ } else if (urlString == null) {
+ System.out.println(USAGE);
+ System.exit(1);
+ }
+ // The parameters are feed to the XSL Stylsheet during transformation.
+ // These parameters can provided data or conditional information.
+ Map paramsMap = new HashMap();
+ if (format != null) {
+ paramsMap.put("format", format);
+ }
+ if (callback != null) {
+ paramsMap.put("callback", callback);
+ }
+
+ if (xslURLString != null) {
+ URL xslURL = new URL(xslURLString);
+ if (xslURL != null) {
+ xslInputStream = xslURL.openStream();
+ } else {
+ getLogger().severe("Error: Unable to locate XSL at URL " + xslURLString);
+ }
+ }
+ xhp.processRequest(urlString, System.out, xslInputStream, paramsMap, null, method, username, password);
+ }
+
+ public static Logger getLogger() {
+ if (logger == null) {
+ logger = Logger.getLogger("jmaki.xhp.Log");
+ }
+ return logger;
+ }
+
+ public static JSONObject loadServices(InputStream is)
+ {
+ JSONObject config = null;
+ JSONObject services = new JSONObject();
+ try
+ {
+ config = loadJSONObject(is).getJSONObject("xhp");
+ JSONArray sA = config.getJSONArray("services");
+ for (int l=0; l < sA.length(); l++) {
+ JSONObject value = sA.getJSONObject(l);
+ String key = value.getString("id");
+ services.put(key,value);
+ }
+ }
+ catch (Exception ex)
+ {
+ getLogger().severe("XmlHttpProxy error loading services." + ex);
+ }
+ return services;
+ }
+
+ public static JSONObject loadJSONObject(InputStream in) {
+ ByteArrayOutputStream out = null;
+ try {
+ byte[] buffer = new byte[1024];
+ int read = 0;
+ out = new ByteArrayOutputStream();
+ while (true) {
+ read = in.read(buffer);
+ if (read <= 0) break;
+ out.write(buffer, 0, read );
+ }
+ return new JSONObject(out.toString());
+ } catch (Exception e) {
+ getLogger().severe("XmlHttpProxy error reading in json " + e);
+ } finally {
+ try {
+ if (in != null) {
+ in.close();
+ }
+ if (out != null) {
+ out.flush();
+ out.close();
+ }
+ } catch (Exception e) {
+ }
+ }
+ return null;
+ }
+}
\ No newline at end of file
Property changes on: projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxy.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxyServlet.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxyServlet.java (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxyServlet.java 2008-10-27 09:47:51 UTC (rev 2624)
@@ -0,0 +1,428 @@
+/* Copyright 2007 You may not modify, use, reproduce, or distribute this software except in compliance with the terms of the License at:
+ http://developer.sun.com/berkeley_license.html
+ $Id$
+*/
+package jmaki.xhp;
+
+import java.io.*;
+import java.util.*;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.logging.*;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+
+import org.json.*;
+
+/** XmlHttpProxyServlet
+ * @author Greg Murray
+ */
+public class XmlHttpProxyServlet extends HttpServlet
+{
+
+ public static String REMOTE_USER = "REMOTE_USER";
+
+ private static String XHP_LAST_MODIFIED = "xhp_last_modified_key";
+ private static String XHP_CONFIG = "xhp.json";
+
+ private static boolean allowXDomain = false;
+ private static boolean requireSession = false;
+ private static boolean createSession = false;
+ private static String responseContentType = "application/json;charset=UTF-8";
+ private static boolean rDebug = false;
+ private Logger logger = null;
+ private XmlHttpProxy xhp = null;
+ private ServletContext ctx;
+ private JSONObject services = null;
+ private String resourcesDir = "/resources/";
+ private String classpathResourcesDir = "/META-INF/resources/";
+ private String headerToken = "jmaki-";
+
+ public XmlHttpProxyServlet() {
+ if (rDebug) {
+ logger = getLogger();
+ }
+ }
+
+ public void init(ServletConfig config) throws ServletException {
+ super.init(config);
+ ctx = config.getServletContext();
+ // set the response content type
+ if (ctx.getInitParameter("responseContentType") != null) {
+ responseContentType = ctx.getInitParameter("responseContentType");
+ }
+ // allow for resources dir over-ride at the xhp level otherwise allow
+ // for the jmaki level resources
+ if (ctx.getInitParameter("jmaki-xhp-resources") != null) {
+ resourcesDir = ctx.getInitParameter("jmaki-xhp-resources");
+ } else if (ctx.getInitParameter("jmaki-resources") != null) {
+ resourcesDir = ctx.getInitParameter("jmaki-resources");
+ }
+ // allow for resources dir over-ride
+ if (ctx.getInitParameter("jmaki-classpath-resources") != null) {
+ classpathResourcesDir = ctx.getInitParameter("jmaki-classpath-resources");
+ }
+ String requireSessionString = ctx.getInitParameter("requireSession");
+ if (requireSessionString == null) requireSessionString = ctx.getInitParameter("jmaki-requireSession");
+ if (requireSessionString != null) {
+ if ("false".equals(requireSessionString)) {
+ requireSession = false;
+ getLogger().severe("XmlHttpProxyServlet: intialization. Session requirement disabled.");
+ } else if ("true".equals(requireSessionString)) {
+ requireSession = true;
+ getLogger().severe("XmlHttpProxyServlet: intialization. Session requirement enabled.");
+ }
+ }
+ String xdomainString = ctx.getInitParameter("allowXDomain");
+ if (xdomainString == null) xdomainString = ctx.getInitParameter("jmaki-allowXDomain");
+ if (xdomainString != null) {
+ if ("true".equals(xdomainString)) {
+ allowXDomain = true;
+ getLogger().severe("XmlHttpProxyServlet: intialization. xDomain access is enabled.");
+ } else if ("false".equals(xdomainString)) {
+ allowXDomain = false;
+ getLogger().severe("XmlHttpProxyServlet: intialization. xDomain access is disabled.");
+ }
+ }
+ String createSessionString = ctx.getInitParameter("jmaki-createSession");
+ if (createSessionString != null) {
+ if ("true".equals(createSessionString)) {
+ createSession = true;
+ getLogger().severe("XmlHttpProxyServlet: intialization. create session is enabled.");
+ } else if ("false".equals(xdomainString)) {
+ createSession = false;
+ getLogger().severe("XmlHttpProxyServlet: intialization. create session is disabled.");
+ }
+ }
+ // if there is a proxyHost and proxyPort specified create an HttpClient with the proxy
+ String proxyHost = ctx.getInitParameter("proxyHost");
+ String proxyPortString = ctx.getInitParameter("proxyPort");
+ if (proxyHost != null && proxyPortString != null) {
+ int proxyPort = 8080;
+ try {
+ proxyPort= new Integer(proxyPortString).intValue();
+ xhp = new XmlHttpProxy(proxyHost, proxyPort);
+ } catch (NumberFormatException nfe) {
+ getLogger().severe("XmlHttpProxyServlet: intialization error. The proxyPort must be a number");
+ throw new ServletException("XmlHttpProxyServlet: intialization error. The proxyPort must be a number");
+ }
+ } else {
+ xhp = new XmlHttpProxy();
+ }
+ }
+
+ private void getServices(HttpServletResponse res)
+ {
+ InputStream is = null;
+ try
+ {
+ URL url = ctx.getResource(resourcesDir + XHP_CONFIG);
+ // use classpath if not found locally.
+ //if (url == null) url = XmlHttpProxyServlet.class.getResource(classpathResourcesDir + XHP_CONFIG);
+ if (url == null) url = XmlHttpProxyServlet.class.getResource(XHP_CONFIG); // same package
+ is = url.openStream();
+ }
+ catch (Exception ex)
+ {
+ try
+ {
+ getLogger().severe("XmlHttpProxyServlet error loading xhp.json : " + ex);
+ PrintWriter writer = res.getWriter();
+ writer.write("XmlHttpProxyServlet Error: Error loading xhp.json. Make sure it is available in the /resources directory of your applicaton.");
+ writer.flush();
+ }
+ catch (Exception iox) {}
+ }
+ services = xhp.loadServices(is);
+ }
+
+ public void doDelete(HttpServletRequest req, HttpServletResponse res) {
+ doProcess(req,res, XmlHttpProxy.DELETE);
+ }
+
+ public void doGet(HttpServletRequest req, HttpServletResponse res) {
+ doProcess(req,res, XmlHttpProxy.GET);
+ }
+
+ public void doPost(HttpServletRequest req, HttpServletResponse res) {
+ doProcess(req,res, XmlHttpProxy.POST);
+ }
+
+ public void doPut(HttpServletRequest req, HttpServletResponse res) {
+ doProcess(req,res, XmlHttpProxy.PUT);
+ }
+
+ public void doProcess(HttpServletRequest req, HttpServletResponse res, String method)
+ {
+
+ boolean isPost = XmlHttpProxy.POST.equals(method);
+ StringBuffer bodyContent = null;
+ OutputStream out = null;
+ PrintWriter writer = null;
+ String serviceKey = null;
+ /*try {
+ BufferedReader in = req.getReader();
+ String line = null;
+ while ((line = in.readLine()) != null) {
+ if (bodyContent == null) bodyContent = new StringBuffer();
+ bodyContent.append(line);
+ }
+ } catch (Exception e) {
+ } */
+
+ try
+ {
+ HttpSession session = null;
+ // it really does not make sense to use create session with require session as
+ // the create session will always result in a session created and the requireSession
+ // will always succeed. Leaving the logic for now.
+ if (createSession) {
+ session = req.getSession(true);
+ }
+ if (requireSession) {
+ // check to see if there was a session created for this request
+ // if not assume it was from another domain and blow up
+ // Wrap this to prevent Portlet exeptions
+ session = req.getSession(false);
+ if (session == null) {
+ res.setStatus(HttpServletResponse.SC_FORBIDDEN);
+ return;
+ }
+ }
+ serviceKey = req.getParameter("id");
+ // only to preven regressions - Remove before 1.0
+ if (serviceKey == null) serviceKey = req.getParameter("key");
+ // check if the services have been loaded or if they need to be reloaded
+ if (services == null || configUpdated()) {
+ getServices(res);
+ }
+ String urlString = null;
+ String xslURLString = null;
+ String userName = null;
+ String password = null;
+ String format = "json";
+ String callback = req.getParameter("callback");
+ String urlParams = req.getParameter("urlparams");
+ String countString = req.getParameter("count");
+ // encode the url to prevent spaces from being passed along
+ if (urlParams != null) {
+ urlParams = urlParams.replace(' ', '+');
+ }
+ // get the headers to pass through
+ Map headers = null;
+ // Forward all request headers starting with the header token jmaki-
+ // and chop off the jmaki-
+ Enumeration hnum = req.getHeaderNames();
+ while (hnum.hasMoreElements()) {
+ String name = (String)hnum.nextElement();
+ if (name.startsWith(headerToken)) {
+ if (headers == null) headers = new HashMap();
+
+ String value = "";
+ // handle multi-value headers
+ Enumeration vnum = req.getHeaders(name);
+ while (vnum.hasMoreElements()) {
+ value += (String)vnum.nextElement();
+ if (vnum.hasMoreElements()) value += ";";
+ }
+ String sname = name.substring(headerToken.length(), name.length());
+ headers.put(sname,value);
+ }
+ }
+ try
+ {
+
+ if (services.has(serviceKey))
+ {
+ JSONObject service = services.getJSONObject(serviceKey);
+ // default to the service default if no url parameters are specified
+ if (urlParams == null && service.has("defaultURLParams")) {
+ urlParams = service.getString("defaultURLParams");
+ }
+ String serviceURL = service.getString("url");
+ // build the URL
+ if (urlParams != null && serviceURL.indexOf("?") == -1){
+ serviceURL += "?";
+ } else if (urlParams != null) {
+ serviceURL += "&";
+ }
+ String apikey = "";
+ if (service.has("username")) userName = service.getString("username");
+ if (service.has("password")) password = service.getString("password");
+ if (service.has("apikey")) apikey = service.getString("apikey");
+ urlString = serviceURL + apikey;
+ if (urlParams != null) urlString += "&" + urlParams;
+ if (service.has("xslStyleSheet")) {
+ xslURLString = service.getString("xslStyleSheet");
+ }
+ }
+ else
+ {
+ writer = res.getWriter();
+ if (serviceKey == null) writer.write("XmlHttpProxyServlet Error: id parameter specifying serivce required.");
+ else writer.write("XmlHttpProxyServlet Error : service for id '" + serviceKey + "' not found.");
+ writer.flush();
+ return;
+ }
+ }
+ catch (Exception ex)
+ {
+ getLogger().severe("XmlHttpProxyServlet Error loading service: " + ex);
+ res.setStatus(500);
+ }
+
+ Map paramsMap = new HashMap();
+ paramsMap.put("format", format);
+ // do not allow for xdomain unless the context level setting is enabled.
+ if (callback != null && allowXDomain) {
+ paramsMap.put("callback", callback);
+ }
+ if (countString != null) {
+ paramsMap.put("count", countString);
+ }
+
+ InputStream xslInputStream = null;
+
+ if (urlString == null) {
+ writer = res.getWriter();
+ writer.write("XmlHttpProxyServlet parameters: id[Required] urlparams[Optional] format[Optional] callback[Optional]");
+ writer.flush();
+ return;
+ }
+ // support for session properties and also authentication name
+ if (urlString.indexOf("${") != -1) {
+ urlString = processURL(urlString, req, res);
+ }
+ // default to JSON
+ res.setContentType(responseContentType);
+ out = res.getOutputStream();
+ // get the stream for the xsl stylesheet
+ if (xslURLString != null) {
+ // check the web root for the resource
+ URL xslURL = null;
+ xslURL = ctx.getResource(resourcesDir + "xsl/"+ xslURLString);
+ // if not in the web root check the classpath
+ if (xslURL == null) {
+ xslURL = XmlHttpProxyServlet.class.getResource(classpathResourcesDir + "xsl/" + xslURLString);
+ }
+ if (xslURL != null) {
+ xslInputStream = xslURL.openStream();
+ } else {
+ String message = "Could not locate the XSL stylesheet provided for service id " + serviceKey + ". Please check the XMLHttpProxy configuration.";
+ getLogger().severe(message);
+ res.setStatus(500);
+ try {
+ out.write(message.getBytes());
+ out.flush();
+ return;
+ } catch (java.io.IOException iox){
+ }
+ }
+ }
+ if (!isPost) {
+ xhp.processRequest(urlString, out, xslInputStream, paramsMap, headers, method, userName, password);
+ } else {
+ if (bodyContent == null) getLogger().info("XmlHttpProxyServlet attempting to post to url " + urlString + " with no body content");
+ xhp.doPost(urlString, out, xslInputStream, paramsMap, headers, bodyContent.toString(), req.getContentType(), userName, password);
+ }
+ } catch (Exception iox) {
+ iox.printStackTrace();
+ getLogger().severe("XmlHttpProxyServlet: caught " + iox);
+ res.setStatus(500);
+ try {
+ writer = res.getWriter();
+ writer.write("XmlHttpProxyServlet error loading service for " + serviceKey + " . Please notify the administrator.");
+ writer.flush();
+ } catch (java.io.IOException ix) {
+ ix.printStackTrace();
+ }
+ return;
+ } finally {
+ try {
+ if (out != null) out.close();
+ if (writer != null) writer.close();
+ } catch (java.io.IOException iox){
+ }
+ }
+ }
+
+ /* Allow for a EL style replacements in the serviceURL
+ *
+ * The constant REMOTE_USER will replace the contents of ${REMOTE_USER}
+ * with the return value of request.getRemoteUserver() if it is not null
+ * otherwise the ${REMOTE_USER} is replaced with a blank.
+ *
+ * If you use ${session.somekey} the ${session.somekey} will be replaced with
+ * the String value of the session varialble somekey or blank if the session key
+ * does not exist.
+ *
+ */
+ private String processURL(String url, HttpServletRequest req, HttpServletResponse res) {
+ String serviceURL = url;
+ int start = url.indexOf("${");
+ int end = url.indexOf("}", start);
+ if (end != -1) {
+ String prop = url.substring(start + 2, end).trim();
+ // no matter what we will remove the ${}
+ // default to blank like the JSP EL
+ String replace = "";
+ if (REMOTE_USER.equals(prop)) {
+ if (req.getRemoteUser() != null) replace = req.getRemoteUser();
+ }
+ if (prop.toLowerCase().startsWith("session.")) {
+ String sessionKey = prop.substring("session.".length(), prop.length());
+ if (req.getSession().getAttribute(sessionKey) != null) {
+ // force to a string
+ replace = req.getSession().getAttribute(sessionKey).toString();
+ }
+ }
+ serviceURL = serviceURL.substring(0, start) +
+ replace +
+ serviceURL.substring(end + 1, serviceURL.length());
+ }
+ // call recursively to process more than one instance of a ${ in the serviceURL
+ if (serviceURL.indexOf("${") != -1) serviceURL = processURL(serviceURL, req, res);
+ return serviceURL;
+ }
+
+ /**
+ * Check to see if the configuration file has been updated so that it may be reloaded.
+ */
+ private boolean configUpdated() {
+ try {
+ URL url = ctx.getResource(resourcesDir + XHP_CONFIG);
+ URLConnection con;
+ if (url == null) return false ;
+ con = url.openConnection();
+ long lastModified = con.getLastModified();
+ long XHP_LAST_MODIFIEDModified = 0;
+ if (ctx.getAttribute(XHP_LAST_MODIFIED) != null) {
+ XHP_LAST_MODIFIEDModified = ((Long)ctx.getAttribute(XHP_LAST_MODIFIED)).longValue();
+ } else {
+ ctx.setAttribute(XHP_LAST_MODIFIED, new Long(lastModified));
+ return false;
+ }
+ if (XHP_LAST_MODIFIEDModified < lastModified) {
+ ctx.setAttribute(XHP_LAST_MODIFIED, new Long(lastModified));
+ return true;
+ }
+ } catch (Exception ex) {
+ getLogger().severe("XmlHttpProxyServlet error checking configuration: " + ex);
+ }
+ return false;
+ }
+
+ public Logger getLogger() {
+ if (logger == null) {
+ logger = Logger.getLogger("jmaki.services.xhp.Log");
+ }
+ return logger;
+ }
+
+ private void logMessage(String message) {
+ if (rDebug) {
+ getLogger().info(message);
+ }
+ }
+}
\ No newline at end of file
Property changes on: projects/gwt-console/trunk/war/src/main/java/jmaki/xhp/XmlHttpProxyServlet.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Authentication.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Authentication.java 2008-10-27 06:21:47 UTC (rev 2623)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Authentication.java 2008-10-27 09:47:51 UTC (rev 2624)
@@ -67,6 +67,8 @@
RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, loginUrl);
+ System.out.println("Authentication against: " + rb.getUrl());
+
if(user!=null&&pass!=null)
{
rb.setUser(user);
@@ -80,6 +82,7 @@
public void onResponseReceived(Request request, Response response)
{
+ System.out.println("! Auth Success");
// parse roles
rolesAssigned = DTOParser.parseRolesAssigned(response.getText());
if(callback!=null) callback.onLoginSuccess(request, response);
@@ -87,6 +90,8 @@
public void onError(Request request, Throwable t)
{
+ System.out.println("! Auth failed");
+
// auth failed
if(callback!=null)
callback.onLoginFailed(request, t);
Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/JSONRequest.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/JSONRequest.java 2008-10-27 06:21:47 UTC (rev 2623)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/JSONRequest.java 2008-10-27 09:47:51 UTC (rev 2624)
@@ -22,6 +22,8 @@
package org.jboss.bpm.console.client.util;
/**
+ * Request helper, to bypass SOP restrictions.<br>
+ * Can only be used to retrieve Json data, wrapped in a script tag.
* @author Heiko.Braun <heiko.braun(a)jboss.com>
*/
public class JSONRequest {
Added: projects/gwt-console/trunk/war/src/main/resources/jmaki/xhp/xhp.json
===================================================================
--- projects/gwt-console/trunk/war/src/main/resources/jmaki/xhp/xhp.json (rev 0)
+++ projects/gwt-console/trunk/war/src/main/resources/jmaki/xhp/xhp.json 2008-10-27 09:47:51 UTC (rev 2624)
@@ -0,0 +1,10 @@
+{"xhp": {
+ "version": "1.1",
+ "services": [
+ {"id": "jboss",
+ "url":"http://localhost:8080",
+ "passthrough":true
+ }
+ ]
+ }
+}
\ No newline at end of file
Modified: projects/gwt-console/trunk/war/src/main/resources/org/jboss/bpm/console/Application.gwt.xml
===================================================================
--- projects/gwt-console/trunk/war/src/main/resources/org/jboss/bpm/console/Application.gwt.xml 2008-10-27 06:21:47 UTC (rev 2623)
+++ projects/gwt-console/trunk/war/src/main/resources/org/jboss/bpm/console/Application.gwt.xml 2008-10-27 09:47:51 UTC (rev 2624)
@@ -7,11 +7,14 @@
<inherits name='com.googlecode.gchart.GChart'/>
<!-- Specify the app entry point class. -->
- <entry-point class='org.jboss.bpm.console.client.Application' />
+ <entry-point class='org.jboss.bpm.console.client.Application' />
+ <servlet path="/xhp" class="jmaki.xhp.XmlHttpProxyServlet"/>
+
<!-- Specify a css to load into your gwt application -->
<stylesheet src='console.css' />
<stylesheet src="js/ext/resources/css/ext-all.css" />
<script src="js/ext/adapter/ext/ext-base.js" />
<script src="js/ext/ext-all.js" />
+
</module>
\ No newline at end of file
Modified: projects/gwt-console/trunk/war/src/main/webapp/WEB-INF/web.xml
===================================================================
--- projects/gwt-console/trunk/war/src/main/webapp/WEB-INF/web.xml 2008-10-27 06:21:47 UTC (rev 2623)
+++ projects/gwt-console/trunk/war/src/main/webapp/WEB-INF/web.xml 2008-10-27 09:47:51 UTC (rev 2624)
@@ -4,17 +4,20 @@
<web-app>
<display-name>Archetype Created Web Application</display-name>
- <servlet>
- <servlet-name>HttpServlet</servlet-name>
- <servlet-class>com.totsp.mavenplugin.gwt.sample.server.HttpServlet</servlet-class>
+
+ <!--servlet>
+ <servlet-name>com.jsos.httpproxy.HttpProxyServlet/org.jboss.bpm.console.Application/proxy</servlet-name>
+ <servlet-class>com.jsos.httpproxy.HttpProxyServlet</servlet-class>
+ <init-param>
+ <param-name>host</param-name>
+ <param-value>http://localhost:8080/</param-value>
+ </init-param>
</servlet>
+
<servlet-mapping>
- <servlet-name>HttpServlet</servlet-name>
- <url-pattern>/HttpServlet</url-pattern>
- </servlet-mapping>
+ <servlet-name>com.jsos.httpproxy.HttpProxyServlet/org.jboss.bpm.console.Application/proxy</servlet-name>
+ <url-pattern>/org.jboss.bpm.console.Application/proxy</url-pattern>
+ </servlet-mapping-->
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- </welcome-file-list>
-
+
</web-app>
\ No newline at end of file
Modified: projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/GwtTestApplication.java
===================================================================
--- projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/GwtTestApplication.java 2008-10-27 06:21:47 UTC (rev 2623)
+++ projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/GwtTestApplication.java 2008-10-27 09:47:51 UTC (rev 2624)
@@ -22,6 +22,8 @@
package org.jboss.bpm.console.client;
import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Timer;
import com.gwtext.client.widgets.ComponentMgr;
import org.jboss.bpm.console.client.process.ProcessDefinitionListEditor;
import org.jboss.bpm.console.client.process.ProcessDefinitionList;
@@ -39,7 +41,7 @@
public String getModuleName()
{
- return "org.jboss.bpm.console.Application";
+ return "org.jboss.bpm.console.Application";
}
@@ -50,11 +52,6 @@
{
application = new Application();
application.onModuleLoad();
-
- /*URLBuilder urlBuilder = new URLBuilder("localhost:8080", "gwt-console-server");
- Authentication auth = new Authentication(urlBuilder.getUserInRoleURL(ConsoleView.KNOWN_ROLES));
- auth.doLogin("admin", "admin");
- System.out.println("Assigned roles: " + auth.getRolesAssigned() );*/
}
}
@@ -64,20 +61,39 @@
ConsoleView view = application.getConsoleView();
assertNotNull("View not initialized", view);
- /*ProcessDefinitionListEditor procListEditor =
- (ProcessDefinitionListEditor)ComponentMgr.getComponent(ProcessDefinitionListEditor.ID);
- assertNotNull("ProcessDefinitionListEditor not initialized", procListEditor);
- // load process definitions
- ProcessDefinitionList procDefList = procListEditor.getProcessDefinitionList();
- procDefList.reloadStore();
-
- List<ProcessDefinition> available = procDefList.getAvailableProcessDefinitions();
- assertFalse("No process definitions available", available.isEmpty());
+ Timer timer = new Timer()
+ {
+ public void run()
+ {
+ System.out.println("! Execute timer");
+ URLBuilder urlBuilder = new URLBuilder(GWT.getModuleBaseURL(), "xhp");
+ String inRoleURL = urlBuilder.getUserInRoleURL(ConsoleView.KNOWN_ROLES);
+ Authentication auth = new Authentication(inRoleURL+"&id=jboss");
+ auth.doLogin("admin", "admin");
+ System.out.println("Assigned roles: " + auth.getRolesAssigned() );
+ finishTest();
+ }
+ };
- for(ProcessDefinition def : available)
- {
- System.out.println(def);
- } */
+ timer.schedule(200);
+ delayTestFinish(500);
}
+
+ /*ProcessDefinitionListEditor procListEditor =
+ (ProcessDefinitionListEditor)ComponentMgr.getComponent(ProcessDefinitionListEditor.ID);
+ assertNotNull("ProcessDefinitionListEditor not initialized", procListEditor);
+
+ // load process definitions
+ ProcessDefinitionList procDefList = procListEditor.getProcessDefinitionList();
+ procDefList.reloadStore();
+
+ List<ProcessDefinition> available = procDefList.getAvailableProcessDefinitions();
+ assertFalse("No process definitions available", available.isEmpty());
+
+ for(ProcessDefinition def : available)
+ {
+ System.out.println(def);
+ } */
+
}
17 years, 6 months
JBoss JBPM SVN: r2623 - jbpm3/trunk/modules/core/src/main/resources.
by do-not-reply@jboss.org
Author: alex.guizar(a)jboss.com
Date: 2008-10-27 02:21:47 -0400 (Mon, 27 Oct 2008)
New Revision: 2623
Removed:
jbpm3/trunk/modules/core/src/main/resources/hibernate.mapping.mysql.xml
Log:
removed unnecessary mysql mapping file which broke the mysql build
Deleted: jbpm3/trunk/modules/core/src/main/resources/hibernate.mapping.mysql.xml
===================================================================
--- jbpm3/trunk/modules/core/src/main/resources/hibernate.mapping.mysql.xml 2008-10-27 05:28:03 UTC (rev 2622)
+++ jbpm3/trunk/modules/core/src/main/resources/hibernate.mapping.mysql.xml 2008-10-27 06:21:47 UTC (rev 2623)
@@ -1,140 +0,0 @@
-
- <!-- ###################### -->
- <!-- # jbpm mapping files # -->
- <!-- ###################### -->
-
- <!-- hql queries and type defs -->
- <mapping resource="org/jbpm/db/hibernate.queries.hbm.xml" />
- <!-- hql queries used in simulation for querying historical data
- uncomment if you want to use the GetSimulationInputCommand
- or maybe you also want to use the queries yourself
- be patient: the queries need the stddev function to be enabled in your dialect
- more information on this can be found here: http://www.camunda.com/business_process_simulation_news/mysql_and_stddev.... -->
- <!--
- <mapping resource="org/jbpm/sim/bam/hibernate.queries.hbm.xml" />
- -->
-
- <!-- graph.action mapping files -->
- <mapping resource="org/jbpm/graph/action/MailAction.hbm.xml"/>
-
- <!-- graph.def mapping files -->
- <mapping resource="org/jbpm/graph/def/ProcessDefinition.hbm.xml"/>
- <mapping resource="org/jbpm/graph/def/Node.hbm.xml"/>
- <mapping resource="org/jbpm/graph/def/Transition.hbm.xml"/>
- <mapping resource="org/jbpm/graph/def/Event.hbm.xml"/>
- <mapping resource="org/jbpm/graph/def/Action.hbm.xml"/>
- <mapping resource="org/jbpm/graph/def/SuperState.hbm.xml"/>
- <mapping resource="org/jbpm/graph/def/ExceptionHandler.hbm.xml"/>
- <mapping resource="org/jbpm/instantiation/Delegation.hbm.xml"/>
-
- <!-- ############################################ -->
- <!-- # another mapping file with external dependencies # -->
- <!-- ############################################ -->
- <!-- following mapping file has a dependency on -->
- <!-- 'bsh-{version}.jar'. -->
- <!-- uncomment this if you don't have bsh on your -->
- <!-- classpath. you won't be able to use the -->
- <!-- script element in process definition files -->
- <!-- has to be defined below org/jbpm/graph/def/Action.hbm.xml -->
- <!-- due to the inline collection-cache elements below -->
- <mapping resource="org/jbpm/graph/action/Script.hbm.xml"/>
-
- <!-- graph.node mapping files -->
- <mapping resource="org/jbpm/graph/node/StartState.hbm.xml"/>
- <mapping resource="org/jbpm/graph/node/EndState.hbm.xml"/>
- <mapping resource="org/jbpm/graph/node/ProcessState.hbm.xml"/>
- <mapping resource="org/jbpm/graph/node/Decision.hbm.xml"/>
- <mapping resource="org/jbpm/graph/node/Fork.hbm.xml"/>
- <mapping resource="org/jbpm/graph/node/Join.hbm.xml"/>
- <mapping resource="org/jbpm/graph/node/MailNode.hbm.xml"/>
- <mapping resource="org/jbpm/graph/node/State.hbm.xml"/>
- <mapping resource="org/jbpm/graph/node/TaskNode.hbm.xml"/>
-
- <!-- context.def mapping files -->
- <mapping resource="org/jbpm/context/def/ContextDefinition.hbm.xml"/>
- <mapping resource="org/jbpm/context/def/VariableAccess.hbm.xml"/>
-
- <!-- bytes mapping files -->
- <mapping resource="org/jbpm/bytes/ByteArray.hbm.xml"/>
-
- <!-- module.def mapping files -->
- <mapping resource="org/jbpm/module/def/ModuleDefinition.hbm.xml"/>
-
- <!-- file.def mapping files -->
- <mapping resource="org/jbpm/file/def/FileDefinition.hbm.xml"/>
-
- <!-- taskmgmt.def mapping files -->
- <mapping resource="org/jbpm/taskmgmt/def/TaskMgmtDefinition.hbm.xml"/>
- <mapping resource="org/jbpm/taskmgmt/def/Swimlane.hbm.xml"/>
- <mapping resource="org/jbpm/taskmgmt/def/Task.hbm.xml"/>
- <mapping resource="org/jbpm/taskmgmt/def/TaskController.hbm.xml"/>
-
- <!-- scheduler.def mapping files -->
- <mapping resource="org/jbpm/scheduler/def/CreateTimerAction.hbm.xml"/>
- <mapping resource="org/jbpm/scheduler/def/CancelTimerAction.hbm.xml"/>
-
- <!-- graph.exe mapping files -->
- <mapping resource="org/jbpm/graph/exe/Comment.hbm.xml"/>
- <mapping resource="org/jbpm/graph/exe/ProcessInstance.hbm.xml"/>
- <mapping resource="org/jbpm/graph/exe/Token.hbm.xml"/>
- <mapping resource="org/jbpm/graph/exe/RuntimeAction.hbm.xml"/>
-
- <!-- module.exe mapping files -->
- <mapping resource="org/jbpm/module/exe/ModuleInstance.hbm.xml"/>
-
- <!-- context.exe mapping files -->
- <mapping resource="org/jbpm/context/exe/ContextInstance.hbm.xml"/>
- <mapping resource="org/jbpm/context/exe/TokenVariableMap.hbm.xml"/>
- <mapping resource="org/jbpm/context/exe/VariableInstance.hbm.xml"/>
- <mapping resource="org/jbpm/context/exe/variableinstance/ByteArrayInstance.hbm.xml"/>
- <mapping resource="org/jbpm/context/exe/variableinstance/DateInstance.hbm.xml"/>
- <mapping resource="org/jbpm/context/exe/variableinstance/DoubleInstance.hbm.xml"/>
- <mapping resource="org/jbpm/context/exe/variableinstance/HibernateLongInstance.hbm.xml"/>
- <mapping resource="org/jbpm/context/exe/variableinstance/HibernateStringInstance.hbm.xml"/>
- <mapping resource="org/jbpm/context/exe/variableinstance/LongInstance.hbm.xml"/>
- <mapping resource="org/jbpm/context/exe/variableinstance/NullInstance.hbm.xml"/>
- <mapping resource="org/jbpm/context/exe/variableinstance/StringInstance.hbm.xml"/>
-
- <!-- job mapping files -->
- <mapping resource="org/jbpm/job/Job.hbm.xml"/>
- <mapping resource="org/jbpm/job/Timer.hbm.xml"/>
- <mapping resource="org/jbpm/job/ExecuteNodeJob.hbm.xml"/>
- <mapping resource="org/jbpm/job/ExecuteActionJob.hbm.xml"/>
-
- <!-- taskmgmt.exe mapping files -->
- <mapping resource="org/jbpm/taskmgmt/exe/TaskMgmtInstance.hbm.xml"/>
- <mapping resource="org/jbpm/taskmgmt/exe/TaskInstance.hbm.xml"/>
- <mapping resource="org/jbpm/taskmgmt/exe/PooledActor.hbm.xml"/>
- <mapping resource="org/jbpm/taskmgmt/exe/SwimlaneInstance.hbm.xml"/>
-
- <!-- logging mapping files -->
- <mapping resource="org/jbpm/logging/log/ProcessLog.hbm.xml"/>
- <mapping resource="org/jbpm/logging/log/MessageLog.hbm.xml"/>
- <mapping resource="org/jbpm/logging/log/CompositeLog.hbm.xml"/>
- <mapping resource="org/jbpm/graph/log/ActionLog.hbm.xml"/>
- <mapping resource="org/jbpm/graph/log/NodeLog.hbm.xml"/>
- <mapping resource="org/jbpm/graph/log/ProcessInstanceCreateLog.hbm.xml"/>
- <mapping resource="org/jbpm/graph/log/ProcessInstanceEndLog.hbm.xml"/>
- <mapping resource="org/jbpm/graph/log/ProcessStateLog.hbm.xml"/>
- <mapping resource="org/jbpm/graph/log/SignalLog.hbm.xml"/>
- <mapping resource="org/jbpm/graph/log/TokenCreateLog.hbm.xml"/>
- <mapping resource="org/jbpm/graph/log/TokenEndLog.hbm.xml"/>
- <mapping resource="org/jbpm/graph/log/TransitionLog.hbm.xml"/>
- <mapping resource="org/jbpm/context/log/VariableLog.hbm.xml"/>
- <mapping resource="org/jbpm/context/log/VariableCreateLog.hbm.xml"/>
- <mapping resource="org/jbpm/context/log/VariableDeleteLog.hbm.xml"/>
- <mapping resource="org/jbpm/context/log/VariableUpdateLog.hbm.xml"/>
- <mapping resource="org/jbpm/context/log/variableinstance/ByteArrayUpdateLog.hbm.xml"/>
- <mapping resource="org/jbpm/context/log/variableinstance/DateUpdateLog.hbm.xml"/>
- <mapping resource="org/jbpm/context/log/variableinstance/DoubleUpdateLog.hbm.xml"/>
- <mapping resource="org/jbpm/context/log/variableinstance/HibernateLongUpdateLog.hbm.xml"/>
- <mapping resource="org/jbpm/context/log/variableinstance/HibernateStringUpdateLog.hbm.xml"/>
- <mapping resource="org/jbpm/context/log/variableinstance/LongUpdateLog.hbm.xml"/>
- <mapping resource="org/jbpm/context/log/variableinstance/StringUpdateLog.hbm.xml"/>
- <mapping resource="org/jbpm/taskmgmt/log/TaskLog.hbm.xml"/>
- <mapping resource="org/jbpm/taskmgmt/log/TaskCreateLog.hbm.xml"/>
- <mapping resource="org/jbpm/taskmgmt/log/TaskAssignLog.hbm.xml"/>
- <mapping resource="org/jbpm/taskmgmt/log/TaskEndLog.hbm.xml"/>
- <mapping resource="org/jbpm/taskmgmt/log/SwimlaneLog.hbm.xml"/>
- <mapping resource="org/jbpm/taskmgmt/log/SwimlaneCreateLog.hbm.xml"/>
- <mapping resource="org/jbpm/taskmgmt/log/SwimlaneAssignLog.hbm.xml"/>
17 years, 6 months
JBoss JBPM SVN: r2622 - in jbpm3/trunk/modules/enterprise/jar: src/main/java/org/jbpm/ejb/impl and 1 other directories.
by do-not-reply@jboss.org
Author: alex.guizar(a)jboss.com
Date: 2008-10-27 01:28:03 -0400 (Mon, 27 Oct 2008)
New Revision: 2622
Modified:
jbpm3/trunk/modules/enterprise/jar/pom.xml
jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/ejb/impl/ExecuteJobCommand.java
jbpm3/trunk/modules/enterprise/jar/src/test/java/org/jbpm/scheduler/ejbtimer/EjbSchedulerTest.java
Log:
[JBPM-1708] added async attribute to join node in testScheduleFork which prevents sporadic failures due to the ejb timer service retrying a failed timeout only once (in this case, after a stale state exception)
removed test exclusion from pom, test now pass reliably under hsqldb and postgresql
Modified: jbpm3/trunk/modules/enterprise/jar/pom.xml
===================================================================
--- jbpm3/trunk/modules/enterprise/jar/pom.xml 2008-10-26 07:28:32 UTC (rev 2621)
+++ jbpm3/trunk/modules/enterprise/jar/pom.xml 2008-10-27 05:28:03 UTC (rev 2622)
@@ -260,14 +260,6 @@
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
- <configuration>
- <excludes>
- <!-- https://jira.jboss.org/jira/browse/JBPM-1708 -->
- <exclude>org/jbpm/scheduler/ejbtimer/EjbSchedulerTest.java</exclude>
- <!-- https://jira.jboss.org/jira/browse/JBPM-1709 -->
- <exclude>org/jbpm/msg/jms/JmsMessageTest.java</exclude>
- </excludes>
- </configuration>
</plugin>
</plugins>
</build>
Modified: jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/ejb/impl/ExecuteJobCommand.java
===================================================================
--- jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/ejb/impl/ExecuteJobCommand.java 2008-10-26 07:28:32 UTC (rev 2621)
+++ jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/ejb/impl/ExecuteJobCommand.java 2008-10-27 05:28:03 UTC (rev 2622)
@@ -61,8 +61,7 @@
JobSession jobSession = jbpmContext.getJobSession();
Job job = jobSession.getJob(jobId);
if (job == null || job.getLockOwner() != null) {
- log.debug("job " + jobId + " was deleted or is locked, abandoning execution");
- jbpmContext.setRollbackOnly();
+ log.debug("job " + jobId + " was deleted or is locked, ignoring command");
return null;
}
String lockOwner = Long.toString(jobId);
Modified: jbpm3/trunk/modules/enterprise/jar/src/test/java/org/jbpm/scheduler/ejbtimer/EjbSchedulerTest.java
===================================================================
--- jbpm3/trunk/modules/enterprise/jar/src/test/java/org/jbpm/scheduler/ejbtimer/EjbSchedulerTest.java 2008-10-26 07:28:32 UTC (rev 2621)
+++ jbpm3/trunk/modules/enterprise/jar/src/test/java/org/jbpm/scheduler/ejbtimer/EjbSchedulerTest.java 2008-10-27 05:28:03 UTC (rev 2622)
@@ -28,7 +28,6 @@
import javax.naming.InitialContext;
import junit.framework.Test;
-import junit.framework.TestSuite;
import org.apache.cactus.ServletTestCase;
import org.apache.commons.logging.Log;
@@ -250,7 +249,7 @@
+ " <timer duedate='1.25 second' transition='timeout' />"
+ " <transition name='timeout' to='j' />"
+ " </state>"
- + " <join name='j'>"
+ + " <join name='j' async='exclusive'>"
+ " <transition to='end' />"
+ " </join>"
+ " <end-state name='end' />"
17 years, 6 months
JBoss JBPM SVN: r2621 - in jbpm3/trunk: modules/core/src/main/java/org/jbpm/db and 18 other directories.
by do-not-reply@jboss.org
Author: alex.guizar(a)jboss.com
Date: 2008-10-26 03:28:32 -0400 (Sun, 26 Oct 2008)
New Revision: 2621
Added:
jbpm3/trunk/modules/core/src/main/java/org/jbpm/job/CleanUpProcessJob.java
jbpm3/trunk/modules/core/src/main/resources/org/jbpm/job/CleanUpProcessJob.hbm.xml
Modified:
jbpm3/trunk/.project
jbpm3/trunk/modules/core/src/main/java/org/jbpm/db/AbstractDbTestCase.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/db/JobSession.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/persistence/jta/JtaDbPersistenceService.java
jbpm3/trunk/modules/core/src/main/resources/hibernate.mapping.default.xml
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jbpm1072/JBPM1072Test.java
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jbpm1755/JBPM1755Test.java
jbpm3/trunk/modules/core/src/test/java/org/jbpm/jbpm983/JBPM983Test.java
jbpm3/trunk/modules/core/src/test/java/org/jbpm/job/executor/JobExecutorDbTest.java
jbpm3/trunk/modules/core/src/test/java/org/jbpm/msg/command/AsyncExecutionDbTest.java
jbpm3/trunk/modules/core/src/test/java/org/jbpm/optimisticlocking/LockingTest.java
jbpm3/trunk/modules/core/src/test/java/org/jbpm/scheduler/exe/TimerDbTest.java
jbpm3/trunk/modules/core/src/test/java/org/jbpm/taskmgmt/exe/TaskTimerExecutionDbTest.java
jbpm3/trunk/modules/distribution/pom.xml
jbpm3/trunk/modules/enterprise/jar/pom.xml
jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/ejb/impl/CommandServiceBean.java
jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/ejb/impl/ExecuteJobCommand.java
jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/ejb/impl/ExecuteJobsCommand.java
jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/msg/jms/JmsMessageServiceFactory.java
jbpm3/trunk/modules/enterprise/jar/src/test/java/org/jbpm/msg/jms/JmsMessageTest.java
jbpm3/trunk/pom.xml
Log:
[JBPM-1709] introduced cleanup-process-job to decrease the likelihood of stale state exceptions while ending a process instance
revised several tests in core module which hanged after the above change because they assumed no jobs remain once a process ends
upgraded posgresql driver version to 8.3, for the xa datasource
JmsMessageTest is good to go on hsql
Modified: jbpm3/trunk/.project
===================================================================
--- jbpm3/trunk/.project 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/.project 2008-10-26 07:28:32 UTC (rev 2621)
@@ -5,7 +5,13 @@
<projects>
</projects>
<buildSpec>
+ <buildCommand>
+ <name>org.maven.ide.eclipse.maven2Builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
</buildSpec>
<natures>
+ <nature>org.maven.ide.eclipse.maven2Nature</nature>
</natures>
</projectDescription>
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/db/AbstractDbTestCase.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/db/AbstractDbTestCase.java 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/db/AbstractDbTestCase.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -63,14 +63,12 @@
protected void setUp() throws Exception
{
super.setUp();
- createJbpmContext();
- initializeMembers();
+ beginSessionTransaction();
}
protected void tearDown() throws Exception
{
- resetMembers();
- closeJbpmContext();
+ commitAndCloseSession();
ensureCleanDatabase();
super.tearDown();
@@ -189,7 +187,10 @@
protected void closeJbpmContext()
{
if (jbpmContext != null)
+ {
jbpmContext.close();
+ jbpmContext = null;
+ }
}
protected void startJobExecutor()
@@ -198,10 +199,8 @@
jobExecutor.start();
}
- private void processAllJobs(final long maxWait, int maxJobs)
+ protected void processAllJobs(final long maxWait, int maxJobs)
{
- boolean jobsAvailable = true;
-
// install a timer that will interrupt if it takes too long
// if that happens, it will lead to an interrupted exception and the test
// will fail
@@ -220,14 +219,11 @@
try
{
- while (jobsAvailable)
+ while (getNbrOfJobsAvailable() > maxJobs)
{
log.debug("going to sleep for 200 millis, waiting for the job executor to process more jobs");
Thread.sleep(200);
- jobsAvailable = (getNbrOfJobsAvailable() > maxJobs);
}
- jobExecutor.stopAndJoin();
-
}
catch (InterruptedException e)
{
@@ -263,7 +259,7 @@
{
int nbrOfJobsAvailable = 0;
Number jobs = (Number)session.createQuery("select count(*) from org.jbpm.job.Job").uniqueResult();
- log.debug("there are '" + jobs + "' jobs currently in the job table");
+ log.debug("there are " + jobs + " jobs in the database");
if (jobs != null)
{
nbrOfJobsAvailable = jobs.intValue();
@@ -271,9 +267,10 @@
return nbrOfJobsAvailable;
}
- protected boolean areJobsAvailable()
- {
- return (getNbrOfJobsAvailable() > 0);
+ protected int getTimerCount() {
+ Number timerCount = (Number)session.createQuery("select count(*) from org.jbpm.job.Timer").uniqueResult();
+ log.debug("there are " + timerCount + " timers in the database");
+ return timerCount.intValue();
}
protected Job getJob()
@@ -289,14 +286,6 @@
protected void processJobs(long maxWait, int maxJobs)
{
commitAndCloseSession();
- try
- {
- Thread.sleep(300);
- }
- catch (InterruptedException e)
- {
- e.printStackTrace();
- }
startJobExecutor();
try
{
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/db/JobSession.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/db/JobSession.java 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/db/JobSession.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -1,3 +1,24 @@
+/*
+ * 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.db;
import java.util.Collection;
@@ -8,14 +29,13 @@
import org.apache.commons.logging.LogFactory;
import org.hibernate.Query;
import org.hibernate.Session;
-import org.jbpm.JbpmContext;
+import org.hibernate.criterion.Restrictions;
import org.jbpm.JbpmException;
import org.jbpm.graph.def.Action;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
import org.jbpm.job.Job;
import org.jbpm.job.Timer;
-import org.jbpm.svc.save.SaveOperation;
public class JobSession {
@@ -117,6 +137,17 @@
}
}
+ public List loadJobs(long[] jobIds) {
+ int jobCount = jobIds.length;
+ Long[] jobs = new Long[jobCount];
+ for (int i = 0; i < jobCount; i++) {
+ jobs[i] = new Long(jobIds[i]);
+ }
+ return session.createCriteria(Job.class)
+ .add(Restrictions.in("id", jobs))
+ .list();
+ }
+
public Job getJob(long jobId) {
try {
return (Job) session.get(Job.class, new Long(jobId));
@@ -164,45 +195,21 @@
}
}
- private static class DeleteJobsOperation implements SaveOperation {
+ public void deleteJobsForProcessInstance(ProcessInstance processInstance) {
+ log.debug("deleting timers for "+processInstance);
+ Query query = session.getNamedQuery("JobSession.deleteTimersForProcessInstance");
+ query.setParameter("processInstance", processInstance);
+ int entityCount = query.executeUpdate();
+ log.debug(entityCount+" remaining timers for "+processInstance+" were deleted");
- private ProcessInstance targetProcessInstance;
-
- private static final long serialVersionUID = 1L;
-
- DeleteJobsOperation(ProcessInstance processInstance) {
- targetProcessInstance = processInstance;
- }
-
- public void save(ProcessInstance processInstance, JbpmContext jbpmContext) {
- // avoid deleting jobs for process instances that did not request job deletion
- if (!targetProcessInstance.equals(processInstance)) {
- log.debug("forgiving " + processInstance + ", it is not the target of this operation");
- return;
- }
-
- log.debug("deleting timers for "+processInstance);
- Session session = jbpmContext.getSession();
- Query query = session.getNamedQuery("JobSession.deleteTimersForProcessInstance");
- query.setParameter("processInstance", processInstance);
- int entityCount = query.executeUpdate();
- log.debug(entityCount+" remaining timers for "+processInstance+" were deleted");
-
- log.debug("deleting execute-node-jobs for "+processInstance);
- query = session.getNamedQuery("JobSession.deleteExecuteNodeJobsForProcessInstance");
- query.setParameter("processInstance", processInstance);
- entityCount = query.executeUpdate();
- log.debug(entityCount+" remaining execute-node-jobs for "+processInstance+" were deleted");
- }
-
+ log.debug("deleting execute-node-jobs for "+processInstance);
+ query = session.getNamedQuery("JobSession.deleteExecuteNodeJobsForProcessInstance");
+ query.setParameter("processInstance", processInstance);
+ entityCount = query.executeUpdate();
+ log.debug(entityCount+" remaining execute-node-jobs for "+processInstance+" were deleted");
}
- public void deleteJobsForProcessInstance(ProcessInstance processInstance) {
- SaveOperation operation = new DeleteJobsOperation(processInstance);
- JbpmContext.getCurrentJbpmContext().getServices().addSaveOperation(operation);
- }
-
public List findJobsWithOverdueLockTime(Date treshold) {
Query query = session.getNamedQuery("JobSession.findJobsWithOverdueLockTime");
query.setDate("now", treshold);
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-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -38,11 +38,12 @@
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.log.ProcessInstanceCreateLog;
import org.jbpm.graph.log.ProcessInstanceEndLog;
+import org.jbpm.job.CleanUpProcessJob;
import org.jbpm.logging.exe.LoggingInstance;
import org.jbpm.logging.log.ProcessLog;
import org.jbpm.module.def.ModuleDefinition;
import org.jbpm.module.exe.ModuleInstance;
-import org.jbpm.scheduler.SchedulerService;
+import org.jbpm.msg.MessageService;
import org.jbpm.svc.Services;
import org.jbpm.taskmgmt.exe.TaskMgmtInstance;
import org.jbpm.util.Clock;
@@ -322,11 +323,14 @@
superProcessToken.signal(superExecutionContext);
}
- // make sure all the timers for this process instance are cancelled when the process end updates get saved in the database.
- // TODO route this directly through the jobSession. just like the suspend and resume.
- // NOTE Only timers should be deleted, messages-type of jobs should be kept.
- SchedulerService schedulerService = (SchedulerService) Services.getCurrentService(Services.SERVICENAME_SCHEDULER, false);
- if (schedulerService!=null) schedulerService.deleteTimersByProcessInstance(this);
+ // make sure all the timers for this process instance are canceled after the process end updates are posted to the database
+ // NOTE Only timers should be deleted, messages should be kept.
+ MessageService messageService = (MessageService) Services.getCurrentService(Services.SERVICENAME_MESSAGE, false);
+ if (messageService != null) {
+ CleanUpProcessJob job = new CleanUpProcessJob(this);
+ job.setDueDate(new Date());
+ messageService.send(job);
+ }
}
}
Added: jbpm3/trunk/modules/core/src/main/java/org/jbpm/job/CleanUpProcessJob.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/job/CleanUpProcessJob.java (rev 0)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/job/CleanUpProcessJob.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -0,0 +1,51 @@
+/*
+ * 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.job;
+
+import org.jbpm.JbpmContext;
+import org.jbpm.graph.exe.ProcessInstance;
+import org.jbpm.scheduler.SchedulerService;
+
+/**
+ * @author Alejandro Guizar
+ */
+public class CleanUpProcessJob extends Job {
+
+ private static final long serialVersionUID = 1L;
+
+ public CleanUpProcessJob() {
+ // default constructor
+ }
+
+ public CleanUpProcessJob(ProcessInstance processInstance) {
+ this.processInstance = processInstance;
+ }
+
+ public boolean execute(JbpmContext jbpmContext) throws Exception {
+ SchedulerService schedulerService = jbpmContext.getServices().getSchedulerService();
+ if (schedulerService!=null) {
+ schedulerService.deleteTimersByProcessInstance(processInstance);
+ }
+ return true;
+ }
+
+}
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/persistence/jta/JtaDbPersistenceService.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/persistence/jta/JtaDbPersistenceService.java 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/persistence/jta/JtaDbPersistenceService.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -49,7 +49,7 @@
}
protected boolean isTransactionActive() {
- return isJtaTxCreated();
+ return isJtaTransactionInProgress();
}
public void close() {
@@ -67,28 +67,28 @@
void beginJtaTransaction() {
try {
- log.debug("start user JTA transaction");
+ log.debug("begin user transaction");
userTransaction = ((JtaDbPersistenceServiceFactory) persistenceServiceFactory).getUserTransaction();
userTransaction.begin();
} catch (Exception e) {
- throw new JbpmException("couldn't start JTA transaction", e);
+ throw new JbpmException("couldn't begin user transaction", e);
}
}
void endJtaTransaction() {
if (isRollbackOnly() || JTAHelper.isRollback(getJtaTransactionStatus())) {
- log.debug("end jta transation with ROLLBACK");
+ log.debug("rolling back user transaction");
try {
userTransaction.rollback();
} catch (Exception e) {
- throw new JbpmException("couldn't rollback JTA transaction", e);
+ throw new JbpmException("couldn't rollback user transaction", e);
}
} else {
- log.debug("end jta transation with COMMIT");
+ log.debug("committing user transaction");
try {
userTransaction.commit();
} catch (Exception e) {
- throw new JbpmException("couldn't commit JTA transaction", e);
+ throw new JbpmException("couldn't commit user transaction", e);
}
}
}
Modified: jbpm3/trunk/modules/core/src/main/resources/hibernate.mapping.default.xml
===================================================================
--- jbpm3/trunk/modules/core/src/main/resources/hibernate.mapping.default.xml 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/core/src/main/resources/hibernate.mapping.default.xml 2008-10-26 07:28:32 UTC (rev 2621)
@@ -100,6 +100,7 @@
<mapping resource="org/jbpm/job/Timer.hbm.xml"/>
<mapping resource="org/jbpm/job/ExecuteNodeJob.hbm.xml"/>
<mapping resource="org/jbpm/job/ExecuteActionJob.hbm.xml"/>
+ <mapping resource="org/jbpm/job/CleanUpProcessJob.hbm.xml"/>
<!-- taskmgmt.exe mapping files -->
<mapping resource="org/jbpm/taskmgmt/exe/TaskMgmtInstance.hbm.xml"/>
Added: jbpm3/trunk/modules/core/src/main/resources/org/jbpm/job/CleanUpProcessJob.hbm.xml
===================================================================
--- jbpm3/trunk/modules/core/src/main/resources/org/jbpm/job/CleanUpProcessJob.hbm.xml (rev 0)
+++ jbpm3/trunk/modules/core/src/main/resources/org/jbpm/job/CleanUpProcessJob.hbm.xml 2008-10-26 07:28:32 UTC (rev 2621)
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping auto-import="false" default-access="field">
+
+ <subclass name="org.jbpm.job.CleanUpProcessJob"
+ discriminator-value="C"
+ extends="org.jbpm.job.Job" />
+
+</hibernate-mapping>
Modified: jbpm3/trunk/modules/core/src/test/java/org/jbpm/jbpm1072/JBPM1072Test.java
===================================================================
--- jbpm3/trunk/modules/core/src/test/java/org/jbpm/jbpm1072/JBPM1072Test.java 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/jbpm1072/JBPM1072Test.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -101,6 +101,7 @@
// wait for process end
EventCallback.waitForEvent(Event.EVENTTYPE_PROCESS_END);
+ assertEquals(2, Counter.getExecutionCount());
// stop job executors
for (int i = jobExecutors.length - 1; i >= 0; i--) {
@@ -113,7 +114,6 @@
}
beginSessionTransaction();
- assertEquals(2, Counter.getExecutionCount());
}
public static class Counter implements ActionHandler {
Modified: jbpm3/trunk/modules/core/src/test/java/org/jbpm/jbpm1755/JBPM1755Test.java
===================================================================
--- jbpm3/trunk/modules/core/src/test/java/org/jbpm/jbpm1755/JBPM1755Test.java 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/jbpm1755/JBPM1755Test.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -39,8 +39,9 @@
@Override
protected void tearDown() throws Exception {
EventCallback.clear();
+
+ stopJobExecutor();
graphSession.deleteProcessDefinition(processDefinitionId);
- stopJobExecutor();
super.tearDown();
}
@@ -76,7 +77,8 @@
waitForProcessInstanceEnd(processInstanceId);
assertTrue(hasProcessInstanceEnded(processInstanceId));
}
- beginSessionTransaction();
+
+ processJobs(maxWaitTime, 0);
}
private void waitForProcessInstanceEnd(long processInstanceId) {
Modified: jbpm3/trunk/modules/core/src/test/java/org/jbpm/jbpm983/JBPM983Test.java
===================================================================
--- jbpm3/trunk/modules/core/src/test/java/org/jbpm/jbpm983/JBPM983Test.java 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/jbpm983/JBPM983Test.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -5,7 +5,6 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.jbpm.JbpmContext;
import org.jbpm.db.AbstractDbTestCase;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.def.ProcessDefinition;
@@ -18,29 +17,43 @@
*
* https://jira.jboss.org/jira/browse/JBPM-983
*
- * @author Tom Baeyens
+ * @author Tom Baeyens
*/
-public class JBPM983Test extends AbstractDbTestCase
-{
+public class JBPM983Test extends AbstractDbTestCase {
+
private static Log log = LogFactory.getLog(JBPM983Test.class);
+ private long subProcessDefinitionId;
+ private long processDefinitionId;
+
@Override
- protected String getJbpmTestConfig()
- {
+ protected String getJbpmTestConfig() {
return "org/jbpm/jbpm.test.cfg.xml";
}
- protected void setUp() throws Exception
- {
+ protected void setUp() throws Exception {
super.setUp();
+
+ ProcessDefinition subProcessDefinition = ProcessDefinition.parseXmlString(SUBPROCESS_XML);
+ jbpmContext.deployProcessDefinition(subProcessDefinition);
+ subProcessDefinitionId = subProcessDefinition.getId();
+
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(PROCESS_XML);
+ jbpmContext.deployProcessDefinition(processDefinition);
+ processDefinitionId = processDefinition.getId();
+
JobExecutor jobExecutor = getJbpmConfiguration().getJobExecutor();
jobExecutor.setNbrOfThreads(5);
jobExecutor.start();
}
- protected void tearDown() throws Exception
- {
+ protected void tearDown() throws Exception {
getJbpmConfiguration().getJobExecutor().stop();
+
+ newTransaction();
+ graphSession.deleteProcessDefinition(processDefinitionId);
+ graphSession.deleteProcessDefinition(subProcessDefinitionId);
+
super.tearDown();
}
@@ -111,101 +124,91 @@
+ "</end-state>"
+ "</process-definition>";
- public void testConcurrentJobs() throws Exception
- {
- assertTrue(getJbpmConfiguration().getJobExecutor().getNbrOfThreads() > 1);
+ public void testConcurrentJobs() throws Exception {
+ // create test properties
+ Map testVariables = new HashMap();
+ testVariables.put("test", "true");
- ProcessDefinition subProcessDefinition = ProcessDefinition.parseXmlString(SUBPROCESS_XML);
- jbpmContext.deployProcessDefinition(subProcessDefinition);
+ final int processCount = 10;
+ long[] processInstanceIds = new long[processCount];
+ for (int i = 0; i < processCount; i++) {
+ newTransaction();
+ ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("superprocess");
+ processInstance.getContextInstance().addVariables(testVariables);
+ processInstance.signal();
+ processInstanceIds[i] = processInstance.getId();
+ }
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(PROCESS_XML);
- jbpmContext.deployProcessDefinition(processDefinition);
-
- newTransaction();
-
- try {
- // create test properties
- Map testVariables = new HashMap();
- testVariables.put("test", "true");
+ for (int i = 0; i < processCount; i++) {
+ long piId = processInstanceIds[i];
+ waitFor(piId);
- final int processCount = 10;
- long[] piIds = new long[processCount];
- for (int i = 0; i < processCount; i++)
- {
- ProcessInstance pi = jbpmContext.newProcessInstanceForUpdate("superprocess");
- pi.getContextInstance().addVariables(testVariables);
- pi.signal();
- piIds[i] = pi.getId();
-
- newTransaction();
- }
-
- for (int i = 0; i < processCount; i++)
- {
- long piId = piIds[i];
- waitFor(piId);
-
- ProcessInstance pi = jbpmContext.loadProcessInstance(piId);
- assertEquals("end-state-success", pi.getRootToken().getNode().getName());
- }
- } finally {
- newTransaction();
- graphSession.deleteProcessDefinition(processDefinition);
- graphSession.deleteProcessDefinition(subProcessDefinition);
+ ProcessInstance pi = jbpmContext.loadProcessInstance(piId);
+ assertEquals("end-state-success", pi.getRootToken().getNode().getName());
}
}
- protected void waitFor(long piId) throws Exception
- {
+ protected void waitFor(long piId) throws Exception {
final int endTimeout = 30;
long startTime = System.currentTimeMillis();
-
+
boolean processInstanceHasEnded = false;
-
- while (! processInstanceHasEnded)
- {
- if (System.currentTimeMillis() - startTime > endTimeout * 1000)
- {
+ while (!processInstanceHasEnded) {
+ if (System.currentTimeMillis() - startTime > endTimeout * 1000) {
fail("Aborting after " + endTimeout + " seconds.");
return;
}
newTransaction();
-
processInstanceHasEnded = jbpmContext.loadProcessInstance(piId).hasEnded();
log.info("waiting for workflow completion....");
- try
- {
+ try {
Thread.sleep(200);
}
- catch (InterruptedException e)
- {
+ catch (InterruptedException e) {
log.error("wait for workflow was interruputed", e);
}
}
}
- public static class TestAction implements ActionHandler
- {
+ public static class TestAction implements ActionHandler {
private static final long serialVersionUID = 1L;
- public void execute(ExecutionContext executionContext) throws Exception
- {
- String processName = executionContext.getProcessDefinition().getName() + ":" + executionContext.getProcessInstance().getId();
+ public void execute(ExecutionContext executionContext) throws Exception {
+ String processName = executionContext.getProcessDefinition().getName()
+ + ":"
+ + executionContext.getProcessInstance().getId();
String nodeName = executionContext.getToken().getNode().getName();
String tokenName = executionContext.getToken().toString();
- log.info("ACTION (process=" + processName + ",node=" + nodeName + ",token=" + tokenName + "): begin");
+ log.info("ACTION (process="
+ + processName
+ + ",node="
+ + nodeName
+ + ",token="
+ + tokenName
+ + "): begin");
- for (int i = 0; i < 5; i++)
- {
- log.info("ACTION (process=" + processName + ",node=" + nodeName + ",token=" + tokenName + "): working...");
+ for (int i = 0; i < 5; i++) {
+ log.info("ACTION (process="
+ + processName
+ + ",node="
+ + nodeName
+ + ",token="
+ + tokenName
+ + "): working...");
Thread.sleep(100);
}
- log.info("ACTION (process=" + processName + ",node=" + nodeName + ",token=" + tokenName + "): end");
+ log.info("ACTION (process="
+ + processName
+ + ",node="
+ + nodeName
+ + ",token="
+ + tokenName
+ + "): end");
executionContext.leaveNode();
}
Modified: jbpm3/trunk/modules/core/src/test/java/org/jbpm/job/executor/JobExecutorDbTest.java
===================================================================
--- jbpm3/trunk/modules/core/src/test/java/org/jbpm/job/executor/JobExecutorDbTest.java 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/job/executor/JobExecutorDbTest.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -53,7 +53,6 @@
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try
{
-
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
"<process-definition name='bulk messages'>"
+ " <start-state>"
Modified: jbpm3/trunk/modules/core/src/test/java/org/jbpm/msg/command/AsyncExecutionDbTest.java
===================================================================
--- jbpm3/trunk/modules/core/src/test/java/org/jbpm/msg/command/AsyncExecutionDbTest.java 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/msg/command/AsyncExecutionDbTest.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -33,35 +33,43 @@
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.graph.exe.ProcessInstance;
-public class AsyncExecutionDbTest extends AbstractDbTestCase
-{
+public class AsyncExecutionDbTest extends AbstractDbTestCase {
static List recordedNodes = new ArrayList();
- public static class RecordNode implements ActionHandler
- {
+ public static class RecordNode implements ActionHandler {
+
private static final long serialVersionUID = 1L;
- public void execute(ExecutionContext executionContext) throws Exception
- {
+ public void execute(ExecutionContext executionContext) throws Exception {
Node node = executionContext.getNode();
recordedNodes.add(node.getName());
node.leave(executionContext);
}
}
- public void testAsyncExecution() throws Exception
- {
+ public void testAsyncExecution() throws Exception {
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>" + " <start-state>" + " <transition to='one' />"
- + " </start-state>" + " <node async='true' name='one'>" + " <action class='org.jbpm.msg.command.AsyncExecutionDbTest$RecordNode' />"
- + " <transition to='two' />" + " </node>" + " <node async='exclusive' name='two'>"
- + " <action class='org.jbpm.msg.command.AsyncExecutionDbTest$RecordNode' />" + " <transition to='three' />" + " </node>"
- + " <node async='true' name='three'>" + " <action class='org.jbpm.msg.command.AsyncExecutionDbTest$RecordNode' />" + " <transition to='end' />"
- + " </node>" + " <end-state name='end' />" + "</process-definition>");
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>"
+ + " <start-state>"
+ + " <transition to='one' />"
+ + " </start-state>"
+ + " <node async='true' name='one'>"
+ + " <action class='org.jbpm.msg.command.AsyncExecutionDbTest$RecordNode' />"
+ + " <transition to='two' />"
+ + " </node>"
+ + " <node async='exclusive' name='two'>"
+ + " <action class='org.jbpm.msg.command.AsyncExecutionDbTest$RecordNode' />"
+ + " <transition to='three' />"
+ + " </node>"
+ + " <node async='true' name='three'>"
+ + " <action class='org.jbpm.msg.command.AsyncExecutionDbTest$RecordNode' />"
+ + " <transition to='end' />"
+ + " </node>"
+ + " <end-state name='end' />"
+ + "</process-definition>");
processDefinition = saveAndReload(processDefinition);
- try
- {
+ try {
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.signal();
jbpmContext.save(processInstance);
@@ -85,8 +93,7 @@
assertTrue(processInstance.hasEnded());
assertEquals(processDefinition.getNode("end"), processInstance.getRootToken().getNode());
}
- finally
- {
+ finally {
jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
}
@@ -94,20 +101,19 @@
static Set recordedActionNumbers = new HashSet();
- public static class RecordAction implements ActionHandler
- {
+ public static class RecordAction implements ActionHandler {
+
private static final long serialVersionUID = 1L;
String nbr;
- public void execute(ExecutionContext executionContext) throws Exception
- {
+ public void execute(ExecutionContext executionContext) throws Exception {
recordedActionNumbers.add(nbr);
}
}
- public void testAsyncAction() throws Exception
- {
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>" + " <event type='process-start'>"
+ public void testAsyncAction() throws Exception {
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>"
+ + " <event type='process-start'>"
+ " <action async='true' class='"
+ RecordAction.class.getName()
+ "'>"
@@ -146,15 +152,17 @@
+ " <nbr>6</nbr>"
+ " </action>"
+ " </event>"
- + " <transition to='end' />" + " </node>" + " <end-state name='end' />" + "</process-definition>");
+ + " <transition to='end' />"
+ + " </node>"
+ + " <end-state name='end' />"
+ + "</process-definition>");
processDefinition = saveAndReload(processDefinition);
- try
- {
+ try {
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.signal();
jbpmContext.save(processInstance);
assertEquals(processDefinition.getNode("end"), processInstance.getRootToken().getNode());
- assertEquals(6, getNbrOfJobsAvailable());
+ assertEquals(7, getNbrOfJobsAvailable());
assertEquals(0, recordedActionNumbers.size());
processJobs(5000);
@@ -171,8 +179,7 @@
assertEquals(expected, recordedActionNumbers);
}
- finally
- {
+ finally {
jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
}
Modified: jbpm3/trunk/modules/core/src/test/java/org/jbpm/optimisticlocking/LockingTest.java
===================================================================
--- jbpm3/trunk/modules/core/src/test/java/org/jbpm/optimisticlocking/LockingTest.java 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/optimisticlocking/LockingTest.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -5,7 +5,6 @@
import java.util.List;
import org.hibernate.Query;
-import org.hibernate.Session;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.db.AbstractDbTestCase;
@@ -18,216 +17,147 @@
*
* https://jira.jboss.org/jira/browse/JBPM-1071
*/
-public class LockingTest extends AbstractDbTestCase
-{
+public class LockingTest extends AbstractDbTestCase {
+
+ private long processDefinitionId;
+
static int nbrOfThreads = 5;
static int nbrOfIterations = 20;
- public void testLocking()
- {
- // the process will be executed in 2 separete transactions:
+ protected void setUp() throws Exception {
+ super.setUp();
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition name='lockprocess'>"
+ + " <start-state name='start'>"
+ + " <transition to='end'/>"
+ + " </start-state>"
+ + " <end-state name='end' />"
+ + "</process-definition>");
+ jbpmContext.deployProcessDefinition(processDefinition);
+ processDefinitionId = processDefinition.getId();
+ }
+
+ protected void tearDown() throws Exception {
+ graphSession.deleteProcessDefinition(processDefinitionId);
+ super.tearDown();
+ }
+
+ public void testLocking() {
+ // the process will be executed in 2 separate transactions:
// Transaction 1 will create the process instance and position
// the root token in the start state
// Transaction 2 will signal the process instance while it is in the
// start state, and that signal will bring the process to it's end state.
- // It's the second transaction for which we'll set up multiple competing threads
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
- "<process-definition name='lockprocess'>" +
- " <start-state name='start'>" +
- " <transition to='end'/>" +
- " </start-state>" +
- " <end-state name='end' />" +
- "</process-definition>");
+ // multiple competing threads will be set up for the second transaction
+ for (int i = 0; i < nbrOfIterations; i++) {
+ long processInstanceId = jbpmContext.newProcessInstanceForUpdate("lockprocess").getId();
+ commitAndCloseSession();
- // deploy the process
- JbpmContext jbpmContext = getJbpmConfiguration().createJbpmContext();
- long processDefinitionId = 0;
- try
- {
- jbpmContext.deployProcessDefinition(processDefinition);
- processDefinitionId = processDefinition.getId();
- }
- finally
- {
- jbpmContext.close();
- }
-
- try
- {
- for (int i = 0; i < nbrOfIterations; i++)
- {
- long processInstanceId = launchProcessInstance();
+ // create a bunch of threads that will all wait on the
+ // semaphore before they will try to signal the same process instance
+ Object semaphore = new Object();
+ List threads = startThreads(semaphore, processInstanceId);
- // create a bunch of threads that will all wait on the
- // semaphore before they will try to signal the same process instance
- Object semaphore = new Object();
- List threads = startThreads(semaphore, processInstanceId);
+ // release all the threads
+ synchronized (semaphore) {
+ semaphore.notifyAll();
+ }
- // release all the threads
- synchronized (semaphore)
- {
- semaphore.notifyAll();
- }
+ // wait for all threads to finish
+ joinAllThreads(threads);
- // wait for all threads to finish
- joinAllThreads(threads);
+ // check that only 1 of those threads committed
+ beginSessionTransaction();
+ Query query = session.createQuery("from org.jbpm.graph.exe.Comment");
+ List results = query.list();
+ assertEquals(results.toString(), 1, results.size());
- // check that only 1 of those threads committed
- jbpmContext = getJbpmConfiguration().createJbpmContext();
- try
- {
- Session session = jbpmContext.getSession();
- Query query = session.createQuery("select c from org.jbpm.graph.exe.Comment as c");
- List results = query.list();
- // System.out.println("iteration "+i+": "+results);
- assertEquals(results.toString(), 1, results.size());
+ // delete the comment
+ session.delete(results.get(0));
- // delete the comment
- session.delete(results.get(0));
-
- }
- finally
- {
- jbpmContext.close();
- }
-
- // check that the process instance has ended
- jbpmContext = getJbpmConfiguration().createJbpmContext();
- try
- {
- ProcessInstance processInstance = jbpmContext.loadProcessInstance(processInstanceId);
- assertTrue(processInstance.hasEnded());
-
- }
- finally
- {
- jbpmContext.close();
- }
- }
+ // check that the process instance has ended
+ ProcessInstance processInstance = jbpmContext.loadProcessInstance(processInstanceId);
+ assertTrue(processInstance.hasEnded());
}
- finally
- {
- jbpmContext = getJbpmConfiguration().createJbpmContext();
- try
- {
- jbpmContext.getGraphSession().deleteProcessDefinition(processDefinitionId);
- }
- finally
- {
- jbpmContext.close();
- }
- }
-
}
- private long launchProcessInstance()
- {
- JbpmContext jbpmContext = getJbpmConfiguration().createJbpmContext();
- try
- {
- return jbpmContext.newProcessInstance("lockprocess").getId();
- }
- finally
- {
- jbpmContext.close();
- }
- }
-
- private List startThreads(Object semaphore, long processInstanceId)
- {
+ private List startThreads(Object semaphore, long processInstanceId) {
List threads = new ArrayList();
- for (int i = 0; i < nbrOfThreads; i++)
- {
+ for (int i = 0; i < nbrOfThreads; i++) {
Thread thread = new LockThread(getJbpmConfiguration(), semaphore, processInstanceId);
thread.start();
threads.add(thread);
}
- try
- {
+ try {
// giving the threads the opportunity to start and arrive in the wait
Thread.sleep(200);
}
- catch (InterruptedException e)
- {
+ catch (InterruptedException e) {
// ignore
}
return threads;
}
- public static class LockThread extends Thread
- {
+ static class LockThread extends Thread {
+
Object semaphore;
long processInstanceId;
JbpmConfiguration jbpmConfiguration;
- public LockThread(JbpmConfiguration jbpmConfiguration, Object semaphore, long processInstanceId)
- {
+ public LockThread(JbpmConfiguration jbpmConfiguration, Object semaphore, long processInstanceId) {
this.semaphore = semaphore;
this.processInstanceId = processInstanceId;
this.jbpmConfiguration = jbpmConfiguration;
}
- public void run()
- {
- try
- {
+ public void run() {
+ try {
// first wait until the all threads are released at once in the
// method testLocking
- synchronized (semaphore)
- {
+ synchronized (semaphore) {
semaphore.wait();
}
- // after a thread is released (=notified), it will try to load the process instance,
+ // after a thread is released (=notified), it will try to load the
+ // process instance,
// signal it and then commit the transaction
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- try
- {
+ try {
ProcessInstance processInstance = jbpmContext.loadProcessInstance(processInstanceId);
processInstance.signal();
jbpmContext.save(processInstance);
- // add a comment in the same transaction so that we can see which thread won
+ // add a comment in the same transaction so that we can see which
+ // thread won
Comment comment = new Comment(getName() + " committed");
jbpmContext.getSession().save(comment);
-
}
- catch (Exception e)
- {
+ catch (Exception e) {
jbpmContext.setRollbackOnly();
}
- finally
- {
+ finally {
jbpmContext.close();
}
-
}
- catch (InterruptedException e)
- {
+ catch (InterruptedException e) {
fail("semaphore waiting got interrupted");
}
- catch (Throwable t)
- {
+ catch (Throwable t) {
// ignore
}
}
}
- private void joinAllThreads(List threads)
- {
+ private void joinAllThreads(List threads) {
Iterator iter = threads.iterator();
- while (iter.hasNext())
- {
- Thread thread = (Thread)iter.next();
- try
- {
+ while (iter.hasNext()) {
+ Thread thread = (Thread) iter.next();
+ try {
thread.join();
}
- catch (InterruptedException e)
- {
+ catch (InterruptedException e) {
fail("join interrupted");
}
}
Modified: jbpm3/trunk/modules/core/src/test/java/org/jbpm/scheduler/exe/TimerDbTest.java
===================================================================
--- jbpm3/trunk/modules/core/src/test/java/org/jbpm/scheduler/exe/TimerDbTest.java 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/scheduler/exe/TimerDbTest.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -24,13 +24,14 @@
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
-import java.util.Iterator;
import java.util.List;
+import org.hibernate.criterion.Restrictions;
import org.jbpm.context.exe.ContextInstance;
import org.jbpm.db.AbstractDbTestCase;
-import org.jbpm.graph.def.Action;
import org.jbpm.graph.def.ActionHandler;
+import org.jbpm.graph.def.Event;
+import org.jbpm.graph.def.Node;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.graph.exe.ProcessInstance;
@@ -40,16 +41,14 @@
public class TimerDbTest extends AbstractDbTestCase {
- static boolean isNoOpExecuted = false;
+ static boolean isNoOpExecuted = false;
- protected void setUp() throws Exception
- {
+ protected void setUp() throws Exception {
super.setUp();
isNoOpExecuted = false;
}
- public void testSaveTimer()
- {
+ public void testSaveTimer() {
final Date now = Calendar.getInstance().getTime();
Timer timer = new Timer();
@@ -59,10 +58,9 @@
timer.setRepeat("repeat-duration");
session.save(timer);
- try
- {
+ try {
newTransaction();
- timer = (Timer)session.load(Timer.class, new Long(timer.getId()));
+ timer = (Timer) session.load(Timer.class, new Long(timer.getId()));
assertEquals("timer-name", timer.getName());
// we test for the same date in a simple format
@@ -81,270 +79,238 @@
assertEquals(ncal.get(Calendar.HOUR_OF_DAY), tcal.get(Calendar.HOUR_OF_DAY));
assertEquals(ncal.get(Calendar.MINUTE), tcal.get(Calendar.MINUTE));
assertEquals(ncal.get(Calendar.SECOND), tcal.get(Calendar.SECOND));
- assertEquals(DateDbTestUtil.getInstance().convertDateToSeconds(now), DateDbTestUtil.getInstance().convertDateToSeconds(timer.getDueDate()));
+ assertEquals(DateDbTestUtil.getInstance().convertDateToSeconds(now),
+ DateDbTestUtil.getInstance().convertDateToSeconds(timer.getDueDate()));
assertEquals("transition-name", timer.getTransitionName());
assertEquals("repeat-duration", timer.getRepeat());
}
- finally
- {
+ finally {
session.delete(timer);
}
}
- public void testTimerCreation() throws Exception
- {
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
- "<process-definition>" +
- " <start-state>" +
- " <transition to='catch crooks' />" +
- " </start-state>" +
- " <state name='catch crooks'>" +
- " <timer name='reminder' duedate='5 seconds' />" +
- " <transition to='end'/>" +
- " </state>" +
- " <end-state name='end'/>" +
- "</process-definition>");
+ public void testTimerCreation() throws Exception {
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>"
+ + " <start-state>"
+ + " <transition to='catch crooks' />"
+ + " </start-state>"
+ + " <state name='catch crooks'>"
+ + " <timer name='reminder' duedate='5 seconds' />"
+ + " <transition to='end'/>"
+ + " </state>"
+ + " <end-state name='end'/>"
+ + "</process-definition>");
- graphSession.saveProcessDefinition(processDefinition);
- try
- {
+ graphSession.saveProcessDefinition(processDefinition);
+ try {
ProcessInstance processInstance = new ProcessInstance(processDefinition);
jbpmContext.save(processInstance);
// long before = System.currentTimeMillis();
processInstance.signal();
// long after = System.currentTimeMillis();
jbpmContext.save(processInstance);
+
newTransaction();
- Timer timer = (Timer)session.createQuery("from org.jbpm.job.Timer").uniqueResult();
+ Timer timer = (Timer) session.createQuery("from org.jbpm.job.Timer").uniqueResult();
assertNotNull("Timer is null", timer);
assertEquals("reminder", timer.getName());
- // Commented out because of timer latency is changing between time required
+ // Commented out because of timer latency is changing between time
+ // required
// to connect to the database
// assertTrue((before + 5000) <= timer.getDueDate().getTime());
// assertTrue(timer.getDueDate().getTime() <= (after + 5000));
assertEquals("catch crooks", timer.getGraphElement().getName());
}
- finally
- {
+ finally {
jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
}
- }
+ }
- public void testTimerCancellation()
- {
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
- "<process-definition>" +
- " <start-state>" +
- " <transition to='catch crooks' />" +
- " </start-state>" +
- " <state name='catch crooks'>" +
- " <timer name='reminder' duedate='5 seconds' />" +
- " <transition to='end'/>" +
- " </state>" +
- " <end-state name='end'/>" +
- "</process-definition>");
+ public void testTimerCancellation() {
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>"
+ + " <start-state>"
+ + " <transition to='catch crooks' />"
+ + " </start-state>"
+ + " <state name='catch crooks'>"
+ + " <timer name='reminder' duedate='5 seconds' />"
+ + " <transition to='end'/>"
+ + " </state>"
+ + " <end-state name='end'/>"
+ + "</process-definition>");
- graphSession.saveProcessDefinition(processDefinition);
- try
- {
+ graphSession.saveProcessDefinition(processDefinition);
+ try {
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.signal();
processInstance = saveAndReload(processInstance);
-
processInstance.signal();
newTransaction();
-
- assertFalse(areJobsAvailable());
+ assertEquals(0, getTimerCount());
}
- finally
- {
+ finally {
jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
}
- }
+ }
- public void testTimerAction()
- {
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
- "<process-definition name='process'>" +
- " <start-state>" +
- " <transition to='sometask' />" +
- " </start-state>" +
- " <task-node name='sometask'>" +
- " <timer name='reminder'" +
- " duedate='1 business minutes'" +
- " repeat='1 business minutes'" +
- " transition='time-out-transition' >" +
- " <action class='my-action-handler-class-name' />" +
- " </timer>" +
- " <task name='do something'/>" +
- " <transition name='time-out-transition' to='sometask' />" +
- " </task-node>" +
- "</process-definition>");
-
- graphSession.saveProcessDefinition(processDefinition);
- try
- {
- ProcessInstance processInstance = new ProcessInstance(processDefinition);
+ public void testTimerAction() {
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition name='process'>"
+ + " <start-state>"
+ + " <transition to='sometask' />"
+ + " </start-state>"
+ + " <task-node name='sometask'>"
+ + " <timer name='reminder'"
+ + " duedate='1 business minutes'"
+ + " repeat='1 business minutes'"
+ + " transition='time-out-transition' >"
+ + " <action class='my-action-handler-class-name' />"
+ + " </timer>"
+ + " <task name='do something'/>"
+ + " <transition name='time-out-transition' to='sometask' />"
+ + " </task-node>"
+ + "</process-definition>");
- jbpmContext.save(processInstance);
- newTransaction();
+ graphSession.saveProcessDefinition(processDefinition);
+ try {
+ Node node = processDefinition.getNode("sometask");
+ List actions = node.getEvent(Event.EVENTTYPE_NODE_ENTER).getActions();
+ assertEquals(1, actions.size());
+ actions = node.getEvent(Event.EVENTTYPE_NODE_LEAVE).getActions();
+ assertEquals(1, actions.size());
- processInstance = graphSession.loadProcessInstance(processInstance.getId());
+ ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.signal();
-
- processDefinition = processInstance.getProcessDefinition();
- Iterator iter = processDefinition.getNode("sometask").getEvent("node-enter").getActions().iterator();
- while (iter.hasNext())
- {
- Action action = (Action)iter.next();
- action.getId();
- }
-
jbpmContext.save(processInstance);
- newTransaction();
- assertTrue(areJobsAvailable());
+ newTransaction();
+ assertEquals(1, getTimerCount());
}
- finally
- {
+ finally {
jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
}
- }
+ }
- public void testTaskTimerExecution() {
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
- "<process-definition>" + " <start-state>" +
- " <transition to='timed task' />" +
- " </start-state>" +
- " <task-node name='timed task'>" +
- " <task>" +
- " <timer duedate='23 business seconds'>" +
- " <action class='geftem-eu-shuppe-oender-ze-konte'/>" +
- " </timer>" +
- " </task>" +
- " </task-node>" +
- "</process-definition>");
- processDefinition = saveAndReload(processDefinition);
- try
- {
+ public void testTaskTimerExecution() {
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>"
+ + " <start-state>"
+ + " <transition to='timed task' />"
+ + " </start-state>"
+ + " <task-node name='timed task'>"
+ + " <task>"
+ + " <timer duedate='23 business seconds'>"
+ + " <action class='geftem-eu-shuppe-oender-ze-konte'/>"
+ + " </timer>"
+ + " </task>"
+ + " </task-node>"
+ + "</process-definition>");
+ processDefinition = saveAndReload(processDefinition);
+ try {
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.signal();
- processInstance = saveAndReload(processInstance);
-
- assertTrue(areJobsAvailable());
+ newTransaction();
+ assertEquals(1, getTimerCount());
}
- finally
- {
+ finally {
jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
}
- }
+ }
- public void testTimerCancellationAtProcessEnd() {
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
- "<process-definition>" +
- " <start-state>" +
- " <transition to='s' />" +
- " </start-state>" +
- " <state name='s'>" +
- " <event type='node-enter'>" +
- " <create-timer duedate='26 business seconds'>" +
- " <action class='claim.you.are.Innocent' />" +
- " </create-timer>" +
- " </event>" +
- " <transition to='end' />" +
- " </state>" +
- " <end-state name='end' />" +
- "</process-definition>");
- processDefinition = saveAndReload(processDefinition);
- try
- {
+ public void testTimerCancellationAtProcessEnd() {
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>"
+ + " <start-state>"
+ + " <transition to='s' />"
+ + " </start-state>"
+ + " <state name='s'>"
+ + " <event type='node-enter'>"
+ + " <create-timer duedate='26 business seconds'>"
+ + " <action class='claim.you.are.Innocent' />"
+ + " </create-timer>"
+ + " </event>"
+ + " <transition to='end' />"
+ + " </state>"
+ + " <end-state name='end' />"
+ + "</process-definition>");
+ processDefinition = saveAndReload(processDefinition);
+ try {
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.signal();
processInstance = saveAndReload(processInstance);
-
- assertTrue(areJobsAvailable());
+ assertEquals(1, getTimerCount());
processInstance.signal();
- processInstance = saveAndReload(processInstance);
-
- assertFalse(areJobsAvailable());
+ processJobs(5000, 0);
+ assertEquals(0, getTimerCount());
}
- finally
- {
+ finally {
jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
}
- }
+ }
- public void testFindTimersByName() {
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
- "<process-definition>" +
- " <start-state>" +
- " <transition to='timed task' />" +
- " </start-state>" +
- " <task-node name='timed task'>" +
- " <task name='find the hole in the market'>" +
- " <timer name='reminder' duedate='23 business seconds'>" +
- " <action class='geftem-eu-shuppe-oender-ze-konte'/>" +
- " </timer>" +
- " </task>" +
- " </task-node>" +
- "</process-definition>");
- processDefinition = saveAndReload(processDefinition);
- try
- {
+ public void testFindTimersByName() {
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>"
+ + " <start-state>"
+ + " <transition to='timed task' />"
+ + " </start-state>"
+ + " <task-node name='timed task'>"
+ + " <task name='find the hole in the market'>"
+ + " <timer name='reminder' duedate='23 business seconds'>"
+ + " <action class='geftem-eu-shuppe-oender-ze-konte'/>"
+ + " </timer>"
+ + " </task>"
+ + " </task-node>"
+ + "</process-definition>");
+ processDefinition = saveAndReload(processDefinition);
+ try {
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.signal();
processInstance = saveAndReload(processInstance);
- List timersByName = session.createQuery("select timer from org.jbpm.job.Timer as timer where timer.name='reminder'").list();
+ List timersByName = session.createCriteria(Timer.class)
+ .add(Restrictions.eq("name", "reminder"))
+ .list();
assertNotNull(timersByName);
assertEquals(1, timersByName.size());
- Timer timer = (Timer)timersByName.get(0);
- assertEquals("geftem-eu-shuppe-oender-ze-konte", timer.getAction().getActionDelegation().getClassName());
+ Timer timer = (Timer) timersByName.get(0);
+ assertEquals("geftem-eu-shuppe-oender-ze-konte", timer.getAction()
+ .getActionDelegation()
+ .getClassName());
}
- finally
- {
+ finally {
jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
}
- }
+ }
-
- public void testTimerRepeat() {
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
- "<process-definition>" +
- " <start-state>" +
- " <transition to='a' />" +
- " </start-state>" +
- " <state name='a'>" +
- " <timer name='reminder' " +
- " duedate='0 seconds'" +
- " repeat='5 seconds' >" +
- " <action class='org.jbpm.scheduler.exe.TimerDbTest$NoOp' />" +
- " </timer>" +
- " <transition to='b'/>" +
- " <transition name='back' to='a'/>" +
- " </state>" +
- " <state name='b'/>" +
- "</process-definition>");
- processDefinition = saveAndReload(processDefinition);
- try
- {
+ public void testTimerRepeat() {
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>"
+ + " <start-state>"
+ + " <transition to='a' />"
+ + " </start-state>"
+ + " <state name='a'>"
+ + " <timer name='reminder' "
+ + " duedate='0 seconds'"
+ + " repeat='5 seconds' >"
+ + " <action class='org.jbpm.scheduler.exe.TimerDbTest$NoOp' />"
+ + " </timer>"
+ + " <transition to='b'/>"
+ + " <transition name='back' to='a'/>"
+ + " </state>"
+ + " <state name='b'/>"
+ + "</process-definition>");
+ processDefinition = saveAndReload(processDefinition);
+ try {
ProcessInstance processInstance = new ProcessInstance(processDefinition);
// long before = System.currentTimeMillis();
processInstance.signal();
// long after = System.currentTimeMillis();
-
jbpmContext.save(processInstance);
newTransaction();
-
- Timer timer = (Timer)jobSession.getFirstAcquirableJob(null);
+ Timer timer = (Timer) jobSession.getFirstAcquirableJob(null);
assertNotNull(timer);
Date date = timer.getDueDate();
assertNotNull(date);
@@ -354,7 +320,9 @@
processJobs(2000, 1);
- timer = (Timer)session.createQuery("from org.jbpm.job.Timer").setMaxResults(1).uniqueResult();
+ timer = (Timer) session.createQuery("from org.jbpm.job.Timer")
+ .setMaxResults(1)
+ .uniqueResult();
assertEquals(origDueDate + 5000, timer.getDueDate().getTime());
processInstance = jbpmContext.loadProcessInstance(processInstance.getId());
@@ -363,9 +331,9 @@
// after = System.currentTimeMillis();
jbpmContext.save(processInstance);
- newTransaction();
- timer = (Timer)jobSession.getFirstAcquirableJob(null);
+ newTransaction();
+ timer = (Timer) jobSession.getFirstAcquirableJob(null);
assertNotNull(timer);
date = timer.getDueDate();
assertNotNull(date);
@@ -373,46 +341,41 @@
// assertTrue(date.getTime() <= after);
newTransaction();
-
processInstance = jbpmContext.loadProcessInstance(processInstance.getId());
processInstance.signal();
jbpmContext.save(processInstance);
newTransaction();
-
- assertFalse(areJobsAvailable());
+ assertEquals(0, getTimerCount());
}
- finally
- {
+ finally {
jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
}
- }
+ }
- public void testTimerUpdatingProcessVariables() {
+ public void testTimerUpdatingProcessVariables() {
// variable a will be a task instance local variable
// variable b will be a process instance variable
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
- "<process-definition>" +
- " <start-state>" +
- " <transition to='a' />" +
- " </start-state>" +
- " <task-node name='a'>" +
- " <task name='wait for var updates'>" +
- " <controller>" +
- " <variable name ='a' />" +
- " </controller>" +
- " <timer name='update variables' " +
- " duedate='0 seconds'" +
- " repeat='5 seconds' >" +
- " <action class='org.jbpm.scheduler.exe.TimerDbTest$UpdateVariables' />" +
- " </timer>" +
- " </task>" +
- " </task-node>" +
- "</process-definition>");
- processDefinition = saveAndReload(processDefinition);
- try
- {
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>"
+ + " <start-state>"
+ + " <transition to='a' />"
+ + " </start-state>"
+ + " <task-node name='a'>"
+ + " <task name='wait for var updates'>"
+ + " <controller>"
+ + " <variable name ='a' />"
+ + " </controller>"
+ + " <timer name='update variables' "
+ + " duedate='0 seconds'"
+ + " repeat='5 seconds' >"
+ + " <action class='org.jbpm.scheduler.exe.TimerDbTest$UpdateVariables' />"
+ + " </timer>"
+ + " </task>"
+ + " </task-node>"
+ + "</process-definition>");
+ processDefinition = saveAndReload(processDefinition);
+ try {
ProcessInstance processInstance = new ProcessInstance(processDefinition);
ContextInstance contextInstance = processInstance.getContextInstance();
contextInstance.setVariable("a", "value a");
@@ -428,43 +391,42 @@
assertEquals("value a", contextInstance.getVariable("a"));
assertEquals("value b updated", contextInstance.getVariable("b"));
- TaskInstance taskInstance = (TaskInstance)processInstance.getTaskMgmtInstance().getTaskInstances().iterator().next();
+ TaskInstance taskInstance = (TaskInstance) processInstance.getTaskMgmtInstance()
+ .getTaskInstances()
+ .iterator()
+ .next();
assertEquals("value a updated", taskInstance.getVariable("a"));
assertEquals("value b updated", taskInstance.getVariable("b"));
}
- finally
- {
+ finally {
jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
}
- }
+ }
- public static class ConcurrentUpdateAction implements ActionHandler
- {
+ public static class ConcurrentUpdateAction implements ActionHandler {
+
private static final long serialVersionUID = 1L;
- public void execute(ExecutionContext executionContext) throws Exception
- {
+ public void execute(ExecutionContext executionContext) throws Exception {
executionContext.setVariable("a", "value a timer actioned updated");
}
}
- public static class NoOp implements ActionHandler
- {
+ public static class NoOp implements ActionHandler {
+
private static final long serialVersionUID = 1L;
- public void execute(ExecutionContext executionContext) throws Exception
- {
+ public void execute(ExecutionContext executionContext) throws Exception {
isNoOpExecuted = true;
}
}
- public static class UpdateVariables implements ActionHandler
- {
+ public static class UpdateVariables implements ActionHandler {
+
private static final long serialVersionUID = 1L;
- public void execute(ExecutionContext executionContext) throws Exception
- {
+ public void execute(ExecutionContext executionContext) throws Exception {
executionContext.setVariable("a", "value a updated");
executionContext.setVariable("b", "value b updated");
}
Modified: jbpm3/trunk/modules/core/src/test/java/org/jbpm/taskmgmt/exe/TaskTimerExecutionDbTest.java
===================================================================
--- jbpm3/trunk/modules/core/src/test/java/org/jbpm/taskmgmt/exe/TaskTimerExecutionDbTest.java 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/taskmgmt/exe/TaskTimerExecutionDbTest.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -118,7 +118,7 @@
jbpmContext.save(taskInstance.getTaskMgmtInstance().getProcessInstance());
newTransaction();
- assertFalse(areJobsAvailable());
+ assertEquals(0, getTimerCount());
}
finally
{
Modified: jbpm3/trunk/modules/distribution/pom.xml
===================================================================
--- jbpm3/trunk/modules/distribution/pom.xml 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/distribution/pom.xml 2008-10-26 07:28:32 UTC (rev 2621)
@@ -157,7 +157,6 @@
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
- <classifier>jdbc3</classifier>
</dependency>
</dependencies>
Modified: jbpm3/trunk/modules/enterprise/jar/pom.xml
===================================================================
--- jbpm3/trunk/modules/enterprise/jar/pom.xml 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/enterprise/jar/pom.xml 2008-10-26 07:28:32 UTC (rev 2621)
@@ -243,8 +243,6 @@
<excludes>
<!-- do not remove, ejb scheduler requires xa support -->
<exclude>org/jbpm/scheduler/ejbtimer/EjbSchedulerTest.java</exclude>
- <!-- https://jira.jboss.org/jira/browse/JBPM-1709 -->
- <exclude>org/jbpm/msg/jms/JmsMessageTest.java</exclude>
</excludes>
</configuration>
</plugin>
Modified: jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/ejb/impl/CommandServiceBean.java
===================================================================
--- jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/ejb/impl/CommandServiceBean.java 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/ejb/impl/CommandServiceBean.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -37,6 +37,7 @@
import org.jbpm.command.CommandService;
import org.jbpm.msg.jms.JmsMessageServiceFactory;
import org.jbpm.persistence.jta.JtaDbPersistenceServiceFactory;
+import org.jbpm.tx.TxService;
/**
* Stateless session bean that executes {@linkplain Command commands} by
@@ -144,6 +145,11 @@
try {
log.debug("executing " + command);
result = command.execute(jbpmContext);
+ // check whether command requested a rollback
+ TxService txService = jbpmContext.getServices().getTxService();
+ if (txService.isRollbackOnly()) {
+ sessionContext.setRollbackOnly();
+ }
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
Modified: jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/ejb/impl/ExecuteJobCommand.java
===================================================================
--- jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/ejb/impl/ExecuteJobCommand.java 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/ejb/impl/ExecuteJobCommand.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -23,6 +23,7 @@
import java.io.PrintWriter;
import java.io.StringWriter;
+import java.util.Arrays;
import java.util.List;
import javax.jms.Destination;
@@ -34,9 +35,9 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.hibernate.criterion.Restrictions;
import org.jbpm.JbpmContext;
import org.jbpm.command.Command;
+import org.jbpm.db.JobSession;
import org.jbpm.job.Job;
import org.jbpm.msg.jms.JmsMessageService;
import org.jbpm.msg.jms.JmsMessageServiceFactory;
@@ -57,37 +58,38 @@
}
public Object execute(JbpmContext jbpmContext) throws Exception {
- Job job = (Job) jbpmContext.getSession().get(Job.class, jobId);
+ JobSession jobSession = jbpmContext.getJobSession();
+ Job job = jobSession.getJob(jobId);
if (job == null || job.getLockOwner() != null) {
+ log.debug("job " + jobId + " was deleted or is locked, abandoning execution");
jbpmContext.setRollbackOnly();
return null;
}
+ String lockOwner = Long.toString(jobId);
if (job.isExclusive()) {
- // acquire exclusive jobs
- List exclusiveJobs = jbpmContext.getSession().createCriteria(Job.class)
- .add(Restrictions.isNull("lockMode"))
- .add(Restrictions.eq("processInstance", job.getProcessInstance()))
- .list();
- String lockOwner = Long.toString(jobId);
- long[] exclusiveJobIds = new long[exclusiveJobs.size()];
- for (int i = 0; i < exclusiveJobIds.length; i++) {
+ List exclusiveJobs = jobSession.findExclusiveJobs(lockOwner, job.getProcessInstance());
+ // lock exclusive jobs
+ int jobCount = exclusiveJobs.size();
+ long[] exclusiveJobIds = new long[jobCount];
+ for (int i = 0; i < jobCount; i++) {
Job exclusiveJob = (Job) exclusiveJobs.get(i);
exclusiveJob.setLockOwner(lockOwner);
exclusiveJobIds[i] = exclusiveJob.getId();
}
+ log.debug("locked jobs " + Arrays.toString(exclusiveJobIds));
// execute exclusive jobs in separate transaction
- executeJobs(jbpmContext, exclusiveJobIds);
+ postJobsExecution(jbpmContext, exclusiveJobIds);
}
else {
+ // lock job to prevent others from deleting it
+ job.setLockOwner(lockOwner);
+ log.debug("executing " + job);
executeJob(job, jbpmContext);
}
return null;
}
static void executeJob(Job job, JbpmContext jbpmContext) {
- // prevent others from removing job
- job.setLockOwner(ExecuteJobCommand.class.getName());
- log.debug("executing " + job);
try {
if (job.execute(jbpmContext)) {
jbpmContext.getJobSession().deleteJob(job);
@@ -107,7 +109,7 @@
}
}
- private static void executeJobs(JbpmContext jbpmContext, long[] exclusiveJobIds)
+ private static void postJobsExecution(JbpmContext jbpmContext, long[] exclusiveJobIds)
throws NamingException, JMSException {
Services services = jbpmContext.getServices();
JmsMessageServiceFactory messageServiceFactory = (JmsMessageServiceFactory) services.getServiceFactory(Services.SERVICENAME_MESSAGE);
Modified: jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/ejb/impl/ExecuteJobsCommand.java
===================================================================
--- jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/ejb/impl/ExecuteJobsCommand.java 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/ejb/impl/ExecuteJobsCommand.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -21,9 +21,14 @@
*/
package org.jbpm.ejb.impl;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.jbpm.JbpmContext;
import org.jbpm.command.Command;
-import org.jbpm.db.JobSession;
import org.jbpm.job.Job;
/**
@@ -33,17 +38,20 @@
public class ExecuteJobsCommand implements Command {
private long[] jobIds;
+
private static final long serialVersionUID = 1L;
+ private static Log log = LogFactory.getLog(ExecuteJobsCommand.class);
public ExecuteJobsCommand(long[] jobIds) {
this.jobIds = jobIds;
}
public Object execute(JbpmContext jbpmContext) throws Exception {
- JobSession jobSession = jbpmContext.getJobSession();
- for (int i = 0; i < jobIds.length; i++) {
- Job job = jobSession.loadJob(jobIds[i]);
- ExecuteJobCommand.executeJob(job, jbpmContext);
+ log.debug("executing jobs " + Arrays.toString(jobIds));
+ List jobs = jbpmContext.getJobSession().loadJobs(jobIds);
+ for (Iterator i = jobs.iterator(); i.hasNext();) {
+ Job job = (Job) i.next();
+ job.execute(jbpmContext);
}
return null;
}
Modified: jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/msg/jms/JmsMessageServiceFactory.java
===================================================================
--- jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/msg/jms/JmsMessageServiceFactory.java 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/enterprise/jar/src/main/java/org/jbpm/msg/jms/JmsMessageServiceFactory.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -85,13 +85,21 @@
destination = (Destination) lookup(destinationJndiName);
}
catch (NamingException e) {
- throw new JbpmException("could not retrieve message destination", e);
+ throw new JbpmException("could not retrieve job destination", e);
}
}
return destination;
}
public Destination getCommandDestination() {
+ if (commandDestination == null) {
+ try {
+ commandDestination = (Destination) lookup(commandDestinationJndiName);
+ }
+ catch (NamingException e) {
+ throw new JbpmException("could not retrieve command destination", e);
+ }
+ }
return commandDestination;
}
Modified: jbpm3/trunk/modules/enterprise/jar/src/test/java/org/jbpm/msg/jms/JmsMessageTest.java
===================================================================
--- jbpm3/trunk/modules/enterprise/jar/src/test/java/org/jbpm/msg/jms/JmsMessageTest.java 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/modules/enterprise/jar/src/test/java/org/jbpm/msg/jms/JmsMessageTest.java 2008-10-26 07:28:32 UTC (rev 2621)
@@ -53,8 +53,8 @@
private static LocalCommandServiceHome commandServiceHome;
- static final int processExecutionCount = 20;
- static final int maxWaitTime = 10000;
+ static final int processExecutionCount = 5;
+ static final int maxWaitTime = 10 * 1000;
public static Test suite() throws Exception {
return new IntegrationTestSetup(JmsMessageTest.class, "enterprise-test.war");
Modified: jbpm3/trunk/pom.xml
===================================================================
--- jbpm3/trunk/pom.xml 2008-10-25 14:35:37 UTC (rev 2620)
+++ jbpm3/trunk/pom.xml 2008-10-26 07:28:32 UTC (rev 2621)
@@ -80,7 +80,7 @@
<!-- Database Driver Versions -->
<hsqldb.version>1.8.0.7</hsqldb.version>
<mysql.connector.version>5.1.6</mysql.connector.version>
- <postgresql.version>7.4</postgresql.version>
+ <postgresql.version>8.3-603.jdbc3</postgresql.version>
</properties>
<!-- DependencyManagement -->
@@ -346,7 +346,6 @@
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
- <classifier>jdbc3</classifier>
<version>${postgresql.version}</version>
</dependency>
</dependencies>
@@ -526,7 +525,6 @@
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
- <classifier>jdbc3</classifier>
<scope>test</scope>
</dependency>
</dependencies>
17 years, 6 months