[jbpm-commits] JBoss JBPM SVN: r1620 - in jbpm4/task: trunk and 26 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Mon Jul 14 10:00:53 EDT 2008
Author: heiko.braun at jboss.com
Date: 2008-07-14 10:00:53 -0400 (Mon, 14 Jul 2008)
New Revision: 1620
Added:
jbpm4/task/trunk/
jbpm4/task/trunk/.classpath
jbpm4/task/trunk/.project
jbpm4/task/trunk/hudson/
jbpm4/task/trunk/hudson/ant.properties.example
jbpm4/task/trunk/hudson/apache-tomcat/
jbpm4/task/trunk/hudson/apache-tomcat/conf/
jbpm4/task/trunk/hudson/apache-tomcat/conf/server.xml
jbpm4/task/trunk/hudson/apache-tomcat/conf/tomcat-users.xml
jbpm4/task/trunk/hudson/build.xml
jbpm4/task/trunk/hudson/hudson-home/
jbpm4/task/trunk/hudson/hudson-home/config.xml
jbpm4/task/trunk/hudson/hudson-home/hudson.tasks.Mailer.xml
jbpm4/task/trunk/hudson/hudson-home/hudson.tasks.Maven.xml
jbpm4/task/trunk/hudson/hudson-home/jobs/
jbpm4/task/trunk/hudson/hudson-home/jobs/jBPM4/
jbpm4/task/trunk/hudson/hudson-home/jobs/jBPM4/config.xml
jbpm4/task/trunk/modules/
jbpm4/task/trunk/modules/core/
jbpm4/task/trunk/modules/core/pom.xml
jbpm4/task/trunk/modules/core/src/
jbpm4/task/trunk/modules/core/src/main/
jbpm4/task/trunk/modules/core/src/main/doc/
jbpm4/task/trunk/modules/core/src/main/doc/models.uml
jbpm4/task/trunk/modules/core/src/main/java/
jbpm4/task/trunk/modules/core/src/main/java/org/
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Assigner.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Role.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/RoleType.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Swimlane.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/SwimlaneDefinition.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Task.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/TaskDefinition.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/TaskException.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/TaskService.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/CreateTask.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/DeleteTask.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/GetTask.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/UpdateTask.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/db/
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/db/TaskDbSession.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/LifeCycle.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/LifeCycleParser.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/LifeCycleState.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/RoleImpl.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/SwimlaneDefinitionImpl.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/SwimlaneImpl.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskDefinitionImpl.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskExecution.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskImpl.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskServiceImpl.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/default.lifecycle.xml
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/task.model.jpg
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskDbSessionBinding.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskDbSessionDescriptor.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskServiceBinding.java
jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskServiceDescriptor.java
jbpm4/task/trunk/modules/core/src/main/resources/
jbpm4/task/trunk/modules/core/src/main/resources/hibernate.task.hbm.xml
jbpm4/task/trunk/modules/core/src/main/resources/hibernate.task.queries.hbm.xml
jbpm4/task/trunk/modules/core/src/main/resources/pvm.hibernate.mappings.xml
jbpm4/task/trunk/modules/core/src/main/resources/pvm.wire.bindings.xml
jbpm4/task/trunk/modules/core/src/test/
jbpm4/task/trunk/modules/core/src/test/java/
jbpm4/task/trunk/modules/core/src/test/java/org/
jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/
jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/task/
jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/task/TaskDbTest.java
jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/task/TaskServiceTest.java
jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/task/TaskTest.java
jbpm4/task/trunk/modules/core/src/test/resources/
jbpm4/task/trunk/modules/core/src/test/resources/org.jbpm.task.cfg.xml
jbpm4/task/trunk/pom.xml
Log:
Start Task project
Added: jbpm4/task/trunk/.classpath
===================================================================
--- jbpm4/task/trunk/.classpath (rev 0)
+++ jbpm4/task/trunk/.classpath 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" output="modules/jpdl/target/classes" path="modules/jpdl/src/main/java"/>
+ <classpathentry kind="src" output="modules/jpdl/target/classes" path="modules/jpdl/src/main/resources"/>
+ <classpathentry kind="src" output="modules/jpdl/target/test-classes" path="modules/jpdl/src/test/java"/>
+ <classpathentry kind="src" output="modules/jpdl/target/test-classes" path="modules/jpdl/src/test/resources"/>
+ <classpathentry kind="src" output="modules/identity/target/classes" path="modules/identity/src/main/java"/>
+ <classpathentry kind="src" output="modules/identity/target/classes" path="modules/identity/src/main/resources"/>
+ <classpathentry kind="src" output="modules/identity/target/test-classes" path="modules/identity/src/test/java"/>
+ <classpathentry kind="src" output="modules/identity/target/test-classes" path="modules/identity/src/test/resources"/>
+ <classpathentry kind="src" output="modules/task/target/classes" path="modules/task/src/main/java"/>
+ <classpathentry kind="src" output="modules/task/target/classes" path="modules/task/src/main/resources"/>
+ <classpathentry kind="src" output="modules/task/target/test-classes" path="modules/task/src/test/java"/>
+ <classpathentry kind="src" output="modules/task/target/test-classes" path="modules/task/src/test/resources"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
Added: jbpm4/task/trunk/.project
===================================================================
--- jbpm4/task/trunk/.project (rev 0)
+++ jbpm4/task/trunk/.project 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>jbpm</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.eclipse.jdt.core.javanature</nature>
+ <nature>org.maven.ide.eclipse.maven2Nature</nature>
+ </natures>
+</projectDescription>
Added: jbpm4/task/trunk/hudson/ant.properties.example
===================================================================
--- jbpm4/task/trunk/hudson/ant.properties.example (rev 0)
+++ jbpm4/task/trunk/hudson/ant.properties.example 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,25 @@
+#
+# A sample ant properties file
+#
+# $Id: ant.properties.example 3995 2007-07-26 08:52:45Z thomas.diesler at jboss.com $
+
+# JBoss remote repository
+jboss.repository=http://repository.jboss.org
+
+# Hudson QA Environment
+hudson.username=changeme
+hudson.password=changeme
+
+hudson.maven.path=/usr/java/apache-maven-2.0.9
+
+hudson.root=/usr/share/java/workspace
+hudson.host=jbws.dyndns.org
+hudson.admin.port=8150
+hudson.http.port=8180
+
+hudson.mail.recipients=
+hudson.smtp.host=localhost
+
+# Hudson setup
+apache-tomcat=5.5.20
+sun-hudson=1.226
Added: jbpm4/task/trunk/hudson/apache-tomcat/conf/server.xml
===================================================================
--- jbpm4/task/trunk/hudson/apache-tomcat/conf/server.xml (rev 0)
+++ jbpm4/task/trunk/hudson/apache-tomcat/conf/server.xml 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,57 @@
+
+<Server port="@hudson.admin.port@" shutdown="SHUTDOWN">
+
+ <!-- Comment these entries out to disable JMX MBeans support used for the
+ administration web application -->
+ <Listener className="org.apache.catalina.core.AprLifecycleListener"/>
+ <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"/>
+ <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
+ <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>
+
+ <!-- Global JNDI resources -->
+ <GlobalNamingResources>
+
+ <!-- Test entry for demonstration purposes -->
+ <Environment name="simpleValue" type="java.lang.Integer" value="30"/>
+
+ <!-- Editable user database that can also be used by
+ UserDatabaseRealm to authenticate users -->
+ <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved"
+ factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml"/>
+
+ </GlobalNamingResources>
+
+ <!-- Define the Tomcat Stand-Alone Service -->
+ <Service name="Catalina">
+
+ <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
+ <Connector port="@hudson.http.port@" maxHttpHeaderSize="8192" maxThreads="150"
+ minSpareThreads="25" maxSpareThreads="75"
+ enableLookups="false" redirectPort="8443" acceptCount="100"
+ connectionTimeout="20000" disableUploadTimeout="true"/>
+
+ <!-- Define the top level container in our container hierarchy -->
+ <Engine name="Catalina" defaultHost="localhost">
+
+ <!-- This Realm uses the UserDatabase configured in the global JNDI
+ resources under the key "UserDatabase". Any edits
+ that are performed against this UserDatabase are immediately
+ available for use by the Realm. -->
+ <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
+
+ <!-- Define the default virtual host
+ Note: XML Schema validation will not work with Xerces 2.2.
+ -->
+ <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
+
+ <Context path="/hudson">
+ <Environment description="" name="HUDSON_HOME" type="java.lang.String" value="@hudson.home@"/>
+ </Context>
+
+ </Host>
+
+ </Engine>
+
+ </Service>
+
+</Server>
\ No newline at end of file
Property changes on: jbpm4/task/trunk/hudson/apache-tomcat/conf/server.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/hudson/apache-tomcat/conf/tomcat-users.xml
===================================================================
--- jbpm4/task/trunk/hudson/apache-tomcat/conf/tomcat-users.xml (rev 0)
+++ jbpm4/task/trunk/hudson/apache-tomcat/conf/tomcat-users.xml 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,5 @@
+<?xml version='1.0' encoding='utf-8'?>
+<tomcat-users>
+ <role rolename="admin"/>
+ <user username="@hudson.username@" password="@hudson.password@" roles="admin"/>
+</tomcat-users>
Property changes on: jbpm4/task/trunk/hudson/apache-tomcat/conf/tomcat-users.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/hudson/build.xml
===================================================================
--- jbpm4/task/trunk/hudson/build.xml (rev 0)
+++ jbpm4/task/trunk/hudson/build.xml 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,175 @@
+<?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$ -->
+
+<project>
+
+ <property name="hudson.dir" value="${basedir}"/>
+ <property name="hudson.target.dir" value="${hudson.dir}/target"/>
+
+ <!-- ================================================================== -->
+ <!-- Initialization -->
+ <!-- ================================================================== -->
+
+ <target name="init">
+
+ <!-- Check if ant.properties is available -->
+ <available property="ant.properties.available" file="${basedir}/ant.properties"/>
+ <fail message="Cannot find ant.properties. Did you copy/edit ant.properties.example?" unless="ant.properties.available"/>
+
+ <property file="${basedir}/ant.properties"/>
+
+ <xmlproperty file="${basedir}/../pom.xml"/>
+ <property name="version.id" value="${project.version}"/>
+ <property name="repository.id" value="${project.version}"/>
+
+ <echo message="version.id=${version.id}"/>
+ <echo message="repository.id=${repository.id}"/>
+ </target>
+
+ <target name="init-hudson" depends="init">
+
+ <property name="hudson.tomcat" value="${hudson.root}/jbpm-hudson-${version.id}/apache-tomcat"/>
+ <property name="hudson.home" value="${hudson.root}/jbpm-hudson-${version.id}/hudson-home"/>
+ <echo/>
+ <echo message="hudson.root = ${hudson.root}"/>
+ <echo message="hudson.home = ${hudson.home}"/>
+ <echo/>
+
+ <available file="${hudson.root}" property="hudson.root.available"/>
+ <available file="${hudson.tomcat}" property="hudson.tomcat.available"/>
+ <fail message="Hudson root not available" unless="hudson.root.available"/>
+
+ <property name="hudson.username.${hudson.username}" value="true"/>
+ <fail message="Cannot use default hudson username: ${hudson.username}" if="hudson.username.changeme"/>
+ <property name="hudson.password.${hudson.password}" value="true"/>
+ <fail message="Cannot use default hudson password: ${hudson.password}" if="hudson.password.changeme"/>
+
+ <property name="thirdparty.dir" value="${hudson.target.dir}/thirdparty"/>
+ <mkdir dir="${thirdparty.dir}"/>
+
+ </target>
+
+ <!--
+ Setup the Hudson Tomcat instance
+ -->
+ <target name="hudson-tomcat-setup" depends="init-hudson" unless="hudson.tomcat.available">
+
+ <get src="${jboss.repository}/apache-tomcat/${apache-tomcat}/lib/apache-tomcat.zip" dest="${thirdparty.dir}/apache-tomcat.zip" usetimestamp="true" verbose="true"/>
+ <get src="${jboss.repository}/sun-hudson/${sun-hudson}/lib/hudson.war" dest="${thirdparty.dir}/hudson.war" usetimestamp="true" verbose="true"/>
+
+ <mkdir dir="${hudson.root}"/>
+ <unzip src="${thirdparty.dir}/apache-tomcat.zip" dest="${hudson.root}"/>
+ <move file="${hudson.root}/apache-tomcat-${apache-tomcat}" tofile="${hudson.tomcat}"/>
+ <chmod perm="+x">
+ <fileset dir="${hudson.tomcat}/bin">
+ <include name="*.sh"/>
+ </fileset>
+ </chmod>
+
+ <!-- Configure Tomcat -->
+ <copy todir="${hudson.tomcat}/webapps" file="${thirdparty.dir}/hudson.war"/>
+ <copy todir="${hudson.tomcat}" overwrite="true">
+ <fileset dir="${hudson.dir}/apache-tomcat">
+ <include name="**/*.xml"/>
+ </fileset>
+ <filterset>
+ <filtersfile file="${hudson.dir}/ant.properties"/>
+ <filter token="hudson.home" value="${hudson.home}"/>
+ </filterset>
+ </copy>
+ </target>
+
+ <!--
+ Update the Hudson version
+ -->
+ <target name="hudson-update" depends="init-hudson">
+
+ <get src="${jboss.repository}/sun-hudson/${sun-hudson}/lib/hudson.war" dest="${thirdparty.dir}/hudson.war" usetimestamp="false" verbose="true"/>
+
+ <delete dir="${hudson.tomcat}/webapps/hudson"/>
+ <copy todir="${hudson.tomcat}/webapps" file="${thirdparty.dir}/hudson.war"/>
+ </target>
+
+ <!--
+ Setup the Hudson QA environment
+ -->
+ <target name="hudson-setup" depends="init-hudson,hudson-tomcat-setup"
+ description="Setup the Hudson QA environment">
+
+ <!-- get the svn url -->
+ <exec dir="${hudson.dir}/.." executable="svn" failonerror="true" output="${hudson.target.dir}/svn-info.xml">
+ <arg line="info"/>
+ <arg line="--xml"/>
+ </exec>
+ <xmlproperty file="${hudson.target.dir}/svn-info.xml"/>
+ <property name="hudson.jbpm.url" value="${info.entry.url}"/>
+
+ <!-- Configure Hudson -->
+ <copy todir="${hudson.home}" overwrite="true">
+ <fileset dir="${hudson.dir}/hudson-home">
+ <include name="jobs/*/config.xml"/>
+ <include name="users/*/config.xml"/>
+ <include name="*.xml"/>
+ </fileset>
+ <filterset>
+ <filter token="hudson.jbpm.url" value="${hudson.jbpm.url}"/>
+ <filter token="hudson.home" value="${hudson.home}"/>
+ <filter token="version.id" value="${version.id}"/>
+ <filtersfile file="${hudson.dir}/ant.properties"/>
+ </filterset>
+ </copy>
+
+ <echo/>
+ <echo message="*************************************"/>
+ <echo message="* Hudson setup successfully *"/>
+ <echo message="* ant hudson-start *"/>
+ <echo message="*************************************"/>
+ <echo/>
+
+ </target>
+
+ <target name="hudson-stop" depends="init-hudson" description="Stops the Hudson QA environment">
+
+ <exec executable="${hudson.tomcat}/bin/catalina.sh" failonerror="true">
+ <arg line="stop"/>
+ </exec>
+
+ <echo/>
+ <echo message="*************************************"/>
+ <echo message="* Hudson stopped successfully *"/>
+ <echo message="* ant hudson-start *"/>
+ <echo message="*************************************"/>
+ <echo/>
+
+ </target>
+
+ <target name="hudson-start" depends="init-hudson" description="Start the Hudson QA environment">
+
+ <property environment="env"/>
+ <fail message="unset JBOSS_REPOSITORY=${env.JBOSS_REPOSITORY}" if="env.JBOSS_REPOSITORY"/>
+
+ <exec executable="${hudson.tomcat}/bin/catalina.sh" failonerror="true" output="${hudson.target.dir}/hudson.log">
+ <env key="CATALINA_OPTS" value="-Xmx512m -Djava.awt.headless=true"/>
+ <arg line="start"/>
+ </exec>
+
+ <echo/>
+ <echo message="*************************************"/>
+ <echo message="* Hudson started successfully *"/>
+ <echo message="* http://localhost:${hudson.http.port}/hudson *"/>
+ <echo message="*************************************"/>
+ <echo/>
+
+ </target>
+
+</project>
Property changes on: jbpm4/task/trunk/hudson/build.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/hudson/hudson-home/config.xml
===================================================================
--- jbpm4/task/trunk/hudson/hudson-home/config.xml (rev 0)
+++ jbpm4/task/trunk/hudson/hudson-home/config.xml 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,17 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<hudson>
+ <numExecutors>1</numExecutors>
+ <useSecurity>true</useSecurity>
+ <systemMessage>
+ <![CDATA[
+ <h2>jBPM- at version.id@ QA Environment</h2>
+
+ <table>
+ <tr><th align=left>jBPM:</th><td>@hudson.jbpm.url@</td></tr>
+ </table>
+]]>
+ </systemMessage>
+ <jdks/>
+ <slaves/>
+ <quietPeriod>5</quietPeriod>
+</hudson>
\ No newline at end of file
Property changes on: jbpm4/task/trunk/hudson/hudson-home/config.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/hudson/hudson-home/hudson.tasks.Mailer.xml
===================================================================
--- jbpm4/task/trunk/hudson/hudson-home/hudson.tasks.Mailer.xml (rev 0)
+++ jbpm4/task/trunk/hudson/hudson-home/hudson.tasks.Mailer.xml 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<hudson.tasks.Mailer-DescriptorImpl>
+ <defaultSuffix></defaultSuffix>
+ <hudsonUrl>http://@hudson.host@:@hudson.http.port@/hudson/</hudsonUrl>
+ <adminAddress>thomas.diesler at jboss.com</adminAddress>
+ <smtpHost>@hudson.smtp.host@</smtpHost>
+</hudson.tasks.Mailer-DescriptorImpl>
Property changes on: jbpm4/task/trunk/hudson/hudson-home/hudson.tasks.Mailer.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/hudson/hudson-home/hudson.tasks.Maven.xml
===================================================================
--- jbpm4/task/trunk/hudson/hudson-home/hudson.tasks.Maven.xml (rev 0)
+++ jbpm4/task/trunk/hudson/hudson-home/hudson.tasks.Maven.xml 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,9 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<hudson.tasks.Maven_-DescriptorImpl>
+ <installations>
+ <hudson.tasks.Maven_-MavenInstallation>
+ <name>apache-maven</name>
+ <mavenHome>@hudson.maven.path@</mavenHome>
+ </hudson.tasks.Maven_-MavenInstallation>
+ </installations>
+</hudson.tasks.Maven_-DescriptorImpl>
\ No newline at end of file
Property changes on: jbpm4/task/trunk/hudson/hudson-home/hudson.tasks.Maven.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/hudson/hudson-home/jobs/jBPM4/config.xml
===================================================================
--- jbpm4/task/trunk/hudson/hudson-home/jobs/jBPM4/config.xml (rev 0)
+++ jbpm4/task/trunk/hudson/hudson-home/jobs/jBPM4/config.xml 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,28 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<hudson.maven.MavenModuleSet>
+ <rootModule>
+ <groupId>org.jboss.jbpm</groupId>
+ <artifactId>jbpm</artifactId>
+ </rootModule>
+ <goals>test</goals>
+ <reporters/>
+ <scm class="hudson.scm.SubversionSCM">
+ <locations>
+ <hudson.scm.SubversionSCM_-ModuleLocation>
+ <remote>@hudson.jbpm.url@</remote>
+ <local>jpdl</local>
+ </hudson.scm.SubversionSCM_-ModuleLocation>
+ </locations>
+ <useUpdate>true</useUpdate>
+ <browser class="hudson.scm.browsers.ViewSVN">
+ <url>http://fisheye.jboss.com/browse/JbpmSvn/</url>
+ </browser>
+ </scm>
+ <canRoam>true</canRoam>
+ <disabled>false</disabled>
+ <triggers class="vector"/>
+ <keepDependencies>false</keepDependencies>
+ <properties/>
+ <description></description>
+ <actions class="vector"/>
+</hudson.maven.MavenModuleSet>
\ No newline at end of file
Property changes on: jbpm4/task/trunk/hudson/hudson-home/jobs/jBPM4/config.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/pom.xml
===================================================================
--- jbpm4/task/trunk/modules/core/pom.xml (rev 0)
+++ jbpm4/task/trunk/modules/core/pom.xml 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,95 @@
+<?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$ -->
+
+<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>JBoss jBPM 4 - Task Core</name>
+ <groupId>org.jboss.jbpm</groupId>
+ <artifactId>task-core</artifactId>
+ <packaging>jar</packaging>
+
+ <!-- Parent -->
+ <parent>
+ <groupId>org.jboss.jbpm</groupId>
+ <artifactId>jbpm</artifactId>
+ <version>4.0.0-SNAPSHOT</version>
+ </parent>
+
+ <!-- Properties -->
+ <properties>
+
+ </properties>
+
+ <!-- Dependencies -->
+ <dependencies>
+ <!-- jBPM Dependencies -->
+ <dependency>
+ <groupId>org.jboss.jbpm.pvm</groupId>
+ <artifactId>pvm-core</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.jbpm</groupId>
+ <artifactId>jbpm-api</artifactId>
+ </dependency>
+
+ <!-- Compile Dependencies -->
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </dependency>
+
+ </dependencies>
+
+
+ <!-- Plugins -->
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <showDeprecation>false</showDeprecation>
+ <testExcludes>
+ <exclude>org/jbpm/task/TaskDbTest.java</exclude>
+ <exclude>org/jbpm/task/TaskTest.java</exclude>
+ </testExcludes>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-jar-plugin</artifactId>
+ <configuration>
+ <excludes>
+ <exclude>hibernate.cfg.xml</exclude>
+ <exclude>jbpm.cfg.xml</exclude>
+ <exclude>jbpm.mail.templates.xml</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <excludes>
+ <exclude>org/jbpm/task/TaskServiceTest.java</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
Property changes on: jbpm4/task/trunk/modules/core/pom.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/doc/models.uml
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/doc/models.uml (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/doc/models.uml 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,1250 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XPD:PROJECT xmlns:XPD="http://www.staruml.com" version="1">
+<XPD:HEADER>
+<XPD:SUBUNITS>
+</XPD:SUBUNITS>
+<XPD:PROFILES>
+</XPD:PROFILES>
+</XPD:HEADER>
+<XPD:BODY>
+<XPD:OBJ name="DocumentElement" type="UMLProject" guid="dizqvgl3LkeHjy/ks6kH8wAA">
+<XPD:ATTR name="Title" type="string">Untitled</XPD:ATTR>
+<XPD:ATTR name="#OwnedElements" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLModel" guid="28q8akawHUut/vt9cqGzHQAA">
+<XPD:ATTR name="Name" type="string">Task</XPD:ATTR>
+<XPD:REF name="Namespace">dizqvgl3LkeHjy/ks6kH8wAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="y2Dig32fuk2qfbzhVMV12gAA">
+<XPD:ATTR name="Name" type="string">Task</XPD:ATTR>
+<XPD:REF name="DiagramOwner">28q8akawHUut/vt9cqGzHQAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="/N3kDxf0DUmenjfOISss4wAA">
+<XPD:REF name="Diagram">y2Dig32fuk2qfbzhVMV12gAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">14</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="BEGpovprr0OpCDXKEafPPAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">452</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">112</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">127</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
+<XPD:REF name="Model">HvFFmfu3EU2Q5JpvC4V1dAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="cb1HAOVGbUGhz+5u0aVooAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="9T7IkvwqGEqMzkPM65WmMAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">Task</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="18KTnjDHzEGH+Q+GkR1ClQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="JiknLGb/Z0Cu9nqlyaNn3AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="Nb2y5cEn8E++FPMih7TpfAAA">
+<XPD:REF name="Model">HvFFmfu3EU2Q5JpvC4V1dAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="9sAfjtNojEiLZ2kkSKHULgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">HvFFmfu3EU2Q5JpvC4V1dAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="UIi+TBpteUG0OFM1uqHsaAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">HvFFmfu3EU2Q5JpvC4V1dAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="fs8kGcLd20yQW3uybthdSwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">268</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">68</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">97</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">30</XPD:ATTR>
+<XPD:REF name="Model">uTvluPMq6EiVrEzIldF+CwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="f5cPYbMir0W8/tl+uePzMAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="Kxi/geJq70m18XV0vWefYwAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">TaskDefinition</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="MTLywrlLUECL0ZhK/KmVawAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="yXGzgAKcbUiqP0djDFiJuQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="PuerV6iAkkGmjsZdqAJEEAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">uTvluPMq6EiVrEzIldF+CwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="M7WkDdTEmkKEx7odnins/gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">uTvluPMq6EiVrEzIldF+CwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="FxIHioj58Ei2Xjj6rcXj8wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">uTvluPMq6EiVrEzIldF+CwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[2]" type="UMLClassView" guid="MH9M/bx8Akm+nfvMLj/xkAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">64</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">180</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">118</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">30</XPD:ATTR>
+<XPD:REF name="Model">GioGPK3R6Ue8w6V2t8TzvgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="JxjsAefJoEmgKonRE54TqAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="f6BUZLh9CU6aYJF1xVRY7gAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">SwimlaneDefinition</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="Sjax149rckKdVbycxgQpXgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="0dfMlb1+6Ue/2vl1YFxW3QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="yTCES2vNVUaDe5fVHcuuNwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">GioGPK3R6Ue8w6V2t8TzvgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="H4oGMkjhHEyBhi/8rQaD7wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">GioGPK3R6Ue8w6V2t8TzvgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="otxfkH9A4EakNQ1lqnfSRwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">GioGPK3R6Ue8w6V2t8TzvgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="ror19oxT9kuTiijsBoK/bAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">268</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">168</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">99</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">57</XPD:ATTR>
+<XPD:REF name="Model">ijjMqBZ6REK0iCxeAVpgAAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="2kE7oGVvZkyuBlPJ5a/RcAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="GEzmoSK3r0WGznrtX32JzQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">Swimlane</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="2YKnNa31ik2ojBUwCEjvpQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="t4P5eBSAJkqqeh3Hg2hmBwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="4rjyvONTNUiPcfx1G59ibQAA">
+<XPD:REF name="Model">ijjMqBZ6REK0iCxeAVpgAAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="//L9vrH53EOscgK+ByNq7QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">ijjMqBZ6REK0iCxeAVpgAAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="cMsAJi5+eEWIlooBLw2zGQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">ijjMqBZ6REK0iCxeAVpgAAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[4]" type="UMLClassView" guid="gaiFlhWKiUe6Ca6zyb+P9wAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">660</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">120</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">30</XPD:ATTR>
+<XPD:REF name="Model">NKuLMRCxwkeVGSHi+kJ4PAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="lmMUO8llAEOBRgv+t/sDnQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="Vh5aRoisiEWlEtggSfVlAgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">Comment</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="Rbp+SfECfEi50IPNbuybxwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="iO3UrPh5+UasGCA9ehmwrAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="i2nM8GNG40KTTd1cuy4DtQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">NKuLMRCxwkeVGSHi+kJ4PAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="nu4ZY/6DP0S6WVnGJAA4PAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">NKuLMRCxwkeVGSHi+kJ4PAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="+CwsKO2rIEie2/cKkqFrtQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">NKuLMRCxwkeVGSHi+kJ4PAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[5]" type="UMLClassView" guid="S4BlySM5kUW/YiK6Pey5zQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">660</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">172</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">112</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">61</XPD:ATTR>
+<XPD:REF name="Model">nDDKC4LElEWTybRg7a79OQAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="EG+yjZiZSk6dQYbTSchLIgAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="kfnvHZmp/U6vqgIWtfgo+wAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">Role</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="Dc5QO3PXY0CqLVjbgof6XgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="k5EEwBtSDUKqEQ+8PQDYdgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="d7UQQXomaUeNgE4YzwfwjAAA">
+<XPD:REF name="Model">nDDKC4LElEWTybRg7a79OQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="VNUc47aFgky/2uiWcvDu+wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">nDDKC4LElEWTybRg7a79OQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="7X2ZbAYJSkq2jDYnXuXq0wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">nDDKC4LElEWTybRg7a79OQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[6]" type="UMLAssociationView" guid="vlPPTxt05ky9R0jdt64xogAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">660,180;608,180;608,160;578,160</XPD:ATTR>
+<XPD:REF name="Model">G9y2XZEWjU+fF6GadfrMNQAA</XPD:REF>
+<XPD:REF name="Head">BEGpovprr0OpCDXKEafPPAAA</XPD:REF>
+<XPD:REF name="Tail">S4BlySM5kUW/YiK6Pey5zQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="WYg7QywiKEKtk0JHTnhPQAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">G9y2XZEWjU+fF6GadfrMNQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="xrCsE8KnX0Oh8sZQo4nXUgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">G9y2XZEWjU+fF6GadfrMNQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="fHicZJt+ckSbT0efOqS9KgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">G9y2XZEWjU+fF6GadfrMNQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="N1AaoL+Z4ECW6JuSkuWnfAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">EZ8r6H+KEUOwFX+TBkkkkQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="zGcniyozykOgAgWYPsbL8AAA">
+<XPD:ATTR name="Alpha" type="real">-0,27829978479133</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">21,8403296678416</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">+roles</XPD:ATTR>
+<XPD:REF name="Model">j7CvxXw8zUuJA8N8a0/lZwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="TPkwMum6MEK5T0dcpz4jJAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">EZ8r6H+KEUOwFX+TBkkkkQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="6vZm1k5uTkiVNM7aHsMJswAA">
+<XPD:ATTR name="Alpha" type="real">0,620249823820819</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">17,2046505340853</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">*</XPD:ATTR>
+<XPD:REF name="Model">j7CvxXw8zUuJA8N8a0/lZwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="2/8qn+mwQEC+A0Z7e54FFAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">EZ8r6H+KEUOwFX+TBkkkkQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="CTPYQGO6lE+AUGXQx1gMjAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">j7CvxXw8zUuJA8N8a0/lZwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="2LswS62HG0m6CPejDe/PEwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-908</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-968</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">EZ8r6H+KEUOwFX+TBkkkkQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="W6sN09AH1kSIQllKiGn4egAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-908</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-968</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">j7CvxXw8zUuJA8N8a0/lZwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[7]" type="UMLAssociationView" guid="kCEQ989tnUi8utrj1r+WuwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">660,140;578,140</XPD:ATTR>
+<XPD:REF name="Model">ucLP51aO/EenmVgZ5kHf+gAA</XPD:REF>
+<XPD:REF name="Head">BEGpovprr0OpCDXKEafPPAAA</XPD:REF>
+<XPD:REF name="Tail">gaiFlhWKiUe6Ca6zyb+P9wAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="PVDNxCwBS06I5wevxolefgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">ucLP51aO/EenmVgZ5kHf+gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="q7l9uyxHbkKezfMiZkEUtwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">ucLP51aO/EenmVgZ5kHf+gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="Y2oOGzv6QE20GosmIVezrgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">ucLP51aO/EenmVgZ5kHf+gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="C67aHXPFBk+hpaUbSC5qQwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">y1D4yhmlCUuZRScC0SWorwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="asLFqkfz1kOieET4xs6NTwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">otiWB8zxNUWzDwH20HQwxQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="9a+PmYwA106lZnqm/AD3xwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">y1D4yhmlCUuZRScC0SWorwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="NCcc+zjELUir3iJ7uWwrjwAA">
+<XPD:ATTR name="Alpha" type="real">-0,540419941447379</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">11,6619037896906</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">*</XPD:ATTR>
+<XPD:REF name="Model">otiWB8zxNUWzDwH20HQwxQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="0ib1VsXba06m432Y4S+q/wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">y1D4yhmlCUuZRScC0SWorwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="CTg2tLYVQ0uVIrDKnq5wMAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">otiWB8zxNUWzDwH20HQwxQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="YZwZYYU4yk+prP+8GOLHNQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-908</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-968</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">y1D4yhmlCUuZRScC0SWorwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="mVHxvbQtUUa5+NHlAOUrQwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-908</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-968</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">otiWB8zxNUWzDwH20HQwxQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="/4J9gJdnhE2I6S8pR8e8CwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">452,148;396,148;396,176;366,176</XPD:ATTR>
+<XPD:REF name="Model">gPaQ+DIN6EWZ4BdgEPOxBAAA</XPD:REF>
+<XPD:REF name="Head">ror19oxT9kuTiijsBoK/bAAA</XPD:REF>
+<XPD:REF name="Tail">BEGpovprr0OpCDXKEafPPAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="rd3R8mu5OUu9cvZ6Z/4NggAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">gPaQ+DIN6EWZ4BdgEPOxBAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="GY3pM5HSK0iI2veru1WgUwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">gPaQ+DIN6EWZ4BdgEPOxBAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="DsV6M80A20K/A48wJowMVAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">gPaQ+DIN6EWZ4BdgEPOxBAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="2Hiiw/pWfUCivqUfdBW8OwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">pIDN0gCe306T092GLUvstgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="4EX0iPgXT0WYxWFInd77KQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">hKHk5PnDTkKXfRG2jmcJJAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="+KVkT8ozQkemNWISCynPpQAA">
+<XPD:ATTR name="Alpha" type="real">0,463647323286684</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15,6524758424985</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Model">pIDN0gCe306T092GLUvstgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="34tfoxrPFkqQ6azctOeNhgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">hKHk5PnDTkKXfRG2jmcJJAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="Ma86Ms4jpU6yL/qb2Bb7CQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">pIDN0gCe306T092GLUvstgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="RTUJ+/IcmkmU5J4z/G0vWAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">hKHk5PnDTkKXfRG2jmcJJAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="C2iw/esZgEmhWgrr+NZg+QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-948</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-972</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">pIDN0gCe306T092GLUvstgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="Q/HJJURAq0OyhISJkhdf6wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-948</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-972</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">hKHk5PnDTkKXfRG2jmcJJAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[9]" type="UMLAssociationView" guid="l0EW19sL+k++O39a+OyjxQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">660,216;366,216</XPD:ATTR>
+<XPD:REF name="Model">+Ae9qqvOAEiQr4SuowB4xgAA</XPD:REF>
+<XPD:REF name="Head">ror19oxT9kuTiijsBoK/bAAA</XPD:REF>
+<XPD:REF name="Tail">S4BlySM5kUW/YiK6Pey5zQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Hzr4oQcJrkuoVCYMb8ik2QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">+Ae9qqvOAEiQr4SuowB4xgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="Dd5BXxX0k0uHTHP6wlvpSgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">+Ae9qqvOAEiQr4SuowB4xgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="Tpgj7+i4REuc+JlFB3AxGAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">+Ae9qqvOAEiQr4SuowB4xgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="Iz0U5YCBrka8yPUrXxKlCgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">qhpWc/+HW0SLBBtfjX4WFwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="3DFnlxZwKkOSCvZ3x80JIAAA">
+<XPD:ATTR name="Alpha" type="real">-0,191184519777575</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">31,5753068076939</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">+candidates</XPD:ATTR>
+<XPD:REF name="Model">Y3XN0KcISUujsCKot7FRwQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="PN0Z99QsQ0aA06SWVhrzdgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">qhpWc/+HW0SLBBtfjX4WFwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="ZVJgTp3++0aX2CB2R8hCuQAA">
+<XPD:ATTR name="Alpha" type="real">0,785398663397698</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">14,142135623731</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">*</XPD:ATTR>
+<XPD:REF name="Model">Y3XN0KcISUujsCKot7FRwQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="wAtztCseO0m7PZc49MG+agAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">qhpWc/+HW0SLBBtfjX4WFwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="AnVW30FHVU+3Ccfw7YrxnAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">Y3XN0KcISUujsCKot7FRwQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="ft42mcFsHECO0yQKn8iDQQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-948</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-972</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">qhpWc/+HW0SLBBtfjX4WFwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="Ooz9JUM66E+ASSUnOnh1KwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-948</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-972</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">Y3XN0KcISUujsCKot7FRwQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[10]" type="UMLAssociationView" guid="s97DNIncIUyqxXbneTudIQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">364,88;392,88;392,120;452,120</XPD:ATTR>
+<XPD:REF name="Model">u9wX0QGdzEKXDMUSuMeSlAAA</XPD:REF>
+<XPD:REF name="Head">BEGpovprr0OpCDXKEafPPAAA</XPD:REF>
+<XPD:REF name="Tail">fs8kGcLd20yQW3uybthdSwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="5nJJhIKfP0aphx/wCbPj8QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">u9wX0QGdzEKXDMUSuMeSlAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="GF15CGpxb0ihKLCpqEgiPwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">u9wX0QGdzEKXDMUSuMeSlAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="mQ03MxKHVEGf7/sHqs6UNQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">u9wX0QGdzEKXDMUSuMeSlAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="TFju0xnXzUeFLEfbHAgvxwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">0vFa396IN0SfuCWKBLJF0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="ABsrUukx4UKDMLhPlPcXaAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">zekdyR8yEUmNFK08gWI5UgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="6pSDVmO3RUiGwA0KZzySZgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">0vFa396IN0SfuCWKBLJF0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="llvYWWfx/E6vLX4zQ9IOHwAA">
+<XPD:ATTR name="Alpha" type="real">0,620249148145143</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">17,2046505340853</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Model">zekdyR8yEUmNFK08gWI5UgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="ZP18gpDXvEaqIO5x2PK4vwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">0vFa396IN0SfuCWKBLJF0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="6oYASua5iUi3jt++CaJaRgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">zekdyR8yEUmNFK08gWI5UgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="LrU5/QaN5kabGVbUYT2uVwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-948</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-972</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">0vFa396IN0SfuCWKBLJF0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="fncRPs0eyUay6gLlnfmaoAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-948</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-972</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">zekdyR8yEUmNFK08gWI5UgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[11]" type="UMLAssociationView" guid="hEfg3zF9T0KZqM6LoHkeywAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">181,193;268,193</XPD:ATTR>
+<XPD:REF name="Model">lT1ML7PzwUGLyiBN6ZM9ewAA</XPD:REF>
+<XPD:REF name="Head">ror19oxT9kuTiijsBoK/bAAA</XPD:REF>
+<XPD:REF name="Tail">MH9M/bx8Akm+nfvMLj/xkAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Xp9wRzdQwUiqwJCNI5b4JQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">lT1ML7PzwUGLyiBN6ZM9ewAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="dQQcX7/IbUGZGP/exqC6OQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">lT1ML7PzwUGLyiBN6ZM9ewAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="wowPjb5qSEiE1UD8gtsPVAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">lT1ML7PzwUGLyiBN6ZM9ewAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="fZzGyZZt1US3pySjYdbe3AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">xnq3//AvmkaNPVRDsIkseAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="kerBdAuXP0qGhUBsKsaVBgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">gXiNnV7a90+F3ShZ01TMFAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="AmXw2BgBNk+PLXzTBtMTqgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">xnq3//AvmkaNPVRDsIkseAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="24szT2Qfg0uwuXHurF5FawAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">gXiNnV7a90+F3ShZ01TMFAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="UHz2AHAHTk6b0UBy27uYsgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">xnq3//AvmkaNPVRDsIkseAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="4pcy4Hj8vUuVJIBH55+G8wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">gXiNnV7a90+F3ShZ01TMFAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="oiGUCSbvcE2jf8t3N6P8eAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-948</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-972</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">xnq3//AvmkaNPVRDsIkseAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="n+zAECOm3kuPp0U6fGa9qQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-948</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-972</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">gXiNnV7a90+F3ShZ01TMFAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[12]" type="UMLAssociationView" guid="0Q8MZMRv3keC5G0P3jqvLgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">540,112;540,92;612,92;612,120;578,120</XPD:ATTR>
+<XPD:REF name="Model">AVjFcKW/SkGrDDjIOVRD+gAA</XPD:REF>
+<XPD:REF name="Head">BEGpovprr0OpCDXKEafPPAAA</XPD:REF>
+<XPD:REF name="Tail">BEGpovprr0OpCDXKEafPPAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="d3Kypc5e9USTEK3RieUIQgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">AVjFcKW/SkGrDDjIOVRD+gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="uD+JnEzcwkSPAPXtxxC+uQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">AVjFcKW/SkGrDDjIOVRD+gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="rnjCjREV6kK6FI664NzbmQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">AVjFcKW/SkGrDDjIOVRD+gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="cfgsL9WLv0C08ZQHcVaKFAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">wi5BJHl4RkiqqqtC44D95QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="GDNhCHzLh0WvJJ1jxSWCbAAA">
+<XPD:ATTR name="Alpha" type="real">-0,765792532386477</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">36,0693775937429</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">+subTasks</XPD:ATTR>
+<XPD:REF name="Model">s0hHwXTeU02e7YGLMAX0PAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="5qWWjDhi90uAUXDD5YSGkAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">wi5BJHl4RkiqqqtC44D95QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="X0imqN7kTUWC5VgPlkJ00gAA">
+<XPD:ATTR name="Alpha" type="real">-0,519146152707896</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">16,1245154965971</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">*</XPD:ATTR>
+<XPD:REF name="Model">s0hHwXTeU02e7YGLMAX0PAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="L1KmK8JoRUSHUwvrb5aMcQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">wi5BJHl4RkiqqqtC44D95QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="qjcLVMn3yEiW/FQqSOppuwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">s0hHwXTeU02e7YGLMAX0PAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="ghdCa3kzQUCEmb8k45FU/AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-924</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-972</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">wi5BJHl4RkiqqqtC44D95QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="poFTZVOeaUWdQnmYEjp2JgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-924</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-972</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">s0hHwXTeU02e7YGLMAX0PAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[13]" type="UMLAssociationView" guid="9vrgDuSQRkuGM2KpgQ681wAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">712,120;712,96;774,96;774,132;745,132</XPD:ATTR>
+<XPD:REF name="Model">3DEhC+Nv0kK7uqtxV6JcZwAA</XPD:REF>
+<XPD:REF name="Head">gaiFlhWKiUe6Ca6zyb+P9wAA</XPD:REF>
+<XPD:REF name="Tail">gaiFlhWKiUe6Ca6zyb+P9wAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="HPgV9SBY2kahngUOTUUnqgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">3DEhC+Nv0kK7uqtxV6JcZwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="4xtJRUX4cUW2j7LzmJ71HgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">3DEhC+Nv0kK7uqtxV6JcZwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="cOI/0aN4FEmtKry1i0zsGgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1,5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">3DEhC+Nv0kK7uqtxV6JcZwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="mJSLnpapqEe+JCw/l9ZrWgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">9l7hGk4Y/kqJrk9GldzJ6QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="MRGwgnyuZkenbLrSBgMGowAA">
+<XPD:ATTR name="Alpha" type="real">-0,564569214907821</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">35,5105618091294</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">+replies</XPD:ATTR>
+<XPD:REF name="Model">zWDSiZ7kIEKvhXHKxmicAwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="mbaATlJxY064398AzNkbrAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">9l7hGk4Y/kqJrk9GldzJ6QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="NDIxC9Q5bUq5Bq5jTTb6DAAA">
+<XPD:ATTR name="Alpha" type="real">-0,463647636778485</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">20,1246117974981</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">*</XPD:ATTR>
+<XPD:REF name="Model">zWDSiZ7kIEKvhXHKxmicAwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="vQr9dU7oMkScUooE1diouQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0,785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">9l7hGk4Y/kqJrk9GldzJ6QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="E7w5n6j9t02OUqefF5g+GQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0,785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">zWDSiZ7kIEKvhXHKxmicAwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="v+lh/JYNEk2ckddRKkYMqgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-908</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-976</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">9l7hGk4Y/kqJrk9GldzJ6QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="Hccf2ZoTsUGJM1WkqVxZHAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-908</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-976</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">zWDSiZ7kIEKvhXHKxmicAwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#OwnedElements" type="integer">15</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLClass" guid="HvFFmfu3EU2Q5JpvC4V1dAAA">
+<XPD:ATTR name="Name" type="string">Task</XPD:ATTR>
+<XPD:REF name="Namespace">28q8akawHUut/vt9cqGzHQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">BEGpovprr0OpCDXKEafPPAAA</XPD:REF>
+<XPD:REF name="Views[1]">Nb2y5cEn8E++FPMih7TpfAAA</XPD:REF>
+<XPD:REF name="Views[2]">9sAfjtNojEiLZ2kkSKHULgAA</XPD:REF>
+<XPD:REF name="Views[3]">UIi+TBpteUG0OFM1uqHsaAAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">6</XPD:ATTR>
+<XPD:REF name="Associations[0]">EZ8r6H+KEUOwFX+TBkkkkQAA</XPD:REF>
+<XPD:REF name="Associations[1]">y1D4yhmlCUuZRScC0SWorwAA</XPD:REF>
+<XPD:REF name="Associations[2]">hKHk5PnDTkKXfRG2jmcJJAAA</XPD:REF>
+<XPD:REF name="Associations[3]">0vFa396IN0SfuCWKBLJF0AAA</XPD:REF>
+<XPD:REF name="Associations[4]">s0hHwXTeU02e7YGLMAX0PAAA</XPD:REF>
+<XPD:REF name="Associations[5]">wi5BJHl4RkiqqqtC44D95QAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="j/qyRKyyK0yfML2GQCwouQAA">
+<XPD:ATTR name="Name" type="string">assignee</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">String</XPD:ATTR>
+<XPD:REF name="Owner">HvFFmfu3EU2Q5JpvC4V1dAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLClass" guid="uTvluPMq6EiVrEzIldF+CwAA">
+<XPD:ATTR name="Name" type="string">TaskDefinition</XPD:ATTR>
+<XPD:REF name="Namespace">28q8akawHUut/vt9cqGzHQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">fs8kGcLd20yQW3uybthdSwAA</XPD:REF>
+<XPD:REF name="Views[1]">PuerV6iAkkGmjsZdqAJEEAAA</XPD:REF>
+<XPD:REF name="Views[2]">M7WkDdTEmkKEx7odnins/gAA</XPD:REF>
+<XPD:REF name="Views[3]">FxIHioj58Ei2Xjj6rcXj8wAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">zekdyR8yEUmNFK08gWI5UgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLClass" guid="GioGPK3R6Ue8w6V2t8TzvgAA">
+<XPD:ATTR name="Name" type="string">SwimlaneDefinition</XPD:ATTR>
+<XPD:REF name="Namespace">28q8akawHUut/vt9cqGzHQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">MH9M/bx8Akm+nfvMLj/xkAAA</XPD:REF>
+<XPD:REF name="Views[1]">yTCES2vNVUaDe5fVHcuuNwAA</XPD:REF>
+<XPD:REF name="Views[2]">H4oGMkjhHEyBhi/8rQaD7wAA</XPD:REF>
+<XPD:REF name="Views[3]">otxfkH9A4EakNQ1lqnfSRwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">zKLAXgKQ/02weDYbKw8WmwAA</XPD:REF>
+<XPD:REF name="Associations[1]">gXiNnV7a90+F3ShZ01TMFAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLClass" guid="ijjMqBZ6REK0iCxeAVpgAAAA">
+<XPD:ATTR name="Name" type="string">Swimlane</XPD:ATTR>
+<XPD:REF name="Namespace">28q8akawHUut/vt9cqGzHQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">ror19oxT9kuTiijsBoK/bAAA</XPD:REF>
+<XPD:REF name="Views[1]">4rjyvONTNUiPcfx1G59ibQAA</XPD:REF>
+<XPD:REF name="Views[2]">//L9vrH53EOscgK+ByNq7QAA</XPD:REF>
+<XPD:REF name="Views[3]">cMsAJi5+eEWIlooBLw2zGQAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">4</XPD:ATTR>
+<XPD:REF name="Associations[0]">pIDN0gCe306T092GLUvstgAA</XPD:REF>
+<XPD:REF name="Associations[1]">qhpWc/+HW0SLBBtfjX4WFwAA</XPD:REF>
+<XPD:REF name="Associations[2]">YROrTOuSWkmpMzIJdfaf/QAA</XPD:REF>
+<XPD:REF name="Associations[3]">xnq3//AvmkaNPVRDsIkseAAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="UrpmYKHol0y1p0QVb2Y+KQAA">
+<XPD:ATTR name="Name" type="string">assignee</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">String</XPD:ATTR>
+<XPD:REF name="Owner">ijjMqBZ6REK0iCxeAVpgAAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLClass" guid="NKuLMRCxwkeVGSHi+kJ4PAAA">
+<XPD:ATTR name="Name" type="string">Comment</XPD:ATTR>
+<XPD:REF name="Namespace">28q8akawHUut/vt9cqGzHQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">gaiFlhWKiUe6Ca6zyb+P9wAA</XPD:REF>
+<XPD:REF name="Views[1]">i2nM8GNG40KTTd1cuy4DtQAA</XPD:REF>
+<XPD:REF name="Views[2]">nu4ZY/6DP0S6WVnGJAA4PAAA</XPD:REF>
+<XPD:REF name="Views[3]">+CwsKO2rIEie2/cKkqFrtQAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">otiWB8zxNUWzDwH20HQwxQAA</XPD:REF>
+<XPD:REF name="Associations[1]">zWDSiZ7kIEKvhXHKxmicAwAA</XPD:REF>
+<XPD:REF name="Associations[2]">9l7hGk4Y/kqJrk9GldzJ6QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[5]" type="UMLClass" guid="nDDKC4LElEWTybRg7a79OQAA">
+<XPD:ATTR name="Name" type="string">Role</XPD:ATTR>
+<XPD:REF name="Namespace">28q8akawHUut/vt9cqGzHQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">S4BlySM5kUW/YiK6Pey5zQAA</XPD:REF>
+<XPD:REF name="Views[1]">d7UQQXomaUeNgE4YzwfwjAAA</XPD:REF>
+<XPD:REF name="Views[2]">VNUc47aFgky/2uiWcvDu+wAA</XPD:REF>
+<XPD:REF name="Views[3]">7X2ZbAYJSkq2jDYnXuXq0wAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">j7CvxXw8zUuJA8N8a0/lZwAA</XPD:REF>
+<XPD:REF name="Associations[1]">Y3XN0KcISUujsCKot7FRwQAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="R6W0j/ihTUmtVv3QsErV3wAA">
+<XPD:ATTR name="Name" type="string">userId</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">String</XPD:ATTR>
+<XPD:REF name="Owner">nDDKC4LElEWTybRg7a79OQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="0OEKBDLZWUKGfeR2HVdi8wAA">
+<XPD:ATTR name="Name" type="string">roleType</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">RoleType</XPD:ATTR>
+<XPD:REF name="Owner">nDDKC4LElEWTybRg7a79OQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[6]" type="UMLAssociation" guid="G9y2XZEWjU+fF6GadfrMNQAA">
+<XPD:REF name="Namespace">28q8akawHUut/vt9cqGzHQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">vlPPTxt05ky9R0jdt64xogAA</XPD:REF>
+<XPD:REF name="Views[1]">WYg7QywiKEKtk0JHTnhPQAAA</XPD:REF>
+<XPD:REF name="Views[2]">xrCsE8KnX0Oh8sZQo4nXUgAA</XPD:REF>
+<XPD:REF name="Views[3]">fHicZJt+ckSbT0efOqS9KgAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="j7CvxXw8zUuJA8N8a0/lZwAA">
+<XPD:ATTR name="Name" type="string">roles</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">*</XPD:ATTR>
+<XPD:REF name="Association">G9y2XZEWjU+fF6GadfrMNQAA</XPD:REF>
+<XPD:REF name="Participant">nDDKC4LElEWTybRg7a79OQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">zGcniyozykOgAgWYPsbL8AAA</XPD:REF>
+<XPD:REF name="Views[1]">6vZm1k5uTkiVNM7aHsMJswAA</XPD:REF>
+<XPD:REF name="Views[2]">CTPYQGO6lE+AUGXQx1gMjAAA</XPD:REF>
+<XPD:REF name="Views[3]">W6sN09AH1kSIQllKiGn4egAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="EZ8r6H+KEUOwFX+TBkkkkQAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">G9y2XZEWjU+fF6GadfrMNQAA</XPD:REF>
+<XPD:REF name="Participant">HvFFmfu3EU2Q5JpvC4V1dAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">N1AaoL+Z4ECW6JuSkuWnfAAA</XPD:REF>
+<XPD:REF name="Views[1]">TPkwMum6MEK5T0dcpz4jJAAA</XPD:REF>
+<XPD:REF name="Views[2]">2/8qn+mwQEC+A0Z7e54FFAAA</XPD:REF>
+<XPD:REF name="Views[3]">2LswS62HG0m6CPejDe/PEwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[7]" type="UMLAssociation" guid="ucLP51aO/EenmVgZ5kHf+gAA">
+<XPD:REF name="Namespace">28q8akawHUut/vt9cqGzHQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">kCEQ989tnUi8utrj1r+WuwAA</XPD:REF>
+<XPD:REF name="Views[1]">PVDNxCwBS06I5wevxolefgAA</XPD:REF>
+<XPD:REF name="Views[2]">q7l9uyxHbkKezfMiZkEUtwAA</XPD:REF>
+<XPD:REF name="Views[3]">Y2oOGzv6QE20GosmIVezrgAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="otiWB8zxNUWzDwH20HQwxQAA">
+<XPD:ATTR name="Multiplicity" type="string">*</XPD:ATTR>
+<XPD:REF name="Association">ucLP51aO/EenmVgZ5kHf+gAA</XPD:REF>
+<XPD:REF name="Participant">NKuLMRCxwkeVGSHi+kJ4PAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">asLFqkfz1kOieET4xs6NTwAA</XPD:REF>
+<XPD:REF name="Views[1]">NCcc+zjELUir3iJ7uWwrjwAA</XPD:REF>
+<XPD:REF name="Views[2]">CTg2tLYVQ0uVIrDKnq5wMAAA</XPD:REF>
+<XPD:REF name="Views[3]">mVHxvbQtUUa5+NHlAOUrQwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="y1D4yhmlCUuZRScC0SWorwAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">ucLP51aO/EenmVgZ5kHf+gAA</XPD:REF>
+<XPD:REF name="Participant">HvFFmfu3EU2Q5JpvC4V1dAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">C67aHXPFBk+hpaUbSC5qQwAA</XPD:REF>
+<XPD:REF name="Views[1]">9a+PmYwA106lZnqm/AD3xwAA</XPD:REF>
+<XPD:REF name="Views[2]">0ib1VsXba06m432Y4S+q/wAA</XPD:REF>
+<XPD:REF name="Views[3]">YZwZYYU4yk+prP+8GOLHNQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[8]" type="UMLAssociation" guid="gPaQ+DIN6EWZ4BdgEPOxBAAA">
+<XPD:REF name="Namespace">28q8akawHUut/vt9cqGzHQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">/4J9gJdnhE2I6S8pR8e8CwAA</XPD:REF>
+<XPD:REF name="Views[1]">rd3R8mu5OUu9cvZ6Z/4NggAA</XPD:REF>
+<XPD:REF name="Views[2]">GY3pM5HSK0iI2veru1WgUwAA</XPD:REF>
+<XPD:REF name="Views[3]">DsV6M80A20K/A48wJowMVAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="hKHk5PnDTkKXfRG2jmcJJAAA">
+<XPD:REF name="Association">gPaQ+DIN6EWZ4BdgEPOxBAAA</XPD:REF>
+<XPD:REF name="Participant">HvFFmfu3EU2Q5JpvC4V1dAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">4EX0iPgXT0WYxWFInd77KQAA</XPD:REF>
+<XPD:REF name="Views[1]">34tfoxrPFkqQ6azctOeNhgAA</XPD:REF>
+<XPD:REF name="Views[2]">RTUJ+/IcmkmU5J4z/G0vWAAA</XPD:REF>
+<XPD:REF name="Views[3]">Q/HJJURAq0OyhISJkhdf6wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="pIDN0gCe306T092GLUvstgAA">
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Association">gPaQ+DIN6EWZ4BdgEPOxBAAA</XPD:REF>
+<XPD:REF name="Participant">ijjMqBZ6REK0iCxeAVpgAAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">2Hiiw/pWfUCivqUfdBW8OwAA</XPD:REF>
+<XPD:REF name="Views[1]">+KVkT8ozQkemNWISCynPpQAA</XPD:REF>
+<XPD:REF name="Views[2]">Ma86Ms4jpU6yL/qb2Bb7CQAA</XPD:REF>
+<XPD:REF name="Views[3]">C2iw/esZgEmhWgrr+NZg+QAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[9]" type="UMLAssociation" guid="+Ae9qqvOAEiQr4SuowB4xgAA">
+<XPD:REF name="Namespace">28q8akawHUut/vt9cqGzHQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">l0EW19sL+k++O39a+OyjxQAA</XPD:REF>
+<XPD:REF name="Views[1]">Hzr4oQcJrkuoVCYMb8ik2QAA</XPD:REF>
+<XPD:REF name="Views[2]">Dd5BXxX0k0uHTHP6wlvpSgAA</XPD:REF>
+<XPD:REF name="Views[3]">Tpgj7+i4REuc+JlFB3AxGAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="Y3XN0KcISUujsCKot7FRwQAA">
+<XPD:ATTR name="Name" type="string">candidates</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">*</XPD:ATTR>
+<XPD:REF name="Association">+Ae9qqvOAEiQr4SuowB4xgAA</XPD:REF>
+<XPD:REF name="Participant">nDDKC4LElEWTybRg7a79OQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">3DFnlxZwKkOSCvZ3x80JIAAA</XPD:REF>
+<XPD:REF name="Views[1]">ZVJgTp3++0aX2CB2R8hCuQAA</XPD:REF>
+<XPD:REF name="Views[2]">AnVW30FHVU+3Ccfw7YrxnAAA</XPD:REF>
+<XPD:REF name="Views[3]">Ooz9JUM66E+ASSUnOnh1KwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="qhpWc/+HW0SLBBtfjX4WFwAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">+Ae9qqvOAEiQr4SuowB4xgAA</XPD:REF>
+<XPD:REF name="Participant">ijjMqBZ6REK0iCxeAVpgAAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Iz0U5YCBrka8yPUrXxKlCgAA</XPD:REF>
+<XPD:REF name="Views[1]">PN0Z99QsQ0aA06SWVhrzdgAA</XPD:REF>
+<XPD:REF name="Views[2]">wAtztCseO0m7PZc49MG+agAA</XPD:REF>
+<XPD:REF name="Views[3]">ft42mcFsHECO0yQKn8iDQQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[10]" type="UMLAssociation" guid="u9wX0QGdzEKXDMUSuMeSlAAA">
+<XPD:REF name="Namespace">28q8akawHUut/vt9cqGzHQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">s97DNIncIUyqxXbneTudIQAA</XPD:REF>
+<XPD:REF name="Views[1]">5nJJhIKfP0aphx/wCbPj8QAA</XPD:REF>
+<XPD:REF name="Views[2]">GF15CGpxb0ihKLCpqEgiPwAA</XPD:REF>
+<XPD:REF name="Views[3]">mQ03MxKHVEGf7/sHqs6UNQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="zekdyR8yEUmNFK08gWI5UgAA">
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Association">u9wX0QGdzEKXDMUSuMeSlAAA</XPD:REF>
+<XPD:REF name="Participant">uTvluPMq6EiVrEzIldF+CwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">ABsrUukx4UKDMLhPlPcXaAAA</XPD:REF>
+<XPD:REF name="Views[1]">llvYWWfx/E6vLX4zQ9IOHwAA</XPD:REF>
+<XPD:REF name="Views[2]">6oYASua5iUi3jt++CaJaRgAA</XPD:REF>
+<XPD:REF name="Views[3]">fncRPs0eyUay6gLlnfmaoAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="0vFa396IN0SfuCWKBLJF0AAA">
+<XPD:REF name="Association">u9wX0QGdzEKXDMUSuMeSlAAA</XPD:REF>
+<XPD:REF name="Participant">HvFFmfu3EU2Q5JpvC4V1dAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">TFju0xnXzUeFLEfbHAgvxwAA</XPD:REF>
+<XPD:REF name="Views[1]">6pSDVmO3RUiGwA0KZzySZgAA</XPD:REF>
+<XPD:REF name="Views[2]">ZP18gpDXvEaqIO5x2PK4vwAA</XPD:REF>
+<XPD:REF name="Views[3]">LrU5/QaN5kabGVbUYT2uVwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[11]" type="UMLAssociation" guid="VOv3sCvVzEOalgoa+JC9YgAA">
+<XPD:REF name="Namespace">28q8akawHUut/vt9cqGzHQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="YROrTOuSWkmpMzIJdfaf/QAA">
+<XPD:REF name="Association">VOv3sCvVzEOalgoa+JC9YgAA</XPD:REF>
+<XPD:REF name="Participant">ijjMqBZ6REK0iCxeAVpgAAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="zKLAXgKQ/02weDYbKw8WmwAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">VOv3sCvVzEOalgoa+JC9YgAA</XPD:REF>
+<XPD:REF name="Participant">GioGPK3R6Ue8w6V2t8TzvgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[12]" type="UMLAssociation" guid="lT1ML7PzwUGLyiBN6ZM9ewAA">
+<XPD:REF name="Namespace">28q8akawHUut/vt9cqGzHQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">hEfg3zF9T0KZqM6LoHkeywAA</XPD:REF>
+<XPD:REF name="Views[1]">Xp9wRzdQwUiqwJCNI5b4JQAA</XPD:REF>
+<XPD:REF name="Views[2]">dQQcX7/IbUGZGP/exqC6OQAA</XPD:REF>
+<XPD:REF name="Views[3]">wowPjb5qSEiE1UD8gtsPVAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="gXiNnV7a90+F3ShZ01TMFAAA">
+<XPD:REF name="Association">lT1ML7PzwUGLyiBN6ZM9ewAA</XPD:REF>
+<XPD:REF name="Participant">GioGPK3R6Ue8w6V2t8TzvgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">kerBdAuXP0qGhUBsKsaVBgAA</XPD:REF>
+<XPD:REF name="Views[1]">24szT2Qfg0uwuXHurF5FawAA</XPD:REF>
+<XPD:REF name="Views[2]">4pcy4Hj8vUuVJIBH55+G8wAA</XPD:REF>
+<XPD:REF name="Views[3]">n+zAECOm3kuPp0U6fGa9qQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="xnq3//AvmkaNPVRDsIkseAAA">
+<XPD:REF name="Association">lT1ML7PzwUGLyiBN6ZM9ewAA</XPD:REF>
+<XPD:REF name="Participant">ijjMqBZ6REK0iCxeAVpgAAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">fZzGyZZt1US3pySjYdbe3AAA</XPD:REF>
+<XPD:REF name="Views[1]">AmXw2BgBNk+PLXzTBtMTqgAA</XPD:REF>
+<XPD:REF name="Views[2]">UHz2AHAHTk6b0UBy27uYsgAA</XPD:REF>
+<XPD:REF name="Views[3]">oiGUCSbvcE2jf8t3N6P8eAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[13]" type="UMLAssociation" guid="AVjFcKW/SkGrDDjIOVRD+gAA">
+<XPD:REF name="Namespace">28q8akawHUut/vt9cqGzHQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">0Q8MZMRv3keC5G0P3jqvLgAA</XPD:REF>
+<XPD:REF name="Views[1]">d3Kypc5e9USTEK3RieUIQgAA</XPD:REF>
+<XPD:REF name="Views[2]">uD+JnEzcwkSPAPXtxxC+uQAA</XPD:REF>
+<XPD:REF name="Views[3]">rnjCjREV6kK6FI664NzbmQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="s0hHwXTeU02e7YGLMAX0PAAA">
+<XPD:ATTR name="Name" type="string">subTasks</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">*</XPD:ATTR>
+<XPD:REF name="Association">AVjFcKW/SkGrDDjIOVRD+gAA</XPD:REF>
+<XPD:REF name="Participant">HvFFmfu3EU2Q5JpvC4V1dAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">GDNhCHzLh0WvJJ1jxSWCbAAA</XPD:REF>
+<XPD:REF name="Views[1]">X0imqN7kTUWC5VgPlkJ00gAA</XPD:REF>
+<XPD:REF name="Views[2]">qjcLVMn3yEiW/FQqSOppuwAA</XPD:REF>
+<XPD:REF name="Views[3]">poFTZVOeaUWdQnmYEjp2JgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="wi5BJHl4RkiqqqtC44D95QAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">AVjFcKW/SkGrDDjIOVRD+gAA</XPD:REF>
+<XPD:REF name="Participant">HvFFmfu3EU2Q5JpvC4V1dAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">cfgsL9WLv0C08ZQHcVaKFAAA</XPD:REF>
+<XPD:REF name="Views[1]">5qWWjDhi90uAUXDD5YSGkAAA</XPD:REF>
+<XPD:REF name="Views[2]">L1KmK8JoRUSHUwvrb5aMcQAA</XPD:REF>
+<XPD:REF name="Views[3]">ghdCa3kzQUCEmb8k45FU/AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[14]" type="UMLAssociation" guid="3DEhC+Nv0kK7uqtxV6JcZwAA">
+<XPD:REF name="Namespace">28q8akawHUut/vt9cqGzHQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">9vrgDuSQRkuGM2KpgQ681wAA</XPD:REF>
+<XPD:REF name="Views[1]">HPgV9SBY2kahngUOTUUnqgAA</XPD:REF>
+<XPD:REF name="Views[2]">4xtJRUX4cUW2j7LzmJ71HgAA</XPD:REF>
+<XPD:REF name="Views[3]">cOI/0aN4FEmtKry1i0zsGgAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="zWDSiZ7kIEKvhXHKxmicAwAA">
+<XPD:ATTR name="Name" type="string">replies</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">*</XPD:ATTR>
+<XPD:REF name="Association">3DEhC+Nv0kK7uqtxV6JcZwAA</XPD:REF>
+<XPD:REF name="Participant">NKuLMRCxwkeVGSHi+kJ4PAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">MRGwgnyuZkenbLrSBgMGowAA</XPD:REF>
+<XPD:REF name="Views[1]">NDIxC9Q5bUq5Bq5jTTb6DAAA</XPD:REF>
+<XPD:REF name="Views[2]">E7w5n6j9t02OUqefF5g+GQAA</XPD:REF>
+<XPD:REF name="Views[3]">Hccf2ZoTsUGJM1WkqVxZHAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="9l7hGk4Y/kqJrk9GldzJ6QAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">3DEhC+Nv0kK7uqtxV6JcZwAA</XPD:REF>
+<XPD:REF name="Participant">NKuLMRCxwkeVGSHi+kJ4PAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">mJSLnpapqEe+JCw/l9ZrWgAA</XPD:REF>
+<XPD:REF name="Views[1]">mbaATlJxY064398AzNkbrAAA</XPD:REF>
+<XPD:REF name="Views[2]">vQr9dU7oMkScUooE1diouQAA</XPD:REF>
+<XPD:REF name="Views[3]">v+lh/JYNEk2ckddRKkYMqgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:BODY>
+</XPD:PROJECT>
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Assigner.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Assigner.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Assigner.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,33 @@
+/*
+ * 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.task;
+
+import java.io.Serializable;
+
+/** interface to delegate {@link Task} or {@link Swimlane} assignment.
+ * @author Tom Baeyens
+ */
+public interface Assigner extends Serializable {
+
+ /** sets the actorId and candidates for the given task. */
+ void assign(Task task) throws Exception;
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Assigner.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Role.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Role.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Role.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,44 @@
+/*
+ * 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.task;
+
+/** a role that a person fullfills for a task.
+ *
+ * @author Tom Baeyens
+ */
+public interface Role {
+
+ long getDbid();
+
+ String getIdentityId();
+ void setIdentityId(String identityId);
+
+ RoleType getRoleType();
+ void setRoleType(RoleType roleType);
+
+ String getDescription();
+ void setDescription(String description);
+
+ Task getTask();
+
+ Swimlane getSwimlane();
+}
\ No newline at end of file
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Role.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/RoleType.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/RoleType.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/RoleType.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,30 @@
+package org.jbpm.task;
+
+/** roleType of a person that is related to a task determines the
+ * privileges that are granted on the task. */
+public enum RoleType {
+
+ /** can do anything with the task */
+ OWNER,
+
+ /** alternative owner, but as long as this person is not the owner.
+ * This person is allowed to make comments, but nothing else. */
+ CANDIDATE,
+
+ /** person that will be using the result of this task. This person is
+ * allowed to make comments, but nothing else. */
+ CLIENT,
+
+ /** person that is allowed to watch-but-not-touch this task */
+ VIEWER,
+
+ /** a person that was assigned to a task, but got replaced because of
+ * absence or another reason. This way, a trace can be left in case
+ * This person returns and wants to take back his tasks that got
+ * reassigned. */
+ REPLACED_ASSIGNEE;
+
+ public String toString() {
+ return super.toString().toLowerCase().replace('_', '-');
+ }
+}
\ No newline at end of file
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/RoleType.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Swimlane.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Swimlane.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Swimlane.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,46 @@
+/*
+ * 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.task;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+/** a runtime process role that can store an assignment so that
+ * multiple related tasks are assigned to the same actor.
+ *
+ * @author Tom Baeyens
+ */
+public interface Swimlane extends Serializable {
+
+ long getDbid();
+
+ String getName();
+
+ String getAssignee();
+ void setAssignee(String assignee);
+
+ Collection<Role> getCandidates();
+ Role createCandidate(String identityId);
+ void removeCandidate(Role candidate);
+
+ SwimlaneDefinition getSwimlaneDefinition();
+}
\ No newline at end of file
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Swimlane.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/SwimlaneDefinition.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/SwimlaneDefinition.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/SwimlaneDefinition.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,39 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.task;
+
+import java.io.Serializable;
+
+/** design-time declaration of a swimlane.
+ *
+ * @author Tom Baeyens
+ */
+public interface SwimlaneDefinition extends Serializable {
+
+ long getDbid();
+
+ String getName();
+
+ String getActorIdExpression();
+ String getCandidatesExpression();
+ String getAssignmentExpression();
+}
\ No newline at end of file
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/SwimlaneDefinition.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Task.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Task.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Task.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,78 @@
+/*
+ * 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.task;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.jbpm.pvm.Execution;
+import org.jbpm.pvm.model.Comment;
+
+/** runtime task.
+ * @author Tom Baeyens
+ */
+public interface Task extends Serializable {
+
+ long getDbid();
+
+ String getName();
+ void setName(String name);
+
+ String getDescription();
+ void setDescription(String description);
+
+ void submit();
+ void submit(Map<String, Object> variables);
+
+ boolean isBlocking();
+ void setBlocking(boolean isBlocking);
+
+ boolean isSignalling();
+ void setSignalling(boolean isSignalling);
+
+ int getPriority();
+ void setPriority(int priority);
+
+ Date getCreate();
+ void setCreate(Date create);
+
+ Date getDueDate();
+ void setDueDate(Date dueDate);
+
+ List<Comment> getComments();
+ Comment createComment(String message);
+ void removeComment(Comment comment);
+
+ Set<Task> getSubTasks();
+ Task createSubTask(String name);
+ Task createSubTask(TaskDefinition subtaskDefinition);
+ void removeSubTask(Task subtask);
+
+ Execution getExecution();
+
+ Swimlane getSwimlane();
+
+ TaskDefinition getTaskDefinition();
+}
\ No newline at end of file
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/Task.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/TaskDefinition.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/TaskDefinition.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/TaskDefinition.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,66 @@
+/*
+ * 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.task;
+
+import java.util.List;
+
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.task.impl.SwimlaneDefinitionImpl;
+import org.jbpm.task.impl.TaskDefinitionImpl;
+
+/** design-time declaration of a task.
+ *
+ * @author Tom Baeyens
+ */
+public interface TaskDefinition { //FIXME: extends ProcessElement {
+
+ String getName();
+
+ String getForm();
+
+ String getAssigneeExpression();
+
+ Descriptor getAssignerDescriptor();
+
+ String getCandidatesExpression();
+
+ String getDueDateDuration();
+
+ /** indicates whether the process must be blocked as long as this task is
+ * not completed. blocking should be turned off by default (isBlocking=false).
+ * but if a user (through the process language) sets isBlocking to true, then
+ * the process cannot be signalled until all blocking tasks are completed first. */
+ boolean isBlocking();
+
+ /** indicates if completion of this task causes a signal on the related execution.
+ * This is to support n-out-of-m. Whenever an execution leaves a task node, all the
+ * tasks that are not completed, related to that execution should loose their
+ * signalling power. */
+ boolean isSignalling();
+
+ int getPriority();
+
+ List<TaskDefinitionImpl> getSubTaskDefinitions();
+
+ SwimlaneDefinitionImpl getSwimlaneDefinition();
+
+}
\ No newline at end of file
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/TaskDefinition.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/TaskException.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/TaskException.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/TaskException.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,40 @@
+/*
+ * 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.task;
+
+public class TaskException extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+ public TaskException() {
+ super();
+ }
+ public TaskException(String msg, Throwable cause) {
+ super(msg, cause);
+ }
+ public TaskException(String msg) {
+ super(msg);
+ }
+ public TaskException(Throwable cause) {
+ super(cause);
+ }
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/TaskException.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/TaskService.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/TaskService.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/TaskService.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,44 @@
+/*
+ * 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.task;
+
+import java.util.List;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface TaskService {
+
+ Task createTask();
+ Task createTask(long taskDefinitionDbid);
+ Task createTask(long taskDefinitionDbid, long executionDbid);
+
+ Task getTask(long taskDbid);
+ void updateTask(Task task);
+ void deleteTask(long taskDbid);
+
+ List<Task> getPersonalTaskListPage(int firstResult, int maxResults);
+ List<Task> getPersonalTaskListPage(String userId, int firstResult, int maxResults);
+ List<Task> getGroupTaskListPage(List<String> identityIds, int firstResult, int maxResults);
+
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/TaskService.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/CreateTask.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/CreateTask.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/CreateTask.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,80 @@
+/*
+ * 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.task.cmd;
+
+import org.jbpm.pvm.internal.cmd.Command;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.session.DbSession;
+import org.jbpm.pvm.env.Environment;
+import org.jbpm.task.Task;
+import org.jbpm.task.impl.TaskDefinitionImpl;
+import org.jbpm.task.impl.TaskImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class CreateTask implements Command
+{
+
+ private static final long serialVersionUID = 1L;
+
+ protected Long taskDefinitionDbid;
+ protected Long executionDbid;
+
+ public CreateTask() {
+ }
+
+ public CreateTask(long taskDefinitionDbid) {
+ this.taskDefinitionDbid = taskDefinitionDbid;
+ }
+
+ public CreateTask(long taskDefinitionDbid, long executionDbid) {
+ this.taskDefinitionDbid = taskDefinitionDbid;
+ this.executionDbid = executionDbid;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ TaskDefinitionImpl taskDefinition = null;
+ ExecutionImpl execution = null;
+
+ if (taskDefinitionDbid!=null) {
+ DbSession dbSession = environment.get(DbSession.class);
+ taskDefinition = dbSession.get(TaskDefinitionImpl.class, taskDefinitionDbid);
+ }
+
+ if (executionDbid!=null) {
+ DbSession dbSession = environment.get(DbSession.class);
+ execution = dbSession.get(ExecutionImpl.class, executionDbid);
+ }
+
+ Task task = null;
+ if (taskDefinition==null) {
+ task = TaskImpl.create();
+ } else if (execution==null) {
+ task = TaskImpl.create(taskDefinition);
+ } else {
+ task = TaskImpl.create(taskDefinition, execution);
+ }
+
+ return task;
+ }
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/CreateTask.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/DeleteTask.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/DeleteTask.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/DeleteTask.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,50 @@
+/*
+ * 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.task.cmd;
+
+import org.jbpm.task.impl.TaskImpl;
+import org.jbpm.pvm.internal.cmd.Command;
+import org.jbpm.pvm.env.Environment;
+import org.jbpm.pvm.session.DbSession;
+
+/**
+ * @author Tom Baeyens
+ */
+public class DeleteTask implements Command
+{
+
+ private static final long serialVersionUID = 1L;
+
+ protected long taskDbid;
+
+ public DeleteTask(long taskDbid) {
+ this.taskDbid = taskDbid;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+ TaskImpl task = dbSession.get(TaskImpl.class, taskDbid);
+ dbSession.delete(task);
+ return null;
+ }
+
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/DeleteTask.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/GetTask.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/GetTask.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/GetTask.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,47 @@
+/*
+ * 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.task.cmd;
+
+import org.jbpm.task.impl.TaskImpl;
+import org.jbpm.pvm.internal.cmd.Command;
+import org.jbpm.pvm.env.Environment;
+import org.jbpm.pvm.session.DbSession;
+
+/**
+ * @author Tom Baeyens
+ */
+public class GetTask implements Command
+{
+
+ private static final long serialVersionUID = 1L;
+
+ protected long taskDbid;
+
+ public GetTask(long taskDbid) {
+ this.taskDbid = taskDbid;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+ return dbSession.get(TaskImpl.class, taskDbid);
+ }
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/GetTask.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/UpdateTask.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/UpdateTask.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/UpdateTask.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,50 @@
+/*
+ * 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.task.cmd;
+
+import org.jbpm.task.Task;
+import org.jbpm.pvm.internal.cmd.Command;
+import org.jbpm.pvm.session.DbSession;
+import org.jbpm.pvm.env.Environment;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class UpdateTask implements Command
+{
+
+ private static final long serialVersionUID = 1L;
+
+ protected Task task;
+
+ public UpdateTask(Task task) {
+ this.task = task;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+ dbSession.save(task);
+ return null;
+ }
+
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/cmd/UpdateTask.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/db/TaskDbSession.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/db/TaskDbSession.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/db/TaskDbSession.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,35 @@
+/*
+ * 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.task.db;
+
+import org.jbpm.pvm.session.DbSession;
+import org.jbpm.pvm.internal.hibernate.HibernateDbSession;
+
+/** persistence interface for tasks.
+ *
+ * @author Tom Baeyens
+ */
+public class TaskDbSession extends HibernateDbSession implements DbSession
+{
+
+ // TODO
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/db/TaskDbSession.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/LifeCycle.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/LifeCycle.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/LifeCycle.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,94 @@
+/*
+ * 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.task.impl;
+
+import org.jbpm.pvm.Execution;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.NodeImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.model.Node;
+import org.jbpm.task.TaskException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Tom Baeyens
+ */
+public class LifeCycle {
+
+ private static LifeCycleParser lifeCycleParser = new LifeCycleParser();
+ private static Map<String, ProcessDefinitionImpl> lifeCycleProcesses = new HashMap<String, ProcessDefinitionImpl>();
+
+ public static String initialise(TaskImpl task) {
+
+ throw new RuntimeException("FIXME: LifeCycle#initialise()");
+
+ /*ProcessDefinitionImpl lifeCycle = getLifeCycle(task);
+ Map<String, Object> lifeCycleVariables = new HashMap<String, Object>();
+ lifeCycleVariables.put("task", task);
+ Execution lifeCycleExecution = lifeCycle.startExecution(lifeCycleVariables);
+ return lifeCycleExecution.getNode().getName();*/
+ }
+
+ public static ProcessDefinitionImpl getLifeCycle(TaskImpl task) {
+
+ throw new RuntimeException("FIXME: LifeCycle#getLifeCycle()");
+
+ /* if (task==null) {
+ throw new TaskException("task is null");
+ }
+ String resource = task.getLifeCycleResource();
+ if (resource==null) {
+ throw new TaskException("task "+task.getClass().getName()+" did'nt return a lifecycle");
+ }
+ ProcessDefinitionImpl lifeCycleProcess = null;
+ synchronized (lifeCycleProcesses) {
+ lifeCycleProcess = lifeCycleProcesses.get(resource);
+ if (lifeCycleProcess==null) {
+ Parse parse = new Parse();
+ lifeCycleProcess = (ProcessDefinitionImpl) lifeCycleParser.parseResource(resource, null, parse);
+ if (parse.hasProblems()) {
+ throw new TaskException("process lifecycle "+resource+" parsing problems: "+parse.getProblems().toString() );
+ }
+ lifeCycleProcesses.put(resource, lifeCycleProcess);
+ }
+ }
+ return lifeCycleProcess;*/
+ }
+
+ protected void fireLifeCycleEvent(String eventName, TaskImpl task) {
+ throw new RuntimeException("FIXME: LifeCycle#fireLifeCycleEvent()");
+ /*
+ ExecutionImpl lifeCycleExecution = new ExecutionImpl();
+ ProcessDefinitionImpl lifeCycleProcess = getLifeCycle(task);
+ lifeCycleExecution.setProcess(lifeCycleProcess);
+ String state = task.getState();
+ Node node = lifeCycleProcess.getNode(state);
+ lifeCycleExecution.setNode((NodeImpl) node);
+ lifeCycleExecution.signal(eventName);
+ task.state = lifeCycleExecution.getNode().getName();
+ */
+ }
+
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/LifeCycle.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/LifeCycleParser.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/LifeCycleParser.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/LifeCycleParser.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,110 @@
+/*
+ * 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.task.impl;
+
+import java.util.List;
+
+import org.jbpm.pvm.internal.xml.Parser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.model.NodeImpl;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.w3c.dom.Element;
+
+/**
+ * @author Tom Baeyens
+ */
+public class LifeCycleParser extends Parser
+{
+
+ public Object parseDocumentElement(Element element, Parse parse) {
+ ProcessDefinitionImpl lifeCycleProcess = new ProcessDefinitionImpl();
+
+ List<Element> stateElements = XmlUtil.elements(element, "state");
+ if (stateElements!=null) {
+ for (Element stateElement: stateElements) {
+ parseState(stateElement, lifeCycleProcess, parse);
+ }
+ for (Element stateElement: stateElements) {
+ parseTransitions(stateElement, lifeCycleProcess, parse);
+ }
+ }
+
+ String initialStateName = null;
+ if (element.hasAttribute("initial")) {
+ initialStateName = element.getAttribute("initial");
+ NodeImpl initial = (NodeImpl) lifeCycleProcess.getNode(initialStateName);
+ if (initial!=null) {
+ lifeCycleProcess.setInitial(initial);
+ } else {
+ parse.addProblem("initial "+initialStateName+" doesn't exist");
+ }
+ }
+
+ return lifeCycleProcess;
+ }
+
+ public void parseTransitions(Element element, ProcessDefinitionImpl lifeCycleProcess, Parse parse) {
+ if (! element.hasAttribute("name")) {
+ parse.addProblem("state doesn't have a name: "+XmlUtil.toString(element));
+ return;
+ }
+ String stateName = element.getAttribute("name");
+ NodeImpl state = (NodeImpl) lifeCycleProcess.getNode(stateName);
+
+ List<Element> transitionElements = XmlUtil.elements(element, "transition");
+ if (transitionElements!=null) {
+ for (Element transitionElement: transitionElements) {
+ parseTransition(transitionElement, state, parse);
+ }
+ }
+ }
+
+ public void parseTransition(Element element, NodeImpl state, Parse parse) {
+ if (! element.hasAttribute("name")) {
+ parse.addProblem("transition doesn't have a name: "+XmlUtil.toString(element));
+ return;
+ }
+ String transitionName = element.getAttribute("name");
+ if (! element.hasAttribute("to")) {
+ parse.addProblem("transition "+transitionName+" doesn't have a to attribute indicating the destination state: "+XmlUtil.toString(element));
+ return;
+ }
+ String destinationName = element.getAttribute("to");
+ NodeImpl destination = (NodeImpl) state.getProcessDefinition().getNode(destinationName);
+ if (destination!=null) {
+ state.createOutgoingTransition(destination, transitionName);
+ } else {
+ parse.addProblem("destination "+destinationName+" of "+transitionName+" is unknown");
+ }
+ }
+
+ public void parseState(Element element, ProcessDefinitionImpl lifeCycleProcess, Parse parse) {
+ if (! element.hasAttribute("name")) {
+ parse.addProblem("state doesn't have an id: "+XmlUtil.toString(element));
+ return;
+ }
+ String stateName = element.getAttribute("name");
+ NodeImpl state = lifeCycleProcess.createNode(stateName);
+ state.setBehaviour(new LifeCycleState());
+ }
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/LifeCycleParser.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/LifeCycleState.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/LifeCycleState.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/LifeCycleState.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,49 @@
+/*
+ * 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.task.impl;
+
+import java.util.Map;
+
+import org.jbpm.pvm.activity.ExternalActivity;
+import org.jbpm.pvm.activity.ActivityExecution;
+
+/**
+ * @author Tom Baeyens
+ */
+public class LifeCycleState implements ExternalActivity
+{
+
+ private static final long serialVersionUID = 1L;
+
+
+ public void execute(ActivityExecution execution) throws Exception {
+ execution.waitForSignal();
+ }
+
+ public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) throws Exception {
+ execution.take(signalName);
+ }
+
+ /*public Set<SignalDefinition> getSignals(Execution execution) throws Exception {
+ return null;
+ } */
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/LifeCycleState.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/RoleImpl.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/RoleImpl.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/RoleImpl.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,82 @@
+/*
+ * 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.task.impl;
+
+import java.io.Serializable;
+
+import org.jbpm.task.Role;
+import org.jbpm.task.RoleType;
+
+
+/** the relation between a task and a person.
+ * @author Tom Baeyens
+ */
+public class RoleImpl implements Serializable, Role {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+ protected int dbversion;
+ protected String identityId;
+ protected RoleType roleType;
+ protected String description;
+ protected TaskImpl task;
+ protected SwimlaneImpl swimlane;
+
+ public String toString() {
+ return roleType.toString()+"("+identityId+")";
+ }
+
+ public TaskImpl getTask() {
+ return task;
+ }
+ public void setTask(TaskImpl task) {
+ this.task = task;
+ }
+ public String getDescription() {
+ return description;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+ public long getDbid() {
+ return dbid;
+ }
+ public SwimlaneImpl getSwimlane() {
+ return swimlane;
+ }
+ public void setSwimlane(SwimlaneImpl swimlane) {
+ this.swimlane = swimlane;
+ }
+ public RoleType getRoleType() {
+ return roleType;
+ }
+ public void setRoleType(RoleType roleType) {
+ this.roleType = roleType;
+ }
+ public String getIdentityId() {
+ return identityId;
+ }
+ public void setIdentityId(String identityId) {
+ this.identityId = identityId;
+ }
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/RoleImpl.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/SwimlaneDefinitionImpl.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/SwimlaneDefinitionImpl.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/SwimlaneDefinitionImpl.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,99 @@
+/*
+ * 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.task.impl;
+
+import java.io.Serializable;
+
+import org.jbpm.task.SwimlaneDefinition;
+import org.jbpm.pvm.internal.util.EqualsUtil;
+
+/**
+ * is a process role (aka participant).
+ */
+public class SwimlaneDefinitionImpl implements Serializable, SwimlaneDefinition {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+ protected int dbversion;
+ protected String name = null;
+
+ /**
+ * expression that resolves to 1 single actorId.
+ */
+ protected String actorIdExpression = null;
+
+ /**
+ * expression that resolves to a comma separated list of actorIds.
+ */
+ protected String candidatesExpression = null;
+
+ /**
+ * expression that resolves to an AssignmentHandler implementation.
+ */
+ protected String assignmentExpression = null;
+
+ // equals ///////////////////////////////////////////////////////////////////
+ // hack to support comparing hibernate proxies against the real objects
+ // since this always falls back to ==, we don't need to overwrite the hashcode
+ public boolean equals(Object o) {
+ return EqualsUtil.equals(this, o);
+ }
+
+ public void setActorIdExpression(String actorIdExpression) {
+ // Note: combination of actorIdExpression and candidatesExpression is allowed
+ this.actorIdExpression = actorIdExpression;
+ this.assignmentExpression = null;
+ }
+ public void setCandidatesExpression(String pooledActorsExpression) {
+ // Note: combination of actorIdExpression and pooledActorsExpression is allowed
+ this.candidatesExpression = pooledActorsExpression;
+ this.assignmentExpression = null;
+ }
+ public void setAssignmentExpression(String assignmentExpression) {
+ // assignment expressions and assignmentDelegation are mutually exclusive
+ this.actorIdExpression = null;
+ this.candidatesExpression = null;
+ this.assignmentExpression = assignmentExpression;
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public long getDbid() {
+ return dbid;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getName() {
+ return name;
+ }
+ public String getActorIdExpression() {
+ return actorIdExpression;
+ }
+ public String getCandidatesExpression() {
+ return candidatesExpression;
+ }
+ public String getAssignmentExpression() {
+ return assignmentExpression;
+ }
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/SwimlaneDefinitionImpl.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/SwimlaneImpl.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/SwimlaneImpl.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/SwimlaneImpl.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,120 @@
+/*
+ * 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.task.impl;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jbpm.task.Role;
+import org.jbpm.task.RoleType;
+import org.jbpm.task.Swimlane;
+import org.jbpm.task.SwimlaneDefinition;
+import org.jbpm.task.TaskException;
+import org.jbpm.pvm.internal.util.EqualsUtil;
+
+/**
+ * runtime process role for a specific process instance.
+ */
+public class SwimlaneImpl implements Serializable, Swimlane {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+ protected int dbversion;
+ protected String name = null;
+ protected String assignee = null;
+ protected Set<RoleImpl> candidates = null;
+ protected SwimlaneDefinition swimlaneDefinition = null;
+
+ // assignment methods ///////////////////////////////////////////////////////
+
+ public String getAssignee() {
+ return assignee;
+ }
+
+ public void setAssignee(String assignee) {
+ this.assignee = assignee;
+ }
+
+ // candidates ///////////////////////////////////////////////////////////////
+
+ public Collection<Role> getCandidates() {
+ if (candidates==null) {
+ return Collections.EMPTY_LIST;
+ }
+ return (Collection)candidates;
+ }
+
+ public Role createCandidate(String identityId) {
+ if (identityId==null) {
+ throw new TaskException("identityId is null");
+ }
+ RoleImpl role = new RoleImpl();
+ role.setIdentityId(identityId);
+ role.setRoleType(RoleType.CANDIDATE);
+ role.setSwimlane(this);
+ if (candidates==null) {
+ candidates = new HashSet<RoleImpl>();
+ }
+ candidates.add(role);
+ return role;
+ }
+
+ public void removeCandidate(Role candidate) {
+ if (candidate==null) {
+ throw new TaskException("candidate is null");
+ }
+ if ( (candidates!=null)
+ && (candidates.remove(candidate))
+ ) {
+ ((RoleImpl)candidate).setTask(null);
+ }
+ }
+
+ // equals ///////////////////////////////////////////////////////////////////
+ // hack to support comparing hibernate proxies against the real objects
+ // since this always falls back to ==, we don't need to overwrite the hashcode
+ public boolean equals(Object o) {
+ return EqualsUtil.equals(this, o);
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public long getDbid() {
+ return dbid;
+ }
+ public String getName() {
+ return name;
+ }
+ public SwimlaneDefinition getSwimlaneDefinition() {
+ return swimlaneDefinition;
+ }
+ public void setSwimlaneDefinition(SwimlaneDefinition swimlaneDefinition) {
+ this.swimlaneDefinition = swimlaneDefinition;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/SwimlaneImpl.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskDefinitionImpl.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskDefinitionImpl.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskDefinitionImpl.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,129 @@
+/*
+ * 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.task.impl;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.jbpm.pvm.internal.model.ProcessElementImpl;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.util.Priority;
+import org.jbpm.task.TaskDefinition;
+
+/**
+ * defines a task and how the actor(s) must be calculated at runtime.
+ */
+public class TaskDefinitionImpl extends ProcessElementImpl implements Serializable, TaskDefinition {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String name;
+ protected String description;
+
+ /** @see #isBlocking() */
+ protected boolean isBlocking;
+
+ /** @see #isSignalling() */
+ protected boolean isSignalling = true;
+
+ protected String dueDateDuration;
+ protected List<TaskDefinitionImpl> subTaskDefinitions;
+ protected int priority = Priority.NORMAL;
+ protected SwimlaneDefinitionImpl swimlaneDefinition;
+ protected String assigneeExpression;
+ protected String candidatesExpression;
+ protected Descriptor assignerDescriptor;
+
+
+ public String getForm() {
+ return (String) (properties!=null ? properties.get("form") : null);
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public String getAssigneeExpression() {
+ return assigneeExpression;
+ }
+ public void setAssigneeExpression(String assigneeExpression) {
+ this.assigneeExpression = assigneeExpression;
+ }
+ public Descriptor getAssignerDescriptor() {
+ return assignerDescriptor;
+ }
+ public void setAssignerDescriptor(Descriptor assignerDescriptor) {
+ this.assignerDescriptor = assignerDescriptor;
+ }
+ public String getCandidatesExpression() {
+ return candidatesExpression;
+ }
+ public void setCandidatesExpression(String candidatesExpression) {
+ this.candidatesExpression = candidatesExpression;
+ }
+ public boolean isBlocking() {
+ return isBlocking;
+ }
+ public void setBlocking(boolean isBlocking) {
+ this.isBlocking = isBlocking;
+ }
+ public boolean isSignalling() {
+ return isSignalling;
+ }
+ public void setSignalling(boolean isSignalling) {
+ this.isSignalling = isSignalling;
+ }
+ public int getPriority() {
+ return priority;
+ }
+ public void setPriority(int priority) {
+ this.priority = priority;
+ }
+ public List<TaskDefinitionImpl> getSubTaskDefinitions() {
+ return subTaskDefinitions;
+ }
+ public void setSubTaskDefinitions(List<TaskDefinitionImpl> subTaskDefinitions) {
+ this.subTaskDefinitions = subTaskDefinitions;
+ }
+ public SwimlaneDefinitionImpl getSwimlaneDefinition() {
+ return swimlaneDefinition;
+ }
+ public void setSwimlaneDefinition(SwimlaneDefinitionImpl swimlaneDefinition) {
+ this.swimlaneDefinition = swimlaneDefinition;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getDescription() {
+ return description;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+ public String getDueDateDuration() {
+ return dueDateDuration;
+ }
+ public void setDueDateDuration(String dueDateDuration) {
+ this.dueDateDuration = dueDateDuration;
+ }
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskDefinitionImpl.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskExecution.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskExecution.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskExecution.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,36 @@
+/*
+ * 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.task.impl;
+
+import java.util.Map;
+
+import org.jbpm.task.Swimlane;
+import org.jbpm.task.Task;
+
+/**
+ * @author Tom Baeyens
+ */
+public interface TaskExecution {
+
+ Map<String, ? extends Task> getTasks();
+ Map<String, ? extends Swimlane> getSwimlanes();
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskExecution.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskImpl.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskImpl.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskImpl.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,393 @@
+/*
+ * 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.task.impl;
+
+import org.jbpm.pvm.Execution;
+import org.jbpm.pvm.model.Comment;
+import org.jbpm.pvm.env.Environment;
+import org.jbpm.pvm.internal.model.CommentImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.util.Clock;
+import org.jbpm.pvm.internal.util.Priority;
+import org.jbpm.pvm.internal.util.ReflectUtil;
+import org.jbpm.pvm.internal.util.EqualsUtil;
+import org.jbpm.pvm.internal.cal.Duration;
+import org.jbpm.task.*;
+
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * is one task instance that can be assigned to an actor (read: put in
+ * someones task list) and that can trigger the continuation of execution
+ * of the token upon completion.
+ */
+public class TaskImpl implements Serializable, Task {
+
+ private static final long serialVersionUID = 1L;
+ // private static final Logger log = Logger.getLogger(TaskImpl.class.getName());
+
+ // could be made configurable:
+ public static final String CONTEXTKEY_TASK_CLASS_NAME = "taskClassName";
+ public static final String[] SEARCHORDER_TASK_CLASS_NAME = new String[]{
+ "FIXME: DefaultEnvironment.CONTEXTNAME_APPLICATION" //DefaultEnvironment.CONTEXTNAME_APPLICATION
+ };
+
+ protected long dbid;
+ protected int dbversion;
+ protected String name;
+ protected String description;
+
+ protected String assignee;
+ protected Set<RoleImpl> roles;
+
+ protected Date create;
+ protected Date dueDate;
+ protected Integer progress;
+
+ //FIXME: protected VariableMap variableMap;
+ protected List<CommentImpl> comments;
+
+ protected int priority = Priority.NORMAL;
+
+ protected String state;
+
+ protected Execution execution;
+ protected boolean isSignalling = true;
+ protected boolean isBlocking;
+
+ protected TaskDefinitionImpl taskDefinition;
+ protected SwimlaneImpl swimlane;
+
+ protected TaskImpl superTask;
+ protected Set<TaskImpl> subTasks;
+
+ protected TaskImpl() {
+ }
+
+ // creating a task
+
+ public static TaskImpl create() {
+ return create(null, null);
+ }
+
+ public static TaskImpl create(TaskDefinitionImpl taskDefinition) {
+ return create(taskDefinition, null);
+ }
+
+ public static TaskImpl create(TaskDefinitionImpl taskDefinition, ExecutionImpl execution) {
+ TaskImpl task = null;
+ // if a task class name is configured
+ Environment environment = Environment.getCurrent();
+ String taskClassName = (environment!=null ? (String) environment.get(TaskImpl.CONTEXTKEY_TASK_CLASS_NAME, TaskImpl.SEARCHORDER_TASK_CLASS_NAME) : null);
+ if (taskClassName!=null) {
+ // dynamically instantiate it
+ ClassLoader classLoader = environment.getClassLoader();
+ Class<?> taskClass = ReflectUtil.loadClass(classLoader, taskClassName);
+ task = (TaskImpl) ReflectUtil.newInstance(taskClass);
+
+ // otherwise just use the default task implementation type
+ } else {
+ task = new TaskImpl();
+ }
+
+ task.create = Clock.getCurrentTime();
+
+ task.setTaskDefinition(taskDefinition);
+ task.setExecution(execution);
+
+ // initialise the task state
+ task.state = LifeCycle.initialise(task);
+
+ return task;
+ }
+
+ public void setTaskDefinition(TaskDefinitionImpl taskDefinition) {
+ this.taskDefinition = taskDefinition;
+ if (taskDefinition!=null) {
+ this.name = taskDefinition.getName();
+ this.description = taskDefinition.getDescription();
+ this.isBlocking = taskDefinition.isBlocking();
+ this.isSignalling = taskDefinition.isSignalling();
+ this.priority = taskDefinition.getPriority();
+
+ String durationText = taskDefinition.getDueDateDuration();
+ if (durationText!=null) {
+ this.dueDate = calculateDueDate(new Duration(durationText));
+ }
+ }
+ }
+
+ protected static Date calculateDueDate(Duration dueDate) {
+ // TODO
+ return null;
+ }
+
+ // assigning a task /////////////////////////////////////////////////////////
+
+ public String getAssignee() {
+ return assignee;
+ }
+
+ public void setAssignee(String assignee) {
+ this.assignee = assignee;
+ // TODO fire the assignment event
+ }
+
+ // roles ////////////////////////////////////////////////////////////////////
+
+ public Set<RoleImpl> getRoles() {
+ if (roles==null) {
+ return Collections.EMPTY_SET;
+ }
+ return roles;
+ }
+
+ public Set<RoleImpl> getAllRoles() {
+ Set<RoleImpl> allRoles = null;
+ if (roles!=null) {
+ allRoles = new HashSet<RoleImpl>(roles);
+ } else {
+ allRoles = new HashSet<RoleImpl>();
+ }
+ if (swimlane!=null) {
+ allRoles.addAll((Set)swimlane.getCandidates());
+ }
+ return allRoles;
+ }
+
+ public Role addRole(String identityId, RoleType roleType) {
+ if (identityId==null) {
+ throw new TaskException("userId is null");
+ }
+ if (roleType==null) {
+ throw new TaskException("roleType is null");
+ }
+ RoleImpl role = new RoleImpl();
+ role.setIdentityId(identityId);
+ role.setTask(this);
+ role.setRoleType(roleType);
+ if (roles==null) {
+ roles = new HashSet<RoleImpl>();
+ }
+ roles.add(role);
+ return role;
+ }
+
+ public void removeRole(Role role) {
+ if (role==null) {
+ throw new TaskException("role is null");
+ }
+ if ( (roles!=null)
+ && (roles.remove(role))
+ ) {
+ ((RoleImpl)role).setTask(null);
+ }
+ }
+
+ // completion ///////////////////////////////////////////////////////////////
+
+ public void submit() {
+ submit(null);
+ }
+
+ public void submit(Map<String, Object> variables) {
+ }
+
+ // comments /////////////////////////////////////////////////////////////////
+
+ public List<Comment> getComments() {
+ if (comments==null) {
+ return Collections.EMPTY_LIST;
+ }
+ return (List) comments;
+ }
+
+ public Comment createComment(String commentText) {
+ if (comments==null) {
+ comments = new ArrayList<CommentImpl>();
+ }
+ CommentImpl comment = new CommentImpl(commentText);
+ comments.add(comment);
+ return comment;
+ }
+
+ public void removeComment(Comment comment) {
+ if (comment==null) {
+ throw new TaskException("comment is null");
+ }
+ if (comments!=null) {
+ comments.remove(comment);
+ }
+ }
+
+ // subtasks /////////////////////////////////////////////////////////////////
+
+ public Set<Task> getSubTasks() {
+ if (subTasks==null) {
+ return Collections.EMPTY_SET;
+ }
+ return (Set) subTasks;
+ }
+
+ public Task createSubTask(String name) {
+ if (subTasks==null) {
+ subTasks = new HashSet<TaskImpl>();
+ }
+ TaskImpl subtask = new TaskImpl();
+ subtask.setName(name);
+ addSubTask(subtask);
+ return subtask;
+ }
+
+ public Task createSubTask(TaskDefinition subtaskDefinition) {
+ if (subtaskDefinition==null) {
+ throw new TaskException("subtaskDefinition is null");
+ }
+ if (subTasks==null) {
+ subTasks = new HashSet<TaskImpl>();
+ }
+ TaskImpl subtask = create(taskDefinition);
+ addSubTask(subtask);
+ return subtask;
+ }
+
+ public Task addSubTask(TaskImpl subtask) {
+ if (subTasks==null) {
+ subTasks = new HashSet<TaskImpl>();
+ }
+ subtask.setSuperTask(this);
+ subTasks.add(subtask);
+ return subtask;
+ }
+
+ public void removeSubTask(Task subtask) {
+ if (subtask==null) {
+ throw new TaskException("subtask is null");
+ }
+ if ( (subTasks!=null)
+ && (subTasks.remove(subtask))
+ ) {
+ ((TaskImpl)subtask).setSuperTask(null);
+ }
+ }
+
+ // equals ///////////////////////////////////////////////////////////////////
+ // hack to support comparing hibernate proxies against the real objects
+ // since this always falls back to ==, we don't need to overwrite the hashcode
+ public boolean equals(Object o) {
+ return EqualsUtil.equals(this, o);
+ }
+
+ public String getLifeCycleResource() {
+ // the default lifecycle can be overridden in subclasses
+ return "org/jbpm/task/impl/default.lifecycle.xml";
+ }
+
+ // modified getters and setters /////////////////////////////////////////////
+ public void setProgress(Integer progress) {
+ if ( (progress<0)
+ || (progress>100)
+ ) {
+ throw new TaskException("task progress is a percentage (integer) and must be expressed between 0 and 100");
+ }
+ this.progress = progress;
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public String getDescription() {
+ return description;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public boolean isBlocking() {
+ return isBlocking;
+ }
+ public void setBlocking(boolean isBlocking) {
+ this.isBlocking = isBlocking;
+ }
+ public boolean isSignalling() {
+ return isSignalling;
+ }
+ public void setSignalling(boolean isSignalling) {
+ this.isSignalling = isSignalling;
+ }
+ public int getPriority() {
+ return priority;
+ }
+ public void setPriority(int priority) {
+ this.priority = priority;
+ }
+ public void setComments(List<CommentImpl> comments) {
+ this.comments = comments;
+ }
+ public Date getCreate() {
+ return create;
+ }
+ public void setCreate(Date create) {
+ this.create = create;
+ }
+ public Date getDueDate() {
+ return dueDate;
+ }
+ public void setDueDate(Date dueDate) {
+ this.dueDate = dueDate;
+ }
+ public Execution getExecution() {
+ return execution;
+ }
+ public void setExecution(Execution execution) {
+ this.execution = execution;
+ }
+ public String getState() {
+ return state;
+ }
+ public Swimlane getSwimlane() {
+ return swimlane;
+ }
+ public void setSwimlane(SwimlaneImpl swimlane) {
+ this.swimlane = swimlane;
+ }
+ public long getDbid() {
+ return dbid;
+ }
+ public TaskDefinition getTaskDefinition() {
+ return taskDefinition;
+ }
+ public TaskImpl getSuperTask() {
+ return superTask;
+ }
+ public void setSuperTask(TaskImpl superTask) {
+ this.superTask = superTask;
+ }
+ public Integer getProgress() {
+ return progress;
+ }
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskImpl.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskServiceImpl.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskServiceImpl.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskServiceImpl.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,91 @@
+/*
+ * 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.task.impl;
+
+import java.util.List;
+
+import org.jbpm.task.Task;
+import org.jbpm.task.TaskService;
+import org.jbpm.task.cmd.CreateTask;
+import org.jbpm.task.cmd.DeleteTask;
+import org.jbpm.task.cmd.GetTask;
+import org.jbpm.task.cmd.UpdateTask;
+import org.jbpm.pvm.internal.cmd.CommandService;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskServiceImpl implements TaskService {
+
+ protected CommandService commandService;
+
+ public TaskServiceImpl() {
+ }
+
+ public TaskServiceImpl(CommandService commandService) {
+ this.commandService = commandService;
+ }
+
+ public Task createTask() {
+ return (Task) commandService.execute(new CreateTask());
+ }
+
+ public Task createTask(long taskDefinitionDbid) {
+ return (Task) commandService.execute(new CreateTask(taskDefinitionDbid));
+ }
+
+ public Task createTask(long taskDefinitionDbid, long executionDbid) {
+ return (Task) commandService.execute(new CreateTask(taskDefinitionDbid, executionDbid));
+ }
+
+ public void deleteTask(long taskDbid) {
+ commandService.execute(new DeleteTask(taskDbid));
+ }
+
+ public Task getTask(long taskDbid) {
+ return (Task) commandService.execute(new GetTask(taskDbid));
+ }
+
+ public void updateTask(Task task) {
+ commandService.execute(new UpdateTask(task));
+ }
+
+ public List<Task> getGroupTaskListPage(List<String> identityIds, int firstResult, int maxResults) {
+ throw new UnsupportedOperationException("TODO");
+ }
+
+ public List<Task> getPersonalTaskListPage(int firstResult, int maxResults) {
+ throw new UnsupportedOperationException("TODO");
+ }
+
+ public List<Task> getPersonalTaskListPage(String userId, int firstResult, int maxResults) {
+ throw new UnsupportedOperationException("TODO");
+ }
+
+ public CommandService getCommandService() {
+ return commandService;
+ }
+ public void setCommandService(CommandService commandService) {
+ this.commandService = commandService;
+ }
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/TaskServiceImpl.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/default.lifecycle.xml
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/default.lifecycle.xml (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/default.lifecycle.xml 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,13 @@
+<task-lifecycle initial="open">
+ <state name="open">
+ <transition name="complete" to="completed" />
+ <transition name="suspend" to="suspended" />
+ <transition name="cancel" to="cancelled" />
+ </state>
+ <state name="suspended">
+ <transition name="resume" to="open" />
+ <transition name="cancel" to="cancelled" />
+ </state>
+ <state name="cancelled" />
+ <state name="completed" />
+</task-lifecycle>
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/impl/default.lifecycle.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/task.model.jpg
===================================================================
(Binary files differ)
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/task.model.jpg
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskDbSessionBinding.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskDbSessionBinding.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskDbSessionBinding.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.task.xml;
+
+import org.jbpm.pvm.internal.xml.Binding;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskDbSessionBinding implements Binding
+{
+
+
+ public String getCategory()
+ {
+ throw new RuntimeException("NYI");
+ }
+
+ public boolean matches(Element element)
+ {
+ throw new RuntimeException("NYI");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ return new TaskDbSessionDescriptor();
+ }
+
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskDbSessionBinding.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskDbSessionDescriptor.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskDbSessionDescriptor.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskDbSessionDescriptor.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,52 @@
+/*
+ * 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.task.xml;
+
+import org.hibernate.Session;
+import org.jbpm.task.db.TaskDbSession;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.descriptor.AbstractDescriptor;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskDbSessionDescriptor extends AbstractDescriptor
+{
+
+ private static final long serialVersionUID = 1L;
+
+ public Object construct(WireContext wireContext) {
+ return new TaskDbSession();
+ }
+
+ public void initialize(Object object, WireContext wireContext) {
+ Session session = wireContext.get(Session.class);
+ TaskDbSession taskDbSession = (TaskDbSession) object;
+ taskDbSession.setSession(session);
+ }
+
+ public Class< ? > getType(WireDefinition wireDefinition) {
+ return TaskDbSession.class;
+ }
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskDbSessionDescriptor.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskServiceBinding.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskServiceBinding.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskServiceBinding.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.task.xml;
+
+import org.jbpm.pvm.internal.xml.Binding;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskServiceBinding implements Binding
+{
+
+
+ public String getCategory()
+ {
+ throw new RuntimeException("NYI");
+ }
+
+ public boolean matches(Element element)
+ {
+ throw new RuntimeException("NYI");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ return new TaskServiceDescriptor();
+ }
+
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskServiceBinding.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskServiceDescriptor.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskServiceDescriptor.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskServiceDescriptor.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.task.xml;
+
+import org.jbpm.task.impl.TaskServiceImpl;
+import org.jbpm.pvm.internal.wire.descriptor.AbstractDescriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.cmd.CommandService;
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskServiceDescriptor extends AbstractDescriptor
+{
+
+ private static final long serialVersionUID = 1L;
+
+ public Object construct(WireContext wireContext) {
+ return new TaskServiceImpl();
+ }
+
+ public void initialize(Object object, WireContext wireContext) {
+ CommandService commandService = wireContext.get(CommandService.class);
+ TaskServiceImpl taskService = (TaskServiceImpl) object;
+ taskService.setCommandService(commandService);
+ }
+
+ public Class< ? > getType(WireDefinition wireDefinition) {
+ return TaskServiceImpl.class;
+ }
+}
Property changes on: jbpm4/task/trunk/modules/core/src/main/java/org/jbpm/task/xml/TaskServiceDescriptor.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/resources/hibernate.task.hbm.xml
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/resources/hibernate.task.hbm.xml (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/resources/hibernate.task.hbm.xml 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,152 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping auto-import="false" package="org.jbpm.task.impl" default-access="field">
+
+ <!-- ### TASK DEFINITION ################################################ -->
+ <class name="TaskDefinitionImpl" discriminator-value="T">
+ <id name="dbid" column="DBID_">
+ <generator class="native" />
+ </id>
+ <discriminator type="char" column="CLASS_"/>
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="name" column="NAME_"/>
+ <property name="description" column="DESCR_"/>
+
+ <property name="priority" column="PRIORITY_"/>
+ <property name="dueDateDuration" column="DUEDATE_"/>
+ <property name="isBlocking" column="BLOCK_"/>
+ <property name="isSignalling" column="SIGNAL_"/>
+ <property name="assigneeExpression" column="ASSIGNEE_EXPR_"/>
+ <property name="candidatesExpression" column="CANDIDATES_EXPR_"/>
+
+ <many-to-one name="assignerDescriptor"
+ column="ASSIGNER_DESCR_"
+ cascade="all"
+ class="org.jbpm.wire.descriptor.AbstractDescriptor"
+ foreign-key="FK_TSK_ASIG_DESCR"
+ index="IDX_TSK_ASIG_DESCR" />
+
+ <many-to-one name="swimlaneDefinition"
+ column="SWIMLANE_DEF_"
+ cascade="all"
+ class="SwimlaneDefinitionImpl"
+ foreign-key="FK_TSK_SWIML_DEF"
+ index="IDX_TSK_SWIML_DEF" />
+
+ <list name="subTaskDefinitions" cascade="all-delete-orphan">
+ <key column="TASKDEF_" />
+ <list-index column="TASKDEF_IDX_" />
+ <one-to-many class="TaskDefinitionImpl" />
+ </list>
+ </class>
+
+ <!-- ### TASK ########################################################### -->
+ <class name="TaskImpl"
+ discriminator-value="T">
+ <id name="dbid" column="DBID_">
+ <generator class="native" />
+ </id>
+ <discriminator type="char" column="CLASS_"/>
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="name" column="NAME_"/>
+ <property name="description" column="DESCR_"/>
+ <property name="assignee" column="ASSIGNEE_"/>
+
+ <set name="roles" cascade="all-delete-orphan">
+ <key column="TASK_" foreign-key="FK_ROLE_TASK" />
+ <one-to-many class="RoleImpl" />
+ </set>
+
+ <property name="priority" column="PRIORITY_"/>
+ <property name="create" column="CREATE_"/>
+ <property name="dueDate" column="DUEDATE_"/>
+ <property name="progress" column="PROGRESS_"/>
+
+ <many-to-one name="variableMap"
+ class="org.jbpm.pvm.impl.VariableMap"
+ column="VARMAP_"
+ foreign-key="FK_TASK_VARMAP"
+ cascade="all" />
+
+ <many-to-one name="swimlane"
+ class="SwimlaneImpl"
+ column="SWIMLANE_"
+ foreign-key="FK_TASK_SWIML" />
+
+ <many-to-one name="taskDefinition"
+ column="TASK_DEF_"
+ class="TaskDefinitionImpl"
+ foreign-key="FK_TSK_DEF"
+ index="IDX_TSK_DEF" />
+
+ <list name="comments" cascade="all-delete-orphan">
+ <key column="TASK_" />
+ <list-index column="TASK_IDX_" />
+ <one-to-many class="org.jbpm.pvm.impl.CommentImpl" />
+ </list>
+
+ <set name="subTasks" cascade="all-delete-orphan">
+ <key column="SUPERTASK_" foreign-key="FK_TASK_SUPERTASK" />
+ <one-to-many class="TaskImpl" />
+ </set>
+
+ </class>
+
+ <!-- ### ROLE ########################################################### -->
+ <class name="RoleImpl"
+ discriminator-value="R">
+ <id name="dbid" column="DBID_">
+ <generator class="native" />
+ </id>
+ <discriminator type="char" column="CLASS_"/>
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="identityId" column="IDENTITYID_"/>
+ <property name="roleType" type="org.jbpm.task.RoleType" column="ROLETYPE_" />
+ <property name="description" column="DESCR_"/>
+
+ <many-to-one name="task"
+ class="TaskImpl"
+ column="TASK_"
+ foreign-key="FK_ROLE_TASK" />
+
+ </class>
+
+ <!-- ### SWIMLANE DEFINITION ############################################ -->
+ <class name="SwimlaneDefinitionImpl">
+ <id name="dbid" column="DBID_">
+ <generator class="native" />
+ </id>
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="name" column="NAME_"/>
+ </class>
+
+
+ <!-- ### SWIMLANE ####################################################### -->
+ <class name="SwimlaneImpl">
+ <id name="dbid" column="DBID_">
+ <generator class="native" />
+ </id>
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="name" column="NAME_"/>
+ <property name="assignee" column="ASSIGNEE_"/>
+
+ <many-to-one name="swimlaneDefinition"
+ class="SwimlaneDefinitionImpl"
+ column="SWIMLANEDEF_"
+ foreign-key="FK_SWIMLANE_DEF" />
+
+ <set name="candidates" cascade="all-delete-orphan">
+ <key column="SWIMLANE_" foreign-key="FK_ROLE_SWIMLANE" />
+ <one-to-many class="RoleImpl" />
+ </set>
+
+ </class>
+
+</hibernate-mapping>
Property changes on: jbpm4/task/trunk/modules/core/src/main/resources/hibernate.task.hbm.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/resources/hibernate.task.queries.hbm.xml
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/resources/hibernate.task.queries.hbm.xml (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/resources/hibernate.task.queries.hbm.xml 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping>
+
+
+ <query name="findTasks">
+ <![CDATA[
+ select task
+ from org.jbpm.task.impl.TaskImpl as task
+ ]]>
+ </query>
+
+
+</hibernate-mapping>
\ No newline at end of file
Property changes on: jbpm4/task/trunk/modules/core/src/main/resources/hibernate.task.queries.hbm.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/resources/pvm.hibernate.mappings.xml
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/resources/pvm.hibernate.mappings.xml (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/resources/pvm.hibernate.mappings.xml 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,4 @@
+<mappings>
+ <mapping resource="hibernate.task.hbm.xml" />
+ <mapping resource="hibernate.task.queries.hbm.xml" />
+</mappings>
Property changes on: jbpm4/task/trunk/modules/core/src/main/resources/pvm.hibernate.mappings.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/main/resources/pvm.wire.bindings.xml
===================================================================
--- jbpm4/task/trunk/modules/core/src/main/resources/pvm.wire.bindings.xml (rev 0)
+++ jbpm4/task/trunk/modules/core/src/main/resources/pvm.wire.bindings.xml 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,6 @@
+<wire-bindings>
+
+ <binding tag="task-db-session" class="org.jbpm.task.xml.TaskDbSessionBinding" category="descriptor" />
+ <binding tag="task-service" class="org.jbpm.task.xml.TaskServiceBinding" category="descriptor" />
+
+</wire-bindings>
Property changes on: jbpm4/task/trunk/modules/core/src/main/resources/pvm.wire.bindings.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/task/TaskDbTest.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/task/TaskDbTest.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/task/TaskDbTest.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,391 @@
+/*
+ * 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.task;
+
+import org.jbpm.pvm.env.Environment;
+import org.jbpm.pvm.env.EnvironmentFactory;
+import org.jbpm.pvm.internal.util.Clock;
+import org.jbpm.pvm.internal.util.Priority;
+import org.jbpm.pvm.model.Comment;
+import org.jbpm.pvm.session.DbSession;
+import org.jbpm.pvm.test.base.DbTestCase;
+import org.jbpm.task.impl.RoleImpl;
+import org.jbpm.task.impl.SwimlaneImpl;
+import org.jbpm.task.impl.TaskDefinitionImpl;
+import org.jbpm.task.impl.TaskImpl;
+
+import java.util.*;
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskDbTest extends DbTestCase
+{
+
+ public void testTask() {
+ Date now = new Date();
+ Date inFiveMinutes = new Date(now.getTime()+ (5*60*1000));
+
+ TaskImpl task;
+ try {
+ Clock.setCurrentTime(now);
+ task = TaskImpl.create();
+ } finally {
+ Clock.setCurrentTime(null);
+ }
+ task.setName("hello");
+ task.setDescription("say hello to your neighbour developer");
+ task.setDueDate(inFiveMinutes);
+ task.setPriority(Priority.HIGHEST);
+
+ task = reload(task, TaskImpl.class);
+
+ assertEquals("hello", task.getName());
+ assertEquals("say hello to your neighbour developer", task.getDescription());
+ assertEquals(now, task.getCreate());
+ assertEquals(inFiveMinutes, task.getDueDate());
+ assertEquals(Priority.HIGHEST, task.getPriority());
+ }
+
+ public void testTaskAssignment() {
+ TaskImpl task = TaskImpl.create();
+ task.setAssignee("john doe");
+
+ task = reload(task, TaskImpl.class);
+
+ assertEquals("john doe", task.getAssignee());
+ }
+
+ public void testTaskReassignmentAssignment() {
+ TaskImpl task = TaskImpl.create();
+ task.setAssignee("johndoe");
+ assertEquals("johndoe", task.getAssignee());
+
+ task = reload(task, TaskImpl.class);
+
+ task.setAssignee("joesmoe");
+
+ task = reload(task, TaskImpl.class);
+
+ assertEquals("joesmoe", task.getAssignee());
+ }
+
+ public void testTaskRoles() {
+ TaskImpl task = TaskImpl.create();
+
+ assertNotNull(task.getRoles());
+ assertEquals(0, task.getRoles().size());
+
+ task.addRole("john doe", RoleType.CLIENT).setDescription("uses the result");
+ task.addRole("joe smoe", RoleType.OWNER).setDescription("does what he wants");
+ task.addRole("jack black", RoleType.CANDIDATE).setDescription("can take this task");
+ task.addRole("jim slim", RoleType.VIEWER).setDescription("is allowed to see");
+ task.addRole("jeff nef", RoleType.REPLACED_ASSIGNEE).setDescription("is sick");
+
+ task = reload(task, TaskImpl.class);
+
+ Map<String, RoleImpl> roleMap = getRoleMap(task.getRoles());
+
+ assertEquals(RoleType.CLIENT, roleMap.get("john doe").getRoleType());
+ assertEquals("uses the result", roleMap.get("john doe").getDescription());
+
+ assertEquals(RoleType.OWNER, roleMap.get("joe smoe").getRoleType());
+ assertEquals("does what he wants", roleMap.get("joe smoe").getDescription());
+
+ assertEquals(RoleType.CANDIDATE, roleMap.get("jack black").getRoleType());
+ assertEquals("can take this task", roleMap.get("jack black").getDescription());
+
+ assertEquals(RoleType.VIEWER, roleMap.get("jim slim").getRoleType());
+ assertEquals("is allowed to see", roleMap.get("jim slim").getDescription());
+
+ assertEquals(RoleType.REPLACED_ASSIGNEE, roleMap.get("jeff nef").getRoleType());
+ assertEquals("is sick", roleMap.get("jeff nef").getDescription());
+
+ assertEquals(5, roleMap.size());
+
+ task.removeRole(roleMap.get("john doe"));
+
+ task = reload(task, TaskImpl.class);
+
+ assertEquals(4, task.getRoles().size());
+ task.removeRole(getRoleMap(task.getRoles()).get("joe smoe"));
+
+ task = reload(task, TaskImpl.class);
+
+ assertEquals(3, task.getRoles().size());
+ task.removeRole(getRoleMap(task.getRoles()).get("jack black"));
+
+ task = reload(task, TaskImpl.class);
+
+ assertEquals(2, task.getRoles().size());
+ task.removeRole(getRoleMap(task.getRoles()).get("jim slim"));
+
+ task = reload(task, TaskImpl.class);
+
+ assertEquals(1, task.getRoles().size());
+ task.removeRole(getRoleMap(task.getRoles()).get("jeff nef"));
+
+ task = reload(task, TaskImpl.class);
+
+ assertEquals(0, getRoleMap(task.getRoles()).size());
+ }
+
+ public static Map<String, RoleImpl> getRoleMap(Set<RoleImpl> roles) {
+ Map<String, RoleImpl> roleMap = new HashMap<String, RoleImpl>();
+ for (RoleImpl role: roles) {
+ roleMap.put(role.getIdentityId(), role);
+ }
+ return roleMap;
+ }
+
+ public void testTaskAllRoles() {
+ SwimlaneImpl manager = new SwimlaneImpl();
+
+ manager.createCandidate("joe smoe").setDescription("too much tostesteron");
+ manager.createCandidate("jack black").setDescription("the pigeon");
+ manager.createCandidate("jim slim").setDescription("lame duck");
+
+ manager = reload(manager, SwimlaneImpl.class);
+
+ TaskImpl task = TaskImpl.create();
+ assertNotNull(task.getAllRoles());
+ assertEquals(0, task.getAllRoles().size());
+
+ task.addRole("john doe", RoleType.CLIENT).setDescription("uses the result");
+ assertEquals(1, task.getAllRoles().size());
+
+ task.addRole("jeff nef", RoleType.REPLACED_ASSIGNEE).setDescription("is sick");
+ task.setSwimlane(manager);
+
+ task = reload(task, TaskImpl.class);
+
+ Map<String, RoleImpl> roleMap = getRoleMap(task.getAllRoles());
+
+ assertEquals(RoleType.CLIENT, roleMap.get("john doe").getRoleType());
+ assertEquals("uses the result", roleMap.get("john doe").getDescription());
+
+ assertEquals(RoleType.CANDIDATE, roleMap.get("joe smoe").getRoleType());
+ assertEquals("too much tostesteron", roleMap.get("joe smoe").getDescription());
+
+ assertEquals(RoleType.CANDIDATE, roleMap.get("jack black").getRoleType());
+ assertEquals("the pigeon", roleMap.get("jack black").getDescription());
+
+ assertEquals(RoleType.CANDIDATE, roleMap.get("jim slim").getRoleType());
+ assertEquals("lame duck", roleMap.get("jim slim").getDescription());
+
+ assertEquals(RoleType.REPLACED_ASSIGNEE, roleMap.get("jeff nef").getRoleType());
+ assertEquals("is sick", roleMap.get("jeff nef").getDescription());
+
+ assertEquals(5, roleMap.size());
+
+ task.removeRole(roleMap.get("john doe"));
+
+ task = reload(task, TaskImpl.class);
+ manager = environment.get(DbSession.class).get(SwimlaneImpl.class, manager.getDbid());
+
+ assertEquals(4, task.getAllRoles().size());
+ manager.removeCandidate(getRoleMap(task.getAllRoles()).get("joe smoe"));
+
+ task = reload(task, TaskImpl.class);
+ manager = environment.get(DbSession.class).get(SwimlaneImpl.class, manager.getDbid());
+
+ assertEquals(3, task.getAllRoles().size());
+ manager.removeCandidate(getRoleMap(task.getAllRoles()).get("jack black"));
+
+ task = reload(task, TaskImpl.class);
+ manager = environment.get(DbSession.class).get(SwimlaneImpl.class, manager.getDbid());
+
+ assertEquals(2, task.getAllRoles().size());
+ manager.removeCandidate(getRoleMap(task.getAllRoles()).get("jim slim"));
+
+ task = reload(task, TaskImpl.class);
+ manager = environment.get(DbSession.class).get(SwimlaneImpl.class, manager.getDbid());
+
+ assertEquals(1, task.getAllRoles().size());
+ task.removeRole(getRoleMap(task.getAllRoles()).get("jeff nef"));
+
+ task = reload(task, TaskImpl.class);
+
+ assertEquals(0, task.getAllRoles().size());
+ }
+
+ public void testTaskComment() {
+ EnvironmentFactory environmentFactory = EnvironmentFactory.parseXmlString("<environment/>");
+ TaskImpl task = TaskImpl.create();
+
+ Environment environment = environmentFactory.openEnvironment();
+ try {
+ environment.setUserId("john doe");
+ task.createComment("should I really do this ? yuk.");
+ } finally {
+ environment.close();
+ }
+
+ task = reload(task, TaskImpl.class);
+
+ environment = environmentFactory.openEnvironment();
+ try {
+ environment.setUserId("joe smoe");
+ task.createComment("yes, you should really do it.");
+ } finally {
+ environment.close();
+ }
+
+ task = reload(task, TaskImpl.class);
+
+ List<Comment> comments = task.getComments();
+ assertNotNull(comments);
+
+ assertEquals("should I really do this ? yuk.", comments.get(0).getMessage());
+ assertEquals("john doe", comments.get(0).getUserId());
+
+ assertEquals("yes, you should really do it.", comments.get(1).getMessage());
+ assertEquals("joe smoe", comments.get(1).getUserId());
+ }
+
+ public void testTaskCommentReplies() {
+ TaskImpl task = TaskImpl.create();
+ Comment comment = task.createComment("hi, how are you?");
+ Comment reply = comment.createReply("i'm fine, thanks");
+ reply = reply.createReply("nice wheather, huh");
+ reply.createReply("snow's great fun");
+
+ task = reload(task, TaskImpl.class);
+
+ comment = task.createComment("are you going to the office?");
+ reply = comment.createReply("no not now");
+ reply = reply.createReply("when are you going");
+ reply.createReply("later");
+
+ task = reload(task, TaskImpl.class);
+
+ List<Comment> comments = task.getComments();
+ assertEquals("hi, how are you?", comments.get(0).getMessage());
+ assertEquals("i'm fine, thanks", comments.get(0).getReplies().get(0).getMessage());
+ assertEquals("nice wheather, huh", comments.get(0).getReplies().get(0).getReplies().get(0).getMessage());
+ assertEquals("snow's great fun", comments.get(0).getReplies().get(0).getReplies().get(0).getReplies().get(0).getMessage());
+
+ assertEquals("are you going to the office?", comments.get(1).getMessage());
+ assertEquals("no not now", comments.get(1).getReplies().get(0).getMessage());
+ assertEquals("when are you going", comments.get(1).getReplies().get(0).getReplies().get(0).getMessage());
+ assertEquals("later", comments.get(1).getReplies().get(0).getReplies().get(0).getReplies().get(0).getMessage());
+
+ comment = task.getComments().get(0);
+ comment.removeReply(comment.getReplies().get(0));
+
+ task = reload(task, TaskImpl.class);
+
+ assertEquals("hi, how are you?", comment.getMessage());
+ assertTrue(comment.getReplies().isEmpty());
+ assertEquals(2, task.getComments().size());
+
+ task.removeComment(task.getComments().get(1));
+
+ task = reload(task, TaskImpl.class);
+
+ assertEquals(1, task.getComments().size());
+ assertEquals("hi, how are you?", comment.getMessage());
+ }
+
+ public void testTaskWithDefinition() {
+ TaskDefinitionImpl taskDefinition = new TaskDefinitionImpl();
+ taskDefinition.setName("hello");
+ taskDefinition.setPriority(Priority.HIGH);
+
+ taskDefinition = reload(taskDefinition, TaskDefinitionImpl.class);
+
+ TaskImpl task = TaskImpl.create(taskDefinition);
+
+ task = reload(task, TaskImpl.class);
+
+ assertEquals("hello", task.getName());
+ assertEquals(Priority.HIGH, task.getPriority());
+ assertEquals("hello", task.getTaskDefinition().getName());
+ }
+
+ public void testSubTasks() {
+ TaskImpl improveWorld = TaskImpl.create();
+ improveWorld.setName("improve the world");
+
+ improveWorld.createSubTask("try to automate everything");
+
+ improveWorld = reload(improveWorld, TaskImpl.class);
+
+ improveWorld.createSubTask("discover the problem is in the workflow part");
+ TaskImpl writeWorkflowEngine = (TaskImpl) improveWorld.createSubTask("write an open source workflow engine");
+ writeWorkflowEngine.createSubTask("create a sf.net project");
+ Task commitCode = writeWorkflowEngine.createSubTask("commit code to cvs");
+ writeWorkflowEngine.createSubTask("nurture it and grow it");
+ writeWorkflowEngine.createSubTask("harvest a beautiful project");
+
+ improveWorld.createSubTask("automate everything with workflow");
+ improveWorld.createSubTask("create peace everywhere");
+
+ improveWorld = reload(improveWorld, TaskImpl.class);
+
+ writeWorkflowEngine = environment.get(DbSession.class).get(TaskImpl.class, writeWorkflowEngine.getDbid());
+
+ Set<String> expectedSubtaskNames = new HashSet<String>();
+ expectedSubtaskNames.add("try to automate everything");
+ expectedSubtaskNames.add("discover the problem is in the workflow part");
+ expectedSubtaskNames.add("write an open source workflow engine");
+ expectedSubtaskNames.add("automate everything with workflow");
+ expectedSubtaskNames.add("create peace everywhere");
+
+ Set<Task> subtasks = improveWorld.getSubTasks();
+ Set<String> subtaskNames = new HashSet<String>();
+ for (Task subtask: subtasks) {
+ subtaskNames.add(subtask.getName());
+ }
+
+ assertEquals(expectedSubtaskNames, subtaskNames);
+
+ expectedSubtaskNames = new HashSet<String>();
+ expectedSubtaskNames.add("create a sf.net project");
+ expectedSubtaskNames.add("commit code to cvs");
+ expectedSubtaskNames.add("nurture it and grow it");
+ expectedSubtaskNames.add("harvest a beautiful project");
+
+ subtasks = writeWorkflowEngine.getSubTasks();
+ subtaskNames = new HashSet<String>();
+ for (Task subtask: subtasks) {
+ subtaskNames.add(subtask.getName());
+ }
+
+ assertEquals(expectedSubtaskNames, subtaskNames);
+
+ writeWorkflowEngine = reload(writeWorkflowEngine, TaskImpl.class);
+ commitCode = environment.get(DbSession.class).get(TaskImpl.class, commitCode.getDbid());
+ writeWorkflowEngine.removeSubTask(commitCode);
+ expectedSubtaskNames.remove("commit code to cvs");
+
+ writeWorkflowEngine = reload(writeWorkflowEngine, TaskImpl.class);
+
+ subtasks = writeWorkflowEngine.getSubTasks();
+ subtaskNames = new HashSet<String>();
+ for (Task subtask: subtasks) {
+ subtaskNames.add(subtask.getName());
+ }
+
+ assertEquals(expectedSubtaskNames, subtaskNames);
+ }
+}
Property changes on: jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/task/TaskDbTest.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/task/TaskServiceTest.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/task/TaskServiceTest.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/task/TaskServiceTest.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,67 @@
+/*
+ * 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.task;
+
+import java.util.Date;
+import java.util.List;
+
+import org.hibernate.Session;
+import org.jbpm.task.impl.TaskImpl;
+import org.jbpm.pvm.test.base.ServiceTestCase;
+import org.jbpm.pvm.internal.cmd.Command;
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.env.Environment;
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskServiceTest extends ServiceTestCase
+{
+
+ public void testTaskService() {
+ TaskService taskService = getEnvironmentFactory().get(TaskService.class);
+
+ Task task = taskService.createTask();
+ task.setName("doing the dishes");
+ Date now = new Date();
+ task.setDueDate(now);
+ taskService.updateTask(task);
+
+ long taskDbid = task.getDbid();
+ task = taskService.getTask(taskDbid);
+ assertEquals("doing the dishes", task.getName());
+ assertEquals(now, task.getDueDate());
+
+ taskService.deleteTask(taskDbid);
+
+ // verify that the task table is empty
+ getEnvironmentFactory().get(CommandService.class).execute(new Command() {
+ public Object execute(Environment environment) throws Exception {
+ Session session = environment.get(Session.class);
+ List tasks = session.createQuery("from "+TaskImpl.class.getName()).list();
+ assertEquals(0, tasks.size());
+ return null;
+ }
+ });
+ }
+
+}
Property changes on: jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/task/TaskServiceTest.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/task/TaskTest.java
===================================================================
--- jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/task/TaskTest.java (rev 0)
+++ jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/task/TaskTest.java 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,312 @@
+/*
+ * 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.task;
+
+import org.jbpm.pvm.internal.util.Clock;
+import org.jbpm.pvm.internal.util.Priority;
+import org.jbpm.pvm.test.base.JbpmTestCase;
+import org.jbpm.pvm.env.EnvironmentFactory;
+import org.jbpm.pvm.env.Environment;
+import org.jbpm.pvm.model.Comment;
+import org.jbpm.task.impl.RoleImpl;
+import org.jbpm.task.impl.SwimlaneImpl;
+import org.jbpm.task.impl.TaskDefinitionImpl;
+import org.jbpm.task.impl.TaskImpl;
+
+import java.util.*;
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskTest extends JbpmTestCase
+{
+
+ public void testTask() {
+ Date now = new Date();
+ Date inFiveMinutes = new Date(now.getTime()+ (5*60*1000));
+
+ TaskImpl task;
+ try {
+ Clock.setCurrentTime(now);
+ task = TaskImpl.create();
+ } finally {
+ Clock.setCurrentTime(null);
+ }
+ task.setName("hello");
+ task.setDescription("say hello to your neighbour developer");
+ task.setDueDate(inFiveMinutes);
+ task.setPriority(Priority.HIGHEST);
+
+ assertEquals("hello", task.getName());
+ assertEquals("say hello to your neighbour developer", task.getDescription());
+ assertEquals(now, task.getCreate());
+ assertEquals(inFiveMinutes, task.getDueDate());
+ assertEquals(Priority.HIGHEST, task.getPriority());
+ }
+
+ public void testTaskAssignment() {
+ TaskImpl task = TaskImpl.create();
+ task.setAssignee("john doe");
+ assertEquals("john doe", task.getAssignee());
+ }
+
+ public void testTaskReassignmentAssignment() {
+ TaskImpl task = TaskImpl.create();
+ task.setAssignee("johndoe");
+ assertEquals("johndoe", task.getAssignee());
+ task.setAssignee("joesmoe");
+ assertEquals("joesmoe", task.getAssignee());
+ }
+
+ public void testTaskRoles() {
+ TaskImpl task = TaskImpl.create();
+
+ assertNotNull(task.getRoles());
+ assertEquals(0, task.getRoles().size());
+
+ task.addRole("john doe", RoleType.CLIENT).setDescription("uses the result");
+ task.addRole("joe smoe", RoleType.OWNER).setDescription("does what he wants");
+ task.addRole("jack black", RoleType.CANDIDATE).setDescription("can take this task");
+ task.addRole("jim slim", RoleType.VIEWER).setDescription("is allowed to see");
+ task.addRole("jeff nef", RoleType.REPLACED_ASSIGNEE).setDescription("is sick");
+
+ Set<RoleImpl> roles = task.getRoles();
+ Map<String, RoleImpl> roleMap = new HashMap<String, RoleImpl>();
+ for (RoleImpl role: roles) {
+ roleMap.put(role.getIdentityId(), role);
+ }
+
+ assertEquals(RoleType.CLIENT, roleMap.get("john doe").getRoleType());
+ assertEquals("uses the result", roleMap.get("john doe").getDescription());
+
+ assertEquals(RoleType.OWNER, roleMap.get("joe smoe").getRoleType());
+ assertEquals("does what he wants", roleMap.get("joe smoe").getDescription());
+
+ assertEquals(RoleType.CANDIDATE, roleMap.get("jack black").getRoleType());
+ assertEquals("can take this task", roleMap.get("jack black").getDescription());
+
+ assertEquals(RoleType.VIEWER, roleMap.get("jim slim").getRoleType());
+ assertEquals("is allowed to see", roleMap.get("jim slim").getDescription());
+
+ assertEquals(RoleType.REPLACED_ASSIGNEE, roleMap.get("jeff nef").getRoleType());
+ assertEquals("is sick", roleMap.get("jeff nef").getDescription());
+
+ assertEquals(5, roles.size());
+
+ task.removeRole(roleMap.get("john doe"));
+ assertEquals(4, task.getRoles().size());
+ task.removeRole(roleMap.get("joe smoe"));
+ assertEquals(3, task.getRoles().size());
+ task.removeRole(roleMap.get("jack black"));
+ assertEquals(2, task.getRoles().size());
+ task.removeRole(roleMap.get("jim slim"));
+ assertEquals(1, task.getRoles().size());
+ task.removeRole(roleMap.get("jeff nef"));
+ assertEquals(0, roles.size());
+ }
+
+ public void testTaskAllRoles() {
+ TaskImpl task = TaskImpl.create();
+
+ assertNotNull(task.getAllRoles());
+ assertEquals(0, task.getAllRoles().size());
+
+ task.addRole("john doe", RoleType.CLIENT).setDescription("uses the result");
+
+ SwimlaneImpl manager = new SwimlaneImpl();
+ task.setSwimlane(manager);
+
+ manager.createCandidate("joe smoe").setDescription("tostesteron ambition");
+ manager.createCandidate("jack black").setDescription("the pigeon");
+ manager.createCandidate("jim slim").setDescription("lame duck");
+
+ task.addRole("jeff nef", RoleType.REPLACED_ASSIGNEE).setDescription("is sick");
+
+ Set<RoleImpl> roles = task.getAllRoles();
+ Map<String, RoleImpl> roleMap = new HashMap<String, RoleImpl>();
+ for (RoleImpl role: roles) {
+ roleMap.put(role.getIdentityId(), role);
+ }
+
+ assertEquals(RoleType.CLIENT, roleMap.get("john doe").getRoleType());
+ assertEquals("uses the result", roleMap.get("john doe").getDescription());
+
+ assertEquals(RoleType.CANDIDATE, roleMap.get("joe smoe").getRoleType());
+ assertEquals("tostesteron ambition", roleMap.get("joe smoe").getDescription());
+
+ assertEquals(RoleType.CANDIDATE, roleMap.get("jack black").getRoleType());
+ assertEquals("the pigeon", roleMap.get("jack black").getDescription());
+
+ assertEquals(RoleType.CANDIDATE, roleMap.get("jim slim").getRoleType());
+ assertEquals("lame duck", roleMap.get("jim slim").getDescription());
+
+ assertEquals(RoleType.REPLACED_ASSIGNEE, roleMap.get("jeff nef").getRoleType());
+ assertEquals("is sick", roleMap.get("jeff nef").getDescription());
+
+ assertEquals(5, roles.size());
+
+ task.removeRole(roleMap.get("john doe"));
+ assertEquals(4, task.getAllRoles().size());
+ manager.removeCandidate(roleMap.get("joe smoe"));
+ assertEquals(3, task.getAllRoles().size());
+ manager.removeCandidate(roleMap.get("jack black"));
+ assertEquals(2, task.getAllRoles().size());
+ manager.removeCandidate(roleMap.get("jim slim"));
+ assertEquals(1, task.getAllRoles().size());
+ task.removeRole(roleMap.get("jeff nef"));
+ assertEquals(0, task.getAllRoles().size());
+ }
+
+ public void testTaskComment() {
+ EnvironmentFactory environmentFactory = EnvironmentFactory.parseXmlString("<environment/>");
+ TaskImpl task = TaskImpl.create();
+
+ Environment environment = environmentFactory.openEnvironment();
+ try {
+ environment.setUserId("john doe");
+ task.createComment("should I really do this ? yuk.");
+ } finally {
+ environment.close();
+ }
+
+ environment = environmentFactory.openEnvironment();
+ try {
+ environment.setUserId("joe smoe");
+ task.createComment("yes, you should really do it.");
+ } finally {
+ environment.close();
+ }
+
+ List<Comment> comments = task.getComments();
+ assertNotNull(comments);
+
+ assertEquals("should I really do this ? yuk.", comments.get(0).getMessage());
+ assertEquals("john doe", comments.get(0).getUserId());
+
+ assertEquals("yes, you should really do it.", comments.get(1).getMessage());
+ assertEquals("joe smoe", comments.get(1).getUserId());
+ }
+
+ public void testTaskCommentReplies() {
+ TaskImpl task = TaskImpl.create();
+ Comment comment = task.createComment("hi, how are you?");
+ Comment reply = comment.createReply("i'm fine, thanks");
+ reply = reply.createReply("nice wheather, huh");
+ reply.createReply("snow's great fun");
+
+ comment = task.createComment("are you going to the office?");
+ reply = comment.createReply("no not now");
+ reply = reply.createReply("when are you going");
+ reply.createReply("later");
+
+ List<Comment> comments = task.getComments();
+ assertEquals("hi, how are you?", comments.get(0).getMessage());
+ assertEquals("i'm fine, thanks", comments.get(0).getReplies().get(0).getMessage());
+ assertEquals("nice wheather, huh", comments.get(0).getReplies().get(0).getReplies().get(0).getMessage());
+ assertEquals("snow's great fun", comments.get(0).getReplies().get(0).getReplies().get(0).getReplies().get(0).getMessage());
+
+ assertEquals("are you going to the office?", comments.get(1).getMessage());
+ assertEquals("no not now", comments.get(1).getReplies().get(0).getMessage());
+ assertEquals("when are you going", comments.get(1).getReplies().get(0).getReplies().get(0).getMessage());
+ assertEquals("later", comments.get(1).getReplies().get(0).getReplies().get(0).getReplies().get(0).getMessage());
+
+ comment = task.getComments().get(0);
+ comment.removeReply(comment.getReplies().get(0));
+
+ assertEquals("hi, how are you?", comment.getMessage());
+ assertTrue(comment.getReplies().isEmpty());
+ assertEquals(2, task.getComments().size());
+
+ task.removeComment(task.getComments().get(1));
+
+ assertEquals(1, task.getComments().size());
+ assertEquals("hi, how are you?", comment.getMessage());
+ }
+
+ public void testTaskWithDefinition() {
+ TaskDefinitionImpl taskDefinition = new TaskDefinitionImpl();
+ taskDefinition.setName("hello");
+ taskDefinition.setPriority(Priority.HIGH);
+
+ TaskImpl task = TaskImpl.create(taskDefinition);
+ assertEquals("hello", task.getName());
+ assertEquals(Priority.HIGH, task.getPriority());
+ assertEquals("hello", task.getTaskDefinition().getName());
+ }
+
+ public void testSubTasks() {
+ TaskImpl improveWorld = TaskImpl.create();
+ improveWorld.setName("improve the world");
+
+ improveWorld.createSubTask("try to automate everything");
+ improveWorld.createSubTask("discover the problem is in the workflow part");
+ Task writeWorkflowEngine = improveWorld.createSubTask("write an open source workflow engine");
+ writeWorkflowEngine.createSubTask("create a sf.net project");
+ Task commitCode = writeWorkflowEngine.createSubTask("commit code to cvs");
+ writeWorkflowEngine.createSubTask("nurture it and grow it");
+ writeWorkflowEngine.createSubTask("harvest a beautiful project");
+
+ improveWorld.createSubTask("automate everything with workflow");
+ improveWorld.createSubTask("create peace everywhere");
+
+ Set<String> expectedSubtaskNames = new HashSet<String>();
+ expectedSubtaskNames.add("try to automate everything");
+ expectedSubtaskNames.add("discover the problem is in the workflow part");
+ expectedSubtaskNames.add("write an open source workflow engine");
+ expectedSubtaskNames.add("automate everything with workflow");
+ expectedSubtaskNames.add("create peace everywhere");
+
+ Set<Task> subtasks = improveWorld.getSubTasks();
+ Set<String> subtaskNames = new HashSet<String>();
+ for (Task subtask: subtasks) {
+ subtaskNames.add(subtask.getName());
+ }
+
+ assertEquals(expectedSubtaskNames, subtaskNames);
+
+ expectedSubtaskNames = new HashSet<String>();
+ expectedSubtaskNames.add("create a sf.net project");
+ expectedSubtaskNames.add("commit code to cvs");
+ expectedSubtaskNames.add("nurture it and grow it");
+ expectedSubtaskNames.add("harvest a beautiful project");
+
+ subtasks = writeWorkflowEngine.getSubTasks();
+ subtaskNames = new HashSet<String>();
+ for (Task subtask: subtasks) {
+ subtaskNames.add(subtask.getName());
+ }
+
+ assertEquals(expectedSubtaskNames, subtaskNames);
+
+ writeWorkflowEngine.removeSubTask(commitCode);
+
+ expectedSubtaskNames.remove("commit code to cvs");
+
+ subtasks = writeWorkflowEngine.getSubTasks();
+ subtaskNames = new HashSet<String>();
+ for (Task subtask: subtasks) {
+ subtaskNames.add(subtask.getName());
+ }
+
+ assertEquals(expectedSubtaskNames, subtaskNames);
+ }
+}
Property changes on: jbpm4/task/trunk/modules/core/src/test/java/org/jbpm/task/TaskTest.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/modules/core/src/test/resources/org.jbpm.task.cfg.xml
===================================================================
--- jbpm4/task/trunk/modules/core/src/test/resources/org.jbpm.task.cfg.xml (rev 0)
+++ jbpm4/task/trunk/modules/core/src/test/resources/org.jbpm.task.cfg.xml 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,31 @@
+<environment>
+
+ <application>
+
+ <pvm-service />
+ <task-service />
+
+ <standard-command-service>
+ <retry-interceptor />
+ <environment-interceptor />
+ <transaction-interceptor />
+ </standard-command-service>
+
+ <hibernate-configuration>
+ <properties resource="hibernate.properties" />
+ <mappings resources="pvm.hibernate.mappings.xml" />
+ <cache-configuration resource="pvm.definition.cache.xml" usage="nonstrict-read-write" />
+ </hibernate-configuration>
+ <hibernate-session-factory />
+ <variable-types resource="pvm.variable.types.xml" />
+
+ </application>
+
+ <block>
+ <standard-transaction />
+ <hibernate-session />
+ <pvm-db-session />
+ <task-db-session />
+ </block>
+
+</environment>
Property changes on: jbpm4/task/trunk/modules/core/src/test/resources/org.jbpm.task.cfg.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: jbpm4/task/trunk/pom.xml
===================================================================
--- jbpm4/task/trunk/pom.xml (rev 0)
+++ jbpm4/task/trunk/pom.xml 2008-07-14 14:00:53 UTC (rev 1620)
@@ -0,0 +1,162 @@
+<?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$ -->
+
+<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>JBoss jBPM 4 - Task</name>
+ <groupId>org.jboss.jbpm</groupId>
+ <artifactId>task</artifactId>
+ <packaging>pom</packaging>
+
+ <version>4.0.0-SNAPSHOT</version>
+
+ <!-- Parent -->
+ <parent>
+ <groupId>org.jboss.jbpm</groupId>
+ <artifactId>jbpm-parent</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+
+ <!-- Modules -->
+ <modules>
+ <module>modules/core</module>
+ </modules>
+
+ <!-- Properties -->
+ <properties>
+ <pvm.version>1.0.0-SNAPSHOT</pvm.version>
+ <jboss.jbpm.api.version>1.0.0-SNAPSHOT</jboss.jbpm.api.version>
+ <junit.version>3.8.2</junit.version>
+ <log4j.version>1.2.14</log4j.version>
+ </properties>
+
+ <!-- DependencyManagement -->
+ <dependencyManagement>
+ <dependencies>
+ <!-- jBPM Dependencies -->
+ <dependency>
+ <groupId>org.jboss.jbpm.pvm</groupId>
+ <artifactId>pvm-core</artifactId>
+ <version>${pvm.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.jbpm</groupId>
+ <artifactId>jbpm-api</artifactId>
+ <version>${jboss.jbpm.api.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>${log4j.version}</version>
+ </dependency>
+
+ <!-- Compile Dependencies -->
+ <!--dependency>
+ <groupId>bsh</groupId>
+ <artifactId>bsh</artifactId>
+ </dependency-->
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>${junit.version}</version>
+ </dependency>
+
+ </dependencies>
+ </dependencyManagement>
+ <!-- Plugins -->
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+ <!-- DistributionManagement -->
+ <distributionManagement>
+ <site>
+ <id>jbws.dyndns.org</id>
+ <url>file:///home/tdiesler/workspace/jbpm-site</url>
+ </site>
+ </distributionManagement>
+
+ <!-- Profiles -->
+ <profiles>
+
+ <!--
+ Name: skiptests
+ Desc: Skips the tests
+ -->
+ <profile>
+ <id>skiptests</id>
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <skipTests>true</skipTests>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+
+ <reporting>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <configuration>
+ <quiet>true</quiet>
+ <source>1.5</source>
+ <verbose>false</verbose>
+ <excludePackageNames>*.internal:*.test</excludePackageNames>
+ </configuration>
+ </plugin>
+ </plugins>
+ </reporting>
+
+ <repositories>
+ <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>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.org/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>
+ </repositories>
+
+</project>
Property changes on: jbpm4/task/trunk/pom.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
More information about the jbpm-commits
mailing list