JBoss JBPM SVN: r6111 - in projects/businesslink: src and 14 other directories.
by do-not-reply@jboss.org
Author: tom.baeyens(a)jboss.com
Date: 2010-01-21 04:12:26 -0500 (Thu, 21 Jan 2010)
New Revision: 6111
Added:
projects/businesslink/.classpath
projects/businesslink/.project
projects/businesslink/license.txt
projects/businesslink/pom.xml
projects/businesslink/src/
projects/businesslink/src/main/
projects/businesslink/src/main/java/
projects/businesslink/src/main/java/org/
projects/businesslink/src/main/java/org/jbpm/
projects/businesslink/src/main/java/org/jbpm/businesslink/
projects/businesslink/src/main/java/org/jbpm/businesslink/api/
projects/businesslink/src/main/java/org/jbpm/businesslink/api/Artifact.java
projects/businesslink/src/main/java/org/jbpm/businesslink/api/BusinessLinkService.java
projects/businesslink/src/main/java/org/jbpm/businesslink/api/Comment.java
projects/businesslink/src/main/java/org/jbpm/businesslink/api/Link.java
projects/businesslink/src/main/java/org/jbpm/businesslink/internal/
projects/businesslink/src/main/java/org/jbpm/businesslink/internal/BusinessLinkServiceImpl.java
projects/businesslink/src/main/java/org/jbpm/businesslink/internal/file/
projects/businesslink/src/main/java/org/jbpm/businesslink/internal/file/FileArtifact.java
projects/businesslink/src/main/java/org/jbpm/businesslink/internal/file/FileRepository.java
projects/businesslink/src/main/java/org/jbpm/businesslink/internal/spi/
projects/businesslink/src/main/java/org/jbpm/businesslink/internal/spi/Repository.java
projects/businesslink/src/test/
projects/businesslink/src/test/java/
projects/businesslink/src/test/java/org/
projects/businesslink/src/test/java/org/jbpm/
projects/businesslink/src/test/java/org/jbpm/businesslink/
projects/businesslink/src/test/java/org/jbpm/businesslink/BusinessLinkTest.java
Log:
adding bl
Added: projects/businesslink/.classpath
===================================================================
--- projects/businesslink/.classpath (rev 0)
+++ projects/businesslink/.classpath 2010-01-21 09:12:26 UTC (rev 6111)
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" output="target/classes" path="src/main/java"/>
+ <classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
Property changes on: projects/businesslink/.classpath
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: projects/businesslink/.project
===================================================================
--- projects/businesslink/.project (rev 0)
+++ projects/businesslink/.project 2010-01-21 09:12:26 UTC (rev 6111)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>businesslink</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.maven.ide.eclipse.maven2Builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.maven.ide.eclipse.maven2Nature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
Property changes on: projects/businesslink/.project
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: projects/businesslink/license.txt
===================================================================
--- projects/businesslink/license.txt (rev 0)
+++ projects/businesslink/license.txt 2010-01-21 09:12:26 UTC (rev 6111)
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
Property changes on: projects/businesslink/license.txt
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: projects/businesslink/pom.xml
===================================================================
--- projects/businesslink/pom.xml (rev 0)
+++ projects/businesslink/pom.xml 2010-01-21 09:12:26 UTC (rev 6111)
@@ -0,0 +1,246 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- ====================================================================== -->
+<!-- -->
+<!-- JBoss, the OpenSource J2EE webOS -->
+<!-- -->
+<!-- Distributable under LGPL license. -->
+<!-- See terms of license at http://www.gnu.org. -->
+<!-- -->
+<!-- ====================================================================== -->
+
+<!-- $Id: pom.xml 6056 2010-01-05 09:13:54Z tom.baeyens(a)jboss.com $ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <name>jBPM BusinessLink</name>
+ <groupId>org.jbpm.businesslink</groupId>
+ <artifactId>businesslink</artifactId>
+ <packaging>jar</packaging>
+
+ <version>1.0-SNAPSHOT</version>
+
+ <organization>
+ <name>JBoss, a division of Red Hat</name>
+ <url>http://www.jboss.org</url>
+ </organization>
+
+ <properties>
+ <hibernate.version>3.3.1.GA</hibernate.version>
+ <junit.version>3.8.2</junit.version>
+ </properties>
+<!--
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <apache.ant.version>1.7.0</apache.ant.version>
+ <beanshell.version>2.0b5</beanshell.version>
+ <groovy.version>1.5.6</groovy.version>
+ <cactus.version>1.8.1</cactus.version>
+ <drools.version>5.0.1</drools.version>
+ <aspectjrt.version>1.5.3</aspectjrt.version>
+ <freemarker.version>2.3.15</freemarker.version>
+ <gwt.console.version>1.3.0</gwt.console.version>
+ <jbpm.gpd.version>4.3-SNAPSHOT</jbpm.gpd.version>
+ <slf4j.version>1.5.2</slf4j.version>
+ <hsqldb.version>1.8.0.7</hsqldb.version>
+ <jboss.identity.version>1.0.0.Beta1</jboss.identity.version>
+ <jboss.j2ee.version>4.2.2.GA</jboss.j2ee.version>
+ <jboss.client.version>5.0.1.GA</jboss.client.version>
+ <jsr233.version>2.0.5</jsr233.version>
+ <juel.version>2.1.0</juel.version>
+ <junit.version>3.8.2</junit.version>
+ <log4j.version>1.2.14</log4j.version>
+ <mail.version>1.4.1</mail.version>
+ <report.engine.version>2.3.2</report.engine.version>
+ <servlet-api.version>2.5</servlet-api.version>
+ <signavio.jbpmeditor.version>1.1</signavio.jbpmeditor.version>
+ <spring.version>2.0.8</spring.version>
+ <stax.api.version>1.0.1</stax.api.version>
+ <wiser.version>1.2</wiser.version>
+ <woodstox.version>3.2.6</woodstox.version>
+ <hsqldb.version>1.8.0.7</hsqldb.version>
+ <mysql.connector.version>5.0.8</mysql.connector.version>
+ <postgresql.version>8.3-603.jdbc3</postgresql.version>
+ <jtds.version>1.2.2</jtds.version>
+ <oracle.version>10.2.0.4</oracle.version>
+ -->
+
+ <dependencies>
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-core</artifactId>
+ <version>${hibernate.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>${junit.version}</version>
+ </dependency>
+ </dependencies>
+
+ <scm>
+ <connection>scm:svn:http://anonsvn.jboss.org/repos/jbpm/projects/businesslink</connection>
+ <developerConnection>scm:svn:https://svn.jboss.org/repos/jbpm/projects/businesslink</developerConnection>
+ <url>http://fisheye.jboss.com/browse/JbpmSvn/projects/businesslink</url>
+ </scm>
+
+ <!-- IssueManagement -->
+ <issueManagement>
+ <system>jira</system>
+ <url>http://jira.jboss.org/jira/browse/JBPM</url>
+ </issueManagement>
+
+ <!-- Licenses -->
+ <licenses>
+ <license>
+ <name>Apache</name>
+ <url>http://repository.jboss.com/licenses/apache-2.0.txt</url>
+ </license>
+ </licenses>
+
+ <!-- Plugins -->
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.5</source>
+ <target>1.5</target>
+ <showDeprecation>true</showDeprecation>
+ <showWarnings>true</showWarnings>
+ <optimize>true</optimize>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <failIfNoTests>false</failIfNoTests>
+ <trimStackTrace>false</trimStackTrace>
+ <redirectTestOutputToFile>true</redirectTestOutputToFile>
+ <excludes>
+ <exclude>**/*TestCase.java</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+ </plugins>
+
+ <!-- PluginManagement -->
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>2.0.2.SP1</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <version>2.2-beta-2</version>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <version>1.1</version>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>buildnumber-maven-plugin</artifactId>
+ <version>1.0-beta-1</version>
+ </plugin>
+ <plugin>
+ <groupId>net.sourceforge.maven-taglib</groupId>
+ <artifactId>maven-taglib-plugin</artifactId>
+ <version>2.3</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>2.3</version>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+ <!-- Repositories -->
+ <repositories>
+ <repository>
+ <id>maven1.java.net</id>
+ <url>http://download.java.net/maven/1/</url>
+ <layout>legacy</layout>
+ </repository>
+ <repository>
+ <id>repository.jboss.org</id>
+ <url>http://repository.jboss.com/maven2</url>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </repository>
+ <repository>
+ <id>snapshots.jboss.org</id>
+ <url>http://snapshots.jboss.org/maven2</url>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ </repository>
+ <repository>
+ <id>repository.codehaus.org</id>
+ <url>http://repository.codehaus.org</url>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </repository>
+ <repository>
+ <id>maven2.java.net</id>
+ <name>Java.net Repository for Maven 2</name>
+ <url>http://download.java.net/maven/2/</url>
+ </repository>
+ <repository>
+ <id>gwt-maven</id>
+ <url>http://gwt-maven.googlecode.com/svn/trunk/mavenrepo/</url>
+ </repository>
+ </repositories>
+
+ <!-- PluginRepositories -->
+ <pluginRepositories>
+ <pluginRepository>
+ <id>maven2.java.net</id>
+ <name>Java.net Repository for Maven 2</name>
+ <url>http://download.java.net/maven/2/</url>
+ </pluginRepository>
+ <pluginRepository>
+ <id>repository.jboss.com</id>
+ <url>http://repository.jboss.com/maven2</url>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </pluginRepository>
+ <pluginRepository>
+ <id>snapshots.jboss.org</id>
+ <url>http://snapshots.jboss.org/maven2</url>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ </pluginRepository>
+ <pluginRepository>
+ <id>gwt-maven</id>
+ <url>http://gwt-maven.googlecode.com/svn/trunk/mavenrepo/</url>
+ </pluginRepository>
+ </pluginRepositories>
+
+ <!-- DistributionManagement -->
+ <distributionManagement>
+ <repository>
+ <id>repository.jboss.org</id>
+ <name>JBoss Maven Repository</name>
+ <url>file://${jboss.maven.repository}</url>
+ </repository>
+ <snapshotRepository>
+ <id>snapshots.jboss.org</id>
+ <name>JBoss Snapshot Repository</name>
+ <url>dav:https://snapshots.jboss.org/maven2</url>
+ </snapshotRepository>
+ </distributionManagement>
+
+</project>
Property changes on: projects/businesslink/pom.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: projects/businesslink/src/main/java/org/jbpm/businesslink/api/Artifact.java
===================================================================
--- projects/businesslink/src/main/java/org/jbpm/businesslink/api/Artifact.java (rev 0)
+++ projects/businesslink/src/main/java/org/jbpm/businesslink/api/Artifact.java 2010-01-21 09:12:26 UTC (rev 6111)
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jbpm.businesslink.api;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface Artifact {
+
+ String ARTIFACTTYPE_DIRECTORY = "directory";
+
+ String getName();
+ String getType();
+ String getPath();
+}
Property changes on: projects/businesslink/src/main/java/org/jbpm/businesslink/api/Artifact.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: projects/businesslink/src/main/java/org/jbpm/businesslink/api/BusinessLinkService.java
===================================================================
--- projects/businesslink/src/main/java/org/jbpm/businesslink/api/BusinessLinkService.java (rev 0)
+++ projects/businesslink/src/main/java/org/jbpm/businesslink/api/BusinessLinkService.java 2010-01-21 09:12:26 UTC (rev 6111)
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jbpm.businesslink.api;
+
+import java.util.List;
+
+
+/** central service access to greenlight facilities.
+ *
+ * authenticated user is assumed to be accessible by the service implementation.
+ *
+ * @author Tom Baeyens
+ */
+public interface BusinessLinkService {
+
+ List<Artifact> getArtifacts(String directoryPath);
+
+ List<Link> getLinks(String path);
+ Link createLink(String artifactA, String artifactB);
+ void updateLink(Link link);
+ Link deleteLink(Link link);
+
+// List<Comment> getComments(String path);
+// void createComment(String path, String text);
+// void updateComment(Comment comment);
+// void deleteComment(Comment comment);
+//
+// Watch createWatch(String path);
+// List<Watch> getWatchers(String path);
+// void updateWatch(Watch watch);
+// void deleteWatch(Watch watch);
+}
Property changes on: projects/businesslink/src/main/java/org/jbpm/businesslink/api/BusinessLinkService.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: projects/businesslink/src/main/java/org/jbpm/businesslink/api/Comment.java
===================================================================
--- projects/businesslink/src/main/java/org/jbpm/businesslink/api/Comment.java (rev 0)
+++ projects/businesslink/src/main/java/org/jbpm/businesslink/api/Comment.java 2010-01-21 09:12:26 UTC (rev 6111)
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jbpm.businesslink.api;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface Comment {
+
+}
Property changes on: projects/businesslink/src/main/java/org/jbpm/businesslink/api/Comment.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: projects/businesslink/src/main/java/org/jbpm/businesslink/api/Link.java
===================================================================
--- projects/businesslink/src/main/java/org/jbpm/businesslink/api/Link.java (rev 0)
+++ projects/businesslink/src/main/java/org/jbpm/businesslink/api/Link.java 2010-01-21 09:12:26 UTC (rev 6111)
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jbpm.businesslink.api;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface Link {
+
+}
Property changes on: projects/businesslink/src/main/java/org/jbpm/businesslink/api/Link.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: projects/businesslink/src/main/java/org/jbpm/businesslink/internal/BusinessLinkServiceImpl.java
===================================================================
--- projects/businesslink/src/main/java/org/jbpm/businesslink/internal/BusinessLinkServiceImpl.java (rev 0)
+++ projects/businesslink/src/main/java/org/jbpm/businesslink/internal/BusinessLinkServiceImpl.java 2010-01-21 09:12:26 UTC (rev 6111)
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jbpm.businesslink.internal;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.jbpm.businesslink.api.Artifact;
+import org.jbpm.businesslink.api.BusinessLinkService;
+import org.jbpm.businesslink.api.Link;
+import org.jbpm.businesslink.internal.spi.Repository;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class BusinessLinkServiceImpl implements BusinessLinkService {
+
+ Map<String, Repository> repositories = new HashMap<String, Repository>();
+
+ public void addRepository(Repository repository) {
+ repositories.put(repository.getName(), repository);
+ }
+
+ public List<Artifact> getArtifacts(String directoryPath) {
+ int slashIndex = directoryPath.indexOf('/');
+ if (slashIndex==-1) {
+ throw new RuntimeException("invalid directory path: no slash: "+directoryPath);
+ }
+ String repositoryName = directoryPath.substring(0, slashIndex);
+ Repository repository = repositories.get(repositoryName);
+
+ String repoPath = directoryPath.substring(slashIndex+1);
+ return repository.getArtifacts(repoPath);
+ }
+
+
+ public Link createLink(String artifactA, String artifactB) {
+ return null;
+ }
+
+ public Link deleteLink(Link link) {
+ return null;
+ }
+
+ public List<Link> getLinks(String path) {
+ return null;
+ }
+
+ public void updateLink(Link link) {
+ }
+}
Property changes on: projects/businesslink/src/main/java/org/jbpm/businesslink/internal/BusinessLinkServiceImpl.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: projects/businesslink/src/main/java/org/jbpm/businesslink/internal/file/FileArtifact.java
===================================================================
--- projects/businesslink/src/main/java/org/jbpm/businesslink/internal/file/FileArtifact.java (rev 0)
+++ projects/businesslink/src/main/java/org/jbpm/businesslink/internal/file/FileArtifact.java 2010-01-21 09:12:26 UTC (rev 6111)
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jbpm.businesslink.internal.file;
+
+import java.io.File;
+
+import org.jbpm.businesslink.api.Artifact;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class FileArtifact implements Artifact {
+
+ FileRepository fileRepository;
+ String path;
+ String name;
+
+ public FileArtifact(FileRepository fileRepository, String path, String artifactName) {
+ this.fileRepository = fileRepository;
+ this.path = path+'/'+artifactName;
+ this.name = artifactName;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getPath() {
+ return fileRepository.name+'/'+path;
+ }
+
+ public String getType() {
+ File file = new File(fileRepository.rootPath+FileRepository.FILESEPARATOR+path);
+ if (file.isDirectory()) {
+ return ARTIFACTTYPE_DIRECTORY;
+ }
+ int lastIndexOf = name.lastIndexOf('.');
+ if (lastIndexOf==-1) {
+ throw new RuntimeException("couldn't determine artifact type "+this);
+ }
+ return name.substring(lastIndexOf);
+ }
+
+ public String toString() {
+ return path;
+ }
+}
Property changes on: projects/businesslink/src/main/java/org/jbpm/businesslink/internal/file/FileArtifact.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: projects/businesslink/src/main/java/org/jbpm/businesslink/internal/file/FileRepository.java
===================================================================
--- projects/businesslink/src/main/java/org/jbpm/businesslink/internal/file/FileRepository.java (rev 0)
+++ projects/businesslink/src/main/java/org/jbpm/businesslink/internal/file/FileRepository.java 2010-01-21 09:12:26 UTC (rev 6111)
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jbpm.businesslink.internal.file;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.businesslink.api.Artifact;
+import org.jbpm.businesslink.internal.spi.Repository;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class FileRepository implements Repository {
+
+ static final String FILESEPARATOR = System.getProperty("file.separator");
+
+ String name;
+ String rootPath;
+
+ public FileRepository(String name, String rootPath) {
+ this.name = name;
+ File rootFile = new File(rootPath);
+ if (!rootFile.exists()) {
+ throw new RuntimeException("rootPath '"+rootPath+"' doesn't exist");
+ }
+ if (!rootFile.isDirectory()) {
+ throw new RuntimeException("rootPath '"+rootPath+"' is not a directory");
+ }
+ try {
+ this.rootPath = rootFile.getCanonicalPath();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public List<Artifact> getArtifacts(String path) {
+ String directoryPath = rootPath+FILESEPARATOR+path;
+ File directory = new File(directoryPath);
+ if (!directory.exists()) {
+ throw new RuntimeException("directory "+directoryPath+" doesn't exist");
+ }
+ if (!directory.isDirectory()) {
+ throw new RuntimeException("not a directory: "+directoryPath);
+ }
+
+ List<Artifact> artifacts = new ArrayList<Artifact>();
+ String[] artifactNames = directory.list();
+ if (artifactNames!=null) {
+ for (String artifactName: artifactNames) {
+ artifacts.add(new FileArtifact(this, path, artifactName));
+ }
+ }
+
+ return artifacts;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getType() {
+ return REPOSITORYTYPE_FILESYSTEM;
+ }
+}
Property changes on: projects/businesslink/src/main/java/org/jbpm/businesslink/internal/file/FileRepository.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: projects/businesslink/src/main/java/org/jbpm/businesslink/internal/spi/Repository.java
===================================================================
--- projects/businesslink/src/main/java/org/jbpm/businesslink/internal/spi/Repository.java (rev 0)
+++ projects/businesslink/src/main/java/org/jbpm/businesslink/internal/spi/Repository.java 2010-01-21 09:12:26 UTC (rev 6111)
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jbpm.businesslink.internal.spi;
+
+import java.util.List;
+
+import org.jbpm.businesslink.api.Artifact;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface Repository {
+
+ String REPOSITORYTYPE_FILESYSTEM = "FileSystem";
+
+ String getName();
+ String getType();
+
+ List<Artifact> getArtifacts(String path);
+}
Property changes on: projects/businesslink/src/main/java/org/jbpm/businesslink/internal/spi/Repository.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: projects/businesslink/src/test/java/org/jbpm/businesslink/BusinessLinkTest.java
===================================================================
--- projects/businesslink/src/test/java/org/jbpm/businesslink/BusinessLinkTest.java (rev 0)
+++ projects/businesslink/src/test/java/org/jbpm/businesslink/BusinessLinkTest.java 2010-01-21 09:12:26 UTC (rev 6111)
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jbpm.businesslink;
+
+import java.io.File;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.jbpm.businesslink.api.Artifact;
+import org.jbpm.businesslink.internal.BusinessLinkServiceImpl;
+import org.jbpm.businesslink.internal.file.FileRepository;
+
+/**
+ * @author Tom Baeyens
+ */
+public class BusinessLinkTest extends TestCase {
+
+ private static final String FILESEPARATOR = System.getProperty("file.separator");
+
+ private static String testSourcesPath = getTestSourcesPath();
+
+ public void testJavaFile() throws Exception {
+ BusinessLinkServiceImpl greenLightService = new BusinessLinkServiceImpl();
+ greenLightService.addRepository(new FileRepository("test-sources", testSourcesPath));
+
+ List<Artifact> artifacts = greenLightService.getArtifacts("test-sources/org/jbpm/businesslink");
+ assertNotNull(artifacts);
+ assertFalse(artifacts.isEmpty());
+
+ Artifact artifact = artifacts.get(0);
+ assertEquals("BusinessLinkTest.java", artifact.getName());
+ assertEquals(".java", artifact.getType());
+ assertEquals("test-sources/org/jbpm/businesslink/BusinessLinkTest.java", artifact.getPath());
+
+ assertEquals(1, artifacts.size());
+ }
+
+ public void testDirectory() throws Exception {
+ BusinessLinkServiceImpl greenLightService = new BusinessLinkServiceImpl();
+ greenLightService.addRepository(new FileRepository("test-sources", testSourcesPath));
+
+ List<Artifact> artifacts = greenLightService.getArtifacts("test-sources/org/jbpm");
+ assertNotNull(artifacts);
+ assertFalse(artifacts.isEmpty());
+
+ Artifact artifact = artifacts.get(0);
+ assertEquals("businesslink", artifact.getName());
+ assertEquals(Artifact.ARTIFACTTYPE_DIRECTORY, artifact.getType());
+ assertEquals("test-sources/org/jbpm/businesslink", artifact.getPath());
+
+ assertEquals(1, artifacts.size());
+ }
+
+ private static String getTestSourcesPath() {
+ try {
+ String testClassesPath = BusinessLinkTest.class.getProtectionDomain().getCodeSource().getLocation().getPath();
+ String testSourcesPath = testClassesPath + FILESEPARATOR + ".." + FILESEPARATOR + ".." + FILESEPARATOR + "src/test/java";
+ testSourcesPath = new File(testSourcesPath).getCanonicalPath();
+ return testSourcesPath;
+ } catch (Exception e) {
+ throw new RuntimeException("couldn't get test sources path", e);
+ }
+ }
+}
Property changes on: projects/businesslink/src/test/java/org/jbpm/businesslink/BusinessLinkTest.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
14 years, 4 months
JBoss JBPM SVN: r6110 - projects.
by do-not-reply@jboss.org
Author: tom.baeyens(a)jboss.com
Date: 2010-01-21 04:08:58 -0500 (Thu, 21 Jan 2010)
New Revision: 6110
Added:
projects/businesslink/
Log:
adding bl
14 years, 4 months
JBoss JBPM SVN: r6109 - jbpm4/trunk/modules/test-db.
by do-not-reply@jboss.org
Author: tom.baeyens(a)jboss.com
Date: 2010-01-21 02:57:58 -0500 (Thu, 21 Jan 2010)
New Revision: 6109
Modified:
jbpm4/trunk/modules/test-db/pom.xml
Log:
excluding failing bpmn test
Modified: jbpm4/trunk/modules/test-db/pom.xml
===================================================================
--- jbpm4/trunk/modules/test-db/pom.xml 2010-01-20 23:11:40 UTC (rev 6108)
+++ jbpm4/trunk/modules/test-db/pom.xml 2010-01-21 07:57:58 UTC (rev 6109)
@@ -106,6 +106,7 @@
<redirectTestOutputToFile>true</redirectTestOutputToFile>
<excludes>
<exclude>org/jbpm/bpmn/UserTaskTest.java</exclude>
+ <exclude>org/jbpm/bpmn/test/intermediatecatch/IntermediateCatchTimerEventTest.java</exclude>
</excludes>
</configuration>
</plugin>
14 years, 4 months
JBoss JBPM SVN: r6108 - in jbpm4/trunk/modules: bpmn/src/main/java/org/jbpm/bpmn/parser and 8 other directories.
by do-not-reply@jboss.org
Author: jbarrez
Date: 2010-01-20 18:11:40 -0500 (Wed, 20 Jan 2010)
New Revision: 6108
Added:
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/IntermediateCatchEventBinding.java
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/IntermediateCatchTimerEvent.java
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/NoneStartEventActivity.java
jbpm4/trunk/modules/bpmn/src/main/resources/BpmnDi.xsd
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cal/CronExpression.java
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/test/intermediatecatch/
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/test/intermediatecatch/IntermediateCatchTimerEventTest.java
Removed:
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/StartActivity.java
Modified:
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ServiceTaskBinding.java
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/StartBinding.java
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/parser/BpmnParser.java
jbpm4/trunk/modules/bpmn/src/main/resources/jbpm.bpmn.flownodes.xml
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cal/Duration.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/job/TimerImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeInstanceImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/TimerDefinitionImpl.java
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/timer/TimerTest.java
Log:
jbpm-2727: finished impl of intermediate timer catch event + test cases + added cron expression definition possibility to timeCycle of event
Added: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/IntermediateCatchEventBinding.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/IntermediateCatchEventBinding.java (rev 0)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/IntermediateCatchEventBinding.java 2010-01-20 23:11:40 UTC (rev 6108)
@@ -0,0 +1,123 @@
+/*
+ * 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.bpmn.flownodes;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.jbpm.pvm.internal.cal.CronExpression;
+import org.jbpm.pvm.internal.cal.Duration;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.EventImpl;
+import org.jbpm.pvm.internal.model.TimerDefinitionImpl;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/**
+ * @author Joram Barrez
+ */
+public class IntermediateCatchEventBinding extends BpmnBinding {
+
+ public IntermediateCatchEventBinding() {
+ super("intermediateCatchEvent");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+
+ String id = XmlUtil.attribute(element, "id");
+ Element eventDefinition = XmlUtil.element(element);
+ if ("timerEventDefinition".equals(eventDefinition.getNodeName())) {
+ return createIntermediateTimerCatchEvent(id, eventDefinition, parse);
+ } else {
+ parse.addProblem("Invalid eventDefinition type : " + eventDefinition.getNodeName());
+ }
+
+ return null;
+ }
+
+ protected IntermediateCatchTimerEvent createIntermediateTimerCatchEvent(String catchEventId,
+ Element eventDefinitionElement, Parse parse) {
+
+ Element timeDate = XmlUtil.element(eventDefinitionElement, "timeDate");
+ Element timeCycle = XmlUtil.element(eventDefinitionElement, "timeCycle");
+
+ if ( (timeDate != null && timeCycle != null)
+ || (timeDate == null && timeCycle == null) ) {
+ parse.addProblem("Intermediate catch event '" + catchEventId +
+ "' requires either a timeDate or a timeCycle definition (but not both)");
+ return null;
+ }
+
+ IntermediateCatchTimerEvent intermediateCatchTimerEvent = new IntermediateCatchTimerEvent();
+ ActivityImpl activity = parse.contextStackFind(ActivityImpl.class);
+
+ // Create timerDefinition and attach an associated event to the activty
+ TimerDefinitionImpl timerDefinition = activity.createTimerDefinition();
+ String eventName = "INTERMEDIATE_TIMER_" + catchEventId;
+ timerDefinition.setEventName(eventName);
+ EventImpl timerEvent = activity.createEvent(eventName);
+ timerEvent.createEventListenerReference(intermediateCatchTimerEvent);
+
+ if (timeDate != null) {
+ parseTimeDate(catchEventId, parse, timeDate, timerDefinition);
+ }
+
+ if (timeCycle != null) {
+ parseTimeCycle(catchEventId, parse, timeCycle, timerDefinition);
+ }
+
+ return intermediateCatchTimerEvent;
+ }
+
+ private void parseTimeCycle(String catchEventId, Parse parse, Element timeCycle, TimerDefinitionImpl timerDefinition) {
+ String cycleExpression = timeCycle.getTextContent();
+ if (Duration.isValidExpression(cycleExpression)) {
+ timerDefinition.setDueDateDescription(cycleExpression);
+ } else if (CronExpression.isValidExpression(cycleExpression)) {
+ timerDefinition.setCronExpression(cycleExpression);
+ } else {
+ parse.addProblem("couldn't parse timeDate duration '"+ cycleExpression
+ + "' on intermediate catch timer event " + catchEventId);
+ }
+ }
+
+ protected void parseTimeDate(String catchEventId, Parse parse, Element timeDate, TimerDefinitionImpl timerDefinition) {
+ String dueDateTime = timeDate.getTextContent();
+ String dueDateTimeFormatText = (String) EnvironmentImpl.getFromCurrent("jbpm.duedatetime.format", false);
+ if (dueDateTimeFormatText==null) {
+ dueDateTimeFormatText = "dd/MM/yyyy HH:mm:ss";
+ }
+ SimpleDateFormat dateFormat = new SimpleDateFormat(dueDateTimeFormatText);
+ try {
+ Date duedatetimeDate = dateFormat.parse(dueDateTime);
+ timerDefinition.setDueDate(duedatetimeDate);
+ } catch (ParseException e) {
+ parse.addProblem("couldn't parse timeDate '"+ dueDateTime
+ + "' on intermediate catch timer event " + catchEventId, e);
+ }
+ }
+
+}
Added: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/IntermediateCatchTimerEvent.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/IntermediateCatchTimerEvent.java (rev 0)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/IntermediateCatchTimerEvent.java 2010-01-20 23:11:40 UTC (rev 6108)
@@ -0,0 +1,54 @@
+/*
+ * 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.bpmn.flownodes;
+
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.api.listener.EventListenerExecution;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+
+/**
+ *
+ * @author Joram Barrez
+ */
+public class IntermediateCatchTimerEvent extends BpmnActivity implements EventListener {
+
+ private static final long serialVersionUID = 1L;
+
+ public void execute(ActivityExecution execution) {
+ execute((ExecutionImpl) execution);
+ }
+
+ public void execute(ExecutionImpl execution) {
+ execution.waitForSignal(); // Timer will automatically be created due to a TimerDefinition attached to the activity
+ }
+
+ /**
+ * Called when an intermediate timer fires.
+ * The given execution should be continued.
+ */
+ public void notify(EventListenerExecution execution) throws Exception {
+ ExecutionImpl executionImpl = (ExecutionImpl) execution;
+ proceed(executionImpl, findOutgoingSequenceFlow(executionImpl, CONDITIONS_CHECKED));
+ }
+
+}
Copied: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/NoneStartEventActivity.java (from rev 6082, jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/StartActivity.java)
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/NoneStartEventActivity.java (rev 0)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/NoneStartEventActivity.java 2010-01-20 23:11:40 UTC (rev 6108)
@@ -0,0 +1,41 @@
+/*
+ * 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.bpmn.flownodes;
+
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+
+/**
+ * None start event
+ */
+public class NoneStartEventActivity extends BpmnActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ public void execute(ActivityExecution execution) {
+ execute((ExecutionImpl) execution);
+ }
+
+ public void execute(ExecutionImpl execution) {
+ proceed(execution, findOutgoingSequenceFlow(execution, CONDITIONS_CHECKED));
+ }
+}
Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ServiceTaskBinding.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ServiceTaskBinding.java 2010-01-20 16:07:55 UTC (rev 6107)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ServiceTaskBinding.java 2010-01-20 23:11:40 UTC (rev 6108)
@@ -31,7 +31,6 @@
import org.jbpm.pvm.internal.wire.operation.InvokeOperation;
import org.jbpm.pvm.internal.xml.Parse;
import org.jbpm.pvm.internal.xml.Parser;
-import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class ServiceTaskBinding extends BpmnBinding {
@@ -47,30 +46,33 @@
JavaServiceTaskActivity javaActivity = new JavaServiceTaskActivity();
BpmnProcessDefinition bpmnProcessDefinition = parse.contextStackFind(BpmnProcessDefinition.class);
- Document dom = element.getOwnerDocument();
+ // Operation parsing
String operationRef = XmlUtil.attribute(element, "operationRef", true, parse, null);
-
- //Element operationElement = dom.getElementById(operationRef);
Element operationElement = bpmnProcessDefinition.getOperations().get(operationRef);
if (operationElement == null) {
parse.addProblem("No operation found for operationRef " + operationRef, operationElement);
}
+
+ // Interface parsing
Element interfaceElement = (Element)operationElement.getParentNode();
+
javaActivity.setMethodName(operationElement.getAttribute("name"));
- //TODO put in function
+ // Out message
String outMessageRef = XmlUtil.element(operationElement, "outMessageRef").getTextContent().trim();
String outStructureRef = bpmnProcessDefinition.getMessages().get(outMessageRef).getAttribute("structureRef");
Element outItemDefinition = bpmnProcessDefinition.getItemDefinitions().get(outStructureRef);
Element var = XmlUtil.element(outItemDefinition, "var");
javaActivity.setVariableName(var.getAttribute("name"));
+ // In message
String inMessageRef = XmlUtil.element(operationElement, "inMessageRef").getTextContent().trim();
String inStructureRef = bpmnProcessDefinition.getMessages().get(inMessageRef).getAttribute("structureRef");
Element itemDefinition = bpmnProcessDefinition.getItemDefinitions().get(inStructureRef);
+ // Arguments
List<Element> argElements = XmlUtil.elements(itemDefinition, "arg");
if (!argElements.isEmpty()) {
List<ArgDescriptor> argDescriptors = wireParser.parseArgs(argElements, parse);
@@ -89,7 +91,7 @@
}
javaActivity.setTarget(target);
} else {
- // parse.addProblem("no target specified in "+TAG+": must specify attribute 'class' or 'expr'", element);
+ parse.addProblem("no target specified in " + TAG +" : must specify attribute 'class' or 'expr'", element);
}
javaActivity.setDefault(getDefault());
Deleted: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/StartActivity.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/StartActivity.java 2010-01-20 16:07:55 UTC (rev 6107)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/StartActivity.java 2010-01-20 23:11:40 UTC (rev 6108)
@@ -1,39 +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.bpmn.flownodes;
-
-import org.jbpm.api.activity.ActivityExecution;
-import org.jbpm.pvm.internal.model.ExecutionImpl;
-
-
-public class StartActivity extends BpmnActivity {
-
- private static final long serialVersionUID = 1L;
-
- public void execute(ActivityExecution execution) {
- execute((ExecutionImpl) execution);
- }
-
- public void execute(ExecutionImpl execution) {
- proceed(execution, findOutgoingSequenceFlow(execution, CONDITIONS_CHECKED));
- }
-}
Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/StartBinding.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/StartBinding.java 2010-01-20 16:07:55 UTC (rev 6107)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/StartBinding.java 2010-01-20 23:11:40 UTC (rev 6108)
@@ -46,7 +46,7 @@
parse.addProblem("multiple start events not yet supported", element);
}
- return new StartActivity();
+ return new NoneStartEventActivity();
}
public boolean isNameRequired() {
Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/parser/BpmnParser.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/parser/BpmnParser.java 2010-01-20 16:07:55 UTC (rev 6107)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/parser/BpmnParser.java 2010-01-20 23:11:40 UTC (rev 6108)
@@ -34,13 +34,11 @@
import org.jbpm.bpmn.common.ResourceParameter;
import org.jbpm.bpmn.flownodes.BpmnActivity;
import org.jbpm.bpmn.flownodes.BpmnBinding;
-import org.jbpm.bpmn.flownodes.DatabasedGatewayActivity;
import org.jbpm.bpmn.model.BpmnProcessDefinition;
import org.jbpm.bpmn.model.SequenceflowCondition;
import org.jbpm.internal.log.Log;
import org.jbpm.pvm.internal.model.ActivityImpl;
import org.jbpm.pvm.internal.model.CompositeElementImpl;
-import org.jbpm.pvm.internal.model.ExpressionCondition;
import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
import org.jbpm.pvm.internal.model.ScopeElementImpl;
import org.jbpm.pvm.internal.model.TransitionImpl;
@@ -79,6 +77,9 @@
// Setting BPMN2 xsd schema
List<String> schemaResources = new ArrayList<String>();
schemaResources.add("BPMN20.xsd");
+ schemaResources.add("DiagramDefinition.xsd");
+ schemaResources.add("DiagramInterchange.xsd");
+ schemaResources.add("BpmnDi.xsd");
setSchemaResources(schemaResources);
}
@@ -110,6 +111,10 @@
if (key != null) {
processDefinition.setKey(key);
}
+
+ if (name == null) {
+ processDefinition.setName(key);
+ }
Element descriptionElement = XmlUtil.element(processElement, "documentation");
if (descriptionElement != null) {
@@ -125,8 +130,6 @@
parseMessages((Element)processElement.getParentNode(), parse, processDefinition);
-
-
parseDataObjects(processElement, parse, processDefinition);
// activities
Added: jbpm4/trunk/modules/bpmn/src/main/resources/BpmnDi.xsd
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/resources/BpmnDi.xsd (rev 0)
+++ jbpm4/trunk/modules/bpmn/src/main/resources/BpmnDi.xsd 2010-01-20 23:11:40 UTC (rev 6108)
@@ -0,0 +1,273 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSpy v2009 sp1 (http://www.altova.com) by Bruce Silver (private) -->
+<xs:schema xmlns="http://bpmndi.org" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://bpmndi.org" elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <xs:element name="bpmndi">
+ <xs:annotation>
+ <xs:documentation>Comment describing your root element</xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="diagram" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="diagram" type="diagramType"/>
+ <xs:complexType name="diagramType">
+ <xs:attribute name="id" type="xs:ID" use="required"/>
+ <xs:attribute name="name" type="xs:string"/>
+ <xs:anyAttribute namespace="##other"/>
+ </xs:complexType>
+ <xs:element name="processDiagram" type="processDiagramType" substitutionGroup="diagram"/>
+ <xs:complexType name="processDiagramType">
+ <xs:complexContent>
+ <xs:extension base="diagramType">
+ <xs:sequence>
+ <xs:element ref="laneCompartment" maxOccurs="unbounded"/>
+ <xs:element ref="sequenceFlowConnector" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="associationConnector" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="dataAssociationConnector" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="processRef" type="xs:IDREF"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:element name="collaborationDiagram" type="collaborationDiagramType" substitutionGroup="diagram"/>
+ <xs:complexType name="collaborationDiagramType">
+ <xs:complexContent>
+ <xs:extension base="diagramType">
+ <xs:sequence>
+ <xs:element name="pool" type="poolCompartmentType" minOccurs="2" maxOccurs="unbounded"/>
+ <xs:element ref="messageFlowConnector" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="collaborationRef" type="xs:IDREF"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:element name="bpmnNode" type="bpmnNodeType"/>
+ <xs:complexType name="bpmnNodeType">
+ <xs:attribute name="id" type="xs:ID" use="required"/>
+ <xs:attribute name="name" type="xs:string"/>
+ <xs:attribute name="x"/>
+ <xs:attribute name="y"/>
+ <xs:attribute name="width"/>
+ <xs:attribute name="height"/>
+ </xs:complexType>
+ <xs:element name="bpmnCompartment" type="bpmnCompartmentType" substitutionGroup="bpmnNode"/>
+ <xs:complexType name="bpmnCompartmentType">
+ <xs:complexContent>
+ <xs:extension base="bpmnNodeType">
+ <xs:attribute name="isVisible" type="xs:boolean"/>
+ <xs:attribute name="orientation">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="horizontal"/>
+ <xs:enumeration value="vertical"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:element name="laneCompartment" type="laneCompartmentType_1" substitutionGroup="bpmnCompartment"/>
+ <xs:complexType name="laneCompartmentType">
+ <xs:complexContent>
+ <xs:extension base="bpmnCompartmentType">
+ <xs:sequence>
+ <xs:element ref="bpmnShape" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="subLane" type="laneCompartmentType_1" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="laneRef" type="xs:IDREF"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:element name="poolCompartment" type="poolCompartmentType" substitutionGroup="bpmnCompartment"/>
+ <xs:complexType name="poolCompartmentType">
+ <xs:complexContent>
+ <xs:extension base="bpmnCompartmentType">
+ <xs:sequence>
+ <xs:element name="laneCompRef" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="participantRef" type="xs:IDREF"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:element name="bpmnShape" type="bpmnNodeType" substitutionGroup="bpmnNode"/>
+ <xs:element name="bpmnLabel" substitutionGroup="bpmnNode"/>
+ <xs:element name="activityShape" type="activityShapeType_1" substitutionGroup="bpmnShape"/>
+ <xs:complexType name="activityShapeType">
+ <xs:attribute name="activityRef" type="xs:IDREF"/>
+ </xs:complexType>
+ <xs:complexType name="activityShapeType_1">
+ <xs:complexContent>
+ <xs:extension base="bpmnNodeType">
+ <xs:attribute name="activityRef"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:element name="subprocessShape" type="subprocessShapeType" substitutionGroup="activityShape"/>
+ <xs:complexType name="subprocessShapeType">
+ <xs:complexContent>
+ <xs:extension base="activityShapeType_1">
+ <xs:sequence>
+ <xs:element name="laneCompRef" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="isExpanded" type="xs:boolean"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:element name="calledSubprocessShape" type="calledSubprocessShapeType" substitutionGroup="activityShape"/>
+ <xs:complexType name="calledSubprocessShapeType">
+ <xs:complexContent>
+ <xs:extension base="activityShapeType_1">
+ <xs:attribute name="isExpanded" type="xs:boolean"/>
+ <xs:attribute name="diagramLink" type="xs:IDREF"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:element name="taskShape" type="activityShapeType_1" substitutionGroup="activityShape"/>
+ <xs:element name="gatewayShape" substitutionGroup="bpmnShape">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="bpmnNodeType">
+ <xs:attribute name="gatewayRef"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="eventShape" substitutionGroup="bpmnShape">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="bpmnNodeType">
+ <xs:attribute name="eventRef"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="dataObjectShape" substitutionGroup="bpmnShape">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="bpmnNodeType">
+ <xs:attribute name="dataObjectRef" type="xs:IDREF"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="dataStoreShape" substitutionGroup="bpmnShape">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="bpmnNodeType">
+ <xs:attribute name="dataStoreRef" type="xs:IDREF"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="dataInputShape" substitutionGroup="bpmnShape">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="bpmnNodeType">
+ <xs:attribute name="dataInputRef" type="xs:IDREF"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="dataOutputShape" substitutionGroup="bpmnShape">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="bpmnNodeType">
+ <xs:attribute name="dataOutputRef" type="xs:IDREF"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="messageShape" substitutionGroup="bpmnShape">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="bpmnNodeType">
+ <xs:attribute name="messageRef" type="xs:IDREF"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="groupShape" substitutionGroup="bpmnShape">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="bpmnNodeType">
+ <xs:attribute name="categoryRef" type="xs:IDREF"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="textAnnotationShape" substitutionGroup="bpmnShape">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="bpmnNodeType">
+ <xs:attribute name="annotationRef" type="xs:IDREF"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="bpmnConnector" type="bpmnConnectorType"/>
+ <xs:complexType name="bpmnConnectorType">
+ <xs:sequence>
+ <xs:element name="bendpoint" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="x" type="xs:double"/>
+ <xs:attribute name="y" type="xs:double"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:ID" use="required"/>
+ <xs:attribute name="sourceRef" type="xs:IDREF" use="required"/>
+ <xs:attribute name="targetRef" type="xs:IDREF" use="required"/>
+ <xs:attribute name="label" type="xs:string"/>
+ </xs:complexType>
+ <xs:element name="sequenceFlowConnector" substitutionGroup="bpmnConnector">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="bpmnConnectorType">
+ <xs:attribute name="sequenceFlowRef" type="xs:IDREF"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="messageFlowConnector">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="bpmnConnectorType">
+ <xs:attribute name="messageFlowRef" type="xs:IDREF"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="dataAssociationConnector" substitutionGroup="bpmnConnector">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="associationConnectorType">
+ <xs:attribute name="dataAssociationRef" type="xs:IDREF"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="associationConnector" type="associationConnectorType_1" substitutionGroup="bpmnConnector"/>
+ <xs:complexType name="associationConnectorType">
+ <xs:complexContent>
+ <xs:extension base="bpmnConnectorType">
+ <xs:attribute name="isDirectional" type="xs:boolean"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:element name="compensationFlowConnector" type="associationConnectorType_1" substitutionGroup="associationConnector"/>
+ <xs:element name="lane" type="laneCompartmentType"/>
+ <xs:complexType name="laneCompartmentType_1">
+ <xs:complexContent>
+ <xs:extension base="laneCompartmentType"/>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="associationConnectorType_1">
+ <xs:complexContent>
+ <xs:extension base="associationConnectorType">
+ <xs:attribute name="associationRef" type="xs:IDREF"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+</xs:schema>
Modified: jbpm4/trunk/modules/bpmn/src/main/resources/jbpm.bpmn.flownodes.xml
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/resources/jbpm.bpmn.flownodes.xml 2010-01-20 16:07:55 UTC (rev 6107)
+++ jbpm4/trunk/modules/bpmn/src/main/resources/jbpm.bpmn.flownodes.xml 2010-01-20 23:11:40 UTC (rev 6108)
@@ -4,12 +4,15 @@
<activity binding="org.jbpm.bpmn.flownodes.StartBinding" />
<activity binding="org.jbpm.bpmn.flownodes.EndBinding" />
+ <!-- Events -->
+ <activity binding="org.jbpm.bpmn.flownodes.IntermediateCatchEventBinding" />
+
<!-- Gateway bindings -->
<activity binding="org.jbpm.bpmn.flownodes.ExclusiveGatewayBinding" />
<activity binding="org.jbpm.bpmn.flownodes.ParallelGatewayBinding" />
<activity binding="org.jbpm.bpmn.flownodes.InclusiveGatewayBinding" />
- <!-- -->
+ <!-- Activities -->
<activity binding="org.jbpm.bpmn.flownodes.ReceiveBinding" />
<!-- Task bindings -->
Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java 2010-01-20 16:07:55 UTC (rev 6107)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java 2010-01-20 23:11:40 UTC (rev 6108)
@@ -362,7 +362,7 @@
timerDefinition.setDueDateDescription(duedate);
} else if (duedatetime!=null) {
- String dueDateTimeFormatText = (String) EnvironmentImpl.getFromCurrent("jbpm.duedatetime.format");
+ String dueDateTimeFormatText = (String) EnvironmentImpl.getFromCurrent("jbpm.duedatetime.format", false);
if (dueDateTimeFormatText==null) {
dueDateTimeFormatText = "HH:mm dd/MM/yyyy";
}
Added: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cal/CronExpression.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cal/CronExpression.java (rev 0)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cal/CronExpression.java 2010-01-20 23:11:40 UTC (rev 6108)
@@ -0,0 +1,1514 @@
+package org.jbpm.pvm.internal.cal;
+
+import java.io.Serializable;
+import java.text.ParseException;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.StringTokenizer;
+import java.util.TimeZone;
+import java.util.TreeSet;
+
+/**
+ * Provides a parser and evaluator for unix-like cron expressions. Cron
+ * expressions provide the ability to specify complex time combinations such as
+ * "At 8:00am every Monday through Friday" or "At 1:30am every
+ * last Friday of the month".
+ * <P>
+ * Cron expressions are comprised of 6 required fields and one optional field
+ * separated by white space. The fields respectively are described as follows:
+ *
+ * <table cellspacing="8">
+ * <tr>
+ * <th align="left">Field Name</th>
+ * <th align="left"> </th>
+ * <th align="left">Allowed Values</th>
+ * <th align="left"> </th>
+ * <th align="left">Allowed Special Characters</th>
+ * </tr>
+ * <tr>
+ * <td align="left"><code>Seconds</code></td>
+ * <td align="left"> </th>
+ * <td align="left"><code>0-59</code></td>
+ * <td align="left"> </th>
+ * <td align="left"><code>, - * /</code></td>
+ * </tr>
+ * <tr>
+ * <td align="left"><code>Minutes</code></td>
+ * <td align="left"> </th>
+ * <td align="left"><code>0-59</code></td>
+ * <td align="left"> </th>
+ * <td align="left"><code>, - * /</code></td>
+ * </tr>
+ * <tr>
+ * <td align="left"><code>Hours</code></td>
+ * <td align="left"> </th>
+ * <td align="left"><code>0-23</code></td>
+ * <td align="left"> </th>
+ * <td align="left"><code>, - * /</code></td>
+ * </tr>
+ * <tr>
+ * <td align="left"><code>Day-of-month</code></td>
+ * <td align="left"> </th>
+ * <td align="left"><code>1-31</code></td>
+ * <td align="left"> </th>
+ * <td align="left"><code>, - * ? / L W</code></td>
+ * </tr>
+ * <tr>
+ * <td align="left"><code>Month</code></td>
+ * <td align="left"> </th>
+ * <td align="left"><code>1-12 or JAN-DEC</code></td>
+ * <td align="left"> </th>
+ * <td align="left"><code>, - * /</code></td>
+ * </tr>
+ * <tr>
+ * <td align="left"><code>Day-of-Week</code></td>
+ * <td align="left"> </th>
+ * <td align="left"><code>1-7 or SUN-SAT</code></td>
+ * <td align="left"> </th>
+ * <td align="left"><code>, - * ? / L #</code></td>
+ * </tr>
+ * <tr>
+ * <td align="left"><code>Year (Optional)</code></td>
+ * <td align="left"> </th>
+ * <td align="left"><code>empty, 1970-2099</code></td>
+ * <td align="left"> </th>
+ * <td align="left"><code>, - * /</code></td>
+ * </tr>
+ * </table>
+ * <P>
+ * The '*' character is used to specify all values. For example, "*"
+ * in the minute field means "every minute".
+ * <P>
+ * The '?' character is allowed for the day-of-month and day-of-week fields. It
+ * is used to specify 'no specific value'. This is useful when you need to
+ * specify something in one of the two fileds, but not the other.
+ * <P>
+ * The '-' character is used to specify ranges For example "10-12" in
+ * the hour field means "the hours 10, 11 and 12".
+ * <P>
+ * The ',' character is used to specify additional values. For example
+ * "MON,WED,FRI" in the day-of-week field means "the days Monday,
+ * Wednesday, and Friday".
+ * <P>
+ * The '/' character is used to specify increments. For example "0/15"
+ * in the seconds field means "the seconds 0, 15, 30, and 45". And
+ * "5/15" in the seconds field means "the seconds 5, 20, 35, and
+ * 50". Specifying '*' before the '/' is equivalent to specifying 0 is
+ * the value to start with. Essentially, for each field in the expression, there
+ * is a set of numbers that can be turned on or off. For seconds and minutes,
+ * the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to
+ * 31, and for months 1 to 12. The "/" character simply helps you turn
+ * on every "nth" value in the given set. Thus "7/6" in the
+ * month field only turns on month "7", it does NOT mean every 6th
+ * month, please note that subtlety.
+ * <P>
+ * The 'L' character is allowed for the day-of-month and day-of-week fields.
+ * This character is short-hand for "last", but it has different
+ * meaning in each of the two fields. For example, the value "L" in
+ * the day-of-month field means "the last day of the month" - day 31
+ * for January, day 28 for February on non-leap years. If used in the
+ * day-of-week field by itself, it simply means "7" or
+ * "SAT". But if used in the day-of-week field after another value, it
+ * means "the last xxx day of the month" - for example "6L"
+ * means "the last friday of the month". When using the 'L' option, it
+ * is important not to specify lists, or ranges of values, as you'll get
+ * confusing results.
+ * <P>
+ * The 'W' character is allowed for the day-of-month field. This character
+ * is used to specify the weekday (Monday-Friday) nearest the given day. As an
+ * example, if you were to specify "15W" as the value for the
+ * day-of-month field, the meaning is: "the nearest weekday to the 15th of
+ * the month". So if the 15th is a Saturday, the trigger will fire on
+ * Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the
+ * 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th.
+ * However if you specify "1W" as the value for day-of-month, and the
+ * 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not
+ * 'jump' over the boundary of a month's days. The 'W' character can only be
+ * specified when the day-of-month is a single day, not a range or list of days.
+ * <P>
+ * The 'L' and 'W' characters can also be combined for the day-of-month
+ * expression to yield 'LW', which translates to "last weekday of the
+ * month".
+ * <P>
+ * The '#' character is allowed for the day-of-week field. This character is
+ * used to specify "the nth" XXX day of the month. For example, the
+ * value of "6#3" in the day-of-week field means the third Friday of
+ * the month (day 6 = Friday and "#3" = the 3rd one in the month).
+ * Other examples: "2#1" = the first Monday of the month and
+ * "4#5" = the fifth Wednesday of the month. Note that if you specify
+ * "#5" and there is not 5 of the given day-of-week in the month, then
+ * no firing will occur that month.
+ * <P>
+ * <!--The 'C' character is allowed for the day-of-month and day-of-week fields.
+ * This character is short-hand for "calendar". This means values are
+ * calculated against the associated calendar, if any. If no calendar is
+ * associated, then it is equivalent to having an all-inclusive calendar. A
+ * value of "5C" in the day-of-month field means "the first day included by the
+ * calendar on or after the 5th". A value of "1C" in the day-of-week field
+ * means "the first day included by the calendar on or after sunday".-->
+ * <P>
+ * The legal characters and the names of months and days of the week are not
+ * case sensitive.
+ *
+ * <p>
+ * <b>NOTES:</b>
+ * <ul>
+ * <li>Support for specifying both a day-of-week and a day-of-month value is
+ * not complete (you'll need to use the '?' character in on of these fields).
+ * </li>
+ * </ul>
+ * </p>
+ *
+ *
+ * @author Sharada Jambula, James House
+ * @author Contributions from Mads Henderson
+ * @author Refactoring from CronTrigger to CronExpression by Aaron Craven
+ */
+public class CronExpression implements Serializable, Cloneable {
+
+ private static final long serialVersionUID = 12423409423L;
+
+ protected static final int SECOND = 0;
+ protected static final int MINUTE = 1;
+ protected static final int HOUR = 2;
+ protected static final int DAY_OF_MONTH = 3;
+ protected static final int MONTH = 4;
+ protected static final int DAY_OF_WEEK = 5;
+ protected static final int YEAR = 6;
+ protected static final int ALL_SPEC_INT = 99; // '*'
+ protected static final int NO_SPEC_INT = 98; // '?'
+ protected static final Integer ALL_SPEC = new Integer(ALL_SPEC_INT);
+ protected static final Integer NO_SPEC = new Integer(NO_SPEC_INT);
+
+ protected static Map monthMap = new HashMap(20);
+ protected static Map dayMap = new HashMap(60);
+ static {
+ monthMap.put("JAN", new Integer(0));
+ monthMap.put("FEB", new Integer(1));
+ monthMap.put("MAR", new Integer(2));
+ monthMap.put("APR", new Integer(3));
+ monthMap.put("MAY", new Integer(4));
+ monthMap.put("JUN", new Integer(5));
+ monthMap.put("JUL", new Integer(6));
+ monthMap.put("AUG", new Integer(7));
+ monthMap.put("SEP", new Integer(8));
+ monthMap.put("OCT", new Integer(9));
+ monthMap.put("NOV", new Integer(10));
+ monthMap.put("DEC", new Integer(11));
+
+ dayMap.put("SUN", new Integer(1));
+ dayMap.put("MON", new Integer(2));
+ dayMap.put("TUE", new Integer(3));
+ dayMap.put("WED", new Integer(4));
+ dayMap.put("THU", new Integer(5));
+ dayMap.put("FRI", new Integer(6));
+ dayMap.put("SAT", new Integer(7));
+ }
+
+ private String cronExpression = null;
+ private TimeZone timeZone = null;
+ protected transient TreeSet seconds;
+ protected transient TreeSet minutes;
+ protected transient TreeSet hours;
+ protected transient TreeSet daysOfMonth;
+ protected transient TreeSet months;
+ protected transient TreeSet daysOfWeek;
+ protected transient TreeSet years;
+
+ protected transient boolean lastdayOfWeek = false;
+ protected transient int nthdayOfWeek = 0;
+ protected transient boolean lastdayOfMonth = false;
+ protected transient boolean nearestWeekday = false;
+ protected transient boolean expressionParsed = false;
+
+ /**
+ * Constructs a new <CODE>CronExpression</CODE> based on the specified
+ * parameter.
+ *
+ * @param cronExpression String representation of the cron expression the
+ * new object should represent
+ * @throws java.text.ParseException
+ * if the string expression cannot be parsed into a valid
+ * <CODE>CronExpression</CODE>
+ */
+ public CronExpression(String cronExpression) throws ParseException {
+ if (cronExpression == null) {
+ throw new IllegalArgumentException("cronExpression cannot be null");
+ }
+
+ this.cronExpression = cronExpression;
+
+ buildExpression(cronExpression.toUpperCase(Locale.US));
+ }
+
+ /**
+ * Indicates whether the given date satisfies the cron expression. Note that
+ * milliseconds are ignored, so two Dates falling on different milliseconds
+ * of the same second will always have the same result here.
+ *
+ * @param date the date to evaluate
+ * @return a boolean indicating whether the given date satisfies the cron
+ * expression
+ */
+ public boolean isSatisfiedBy(Date date) {
+ Calendar testDateCal = Calendar.getInstance();
+ testDateCal.setTime(date);
+ testDateCal.set(Calendar.MILLISECOND, 0);
+ Date originalDate = testDateCal.getTime();
+
+ testDateCal.add(Calendar.SECOND, -1);
+
+ Date timeAfter = getTimeAfter(testDateCal.getTime());
+
+ return ((timeAfter != null) && (timeAfter.equals(originalDate)));
+ }
+
+ /**
+ * Returns the next date/time <I>after</I> the given date/time which
+ * satisfies the cron expression.
+ *
+ * @param date the date/time at which to begin the search for the next valid
+ * date/time
+ * @return the next valid date/time
+ */
+ public Date getNextValidTimeAfter(Date date) {
+ return getTimeAfter(date);
+ }
+
+ /**
+ * Returns the next date/time <I>after</I> the given date/time which does
+ * <I>not</I> satisfy the expression
+ *
+ * @param date the date/time at which to begin the search for the next
+ * invalid date/time
+ * @return the next valid date/time
+ */
+ public Date getNextInvalidTimeAfter(Date date) {
+ long difference = 1000;
+
+ //move back to the nearest second so differences will be accurate
+ Calendar adjustCal = Calendar.getInstance();
+ adjustCal.setTime(date);
+ adjustCal.set(Calendar.MILLISECOND, 0);
+ Date lastDate = adjustCal.getTime();
+
+ Date newDate = null;
+
+ //TODO: (QUARTZ-481) IMPROVE THIS! The following is a BAD solution to this problem. Performance will be very bad here, depending on the cron expression. It is, however A solution.
+
+ //keep getting the next included time until it's farther than one second
+ // apart. At that point, lastDate is the last valid fire time. We return
+ // the second immediately following it.
+ while (difference == 1000) {
+ newDate = getTimeAfter(lastDate);
+
+ difference = newDate.getTime() - lastDate.getTime();
+
+ if (difference == 1000) {
+ lastDate = newDate;
+ }
+ }
+
+ return new Date(lastDate.getTime() + 1000);
+ }
+
+ /**
+ * Returns the time zone for which this <code>CronExpression</code>
+ * will be resolved.
+ */
+ public TimeZone getTimeZone() {
+ if (timeZone == null) {
+ timeZone = TimeZone.getDefault();
+ }
+
+ return timeZone;
+ }
+
+ /**
+ * Sets the time zone for which this <code>CronExpression</code>
+ * will be resolved.
+ */
+ public void setTimeZone(TimeZone timeZone) {
+ this.timeZone = timeZone;
+ }
+
+ /**
+ * Returns the string representation of the <CODE>CronExpression</CODE>
+ *
+ * @return a string representation of the <CODE>CronExpression</CODE>
+ */
+ public String toString() {
+ return cronExpression;
+ }
+
+ /**
+ * Indicates whether the specified cron expression can be parsed into a
+ * valid cron expression
+ *
+ * @param cronExpression the expression to evaluate
+ * @return a boolean indicating whether the given expression is a valid cron
+ * expression
+ */
+ public static boolean isValidExpression(String cronExpression) {
+
+ try {
+ new CronExpression(cronExpression);
+ } catch (ParseException pe) {
+ return false;
+ }
+
+ return true;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Expression Parsing Functions
+ //
+ ////////////////////////////////////////////////////////////////////////////
+
+ protected void buildExpression(String expression) throws ParseException {
+ expressionParsed = true;
+
+ try {
+
+ if (seconds == null) {
+ seconds = new TreeSet();
+ }
+ if (minutes == null) {
+ minutes = new TreeSet();
+ }
+ if (hours == null) {
+ hours = new TreeSet();
+ }
+ if (daysOfMonth == null) {
+ daysOfMonth = new TreeSet();
+ }
+ if (months == null) {
+ months = new TreeSet();
+ }
+ if (daysOfWeek == null) {
+ daysOfWeek = new TreeSet();
+ }
+ if (years == null) {
+ years = new TreeSet();
+ }
+
+ int exprOn = SECOND;
+
+ StringTokenizer exprsTok = new StringTokenizer(expression, " \t",
+ false);
+
+ while (exprsTok.hasMoreTokens() && exprOn <= YEAR) {
+ String expr = exprsTok.nextToken().trim();
+ StringTokenizer vTok = new StringTokenizer(expr, ",");
+ while (vTok.hasMoreTokens()) {
+ String v = vTok.nextToken();
+ storeExpressionVals(0, v, exprOn);
+ }
+
+ exprOn++;
+ }
+
+ if (exprOn <= DAY_OF_WEEK) {
+ throw new ParseException("Unexpected end of expression.",
+ expression.length());
+ }
+
+ if (exprOn <= YEAR) {
+ storeExpressionVals(0, "*", YEAR);
+ }
+
+ } catch (ParseException pe) {
+ throw pe;
+ } catch (Exception e) {
+ throw new ParseException("Illegal cron expression format ("
+ + e.toString() + ")", 0);
+ }
+ }
+
+ protected int storeExpressionVals(int pos, String s, int type)
+ throws ParseException {
+
+ int incr = 0;
+ int i = skipWhiteSpace(pos, s);
+ if (i >= s.length()) {
+ return i;
+ }
+ char c = s.charAt(i);
+ if ((c >= 'A') && (c <= 'Z') && (!s.equals("L")) && (!s.equals("LW"))) {
+ String sub = s.substring(i, i + 3);
+ int sval = -1;
+ int eval = -1;
+ if (type == MONTH) {
+ sval = getMonthNumber(sub) + 1;
+ if (sval < 0) {
+ throw new ParseException("Invalid Month value: '" + sub + "'", i);
+ }
+ if (s.length() > i + 3) {
+ c = s.charAt(i + 3);
+ if (c == '-') {
+ i += 4;
+ sub = s.substring(i, i + 3);
+ eval = getMonthNumber(sub) + 1;
+ if (eval < 0) {
+ throw new ParseException("Invalid Month value: '" + sub + "'", i);
+ }
+ }
+ }
+ } else if (type == DAY_OF_WEEK) {
+ sval = getDayOfWeekNumber(sub);
+ if (sval < 0) {
+ throw new ParseException("Invalid Day-of-Week value: '"
+ + sub + "'", i);
+ }
+ if (s.length() > i + 3) {
+ c = s.charAt(i + 3);
+ if (c == '-') {
+ i += 4;
+ sub = s.substring(i, i + 3);
+ eval = getDayOfWeekNumber(sub);
+ if (eval < 0) {
+ throw new ParseException(
+ "Invalid Day-of-Week value: '" + sub
+ + "'", i);
+ }
+ if (sval > eval) {
+ throw new ParseException(
+ "Invalid Day-of-Week sequence: " + sval
+ + " > " + eval, i);
+ }
+ } else if (c == '#') {
+ try {
+ i += 4;
+ nthdayOfWeek = Integer.parseInt(s.substring(i));
+ if (nthdayOfWeek < 1 || nthdayOfWeek > 5) {
+ throw new Exception();
+ }
+ } catch (Exception e) {
+ throw new ParseException(
+ "A numeric value between 1 and 5 must follow the '#' option",
+ i);
+ }
+ } else if (c == 'L') {
+ lastdayOfWeek = true;
+ i++;
+ }
+ }
+
+ } else {
+ throw new ParseException(
+ "Illegal characters for this position: '" + sub + "'",
+ i);
+ }
+ if (eval != -1) {
+ incr = 1;
+ }
+ addToSet(sval, eval, incr, type);
+ return (i + 3);
+ }
+
+ if (c == '?') {
+ i++;
+ if ((i + 1) < s.length()
+ && (s.charAt(i) != ' ' && s.charAt(i + 1) != '\t')) {
+ throw new ParseException("Illegal character after '?': "
+ + s.charAt(i), i);
+ }
+ if (type != DAY_OF_WEEK && type != DAY_OF_MONTH) {
+ throw new ParseException(
+ "'?' can only be specfied for Day-of-Month or Day-of-Week.",
+ i);
+ }
+ if (type == DAY_OF_WEEK && !lastdayOfMonth) {
+ int val = ((Integer) daysOfMonth.last()).intValue();
+ if (val == NO_SPEC_INT) {
+ throw new ParseException(
+ "'?' can only be specfied for Day-of-Month -OR- Day-of-Week.",
+ i);
+ }
+ }
+
+ addToSet(NO_SPEC_INT, -1, 0, type);
+ return i;
+ }
+
+ if (c == '*' || c == '/') {
+ if (c == '*' && (i + 1) >= s.length()) {
+ addToSet(ALL_SPEC_INT, -1, incr, type);
+ return i + 1;
+ } else if (c == '/'
+ && ((i + 1) >= s.length() || s.charAt(i + 1) == ' ' || s
+ .charAt(i + 1) == '\t')) {
+ throw new ParseException("'/' must be followed by an integer.", i);
+ } else if (c == '*') {
+ i++;
+ }
+ c = s.charAt(i);
+ if (c == '/') { // is an increment specified?
+ i++;
+ if (i >= s.length()) {
+ throw new ParseException("Unexpected end of string.", i);
+ }
+
+ incr = getNumericValue(s, i);
+
+ i++;
+ if (incr > 10) {
+ i++;
+ }
+ if (incr > 59 && (type == SECOND || type == MINUTE)) {
+ throw new ParseException("Increment > 60 : " + incr, i);
+ } else if (incr > 23 && (type == HOUR)) {
+ throw new ParseException("Increment > 24 : " + incr, i);
+ } else if (incr > 31 && (type == DAY_OF_MONTH)) {
+ throw new ParseException("Increment > 31 : " + incr, i);
+ } else if (incr > 7 && (type == DAY_OF_WEEK)) {
+ throw new ParseException("Increment > 7 : " + incr, i);
+ } else if (incr > 12 && (type == MONTH)) {
+ throw new ParseException("Increment > 12 : " + incr, i);
+ }
+ } else {
+ incr = 1;
+ }
+
+ addToSet(ALL_SPEC_INT, -1, incr, type);
+ return i;
+ } else if (c == 'L') {
+ i++;
+ if (type == DAY_OF_MONTH) {
+ lastdayOfMonth = true;
+ }
+ if (type == DAY_OF_WEEK) {
+ addToSet(7, 7, 0, type);
+ }
+ if(type == DAY_OF_MONTH && s.length() > i) {
+ c = s.charAt(i);
+ if(c == 'W') {
+ nearestWeekday = true;
+ i++;
+ }
+ }
+ return i;
+ } else if (c >= '0' && c <= '9') {
+ int val = Integer.parseInt(String.valueOf(c));
+ i++;
+ if (i >= s.length()) {
+ addToSet(val, -1, -1, type);
+ } else {
+ c = s.charAt(i);
+ if (c >= '0' && c <= '9') {
+ ValueSet vs = getValue(val, s, i);
+ val = vs.value;
+ i = vs.pos;
+ }
+ i = checkNext(i, s, val, type);
+ return i;
+ }
+ } else {
+ throw new ParseException("Unexpected character: " + c, i);
+ }
+
+ return i;
+ }
+
+ protected int checkNext(int pos, String s, int val, int type)
+ throws ParseException {
+
+ int end = -1;
+ int i = pos;
+
+ if (i >= s.length()) {
+ addToSet(val, end, -1, type);
+ return i;
+ }
+
+ char c = s.charAt(pos);
+
+ if (c == 'L') {
+ if (type == DAY_OF_WEEK) {
+ lastdayOfWeek = true;
+ } else {
+ throw new ParseException("'L' option is not valid here. (pos=" + i + ")", i);
+ }
+ TreeSet set = getSet(type);
+ set.add(new Integer(val));
+ i++;
+ return i;
+ }
+
+ if (c == 'W') {
+ if (type == DAY_OF_MONTH) {
+ nearestWeekday = true;
+ } else {
+ throw new ParseException("'W' option is not valid here. (pos=" + i + ")", i);
+ }
+ TreeSet set = getSet(type);
+ set.add(new Integer(val));
+ i++;
+ return i;
+ }
+
+ if (c == '#') {
+ if (type != DAY_OF_WEEK) {
+ throw new ParseException("'#' option is not valid here. (pos=" + i + ")", i);
+ }
+ i++;
+ try {
+ nthdayOfWeek = Integer.parseInt(s.substring(i));
+ if (nthdayOfWeek < 1 || nthdayOfWeek > 5) {
+ throw new Exception();
+ }
+ } catch (Exception e) {
+ throw new ParseException(
+ "A numeric value between 1 and 5 must follow the '#' option",
+ i);
+ }
+
+ TreeSet set = getSet(type);
+ set.add(new Integer(val));
+ i++;
+ return i;
+ }
+
+ if (c == '-') {
+ i++;
+ c = s.charAt(i);
+ int v = Integer.parseInt(String.valueOf(c));
+ end = v;
+ i++;
+ if (i >= s.length()) {
+ addToSet(val, end, 1, type);
+ return i;
+ }
+ c = s.charAt(i);
+ if (c >= '0' && c <= '9') {
+ ValueSet vs = getValue(v, s, i);
+ int v1 = vs.value;
+ end = v1;
+ i = vs.pos;
+ }
+ if (i < s.length() && ((c = s.charAt(i)) == '/')) {
+ i++;
+ c = s.charAt(i);
+ int v2 = Integer.parseInt(String.valueOf(c));
+ i++;
+ if (i >= s.length()) {
+ addToSet(val, end, v2, type);
+ return i;
+ }
+ c = s.charAt(i);
+ if (c >= '0' && c <= '9') {
+ ValueSet vs = getValue(v2, s, i);
+ int v3 = vs.value;
+ addToSet(val, end, v3, type);
+ i = vs.pos;
+ return i;
+ } else {
+ addToSet(val, end, v2, type);
+ return i;
+ }
+ } else {
+ addToSet(val, end, 1, type);
+ return i;
+ }
+ }
+
+ if (c == '/') {
+ i++;
+ c = s.charAt(i);
+ int v2 = Integer.parseInt(String.valueOf(c));
+ i++;
+ if (i >= s.length()) {
+ addToSet(val, end, v2, type);
+ return i;
+ }
+ c = s.charAt(i);
+ if (c >= '0' && c <= '9') {
+ ValueSet vs = getValue(v2, s, i);
+ int v3 = vs.value;
+ addToSet(val, end, v3, type);
+ i = vs.pos;
+ return i;
+ } else {
+ throw new ParseException("Unexpected character '" + c + "' after '/'", i);
+ }
+ }
+
+ addToSet(val, end, 0, type);
+ i++;
+ return i;
+ }
+
+ public String getCronExpression() {
+ return cronExpression;
+ }
+
+ public String getExpressionSummary() {
+ StringBuilder summary = new StringBuilder();
+
+ summary.append("seconds: ");
+ summary.append(getExpressionSetSummary(seconds));
+ summary.append("\n");
+ summary.append("minutes: ");
+ summary.append(getExpressionSetSummary(minutes));
+ summary.append("\n");
+ summary.append("hours: ");
+ summary.append(getExpressionSetSummary(hours));
+ summary.append("\n");
+ summary.append("daysOfMonth: ");
+ summary.append(getExpressionSetSummary(daysOfMonth));
+ summary.append("\n");
+ summary.append("months: ");
+ summary.append(getExpressionSetSummary(months));
+ summary.append("\n");
+ summary.append("daysOfWeek: ");
+ summary.append(getExpressionSetSummary(daysOfWeek));
+ summary.append("\n");
+ summary.append("lastdayOfWeek: ");
+ summary.append(lastdayOfWeek);
+ summary.append("\n");
+ summary.append("nearestWeekday: ");
+ summary.append(nearestWeekday);
+ summary.append("\n");
+ summary.append("NthDayOfWeek: ");
+ summary.append(nthdayOfWeek);
+ summary.append("\n");
+ summary.append("lastdayOfMonth: ");
+ summary.append(lastdayOfMonth);
+ summary.append("\n");
+ summary.append("years: ");
+ summary.append(getExpressionSetSummary(years));
+ summary.append("\n");
+
+ return summary.toString();
+ }
+
+ protected String getExpressionSetSummary(java.util.Set set) {
+
+ if (set.contains(NO_SPEC)) {
+ return "?";
+ }
+ if (set.contains(ALL_SPEC)) {
+ return "*";
+ }
+
+ StringBuilder summary = new StringBuilder();
+
+ Iterator itr = set.iterator();
+ boolean first = true;
+ while (itr.hasNext()) {
+ Integer iVal = (Integer) itr.next();
+ String val = iVal.toString();
+ if (!first) {
+ summary.append(",");
+ }
+ summary.append(val);
+ first = false;
+ }
+
+ return summary.toString();
+ }
+
+ protected String getExpressionSetSummary(java.util.List list) {
+
+ if (list.contains(NO_SPEC)) {
+ return "?";
+ }
+ if (list.contains(ALL_SPEC)) {
+ return "*";
+ }
+
+ StringBuilder summary = new StringBuilder();
+
+ Iterator itr = list.iterator();
+ boolean first = true;
+ while (itr.hasNext()) {
+ Integer iVal = (Integer) itr.next();
+ String val = iVal.toString();
+ if (!first) {
+ summary.append(",");
+ }
+ summary.append(val);
+ first = false;
+ }
+
+ return summary.toString();
+ }
+
+ protected int skipWhiteSpace(int i, String s) {
+ for (; i < s.length() && (s.charAt(i) == ' ' || s.charAt(i) == '\t'); i++) {
+ ;
+ }
+
+ return i;
+ }
+
+ protected int findNextWhiteSpace(int i, String s) {
+ for (; i < s.length() && (s.charAt(i) != ' ' || s.charAt(i) != '\t'); i++) {
+ ;
+ }
+
+ return i;
+ }
+
+ protected void addToSet(int val, int end, int incr, int type)
+ throws ParseException {
+
+ TreeSet set = getSet(type);
+
+ if (type == SECOND || type == MINUTE) {
+ if ((val < 0 || val > 59 || end > 59) && (val != ALL_SPEC_INT)) {
+ throw new ParseException(
+ "Minute and Second values must be between 0 and 59",
+ -1);
+ }
+ } else if (type == HOUR) {
+ if ((val < 0 || val > 23 || end > 23) && (val != ALL_SPEC_INT)) {
+ throw new ParseException(
+ "Hour values must be between 0 and 23", -1);
+ }
+ } else if (type == DAY_OF_MONTH) {
+ if ((val < 1 || val > 31 || end > 31) && (val != ALL_SPEC_INT)
+ && (val != NO_SPEC_INT)) {
+ throw new ParseException(
+ "Day of month values must be between 1 and 31", -1);
+ }
+ } else if (type == MONTH) {
+ if ((val < 1 || val > 12 || end > 12) && (val != ALL_SPEC_INT)) {
+ throw new ParseException(
+ "Month values must be between 1 and 12", -1);
+ }
+ } else if (type == DAY_OF_WEEK) {
+ if ((val == 0 || val > 7 || end > 7) && (val != ALL_SPEC_INT)
+ && (val != NO_SPEC_INT)) {
+ throw new ParseException(
+ "Day-of-Week values must be between 1 and 7", -1);
+ }
+ }
+
+ if ((incr == 0 || incr == -1) && val != ALL_SPEC_INT) {
+ if (val != -1) {
+ set.add(new Integer(val));
+ } else {
+ set.add(NO_SPEC);
+ }
+
+ return;
+ }
+
+ int startAt = val;
+ int stopAt = end;
+
+ if (val == ALL_SPEC_INT && incr <= 0) {
+ incr = 1;
+ set.add(ALL_SPEC); // put in a marker, but also fill values
+ }
+
+ if (type == SECOND || type == MINUTE) {
+ if (stopAt == -1) {
+ stopAt = 59;
+ }
+ if (startAt == -1 || startAt == ALL_SPEC_INT) {
+ startAt = 0;
+ }
+ } else if (type == HOUR) {
+ if (stopAt == -1) {
+ stopAt = 23;
+ }
+ if (startAt == -1 || startAt == ALL_SPEC_INT) {
+ startAt = 0;
+ }
+ } else if (type == DAY_OF_MONTH) {
+ if (stopAt == -1) {
+ stopAt = 31;
+ }
+ if (startAt == -1 || startAt == ALL_SPEC_INT) {
+ startAt = 1;
+ }
+ } else if (type == MONTH) {
+ if (stopAt == -1) {
+ stopAt = 12;
+ }
+ if (startAt == -1 || startAt == ALL_SPEC_INT) {
+ startAt = 1;
+ }
+ } else if (type == DAY_OF_WEEK) {
+ if (stopAt == -1) {
+ stopAt = 7;
+ }
+ if (startAt == -1 || startAt == ALL_SPEC_INT) {
+ startAt = 1;
+ }
+ } else if (type == YEAR) {
+ if (stopAt == -1) {
+ stopAt = 2099;
+ }
+ if (startAt == -1 || startAt == ALL_SPEC_INT) {
+ startAt = 1970;
+ }
+ }
+
+ for (int i = startAt; i <= stopAt; i += incr) {
+ set.add(new Integer(i));
+ }
+ }
+
+ protected TreeSet getSet(int type) {
+ switch (type) {
+ case SECOND:
+ return seconds;
+ case MINUTE:
+ return minutes;
+ case HOUR:
+ return hours;
+ case DAY_OF_MONTH:
+ return daysOfMonth;
+ case MONTH:
+ return months;
+ case DAY_OF_WEEK:
+ return daysOfWeek;
+ case YEAR:
+ return years;
+ default:
+ return null;
+ }
+ }
+
+ protected ValueSet getValue(int v, String s, int i) {
+ char c = s.charAt(i);
+ String s1 = String.valueOf(v);
+ while (c >= '0' && c <= '9') {
+ s1 += c;
+ i++;
+ if (i >= s.length()) {
+ break;
+ }
+ c = s.charAt(i);
+ }
+ ValueSet val = new ValueSet();
+
+ val.pos = (i < s.length()) ? i : i + 1;
+ val.value = Integer.parseInt(s1);
+ return val;
+ }
+
+ protected int getNumericValue(String s, int i) {
+ int endOfVal = findNextWhiteSpace(i, s);
+ String val = s.substring(i, endOfVal);
+ return Integer.parseInt(val);
+ }
+
+ protected int getMonthNumber(String s) {
+ Integer integer = (Integer) monthMap.get(s);
+
+ if (integer == null) {
+ return -1;
+ }
+
+ return integer.intValue();
+ }
+
+ protected int getDayOfWeekNumber(String s) {
+ Integer integer = (Integer) dayMap.get(s);
+
+ if (integer == null) {
+ return -1;
+ }
+
+ return integer.intValue();
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Computation Functions
+ //
+ ////////////////////////////////////////////////////////////////////////////
+
+ protected Date getTimeAfter(Date afterTime) {
+
+ Calendar cl = Calendar.getInstance(getTimeZone());
+
+ // move ahead one second, since we're computing the time *after* the
+ // given time
+ afterTime = new Date(afterTime.getTime() + 1000);
+ // CronTrigger does not deal with milliseconds
+ cl.setTime(afterTime);
+ cl.set(Calendar.MILLISECOND, 0);
+
+ boolean gotOne = false;
+ // loop until we've computed the next time, or we've past the endTime
+ while (!gotOne) {
+
+ //if (endTime != null && cl.getTime().after(endTime)) return null;
+ if(cl.get(Calendar.YEAR) > 2999) // prevent endless loop...
+ return null;
+
+ SortedSet st = null;
+ int t = 0;
+
+ int sec = cl.get(Calendar.SECOND);
+ int min = cl.get(Calendar.MINUTE);
+
+ // get second.................................................
+ st = seconds.tailSet(new Integer(sec));
+ if (st != null && st.size() != 0) {
+ sec = ((Integer) st.first()).intValue();
+ } else {
+ sec = ((Integer) seconds.first()).intValue();
+ min++;
+ cl.set(Calendar.MINUTE, min);
+ }
+ cl.set(Calendar.SECOND, sec);
+
+ min = cl.get(Calendar.MINUTE);
+ int hr = cl.get(Calendar.HOUR_OF_DAY);
+ t = -1;
+
+ // get minute.................................................
+ st = minutes.tailSet(new Integer(min));
+ if (st != null && st.size() != 0) {
+ t = min;
+ min = ((Integer) st.first()).intValue();
+ } else {
+ min = ((Integer) minutes.first()).intValue();
+ hr++;
+ }
+ if (min != t) {
+ cl.set(Calendar.SECOND, 0);
+ cl.set(Calendar.MINUTE, min);
+ setCalendarHour(cl, hr);
+ continue;
+ }
+ cl.set(Calendar.MINUTE, min);
+
+ hr = cl.get(Calendar.HOUR_OF_DAY);
+ int day = cl.get(Calendar.DAY_OF_MONTH);
+ t = -1;
+
+ // get hour...................................................
+ st = hours.tailSet(new Integer(hr));
+ if (st != null && st.size() != 0) {
+ t = hr;
+ hr = ((Integer) st.first()).intValue();
+ } else {
+ hr = ((Integer) hours.first()).intValue();
+ day++;
+ }
+ if (hr != t) {
+ cl.set(Calendar.SECOND, 0);
+ cl.set(Calendar.MINUTE, 0);
+ cl.set(Calendar.DAY_OF_MONTH, day);
+ setCalendarHour(cl, hr);
+ continue;
+ }
+ cl.set(Calendar.HOUR_OF_DAY, hr);
+
+ day = cl.get(Calendar.DAY_OF_MONTH);
+ int mon = cl.get(Calendar.MONTH) + 1;
+ // '+ 1' because calendar is 0-based for this field, and we are
+ // 1-based
+ t = -1;
+ int tmon = mon;
+
+ // get day...................................................
+ boolean dayOfMSpec = !daysOfMonth.contains(NO_SPEC);
+ boolean dayOfWSpec = !daysOfWeek.contains(NO_SPEC);
+ if (dayOfMSpec && !dayOfWSpec) { // get day by day of month rule
+ st = daysOfMonth.tailSet(new Integer(day));
+ if (lastdayOfMonth) {
+ if(!nearestWeekday) {
+ t = day;
+ day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
+ } else {
+ t = day;
+ day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
+
+ java.util.Calendar tcal = java.util.Calendar.getInstance();
+ tcal.set(Calendar.SECOND, 0);
+ tcal.set(Calendar.MINUTE, 0);
+ tcal.set(Calendar.HOUR_OF_DAY, 0);
+ tcal.set(Calendar.DAY_OF_MONTH, day);
+ tcal.set(Calendar.MONTH, mon - 1);
+ tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR));
+
+ int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
+ int dow = tcal.get(Calendar.DAY_OF_WEEK);
+
+ if(dow == Calendar.SATURDAY && day == 1) {
+ day += 2;
+ } else if(dow == Calendar.SATURDAY) {
+ day -= 1;
+ } else if(dow == Calendar.SUNDAY && day == ldom) {
+ day -= 2;
+ } else if(dow == Calendar.SUNDAY) {
+ day += 1;
+ }
+
+ tcal.set(Calendar.SECOND, sec);
+ tcal.set(Calendar.MINUTE, min);
+ tcal.set(Calendar.HOUR_OF_DAY, hr);
+ tcal.set(Calendar.DAY_OF_MONTH, day);
+ tcal.set(Calendar.MONTH, mon - 1);
+ Date nTime = tcal.getTime();
+ if(nTime.before(afterTime)) {
+ day = 1;
+ mon++;
+ }
+ }
+ } else if(nearestWeekday) {
+ t = day;
+ day = ((Integer) daysOfMonth.first()).intValue();
+
+ java.util.Calendar tcal = java.util.Calendar.getInstance();
+ tcal.set(Calendar.SECOND, 0);
+ tcal.set(Calendar.MINUTE, 0);
+ tcal.set(Calendar.HOUR_OF_DAY, 0);
+ tcal.set(Calendar.DAY_OF_MONTH, day);
+ tcal.set(Calendar.MONTH, mon - 1);
+ tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR));
+
+ int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
+ int dow = tcal.get(Calendar.DAY_OF_WEEK);
+
+ if(dow == Calendar.SATURDAY && day == 1) {
+ day += 2;
+ } else if(dow == Calendar.SATURDAY) {
+ day -= 1;
+ } else if(dow == Calendar.SUNDAY && day == ldom) {
+ day -= 2;
+ } else if(dow == Calendar.SUNDAY) {
+ day += 1;
+ }
+
+
+ tcal.set(Calendar.SECOND, sec);
+ tcal.set(Calendar.MINUTE, min);
+ tcal.set(Calendar.HOUR_OF_DAY, hr);
+ tcal.set(Calendar.DAY_OF_MONTH, day);
+ tcal.set(Calendar.MONTH, mon - 1);
+ Date nTime = tcal.getTime();
+ if(nTime.before(afterTime)) {
+ day = ((Integer) daysOfMonth.first()).intValue();;
+ mon++;
+ }
+ } else if (st != null && st.size() != 0) {
+ t = day;
+ day = ((Integer) st.first()).intValue();
+ } else {
+ day = ((Integer) daysOfMonth.first()).intValue();
+ mon++;
+ }
+
+ if (day != t || mon != tmon) {
+ cl.set(Calendar.SECOND, 0);
+ cl.set(Calendar.MINUTE, 0);
+ cl.set(Calendar.HOUR_OF_DAY, 0);
+ cl.set(Calendar.DAY_OF_MONTH, day);
+ cl.set(Calendar.MONTH, mon - 1);
+ // '- 1' because calendar is 0-based for this field, and we
+ // are 1-based
+ continue;
+ }
+ } else if (dayOfWSpec && !dayOfMSpec) { // get day by day of week rule
+ if (lastdayOfWeek) { // are we looking for the last XXX day of
+ // the month?
+ int dow = ((Integer) daysOfWeek.first()).intValue(); // desired
+ // d-o-w
+ int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w
+ int daysToAdd = 0;
+ if (cDow < dow) {
+ daysToAdd = dow - cDow;
+ }
+ if (cDow > dow) {
+ daysToAdd = dow + (7 - cDow);
+ }
+
+ int lDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
+
+ if (day + daysToAdd > lDay) { // did we already miss the
+ // last one?
+ cl.set(Calendar.SECOND, 0);
+ cl.set(Calendar.MINUTE, 0);
+ cl.set(Calendar.HOUR_OF_DAY, 0);
+ cl.set(Calendar.DAY_OF_MONTH, 1);
+ cl.set(Calendar.MONTH, mon);
+ // no '- 1' here because we are promoting the month
+ continue;
+ }
+
+ // find date of last occurance of this day in this month...
+ while ((day + daysToAdd + 7) <= lDay) {
+ daysToAdd += 7;
+ }
+
+ day += daysToAdd;
+
+ if (daysToAdd > 0) {
+ cl.set(Calendar.SECOND, 0);
+ cl.set(Calendar.MINUTE, 0);
+ cl.set(Calendar.HOUR_OF_DAY, 0);
+ cl.set(Calendar.DAY_OF_MONTH, day);
+ cl.set(Calendar.MONTH, mon - 1);
+ // '- 1' here because we are not promoting the month
+ continue;
+ }
+
+ } else if (nthdayOfWeek != 0) {
+ // are we looking for the Nth XXX day in the month?
+ int dow = ((Integer) daysOfWeek.first()).intValue(); // desired
+ // d-o-w
+ int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w
+ int daysToAdd = 0;
+ if (cDow < dow) {
+ daysToAdd = dow - cDow;
+ } else if (cDow > dow) {
+ daysToAdd = dow + (7 - cDow);
+ }
+
+ boolean dayShifted = false;
+ if (daysToAdd > 0) {
+ dayShifted = true;
+ }
+
+ day += daysToAdd;
+ int weekOfMonth = day / 7;
+ if (day % 7 > 0) {
+ weekOfMonth++;
+ }
+
+ daysToAdd = (nthdayOfWeek - weekOfMonth) * 7;
+ day += daysToAdd;
+ if (daysToAdd < 0
+ || day > getLastDayOfMonth(mon, cl
+ .get(Calendar.YEAR))) {
+ cl.set(Calendar.SECOND, 0);
+ cl.set(Calendar.MINUTE, 0);
+ cl.set(Calendar.HOUR_OF_DAY, 0);
+ cl.set(Calendar.DAY_OF_MONTH, 1);
+ cl.set(Calendar.MONTH, mon);
+ // no '- 1' here because we are promoting the month
+ continue;
+ } else if (daysToAdd > 0 || dayShifted) {
+ cl.set(Calendar.SECOND, 0);
+ cl.set(Calendar.MINUTE, 0);
+ cl.set(Calendar.HOUR_OF_DAY, 0);
+ cl.set(Calendar.DAY_OF_MONTH, day);
+ cl.set(Calendar.MONTH, mon - 1);
+ // '- 1' here because we are NOT promoting the month
+ continue;
+ }
+ } else {
+ int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w
+ int dow = ((Integer) daysOfWeek.first()).intValue(); // desired
+ // d-o-w
+ st = daysOfWeek.tailSet(new Integer(cDow));
+ if (st != null && st.size() > 0) {
+ dow = ((Integer) st.first()).intValue();
+ }
+
+ int daysToAdd = 0;
+ if (cDow < dow) {
+ daysToAdd = dow - cDow;
+ }
+ if (cDow > dow) {
+ daysToAdd = dow + (7 - cDow);
+ }
+
+ int lDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
+
+ if (day + daysToAdd > lDay) { // will we pass the end of
+ // the month?
+ cl.set(Calendar.SECOND, 0);
+ cl.set(Calendar.MINUTE, 0);
+ cl.set(Calendar.HOUR_OF_DAY, 0);
+ cl.set(Calendar.DAY_OF_MONTH, 1);
+ cl.set(Calendar.MONTH, mon);
+ // no '- 1' here because we are promoting the month
+ continue;
+ } else if (daysToAdd > 0) { // are we swithing days?
+ cl.set(Calendar.SECOND, 0);
+ cl.set(Calendar.MINUTE, 0);
+ cl.set(Calendar.HOUR_OF_DAY, 0);
+ cl.set(Calendar.DAY_OF_MONTH, day + daysToAdd);
+ cl.set(Calendar.MONTH, mon - 1);
+ // '- 1' because calendar is 0-based for this field,
+ // and we are 1-based
+ continue;
+ }
+ }
+ } else { // dayOfWSpec && !dayOfMSpec
+ throw new UnsupportedOperationException(
+ "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.");
+ // TODO:
+ }
+ cl.set(Calendar.DAY_OF_MONTH, day);
+
+ mon = cl.get(Calendar.MONTH) + 1;
+ // '+ 1' because calendar is 0-based for this field, and we are
+ // 1-based
+ int year = cl.get(Calendar.YEAR);
+ t = -1;
+
+ // test for expressions that never generate a valid fire date,
+ // but keep looping...
+ if (year > 2099) {
+ return null;
+ }
+
+ // get month...................................................
+ st = months.tailSet(new Integer(mon));
+ if (st != null && st.size() != 0) {
+ t = mon;
+ mon = ((Integer) st.first()).intValue();
+ } else {
+ mon = ((Integer) months.first()).intValue();
+ year++;
+ }
+ if (mon != t) {
+ cl.set(Calendar.SECOND, 0);
+ cl.set(Calendar.MINUTE, 0);
+ cl.set(Calendar.HOUR_OF_DAY, 0);
+ cl.set(Calendar.DAY_OF_MONTH, 1);
+ cl.set(Calendar.MONTH, mon - 1);
+ // '- 1' because calendar is 0-based for this field, and we are
+ // 1-based
+ cl.set(Calendar.YEAR, year);
+ continue;
+ }
+ cl.set(Calendar.MONTH, mon - 1);
+ // '- 1' because calendar is 0-based for this field, and we are
+ // 1-based
+
+ year = cl.get(Calendar.YEAR);
+ t = -1;
+
+ // get year...................................................
+ st = years.tailSet(new Integer(year));
+ if (st != null && st.size() != 0) {
+ t = year;
+ year = ((Integer) st.first()).intValue();
+ } else {
+ return null; // ran out of years...
+ }
+
+ if (year != t) {
+ cl.set(Calendar.SECOND, 0);
+ cl.set(Calendar.MINUTE, 0);
+ cl.set(Calendar.HOUR_OF_DAY, 0);
+ cl.set(Calendar.DAY_OF_MONTH, 1);
+ cl.set(Calendar.MONTH, 0);
+ // '- 1' because calendar is 0-based for this field, and we are
+ // 1-based
+ cl.set(Calendar.YEAR, year);
+ continue;
+ }
+ cl.set(Calendar.YEAR, year);
+
+ gotOne = true;
+ } // while( !done )
+
+ return cl.getTime();
+ }
+
+ /**
+ * Advance the calendar to the particular hour paying particular attention
+ * to daylight saving problems.
+ *
+ * @param cal
+ * @param hour
+ */
+ protected void setCalendarHour(Calendar cal, int hour) {
+ cal.set(java.util.Calendar.HOUR_OF_DAY, hour);
+ if (cal.get(java.util.Calendar.HOUR_OF_DAY) != hour && hour != 24) {
+ cal.set(java.util.Calendar.HOUR_OF_DAY, hour + 1);
+ }
+ }
+
+ /**
+ * NOT YET IMPLEMENTED: Returns the time before the given time
+ * that the <code>CronExpression</code> matches.
+ */
+ protected Date getTimeBefore(Date endTime) {
+ // TODO: implement QUARTZ-423
+ return null;
+ }
+
+ /**
+ * NOT YET IMPLEMENTED: Returns the final time that the
+ * <code>CronExpression</code> will match.
+ */
+ public Date getFinalFireTime() {
+ // TODO: implement QUARTZ-423
+ return null;
+ }
+
+ protected boolean isLeapYear(int year) {
+ return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
+ }
+
+ protected int getLastDayOfMonth(int monthNum, int year) {
+
+ switch (monthNum) {
+ case 1:
+ return 31;
+ case 2:
+ return (isLeapYear(year)) ? 29 : 28;
+ case 3:
+ return 31;
+ case 4:
+ return 30;
+ case 5:
+ return 31;
+ case 6:
+ return 30;
+ case 7:
+ return 31;
+ case 8:
+ return 31;
+ case 9:
+ return 30;
+ case 10:
+ return 31;
+ case 11:
+ return 30;
+ case 12:
+ return 31;
+ default:
+ throw new IllegalArgumentException("Illegal month number: "
+ + monthNum);
+ }
+ }
+
+
+ private void readObject(java.io.ObjectInputStream stream)
+ throws java.io.IOException, ClassNotFoundException {
+
+ stream.defaultReadObject();
+ try {
+ buildExpression(cronExpression);
+ } catch (Exception ignore) {
+ } // never happens
+ }
+
+ public Object clone() {
+ CronExpression copy = null;
+ try {
+ copy = new CronExpression(getCronExpression());
+ copy.setTimeZone(getTimeZone());
+ } catch (ParseException ex) { // never happens since the source is valid...
+ throw new IncompatibleClassChangeError("Not Cloneable.");
+ }
+ return copy;
+ }
+}
+
+class ValueSet {
+ public int value;
+
+ public int pos;
+}
\ No newline at end of file
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cal/Duration.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cal/Duration.java 2010-01-20 16:07:55 UTC (rev 6107)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cal/Duration.java 2010-01-20 23:11:40 UTC (rev 6108)
@@ -82,6 +82,15 @@
isBusinessTime = text.indexOf("business")!=-1;
}
+
+ public static boolean isValidExpression(String durationExpression) {
+ try {
+ new Duration(durationExpression);
+ } catch (JbpmException e) {
+ return false;
+ }
+ return true;
+ }
public Duration(boolean isBusinessTime, int millis, int seconds, int minutes, int hours, int days, int weeks, int months, int years) {
this.isBusinessTime = isBusinessTime;
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/job/TimerImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/job/TimerImpl.java 2010-01-20 16:07:55 UTC (rev 6107)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/job/TimerImpl.java 2010-01-20 23:11:40 UTC (rev 6108)
@@ -74,7 +74,7 @@
}
public void setDueDateDescription(String dueDateDescription) {
-
+ if (dueDateDescription != null) {
ScriptManager scriptManager = ScriptManager.getScriptManager();
Date baseDate;
@@ -125,7 +125,8 @@
} else {
duedate = businessCalendar.subtract(baseDate, durationString);
}
- }
+ }
+ }
}
public Boolean execute(Environment environment) throws Exception {
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeInstanceImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeInstanceImpl.java 2010-01-20 16:07:55 UTC (rev 6107)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ScopeInstanceImpl.java 2010-01-20 23:11:40 UTC (rev 6108)
@@ -22,6 +22,7 @@
package org.jbpm.pvm.internal.model;
import java.io.Serializable;
+import java.text.ParseException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -32,6 +33,7 @@
import org.jbpm.api.Execution;
import org.jbpm.api.JbpmException;
import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.cal.CronExpression;
import org.jbpm.pvm.internal.env.EnvironmentImpl;
import org.jbpm.pvm.internal.history.HistoryEvent;
import org.jbpm.pvm.internal.history.events.VariableCreate;
@@ -44,6 +46,7 @@
import org.jbpm.pvm.internal.type.Variable;
import org.jbpm.pvm.internal.type.variable.NullVariable;
import org.jbpm.pvm.internal.type.variable.UnpersistableVariable;
+import org.jbpm.pvm.internal.util.Clock;
/**
@@ -301,6 +304,16 @@
timer.setSignalName(timerDefinition.getSignalName());
timer.setDuedate(timerDefinition.getDueDate());
timer.setDueDateDescription(timerDefinition.getDueDateDescription());
+
+ if (timer.getDuedate() == null && timerDefinition.getCronExpression() != null) {
+ try {
+ timer.setDuedate(new CronExpression(timerDefinition.getCronExpression())
+ .getNextValidTimeAfter(Clock.getCurrentTime()));
+ } catch (ParseException pe) {
+ throw new JbpmException("Can't parse cron expression " + timerDefinition.getCronExpression(), pe);
+ }
+ }
+
Boolean isExclusive = timerDefinition.isExclusive();
if (isExclusive!=null) {
timer.setExclusive(isExclusive);
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/TimerDefinitionImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/TimerDefinitionImpl.java 2010-01-20 16:07:55 UTC (rev 6107)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/TimerDefinitionImpl.java 2010-01-20 23:11:40 UTC (rev 6108)
@@ -24,7 +24,9 @@
import java.io.Serializable;
import java.util.Date;
+import org.jbpm.api.JbpmException;
+
/**
* @author Tom Baeyens
* @author Pascal Verdage
@@ -37,6 +39,7 @@
protected int dbversion;
protected String dueDateDescription;
protected Date dueDate;
+ protected String cronExpression;
protected String repeat;
protected Boolean isExclusive;
protected Integer retries;
@@ -50,6 +53,9 @@
return repeat;
}
public void setRepeat(String repeat) {
+ if (cronExpression != null) {
+ throw new JbpmException("Can't use 'repeat' and 'cronExpression' together for same timer");
+ }
this.repeat = repeat;
}
public long getDbid() {
@@ -91,4 +97,13 @@
public void setDueDate(Date dueDate) {
this.dueDate = dueDate;
}
+ public String getCronExpression() {
+ return cronExpression;
+ }
+ public void setCronExpression(String cronExpression) {
+ if (repeat != null) {
+ throw new JbpmException("Can't use 'repeat' and 'cronExpression' together for same timer");
+ }
+ this.cronExpression = cronExpression;
+ }
}
Added: jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/test/intermediatecatch/IntermediateCatchTimerEventTest.java
===================================================================
--- jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/test/intermediatecatch/IntermediateCatchTimerEventTest.java (rev 0)
+++ jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/test/intermediatecatch/IntermediateCatchTimerEventTest.java 2010-01-20 23:11:40 UTC (rev 6108)
@@ -0,0 +1,196 @@
+/*
+ * 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.bpmn.test.intermediatecatch;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.ProcessInstance;
+import org.jbpm.api.job.Job;
+import org.jbpm.pvm.internal.util.Clock;
+import org.jbpm.test.JbpmTestCase;
+import org.jbpm.test.assertion.CollectionAssertions;
+
+/**
+ * @author Joram Barrez
+ */
+public class IntermediateCatchTimerEventTest extends JbpmTestCase {
+
+ private static final String BAD_PROCESS_1 =
+ "<definitions xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>" +
+ " <process id='intermediateCatchEvent'>" +
+ " <startEvent id='theStart' />" +
+ " <sequenceFlow id='flow1' sourceRef='theStart' targetRef='intermediateTimer' />" +
+ " <intermediateCatchEvent id='intermediateTimer' >" +
+ " <timerEventDefinition/>" +
+ " </intermediateCatchEvent>" +
+ " <sequenceFlow id='flow2' sourceRef='intermediateTimer' targetRef='theEnd' />" +
+ " <endEvent id='theEnd' />" +
+ " </process>" +
+ "</definitions>";
+
+ private static final String BAD_PROCESS_2 =
+ "<definitions xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>" +
+ " <process id='intermediateCatchEvent'>" +
+ " <startEvent id='theStart' />" +
+ " <sequenceFlow id='flow1' sourceRef='theStart' targetRef='intermediateTimer' />" +
+ " <intermediateCatchEvent id='intermediateTimer' >" +
+ " <timerEventDefinition>" +
+ " <timeCycle>5 hours</timeCycle>" +
+ " <timeDate>10/10/1985</timeDate>" +
+ " </timerEventDefinition>" +
+ " </intermediateCatchEvent>" +
+ " <sequenceFlow id='flow2' sourceRef='intermediateTimer' targetRef='theEnd' />" +
+ " <endEvent id='theEnd' />" +
+ " </process>" +
+ "</definitions>";
+
+ private static final String TIMER_CATCH_WITH_TIMECYCLE =
+ "<definitions xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>" +
+ " <process id='timeCycleProcess'>" +
+ " <startEvent id='theStart' />" +
+ " <sequenceFlow id='flow1' sourceRef='theStart' targetRef='intermediateTimer' />" +
+ " <intermediateCatchEvent id='intermediateTimer' >" +
+ " <timerEventDefinition>" +
+ " <timeCycle>5 hours</timeCycle>" +
+ " </timerEventDefinition>" +
+ " </intermediateCatchEvent>" +
+ " <sequenceFlow id='flow2' sourceRef='intermediateTimer' targetRef='theEnd' />" +
+ " <endEvent id='theEnd' />" +
+ " </process>" +
+ "</definitions>";
+
+ private static final String TIMER_CATCH_WITH_TIMEDATE =
+ "<definitions xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>" +
+ " <process id='timeDateProcess'>" +
+ " <startEvent id='theStart' />" +
+ " <sequenceFlow id='flow1' sourceRef='theStart' targetRef='intermediateTimer' />" +
+ " <intermediateCatchEvent id='intermediateTimer' >" +
+ " <timerEventDefinition>" +
+ " <timeDate>10/10/2099 00:00:00</timeDate>" +
+ " </timerEventDefinition>" +
+ " </intermediateCatchEvent>" +
+ " <sequenceFlow id='flow2' sourceRef='intermediateTimer' targetRef='theEnd' />" +
+ " <endEvent id='theEnd' />" +
+ " </process>" +
+ "</definitions>";
+
+ private static final String TIMER_CATCH_WITH_CRON_EXPRESSION =
+ "<definitions xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>" +
+ " <process id='timeDateProcess'>" +
+ " <startEvent id='theStart' />" +
+ " <sequenceFlow id='flow1' sourceRef='theStart' targetRef='intermediateTimer' />" +
+ " <intermediateCatchEvent id='intermediateTimer' >" +
+ " <timerEventDefinition>" +
+ " <timeCycle>0 * * * * ?</timeCycle>" +
+ " </timerEventDefinition>" +
+ " </intermediateCatchEvent>" +
+ " <sequenceFlow id='flow2' sourceRef='intermediateTimer' targetRef='theEnd' />" +
+ " <endEvent id='theEnd' />" +
+ " </process>" +
+ "</definitions>";
+
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ Clock.setCurrentTime(null);
+ }
+
+ public void testInvalidProcess() {
+ final String expectedMsg = "Intermediate catch event 'intermediateTimer' requires either a " +
+ "timeDate or a timeCycle definition (but not both)";
+ try {
+ deployBpmn2XmlString(BAD_PROCESS_1);
+ fail();
+ } catch (JbpmException e) {
+ assertTrue(e.getMessage().contains(expectedMsg));
+ }
+
+ try {
+ deployBpmn2XmlString(BAD_PROCESS_2);
+ fail();
+ } catch (JbpmException e) {
+ assertTrue(e.getMessage().contains(expectedMsg));
+ }
+ }
+
+ public void testTimeCycleExpression() {
+ deployBpmn2XmlString(TIMER_CATCH_WITH_TIMECYCLE);
+
+ long processStartTime = 5000;
+ Clock.setCurrentTime(new Date(processStartTime));
+
+ ProcessInstance pi = executionService.startProcessInstanceByKey("timeCycleProcess");
+ CollectionAssertions.assertContainsSameElements(pi.findActiveActivityNames(), "intermediateTimer");
+
+ Job timerJob = managementService.createJobQuery().processInstanceId(pi.getId()).uniqueResult();
+ long expectedTimerDueDate = processStartTime + (5 * 60 * 60 * 1000); // expected = 5 hours in ms
+ assertEquals(expectedTimerDueDate, timerJob.getDuedate().getTime());
+
+ managementService.executeJob(timerJob.getId());
+ assertProcessInstanceEnded(pi);
+ }
+
+ public void testTimeDateExpression() {
+ deployBpmn2XmlString(TIMER_CATCH_WITH_TIMEDATE);
+
+ ProcessInstance pi = executionService.startProcessInstanceByKey("timeDateProcess");
+ CollectionAssertions.assertContainsSameElements(pi.findActiveActivityNames(), "intermediateTimer");
+
+ Job timerJob = managementService.createJobQuery().processInstanceId(pi.getId()).uniqueResult();
+ Date expectedDueDate = getDate(10, Calendar.OCTOBER, 2099);
+ assertEquals(expectedDueDate.getTime(), timerJob.getDuedate().getTime());
+
+ managementService.executeJob(timerJob.getId());
+ assertProcessInstanceEnded(pi);
+ }
+
+ public void testCronExpression() {
+ deployBpmn2XmlString(TIMER_CATCH_WITH_CRON_EXPRESSION);
+ Clock.setCurrentTime(new Date(61000)); // Start on 35 seconds
+
+ ProcessInstance pi = executionService.startProcessInstanceByKey("timeDateProcess");
+ CollectionAssertions.assertContainsSameElements(pi.findActiveActivityNames(), "intermediateTimer");
+
+ Job timerJob = managementService.createJobQuery().processInstanceId(pi.getId()).uniqueResult();
+ assertEquals(120000, timerJob.getDuedate().getTime());
+
+ managementService.executeJob(timerJob.getId());
+ assertProcessInstanceEnded(pi);
+ }
+
+ private Date getDate(int day, int month, int year) {
+ Calendar cal = Calendar.getInstance();
+ cal.set(Calendar.DAY_OF_MONTH, day);
+ cal.set(Calendar.MONTH, month);
+ cal.set(Calendar.YEAR, year);
+ cal.set(Calendar.HOUR_OF_DAY, 0);
+ cal.set(Calendar.MINUTE, 0);
+ cal.set(Calendar.SECOND, 0);
+ cal.set(Calendar.MILLISECOND, 0);
+ return cal.getTime();
+ }
+
+
+}
Modified: jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/timer/TimerTest.java
===================================================================
--- jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/timer/TimerTest.java 2010-01-20 16:07:55 UTC (rev 6107)
+++ jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/timer/TimerTest.java 2010-01-20 23:11:40 UTC (rev 6108)
@@ -227,7 +227,8 @@
Calendar jobDate = Calendar.getInstance();
jobDate.setTime(job.getDuedate());
- assertEquals(cal.get(Calendar.DAY_OF_MONTH) + 5 , jobDate.get(Calendar.DAY_OF_MONTH));
+ cal.add(Calendar.DAY_OF_MONTH, 5);
+ assertEquals(cal.get(Calendar.DAY_OF_MONTH), jobDate.get(Calendar.DAY_OF_MONTH));
managementService.executeJob(job.getId());
assertProcessInstanceEnded(processInstance);
14 years, 4 months
JBoss JBPM SVN: r6107 - in jbpm4/trunk: qa and 1 other directory.
by do-not-reply@jboss.org
Author: tom.baeyens(a)jboss.com
Date: 2010-01-20 11:07:55 -0500 (Wed, 20 Jan 2010)
New Revision: 6107
Modified:
jbpm4/trunk/modules/db/src/main/java/org/jbpm/db/Upgrade.java
jbpm4/trunk/qa/build.xml
Log:
JBPM-2714 fixing upgrade for postgresql
Modified: jbpm4/trunk/modules/db/src/main/java/org/jbpm/db/Upgrade.java
===================================================================
--- jbpm4/trunk/modules/db/src/main/java/org/jbpm/db/Upgrade.java 2010-01-20 15:55:02 UTC (rev 6106)
+++ jbpm4/trunk/modules/db/src/main/java/org/jbpm/db/Upgrade.java 2010-01-20 16:07:55 UTC (rev 6107)
@@ -38,6 +38,7 @@
import org.jbpm.pvm.internal.repository.DeploymentProperty;
/**
+ * @author Tom Baeyens
* @author Alejandro Guizar
*/
public class Upgrade {
@@ -69,7 +70,14 @@
private static final long serialVersionUID = 1L;
public Object execute(Environment environment) throws Exception {
Session session = environment.get(Session.class);
- propertiesTableExists = PropertyImpl.propertiesTableExists(session);
+ propertiesTableExists = PropertyImpl.propertiesTableExists(session);
+ return null;
+ }
+ });
+ processEngine.execute(new Command<Object>(){
+ private static final long serialVersionUID = 1L;
+ public Object execute(Environment environment) throws Exception {
+ Session session = environment.get(Session.class);
if (!propertiesTableExists) {
try {
session.createSQLQuery("select CLASSNAME_ from JBPM4_VARIABLE").list();
Modified: jbpm4/trunk/qa/build.xml
===================================================================
--- jbpm4/trunk/qa/build.xml 2010-01-20 15:55:02 UTC (rev 6106)
+++ jbpm4/trunk/qa/build.xml 2010-01-20 16:07:55 UTC (rev 6107)
@@ -324,9 +324,6 @@
<replacetoken><![CDATA[<import resource="jbpm.businesscalendar.cfg.xml" />]]></replacetoken>
<replacevalue></replacevalue>
</replace>
- <ant antfile="${old.jbpm.home}/db/build.xml" target="drop.jbpm.schema" inheritall="false">
- <property name="database" value="${database}" />
- </ant>
<ant antfile="${old.jbpm.home}/db/build.xml" target="create.jbpm.schema" inheritall="false">
<property name="database" value="${database}" />
</ant>
@@ -343,9 +340,6 @@
<copy todir="${old.jbpm.home}/install/jdbc">
<fileset dir="upgrade/target/jdbc" />
</copy>
- <ant antfile="${old.jbpm.home}/install/build.xml" target="drop.jbpm.schema" inheritall="false">
- <property name="database" value="${database}" />
- </ant>
<ant antfile="${old.jbpm.home}/install/build.xml" target="create.jbpm.schema" inheritall="false">
<property name="database" value="${database}" />
</ant>
14 years, 4 months
JBoss JBPM SVN: r6106 - in jbpm4/trunk/modules: bpmn/src/main/java/org/jbpm/bpmn/flownodes and 10 other directories.
by do-not-reply@jboss.org
Author: tom.baeyens(a)jboss.com
Date: 2010-01-20 10:55:02 -0500 (Wed, 20 Jan 2010)
New Revision: 6106
Added:
jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java
jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Transition.java
Removed:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/Activity.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/Transition.java
Modified:
jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/OpenExecution.java
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/AbstractMergingGatewayActivity.java
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/AbstractTask.java
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/BpmnActivity.java
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/EndActivity.java
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ExclusiveGatewayActivity.java
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ParallelGatewayActivity.java
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ReceiveActivity.java
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/UserTaskActivity.java
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/model/BpmnProcessDefinition.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionConditionActivity.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionExpressionActivity.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionHandlerActivity.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/EndActivity.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/ForkActivity.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/GroupActivity.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JoinActivity.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/StateActivity.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/SubProcessActivity.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskActivity.java
jbpm4/trunk/modules/jpdl/src/test/java/org/jbpm/jpdl/parsing/TransitionParsingTest.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cmd/GetOutcomes.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/migration/DefaultMigrationHandler.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ActivityImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/CompositeElement.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/CompositeElementImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/Condition.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/OpenProcessDefinition.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ProcessModificationsImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/TransitionImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/LifeCycle.java
jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/builder/BuilderTest.java
jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/custombusinesscalendarimpl/CustomBusinessCalendar.java
jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/EventTest.java
jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/FunctionalActivityTest.java
jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ScopeVariableDeclarationTest.java
Log:
JBPM-2609 Extended API to be able to list all outgoing transitions of active activities
Copied: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java (from rev 6105, jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/Activity.java)
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java (rev 0)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -0,0 +1,147 @@
+/*
+ * 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.api.model;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * a activity in a {@link OpenProcessDefinition} graph.
+ *
+ * <p>The activity supports both graph based process models as well as
+ * block structured (tree based) process models. First we describe
+ * tranisions that can be used to formResourceName graph based process structures
+ * and then we'll describe activity composition to formResourceName block structured
+ * process models. Both models can be combined as well.
+ * </p>
+ *
+ * <p>Activities have {@link #getIncomingTransitions() incoming}
+ * and {@link #getOutgoingTransitions() outgoing transitions}.
+ * These are lists of transitions.
+ * </p>
+ *
+ * <p>Optionally, transitions can have names. In that case the
+ * transition {@link #getOutgoingTransition(String) names are associated
+ * to activity's outgoing transitions}. The {@link #getOutgoingTransitionsMap() map
+ * of outgoing transitions} provides easy access to the named transitions.
+ * </p>
+ *
+ * <p>One of the outgoing transitions can optionally be marked as
+ * {@link #getDefaultOutgoingTransition() the default transition}.
+ * </p>
+ *
+ * <p>Block structured process languages have composite activities that can be
+ * modeled with the {@link #getParent() parent}-{@link #getActivities() child}
+ * relation.
+ * </p>
+ *
+ * @author Tom Baeyens
+ */
+public interface Activity {
+
+ /** the short display name given to this element. */
+ String getName();
+
+ /** the list of outgoing transitions.
+ * Caution: the actual member is returned. No copy is made. */
+ List<Transition> getOutgoingTransitions();
+
+ /** the default outgoing transition. */
+ Transition getDefaultOutgoingTransition();
+
+ /** the first leaving transition with the given name or null of no
+ * such leaving transition exists. If the multiple transitions have
+ * the given transition name, the first (in order of {@link #getOutgoingTransitions()})
+ * will be returned.
+ *
+ * @param transitionName is the name of the transition to take. A null value will
+ * match the first unnamed transition. */
+ Transition getOutgoingTransition(String transitionName);
+
+ /** indicates if a leaving transition with the given transitionName exists.
+ * A null value matches an unnamed transition. */
+ boolean hasOutgoingTransition(String transitionName);
+
+ /** indicates if this activity has leaving transitions */
+ boolean hasOutgoingTransitions();
+
+ /** the leaving transitions, keyed by transition name. If a transition with
+ * the same name occurs mutltiple times, the first one is returned.
+ * Leaving transitions with a null value for their name are not included
+ * in the map.
+ * Beware: the actual member is returned. No copy is made. In fact, the
+ * returned map is maintained as a cache. So updates to the map will
+ * influence subsequent retrievals of outgoing transitions by name. */
+ Map<String, Transition> getOutgoingTransitionsMap();
+
+ /** searches for the given transitionName in this activity and then up the
+ * parent chain. Returns null if no such transition is found. */
+ Transition findOutgoingTransition(String transitionName);
+
+ /** the list of arriving transitions.
+ * Beware: the actual member is returned. No copy is made. */
+ List<Transition> getIncomingTransitions();
+
+ /** indicates if this activity has arriving transitions */
+ boolean hasIncomingTransitions();
+
+ /** retrieve the parent activity in the composite activity structure. This is
+ * different from {@link ObservableElement#getParent()} in that it is restricted
+ * to the parent activities. It doesn't take into account the process definition. */
+ Activity getParentActivity();
+
+ /** indicates if this processDefinition has activities. */
+ boolean hasActivities();
+
+ /** the list of direct composite activities. Recursively contained
+ * activities are not included in the list.
+ * Beware: the actual member is returned. No copy is made. */
+ List<? extends Activity> getActivities();
+
+ /** indicates if an activity with the given name exists directly in
+ * this element. Only the direct contained activities are
+ * searched. No recursive search is made. */
+ boolean hasActivity(String activityName);
+
+ /** the first composite activity with the given name or null of no
+ * such activity exists. Only the direct contained activities are
+ * searched. No recursive search is made. */
+ Activity getActivity(String activityName);
+
+ /** searches for the given activity in this element recursively,
+ * including this activity and all child activities. The search
+ * is done depth-first. A null value for activityName matches a activity
+ * without a name. */
+ Activity findActivity(String activityName);
+
+ /** the composite activities, keyed by activity name. If an activity
+ * with the same name occurs mutltiple times, the first in the list
+ * is included in the map. Activities with a null value for their name
+ * are not included in the map.
+ * Beware: the actual member is returned. No copy is made. In fact, the
+ * returned map is maintained as a cache. So updates to the map will
+ * influence subsequent retrievals of activities by name.*/
+ Map<String, Activity> getActivitiesMap();
+
+ /** the type of this activity which corresponds to the xml tag */
+ String getType();
+}
\ No newline at end of file
Property changes on: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:mergeinfo
+
Name: svn:eol-style
+ LF
Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/OpenExecution.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/OpenExecution.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/OpenExecution.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -46,6 +46,9 @@
*/
public interface OpenExecution extends Execution {
+ /** the current activity */
+ Activity getActivity();
+
/** update the state */
void setState(String state);
Copied: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Transition.java (from rev 6105, jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/Transition.java)
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Transition.java (rev 0)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Transition.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -0,0 +1,63 @@
+/*
+ * 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.api.model;
+
+/**
+ * a transition in a {@link OpenProcessDefinition} graph.
+ *
+ * <h3 id="guardconditions">Guard conditions</h3>
+ * <p>TODO</p>
+ *
+ * <h3 id="transitionsaswaitstates">Transitions as wait states</h3>
+ * <p>A wait condition indicates wether a transition is to be taken synchronously
+ * or wether the transition will behave as a wait state.
+ * </p>
+ *
+ * <p>Transitions that are wait states can occur when an analyst has
+ * an actual state (e.g. 'making loss') and a desired state (e.g. 'making profit')
+ * and models a transition between those states. In that case the transition
+ * might take a long time and hence it results into a wait state for the system.
+ * </p>
+ *
+ * <p>If the wait condition is null or if it returns false, then the transition
+ * will be taking synchronously. Otherwise the transition will behave as
+ * a wait state and wait for a signal on the execution.
+ * </p>
+ *
+ * <p>Transitions as wait states has every thing to do with matching the
+ * process graph to transactions on the server. If the transition is taken
+ * in one (the current) transaction, then the async condition should be empty
+ * or evaluate to false. If the arrival of the execution in the destination
+ * activity should occur in a separate execution
+ *
+ * @author Tom Baeyens
+ */
+public interface Transition {
+ /** the short display name given to this element. */
+ String getName();
+
+ /** the activity from which this transition leaves. */
+ Activity getSource();
+
+ /** the activity in which this transition arrives. */
+ Activity getDestination();
+}
\ No newline at end of file
Property changes on: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Transition.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/AbstractMergingGatewayActivity.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/AbstractMergingGatewayActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/AbstractMergingGatewayActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -29,11 +29,11 @@
import org.jbpm.api.Execution;
import org.jbpm.api.JbpmException;
import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.api.model.Activity;
+import org.jbpm.api.model.Transition;
import org.jbpm.internal.log.Log;
import org.jbpm.pvm.internal.env.EnvironmentImpl;
-import org.jbpm.pvm.internal.model.Activity;
import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.model.Transition;
/**
* Superclass for gateway activities that wait on multiple incoming executions before merging
Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/AbstractTask.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/AbstractTask.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/AbstractTask.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -26,10 +26,10 @@
import org.jbpm.api.Execution;
import org.jbpm.api.activity.ActivityExecution;
-import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.api.model.Activity;
+import org.jbpm.api.model.Transition;
import org.jbpm.pvm.internal.model.Condition;
import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.model.Transition;
/**
* The abstract task is a base class for all BPMN 2.0 tasks
Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/BpmnActivity.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/BpmnActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/BpmnActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -29,11 +29,13 @@
import org.jbpm.api.Execution;
import org.jbpm.api.JbpmException;
import org.jbpm.api.activity.ActivityBehaviour;
+import org.jbpm.api.model.Activity;
+import org.jbpm.api.model.Transition;
import org.jbpm.internal.log.Log;
-import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.ActivityImpl;
import org.jbpm.pvm.internal.model.Condition;
import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.model.Transition;
+import org.jbpm.pvm.internal.model.TransitionImpl;
/**
* Basic activity for BPMN activities (tasks, gateways)
@@ -115,12 +117,12 @@
* If the boolean 'checkConditions' is true, conditions on the sequence flow will be evaluated.
*/
protected List<Transition> findOutgoingSequenceFlow(ExecutionImpl execution, boolean checkConditions) {
- Activity activity = execution.getActivity();
+ ActivityImpl activity = execution.getActivity();
// evaluate the conditions and find the transitions that should be forked
List<Transition> forkingTransitions = new ArrayList<Transition>();
- List<Transition> outgoingTransitions = activity.getOutgoingTransitions();
+ List<TransitionImpl> outgoingTransitions = (List) activity.getOutgoingTransitions();
- for (Transition transition : outgoingTransitions) {
+ for (TransitionImpl transition : outgoingTransitions) {
Condition condition = transition.getCondition();
if ( ( (condition == null) || (!checkConditions) || (condition.evaluate(execution)) )
&& (activity.getDefaultOutgoingTransition() != transition) ) {
Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/EndActivity.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/EndActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/EndActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -24,11 +24,11 @@
import java.util.List;
import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.api.model.Activity;
import org.jbpm.api.model.OpenExecution;
-import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.api.model.Transition;
import org.jbpm.pvm.internal.model.ActivityImpl;
import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.model.Transition;
/**
Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ExclusiveGatewayActivity.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ExclusiveGatewayActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ExclusiveGatewayActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -24,10 +24,10 @@
import java.util.List;
import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.api.model.Transition;
import org.jbpm.bpmn.parser.BindingsParser;
import org.jbpm.internal.log.Log;
import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.model.Transition;
/**
* @author Tom Baeyens
Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ParallelGatewayActivity.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ParallelGatewayActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ParallelGatewayActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -23,8 +23,8 @@
import java.util.List;
+import org.jbpm.api.model.Activity;
import org.jbpm.internal.log.Log;
-import org.jbpm.pvm.internal.model.Activity;
import org.jbpm.pvm.internal.model.ExecutionImpl;
/**
Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ReceiveActivity.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ReceiveActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ReceiveActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -27,10 +27,10 @@
import org.jbpm.api.JbpmException;
import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.api.model.Transition;
import org.jbpm.internal.log.Log;
-import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.ActivityImpl;
import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.model.Transition;
/**
* Java version of the Receive activity.
@@ -57,7 +57,7 @@
}
public void signal(ExecutionImpl execution, String signalName, Map<String, ?> parameters) {
- Activity activity = execution.getActivity();
+ ActivityImpl activity = execution.getActivity();
if (parameters!=null) {
execution.setVariables(parameters);
Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/UserTaskActivity.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/UserTaskActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/UserTaskActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -30,7 +30,7 @@
import org.jbpm.pvm.internal.env.EnvironmentImpl;
import org.jbpm.pvm.internal.history.HistoryEvent;
import org.jbpm.pvm.internal.history.events.TaskActivityStart;
-import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.ActivityImpl;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.session.DbSession;
import org.jbpm.pvm.internal.task.TaskDefinitionImpl;
@@ -92,7 +92,7 @@
}
public void signal(ExecutionImpl execution, String signalName, Map<String, ? > parameters) throws Exception {
- Activity activity = execution.getActivity();
+ ActivityImpl activity = execution.getActivity();
if (parameters != null) {
execution.setVariables(parameters);
Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/model/BpmnProcessDefinition.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/model/BpmnProcessDefinition.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/model/BpmnProcessDefinition.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -28,10 +28,10 @@
import java.util.Map;
import java.util.Set;
+import org.jbpm.api.model.Transition;
import org.jbpm.bpmn.common.Resource;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
-import org.jbpm.pvm.internal.model.Transition;
import org.jbpm.pvm.internal.model.VariableDefinitionImpl;
import org.jbpm.pvm.internal.task.TaskDefinitionImpl;
import org.w3c.dom.Element;
Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionConditionActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionConditionActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionConditionActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -25,10 +25,11 @@
import org.jbpm.api.JbpmException;
import org.jbpm.api.activity.ActivityExecution;
-import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.api.model.Activity;
+import org.jbpm.api.model.Transition;
import org.jbpm.pvm.internal.model.Condition;
import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.model.Transition;
+import org.jbpm.pvm.internal.model.TransitionImpl;
/**
@@ -55,8 +56,8 @@
public static Transition findTransitionUsingConditions(ExecutionImpl execution) {
Activity activity = execution.getActivity();
- List<Transition> outgoingTransitions = activity.getOutgoingTransitions();
- for (Transition transition : outgoingTransitions) {
+ List<TransitionImpl> outgoingTransitions = (List) activity.getOutgoingTransitions();
+ for (TransitionImpl transition : outgoingTransitions) {
Condition condition = transition.getCondition();
if ( (condition==null)
|| (condition.evaluate(execution))
Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionExpressionActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionExpressionActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionExpressionActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -23,9 +23,9 @@
import org.jbpm.api.JbpmException;
import org.jbpm.api.activity.ActivityExecution;
-import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.api.model.Activity;
+import org.jbpm.api.model.Transition;
import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.model.Transition;
import org.jbpm.pvm.internal.script.ScriptManager;
/**
Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionHandlerActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionHandlerActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/DecisionHandlerActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -24,9 +24,9 @@
import org.jbpm.api.JbpmException;
import org.jbpm.api.activity.ActivityExecution;
import org.jbpm.api.jpdl.DecisionHandler;
-import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.api.model.Activity;
+import org.jbpm.api.model.Transition;
import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.model.Transition;
import org.jbpm.pvm.internal.wire.usercode.UserCodeReference;
/**
Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/EndActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/EndActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/EndActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -24,11 +24,11 @@
import java.util.List;
import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.api.model.Activity;
import org.jbpm.api.model.OpenExecution;
-import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.api.model.Transition;
import org.jbpm.pvm.internal.model.ActivityImpl;
import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.model.Transition;
/**
Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/ForkActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/ForkActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/ForkActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -28,10 +28,11 @@
import org.jbpm.api.Execution;
import org.jbpm.api.activity.ActivityExecution;
-import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.api.model.Activity;
+import org.jbpm.api.model.Transition;
import org.jbpm.pvm.internal.model.Condition;
import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.model.Transition;
+import org.jbpm.pvm.internal.model.TransitionImpl;
/**
@@ -50,8 +51,8 @@
// evaluate the conditions and find the transitions that should be forked
List<Transition> forkingTransitions = new ArrayList<Transition>();
- List<Transition> outgoingTransitions = activity.getOutgoingTransitions();
- for (Transition transition: outgoingTransitions) {
+ List<TransitionImpl> outgoingTransitions = (List) activity.getOutgoingTransitions();
+ for (TransitionImpl transition: outgoingTransitions) {
Condition condition = transition.getCondition();
if ( (condition==null)
|| (condition.evaluate(execution))
Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/GroupActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/GroupActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/GroupActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -28,10 +28,10 @@
import org.jbpm.api.Execution;
import org.jbpm.api.JbpmException;
import org.jbpm.api.activity.ActivityExecution;
-import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.api.model.Activity;
+import org.jbpm.api.model.Transition;
import org.jbpm.pvm.internal.model.ActivityImpl;
import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.model.Transition;
/**
Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JoinActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JoinActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JoinActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -29,10 +29,10 @@
import org.jbpm.api.Execution;
import org.jbpm.api.JbpmException;
import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.api.model.Activity;
+import org.jbpm.api.model.Transition;
import org.jbpm.pvm.internal.env.EnvironmentImpl;
-import org.jbpm.pvm.internal.model.Activity;
import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.model.Transition;
/**
Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/StateActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/StateActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/StateActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -24,9 +24,9 @@
import java.util.Map;
import org.jbpm.api.activity.ActivityExecution;
-import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.api.model.Transition;
+import org.jbpm.pvm.internal.model.ActivityImpl;
import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.model.Transition;
/**
* @author Tom Baeyens
@@ -50,7 +50,7 @@
}
public void signal(ExecutionImpl execution, String signalName, Map<String, ?> parameters) throws Exception {
- Activity activity = execution.getActivity();
+ ActivityImpl activity = execution.getActivity();
if (parameters!=null) {
execution.setVariables(parameters);
Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/SubProcessActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/SubProcessActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/SubProcessActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -25,11 +25,11 @@
import java.util.Map;
import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.api.model.Activity;
import org.jbpm.pvm.internal.client.ClientProcessDefinition;
import org.jbpm.pvm.internal.env.Context;
import org.jbpm.pvm.internal.env.EnvironmentImpl;
import org.jbpm.pvm.internal.env.ExecutionContext;
-import org.jbpm.pvm.internal.model.Activity;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.script.ScriptManager;
import org.jbpm.pvm.internal.session.DbSession;
Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskActivity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/TaskActivity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -27,13 +27,13 @@
import org.jbpm.api.JbpmException;
import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.api.model.Transition;
import org.jbpm.internal.log.Log;
import org.jbpm.pvm.internal.env.EnvironmentImpl;
import org.jbpm.pvm.internal.history.HistoryEvent;
import org.jbpm.pvm.internal.history.events.TaskActivityStart;
-import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.ActivityImpl;
import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.model.Transition;
import org.jbpm.pvm.internal.session.DbSession;
import org.jbpm.pvm.internal.task.ParticipationImpl;
import org.jbpm.pvm.internal.task.SwimlaneDefinitionImpl;
@@ -104,7 +104,7 @@
}
public void signal(ExecutionImpl execution, String signalName, Map<String, ?> parameters) throws Exception {
- Activity activity = execution.getActivity();
+ ActivityImpl activity = execution.getActivity();
if (parameters!=null) {
execution.setVariables(parameters);
Modified: jbpm4/trunk/modules/jpdl/src/test/java/org/jbpm/jpdl/parsing/TransitionParsingTest.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/test/java/org/jbpm/jpdl/parsing/TransitionParsingTest.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/jpdl/src/test/java/org/jbpm/jpdl/parsing/TransitionParsingTest.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -23,9 +23,9 @@
import java.util.List;
+import org.jbpm.api.model.Activity;
+import org.jbpm.api.model.Transition;
import org.jbpm.pvm.internal.client.ClientProcessDefinition;
-import org.jbpm.pvm.internal.model.Activity;
-import org.jbpm.pvm.internal.model.Transition;
import org.jbpm.pvm.internal.xml.Problem;
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cmd/GetOutcomes.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cmd/GetOutcomes.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cmd/GetOutcomes.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -28,10 +28,10 @@
import org.jbpm.api.JbpmException;
import org.jbpm.api.cmd.Command;
import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.model.Transition;
import org.jbpm.api.task.Task;
import org.jbpm.pvm.internal.model.ActivityImpl;
import org.jbpm.pvm.internal.model.ExecutionImpl;
-import org.jbpm.pvm.internal.model.Transition;
import org.jbpm.pvm.internal.session.DbSession;
import org.jbpm.pvm.internal.task.TaskImpl;
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/migration/DefaultMigrationHandler.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/migration/DefaultMigrationHandler.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/migration/DefaultMigrationHandler.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -4,9 +4,9 @@
import org.jbpm.api.JbpmException;
import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessInstance;
+import org.jbpm.api.model.Activity;
import org.jbpm.pvm.internal.history.HistoryEvent;
import org.jbpm.pvm.internal.history.events.ProcessInstanceMigration;
-import org.jbpm.pvm.internal.model.Activity;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
Deleted: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/Activity.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/Activity.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/Activity.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -1,111 +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.pvm.internal.model;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * a activity in a {@link OpenProcessDefinition} graph.
- *
- * <p>The activity supports both graph based process models as well as
- * block structured (tree based) process models. First we describe
- * tranisions that can be used to formResourceName graph based process structures
- * and then we'll describe activity composition to formResourceName block structured
- * process models. Both models can be combined as well.
- * </p>
- *
- * <p>Activities have {@link #getIncomingTransitions() incoming}
- * and {@link #getOutgoingTransitions() outgoing transitions}.
- * These are lists of transitions.
- * </p>
- *
- * <p>Optionally, transitions can have names. In that case the
- * transition {@link #getOutgoingTransition(String) names are associated
- * to activity's outgoing transitions}. The {@link #getOutgoingTransitionsMap() map
- * of outgoing transitions} provides easy access to the named transitions.
- * </p>
- *
- * <p>One of the outgoing transitions can optionally be marked as
- * {@link #getDefaultOutgoingTransition() the default transition}.
- * </p>
- *
- * <p>Block structured process languages have composite activities that can be
- * modeled with the {@link #getParent() parent}-{@link #getActivities() child}
- * relation.
- * </p>
- *
- * @author Tom Baeyens
- */
-public interface Activity extends CompositeElement {
-
- /** the list of outgoing transitions.
- * Caution: the actual member is returned. No copy is made. */
- List<Transition> getOutgoingTransitions();
-
- /** the default outgoing transition. */
- Transition getDefaultOutgoingTransition();
-
- /** the first leaving transition with the given name or null of no
- * such leaving transition exists. If the multiple transitions have
- * the given transition name, the first (in order of {@link #getOutgoingTransitions()})
- * will be returned.
- *
- * @param transitionName is the name of the transition to take. A null value will
- * match the first unnamed transition. */
- Transition getOutgoingTransition(String transitionName);
-
- /** indicates if a leaving transition with the given transitionName exists.
- * A null value matches an unnamed transition. */
- boolean hasOutgoingTransition(String transitionName);
-
- /** indicates if this activity has leaving transitions */
- boolean hasOutgoingTransitions();
-
- /** the leaving transitions, keyed by transition name. If a transition with
- * the same name occurs mutltiple times, the first one is returned.
- * Leaving transitions with a null value for their name are not included
- * in the map.
- * Beware: the actual member is returned. No copy is made. In fact, the
- * returned map is maintained as a cache. So updates to the map will
- * influence subsequent retrievals of outgoing transitions by name. */
- Map<String, Transition> getOutgoingTransitionsMap();
-
- /** searches for the given transitionName in this activity and then up the
- * parent chain. Returns null if no such transition is found. */
- Transition findOutgoingTransition(String transitionName);
-
- /** the list of arriving transitions.
- * Beware: the actual member is returned. No copy is made. */
- List<Transition> getIncomingTransitions();
-
- /** indicates if this activity has arriving transitions */
- boolean hasIncomingTransitions();
-
- /** retrieve the parent activity in the composite activity structure. This is
- * different from {@link ObservableElement#getParent()} in that it is restricted
- * to the parent activities. It doesn't take into account the process definition. */
- Activity getParentActivity();
-
- /** the type of this activity which corresponds to the xml tag */
- String getType();
-}
\ No newline at end of file
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ActivityImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ActivityImpl.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ActivityImpl.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -27,13 +27,15 @@
import java.util.Map;
import org.jbpm.api.activity.ActivityBehaviour;
+import org.jbpm.api.model.Activity;
+import org.jbpm.api.model.Transition;
import org.jbpm.pvm.internal.util.ReflectUtil;
import org.jbpm.pvm.internal.wire.Descriptor;
/**
* @author Tom Baeyens
*/
-public class ActivityImpl extends CompositeElementImpl implements Activity {
+public class ActivityImpl extends CompositeElementImpl implements Activity, ObservableElement {
private static final long serialVersionUID = 1L;
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/CompositeElement.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/CompositeElement.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/CompositeElement.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -24,8 +24,10 @@
import java.util.List;
import java.util.Map;
+import org.jbpm.api.model.Activity;
+
/** activity container base class for {@link OpenProcessDefinition} and {@link Activity}.
*
* @author Tom Baeyens
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/CompositeElementImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/CompositeElementImpl.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/CompositeElementImpl.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -25,7 +25,9 @@
import java.util.List;
import java.util.Map;
+import org.jbpm.api.model.Activity;
+
/**
* @author Tom Baeyens
*/
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/Condition.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/Condition.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/Condition.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -24,6 +24,7 @@
import java.io.Serializable;
import org.jbpm.api.model.OpenExecution;
+import org.jbpm.api.model.Transition;
/** user code that reflects a runtime calculation of a boolean value.
* Used for {@link Transition#getCondition() transition guard conditions} and
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -42,8 +42,10 @@
import org.jbpm.api.job.Job;
import org.jbpm.api.job.Timer;
import org.jbpm.api.listener.EventListenerExecution;
+import org.jbpm.api.model.Activity;
import org.jbpm.api.model.Event;
import org.jbpm.api.model.OpenExecution;
+import org.jbpm.api.model.Transition;
import org.jbpm.api.task.Assignable;
import org.jbpm.api.task.AssignmentHandler;
import org.jbpm.internal.log.Log;
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/OpenProcessDefinition.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/OpenProcessDefinition.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/OpenProcessDefinition.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -22,6 +22,7 @@
package org.jbpm.pvm.internal.model;
import org.jbpm.api.ProcessDefinition;
+import org.jbpm.api.model.Activity;
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ProcessModificationsImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ProcessModificationsImpl.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ProcessModificationsImpl.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -24,8 +24,10 @@
import java.io.Serializable;
import java.util.List;
+import org.jbpm.api.model.Activity;
+
/**
* @author Tom Baeyens
*/
Deleted: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/Transition.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/Transition.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/Transition.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -1,66 +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.pvm.internal.model;
-
-
-/**
- * a transition in a {@link OpenProcessDefinition} graph.
- *
- * <h3 id="guardconditions">Guard conditions</h3>
- * <p>TODO</p>
- *
- * <h3 id="transitionsaswaitstates">Transitions as wait states</h3>
- * <p>A wait condition indicates wether a transition is to be taken synchronously
- * or wether the transition will behave as a wait state.
- * </p>
- *
- * <p>Transitions that are wait states can occur when an analyst has
- * an actual state (e.g. 'making loss') and a desired state (e.g. 'making profit')
- * and models a transition between those states. In that case the transition
- * might take a long time and hence it results into a wait state for the system.
- * </p>
- *
- * <p>If the wait condition is null or if it returns false, then the transition
- * will be taking synchronously. Otherwise the transition will behave as
- * a wait state and wait for a signal on the execution.
- * </p>
- *
- * <p>Transitions as wait states has every thing to do with matching the
- * process graph to transactions on the server. If the transition is taken
- * in one (the current) transaction, then the async condition should be empty
- * or evaluate to false. If the arrival of the execution in the destination
- * activity should occur in a separate execution
- *
- * @author Tom Baeyens
- */
-public interface Transition extends ObservableElement {
-
- /** the activity from which this transition leaves. */
- Activity getSource();
-
- /** the activity in which this transition arrives. */
- Activity getDestination();
-
- /** the general purpose condition that can be used in various ways by the
- * activities. */
- Condition getCondition();
-}
\ No newline at end of file
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/TransitionImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/TransitionImpl.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/TransitionImpl.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -24,6 +24,7 @@
import java.util.List;
import org.jbpm.api.model.Event;
+import org.jbpm.api.model.Transition;
/**
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/LifeCycle.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/LifeCycle.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/LifeCycle.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -25,8 +25,8 @@
import java.util.Map;
import org.jbpm.api.JbpmException;
+import org.jbpm.api.model.Activity;
import org.jbpm.pvm.internal.id.IdComposer;
-import org.jbpm.pvm.internal.model.Activity;
import org.jbpm.pvm.internal.model.ActivityImpl;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
Modified: jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/builder/BuilderTest.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/builder/BuilderTest.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/builder/BuilderTest.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -24,10 +24,10 @@
import java.util.List;
import java.util.Map;
+import org.jbpm.api.model.Transition;
import org.jbpm.pvm.internal.builder.ProcessDefinitionBuilder;
import org.jbpm.pvm.internal.client.ClientProcessDefinition;
import org.jbpm.pvm.internal.model.ActivityImpl;
-import org.jbpm.pvm.internal.model.Transition;
import org.jbpm.test.BaseJbpmTestCase;
Modified: jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/custombusinesscalendarimpl/CustomBusinessCalendar.java
===================================================================
--- jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/custombusinesscalendarimpl/CustomBusinessCalendar.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/custombusinesscalendarimpl/CustomBusinessCalendar.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -42,4 +42,8 @@
}
return null;
}
+
+ public Date subtract(Date date, String duration) {
+ return null;
+ }
}
Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/EventTest.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/EventTest.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/EventTest.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -33,7 +33,7 @@
import org.jbpm.pvm.internal.client.ClientExecution;
import org.jbpm.pvm.internal.client.ClientProcessDefinition;
import org.jbpm.pvm.internal.client.ClientProcessInstance;
-import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.ActivityImpl;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.test.BaseJbpmTestCase;
@@ -179,7 +179,7 @@
signal((ExecutionImpl)execution, signal, parameters);
}
public void signal(ExecutionImpl execution, String signal, Map<String, ?> parameters) throws Exception {
- Activity activity = execution.getActivity();
+ ActivityImpl activity = execution.getActivity();
if ( (signal!=null)
&& (activity!=null)
&& (activity.hasEvent(signal))
Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/FunctionalActivityTest.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/FunctionalActivityTest.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/FunctionalActivityTest.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -30,11 +30,11 @@
import org.jbpm.api.activity.ExternalActivityBehaviour;
import org.jbpm.api.listener.EventListener;
import org.jbpm.api.listener.EventListenerExecution;
+import org.jbpm.api.model.Activity;
import org.jbpm.api.model.OpenExecution;
import org.jbpm.pvm.internal.builder.ProcessDefinitionBuilder;
import org.jbpm.pvm.internal.client.ClientProcessDefinition;
import org.jbpm.pvm.internal.client.ClientProcessInstance;
-import org.jbpm.pvm.internal.model.Activity;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.test.BaseJbpmTestCase;
Modified: jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ScopeVariableDeclarationTest.java
===================================================================
--- jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ScopeVariableDeclarationTest.java 2010-01-20 12:32:25 UTC (rev 6105)
+++ jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/ScopeVariableDeclarationTest.java 2010-01-20 15:55:02 UTC (rev 6106)
@@ -26,11 +26,11 @@
import org.jbpm.api.activity.ActivityExecution;
import org.jbpm.api.activity.ExternalActivityBehaviour;
+import org.jbpm.api.model.Activity;
import org.jbpm.api.model.OpenExecution;
import org.jbpm.pvm.internal.builder.ProcessDefinitionBuilder;
import org.jbpm.pvm.internal.client.ClientExecution;
import org.jbpm.pvm.internal.client.ClientProcessDefinition;
-import org.jbpm.pvm.internal.model.Activity;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.wire.descriptor.StringDescriptor;
import org.jbpm.test.BaseJbpmTestCase;
14 years, 4 months
JBoss JBPM SVN: r6105 - jbpm4/trunk/modules/db/src/main/java/org/jbpm/db.
by do-not-reply@jboss.org
Author: tom.baeyens(a)jboss.com
Date: 2010-01-20 07:32:25 -0500 (Wed, 20 Jan 2010)
New Revision: 6105
Modified:
jbpm4/trunk/modules/db/src/main/java/org/jbpm/db/Upgrade.java
Log:
JBPM-2718 made sure that for new version, up-to-date check is based on library version
Modified: jbpm4/trunk/modules/db/src/main/java/org/jbpm/db/Upgrade.java
===================================================================
--- jbpm4/trunk/modules/db/src/main/java/org/jbpm/db/Upgrade.java 2010-01-20 11:18:18 UTC (rev 6104)
+++ jbpm4/trunk/modules/db/src/main/java/org/jbpm/db/Upgrade.java 2010-01-20 12:32:25 UTC (rev 6105)
@@ -90,7 +90,8 @@
}
});
- if (jbpmVersion == JbpmVersion.V_4_4) {
+ JbpmVersion currentJbpmVersion = JbpmVersion.getJbpmVersion(ProcessEngineImpl.JBPM_LIBRARY_VERSION);
+ if (jbpmVersion == currentJbpmVersion) {
log.info("jBPM schema is already up to date");
} else {
14 years, 4 months
JBoss JBPM SVN: r6104 - jbpm4/trunk/modules/devguide/src/main/docbook/en/modules.
by do-not-reply@jboss.org
Author: kukeltje
Date: 2010-01-20 06:18:18 -0500 (Wed, 20 Jan 2010)
New Revision: 6104
Modified:
jbpm4/trunk/modules/devguide/src/main/docbook/en/modules/ch02-Incubation.xml
Log:
JBPM-2745 documentation
Modified: jbpm4/trunk/modules/devguide/src/main/docbook/en/modules/ch02-Incubation.xml
===================================================================
--- jbpm4/trunk/modules/devguide/src/main/docbook/en/modules/ch02-Incubation.xml 2010-01-20 10:58:59 UTC (rev 6103)
+++ jbpm4/trunk/modules/devguide/src/main/docbook/en/modules/ch02-Incubation.xml 2010-01-20 11:18:18 UTC (rev 6104)
@@ -51,7 +51,8 @@
<entry><emphasis role="bold">required</emphasis></entry>
<entry>Specifies when the timer needs to fire. For
example: <literal>20 minutes</literal> or
- <literal>3 business days</literal>
+ <literal>3 business days</literal> or
+ <literal>#{proc_var} + 1 week</literal>
</entry>
</row>
<row>
@@ -71,18 +72,55 @@
<section id="duedateexpressions">
<title>Duedate expressions</title>
<para>A duedate expression has the following syntax:</para>
- <programlisting>quantity [business] {second | seconds | minute | minutes |
+ <programlisting>[<Base Date> {+|-}] quantity [business] {second | seconds | minute | minutes |
hour | hours | day | days | week |
weeks | month | months | year | years}</programlisting>
- <para>where <literal>quantity</literal> is a positive integer.
+ <para>Where <literal><link linkend="baseDate">Base Date</link></literal> is specified as EL and
+ where <literal>quantity</literal> is a positive integer.
</para>
<para>And adding the optional indication <literal>business</literal> means
that only business hours should be taken into account for this duration. Without
the indication business, the duration will be interpreted as an absolute time period.
How to configure business hours is explained in <xref linkend="businesscalendar"/>
+ <emphasis>Note: 'business' is not supported when subtracting from a base date!</emphasis>
</para>
+
+ <section id="baseDate">
+ <title>Base date</title>
+
+ <para>The base date can be specified in any JAVA Expression
+ Language expression that resolves to a JAVA Date or Calendar object.
+ Referencing variables of other object types, even a String in a date
+ format like '2036-02-12', will throw a JbpmException</para>
+
+ <para>NOTE: This baseDate is supported on the duedate and repeat attributes of all places where timers can be used,
+ but also on the reminder of a task</para>
+ </section>
+
+ <section id="duedateExamples">
+ <title>Examples</title>
+
+ <para>The following examples of the usage are all possible</para>
+
+ <programlisting language="xml"><timer name="daysBeforeHoliday" duedate="5 business days">...</timer>
+
+<timer name="pensionDate" duedate="#{dateOfBirth} + 65 years" >...</timer>
+
+<timer name="pensionReminder" duedate="#{dateOfPension} - 1 year" >...</timer>
+
+<timer name="fireWorks" duedate="#{chineseNewYear} repeat="1 year" >...</timer>
+
+<reminder name="hitBoss" duedate="#{payRaiseDay} + 3 days" repeat="1 week" />
+
+<reminder name="hitBoss" duedate="#{payRaiseDay} + 3 days" repeat="#{iritationFactor}" />
+ </programlisting>
+
+ <para>Remember, the following example, a subtraction in combination with 'business', is <emphasis>not</emphasis> supported and will throw an exception, as will resulting due dates that will be in the past</para>
+ <programlisting language="xml"><reminder name="toGoOrNotToGo" duedate="#{goLive} - 3 business days"/></programlisting>
+ </section>
</section>
+
<section id="businesscalendar">
<title>Business calendar</title>
<para>The default configuration will contain a reference to the file
14 years, 4 months
JBoss JBPM SVN: r6103 - jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/id.
by do-not-reply@jboss.org
Author: tom.baeyens(a)jboss.com
Date: 2010-01-20 05:58:59 -0500 (Wed, 20 Jan 2010)
New Revision: 6103
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/id/PropertyImpl.java
Log:
JBPM-2714 reused check for properties table as postgresql ignores everything after a SQL exception
Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/id/PropertyImpl.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/id/PropertyImpl.java 2010-01-20 10:58:22 UTC (rev 6102)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/id/PropertyImpl.java 2010-01-20 10:58:59 UTC (rev 6103)
@@ -186,16 +186,6 @@
.uniqueResult();
}
- public static boolean isFirstPartUpgrade42Completed(Session session) {
- try {
- getProperty(session, DB_VERSION_KEY);
- return true;
- } catch (Exception e) {
- // ok, this means the properties table exists
- }
- return false;
- }
-
public static void setDbVersionTo41(Session session) {
setPropertyValue(session, DB_VERSION_KEY, "4.1");
}
14 years, 4 months
JBoss JBPM SVN: r6102 - jbpm4/trunk/modules/db/src/main/java/org/jbpm/db.
by do-not-reply@jboss.org
Author: tom.baeyens(a)jboss.com
Date: 2010-01-20 05:58:22 -0500 (Wed, 20 Jan 2010)
New Revision: 6102
Modified:
jbpm4/trunk/modules/db/src/main/java/org/jbpm/db/Upgrade.java
Log:
JBPM-2714 reused check for properties table as postgresql ignores everything after a SQL exception
Modified: jbpm4/trunk/modules/db/src/main/java/org/jbpm/db/Upgrade.java
===================================================================
--- jbpm4/trunk/modules/db/src/main/java/org/jbpm/db/Upgrade.java 2010-01-20 10:51:17 UTC (rev 6101)
+++ jbpm4/trunk/modules/db/src/main/java/org/jbpm/db/Upgrade.java 2010-01-20 10:58:22 UTC (rev 6102)
@@ -48,6 +48,7 @@
static String database;
static JbpmVersion jbpmVersion;
+ static boolean propertiesTableExists;
public static void main(String[] args) {
if ( (args==null)
@@ -68,7 +69,8 @@
private static final long serialVersionUID = 1L;
public Object execute(Environment environment) throws Exception {
Session session = environment.get(Session.class);
- if (!PropertyImpl.propertiesTableExists(session)) {
+ propertiesTableExists = PropertyImpl.propertiesTableExists(session);
+ if (!propertiesTableExists) {
try {
session.createSQLQuery("select CLASSNAME_ from JBPM4_VARIABLE").list();
jbpmVersion = JbpmVersion.V_4_1;
@@ -104,13 +106,16 @@
}
if (jbpmVersion.isEarlier(JbpmVersion.V_4_2)) {
- boolean isFfirstPartUpgrade42Completed = PropertyImpl.isFirstPartUpgrade42Completed(session);
- if (!isFfirstPartUpgrade42Completed) {
+ // the first part of the upgrade to 4.2 might already be done before as that happens in the next transaction (and that next transaction might have failed in a previous run of upgrade)
+ // in that case, the next part is skipped
+ if (!propertiesTableExists) {
DbHelper.executeSqlResource("upgrade-4.1-to-4.2/jbpm." + database + ".upgrade.sql", session);
PropertyImpl.initializeNextDbid(session);
+ // we set the version to 4.1 as the next transaction might fail
PropertyImpl.setDbVersionTo41(session);
}
}
+ // transaction is now committed as the next transaction requires the NextDbid property to be initialized and committed.
return null;
}
});
14 years, 4 months