[jboss-svn-commits] JBL Code SVN: r22723 - in labs/jbossrules/trunk/drools-process: drools-process-task/src/main/java/org/drools/task and 11 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Sep 12 13:44:38 EDT 2008


Author: mark.proctor at jboss.com
Date: 2008-09-12 13:44:38 -0400 (Fri, 12 Sep 2008)
New Revision: 22723

Added:
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Content.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/EmailNotification.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/EmailNotificationHeader.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/NotificationType.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/UserInfo.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/WorkItemNotification.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/SendIcal.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/drools.process.email.conf
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/MockUserInfo.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingGetContentResponseHandler.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingSetContentResponseHandler.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/IcalTest.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceEmailNotificationTest.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/resources/org/drools/task/service/Notification1.mvel
Removed:
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/AttachmentContent.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingGetAttachmentContentResponseHandler.java
Modified:
   labs/jbossrules/trunk/drools-process/drools-process-task/.classpath
   labs/jbossrules/trunk/drools-process/drools-process-task/.project
   labs/jbossrules/trunk/drools-process/drools-process-task/pom.xml
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Attachment.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Deadline.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/I18NText.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Notification.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Task.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/TaskData.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/CommandName.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/DefaultEscalatedDeadlineHandler.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/EscalatedDeadlineHandler.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskClient.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskClientHandler.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServerHandler.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskService.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/utils/CollectionUtils.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/persistence.xml
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/BaseTest.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/ModelPersistenceTest.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceCommentsAndAttachmentsTest.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceEscalationTest.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceLifeCycleTest.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/resources/org/drools/task/FullyPopulatedTask.mvel
   labs/jbossrules/trunk/drools-process/drools-workitems/.classpath
   labs/jbossrules/trunk/drools-process/drools-workitems/.project
   labs/jbossrules/trunk/drools-process/drools-workitems/pom.xml
   labs/jbossrules/trunk/drools-process/drools-workitems/src/main/java/org/drools/process/workitem/email/SendHtml.java
   labs/jbossrules/trunk/drools-process/drools-workitems/src/main/java/org/drools/process/workitem/wsht/WSHumanTaskHandler.java
   labs/jbossrules/trunk/drools-process/drools-workitems/src/test/java/org/drools/process/workitem/email/EmailWorkItemHandlerTest.java
Log:
JBRULES-1745 WS-Human-Task
-Cal emails when reserving a task is now supported.
-had to remove task test from workitems project, due to cyclic deps.

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/.classpath	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/.classpath	2008-09-12 17:44:38 UTC (rev 22723)
@@ -1,30 +1,53 @@
-<classpath>
-  <classpathentry kind="src" path="src/main/java"/>
-  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
-  <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
-  <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
-  <classpathentry kind="output" path="target/classes"/>
-  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-  <classpathentry kind="var" path="M2_REPO/com/h2database/h2/1.0.77/h2-1.0.77.jar"/>
-  <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.3/xstream-1.3.jar"/>
-  <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar"/>
-  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/apache/mina/mina-core/2.0.0-M3/mina-core-2.0.0-M3.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.5.2/slf4j-api-1.5.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-entitymanager/3.4.0.GA/hibernate-entitymanager-3.4.0.GA.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hibernate/ejb3-persistence/1.0.2.GA/ejb3-persistence-1.0.2.GA.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-commons-annotations/3.1.0.GA/hibernate-commons-annotations-3.1.0.GA.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-annotations/3.4.0.GA/hibernate-annotations-3.4.0.GA.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-core/3.3.0.SP1/hibernate-core-3.3.0.SP1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6.jar"/>
-  <classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.1/commons-collections-3.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/javax/transaction/jta/1.1/jta-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/javassist/javassist/3.4.GA/javassist-3.4.GA.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.0.1/jmock-2.5.0.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-SNAPSHOT/mvel-2.0-SNAPSHOT.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-jdk14/1.5.2/slf4j-jdk14-1.5.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/postgresql/postgresql/8.3-603.jdbc3/postgresql-8.3-603.jdbc3.jar"/>
+<classpath>
+  <classpathentry kind="src" path="src/main/java"/>
+  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+  <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+  <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="var" path="M2_REPO/com/h2database/h2/1.0.77/h2-1.0.77.jar"/>
+  <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.3/xstream-1.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/mina/mina-core/2.0.0-M3/mina-core-2.0.0-M3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.5.2/slf4j-api-1.5.2.jar"/>
+  <classpathentry kind="src" path="/drools-workitems"/>
+  <classpathentry kind="src" path="/drools-core"/>
+  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-SNAPSHOT/mvel-2.0-SNAPSHOT.jar"/>
+  <classpathentry kind="src" path="/drools-compiler"/>
+  <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0.1/antlr-runtime-3.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/antlr/gunit/1.0.1/gunit-1.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/antlr/antlr/3.0.1/antlr-3.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
+  <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/mail/mail/1.4/mail-1.4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/activation/activation/1.1/activation-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-finder/1.0-SNAPSHOT/commons-finder-1.0-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-io/commons-io/1.4/commons-io-1.4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-cli/2.0-SNAPSHOT/commons-cli-2.0-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-compress/1.0-SNAPSHOT/commons-compress-1.0-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-exec/1.0.0-SNAPSHOT/commons-exec-1.0.0-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-entitymanager/3.4.0.GA/hibernate-entitymanager-3.4.0.GA.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hibernate/ejb3-persistence/1.0.2.GA/ejb3-persistence-1.0.2.GA.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-commons-annotations/3.1.0.GA/hibernate-commons-annotations-3.1.0.GA.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-annotations/3.4.0.GA/hibernate-annotations-3.4.0.GA.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-core/3.3.0.SP1/hibernate-core-3.3.0.SP1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.1/commons-collections-3.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/xml-apis/xml-apis/2.0.2/xml-apis-2.0.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/transaction/jta/1.1/jta-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javassist/javassist/3.4.GA/javassist-3.4.GA.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.0.1/jmock-2.5.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-jdk14/1.5.2/slf4j-jdk14-1.5.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/subethamail/subethasmtp-wiser/1.2/subethasmtp-wiser-1.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/subethamail/subethasmtp-smtp/1.2/subethasmtp-smtp-1.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.13/log4j-1.2.13.jar"/>
+  <classpathentry kind="var" path="M2_REPO/logkit/logkit/1.0.1/logkit-1.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/servlet/servlet-api/2.3/servlet-api-2.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/postgresql/postgresql/8.3-603.jdbc3/postgresql-8.3-603.jdbc3.jar"/>
 </classpath>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/.project
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/.project	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/.project	2008-09-12 17:44:38 UTC (rev 22723)
@@ -1,7 +1,11 @@
 <projectDescription>
   <name>drools-process-task</name>
   <comment>A rule production system</comment>
-  <projects/>
+  <projects>
+    <project>drools-workitems</project>
+    <project>drools-core</project>
+    <project>drools-compiler</project>
+  </projects>
   <buildSpec>
     <buildCommand>
       <name>org.eclipse.jdt.core.javabuilder</name>

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/pom.xml	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/pom.xml	2008-09-12 17:44:38 UTC (rev 22723)
@@ -12,8 +12,14 @@
   <packaging>jar</packaging>
   <name>Drools :: Process :: Task</name> 
     
-      <dependencies> 	        
+      <dependencies> 	       
     	<dependency>
+    		<groupId>org.drools</groupId>
+    		<artifactId>drools-workitems</artifactId>
+    		<version>${project.version}</version>
+    	</dependency>         		  
+       
+    	<dependency>
     		<groupId>org.apache.mina</groupId>
     		<artifactId>mina-core</artifactId>
     		<version>2.0.0-M3</version>
@@ -60,7 +66,14 @@
         <dependency>
             <groupId>org.mvel</groupId>
             <artifactId>mvel</artifactId>
-        </dependency>              	  
+        </dependency>         
+        
+      <dependency>
+          <groupId>org.subethamail</groupId>
+          <artifactId>subethasmtp-wiser</artifactId>
+          <version>1.2</version>
+          <scope>test</scope>
+    </dependency>     	  
       </dependencies>              
                   
 </project>

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Attachment.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Attachment.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Attachment.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -44,7 +44,7 @@
 
     private int    size;    
     
-    private long   contentId;
+    private long   attachmentContentId;
     
     public void writeExternal(ObjectOutput out) throws IOException {
         out.writeLong( id );
@@ -54,7 +54,7 @@
         attachedBy.writeExternal( out );
         out.writeLong( attachedAt.getTime() );
         out.writeInt( size );
-        out.writeLong( contentId );
+        out.writeLong( attachmentContentId );
     }
     
     public void readExternal(ObjectInput in) throws IOException,
@@ -67,7 +67,7 @@
         attachedBy.readExternal( in );        
         attachedAt = new Date( in.readLong() );
         size = in.readInt( );
-        contentId = in.readLong();
+        attachmentContentId = in.readLong();
     }
 
     public Long getId() {
@@ -126,12 +126,12 @@
         this.size = size;
     }
         
-    public long getContentId() {
-        return contentId;
+    public long getAttachmentContentId() {
+        return attachmentContentId;
     }
 
-    public void setContentId(long contentId) {
-        this.contentId = contentId;
+    public void setAttachmentContentId(long contentId) {
+        this.attachmentContentId = contentId;
     }
 
     @Override
@@ -142,7 +142,7 @@
         result = prime * result + ((attachedAt == null) ? 0 : attachedAt.hashCode());
         result = prime * result + ((attachedBy == null) ? 0 : attachedBy.hashCode());
         result = prime * result + size;
-        result = prime * result + (int) (contentId ^ (contentId >>> 32));
+        result = prime * result + (int) (attachmentContentId ^ (attachmentContentId >>> 32));
         result = prime * result + ((contentType == null) ? 0 : contentType.hashCode());
         result = prime * result + ((name == null) ? 0 : name.hashCode());
         return result;
@@ -164,7 +164,7 @@
             if ( other.attachedBy != null ) return false;
         } else if ( !attachedBy.equals( other.attachedBy ) ) return false;
         if ( size != other.size ) return false;
-        if ( contentId != other.contentId ) return false;
+        if ( attachmentContentId != other.attachmentContentId ) return false;
         if ( contentType == null ) {
             if ( other.contentType != null ) return false;
         } else if ( !contentType.equals( other.contentType ) ) return false;

Deleted: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/AttachmentContent.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/AttachmentContent.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/AttachmentContent.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -1,76 +0,0 @@
-package org.drools.task;
-
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Arrays;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Lob;
-
- at Entity
-public class AttachmentContent implements Externalizable {
-    @Id
-    @GeneratedValue(strategy = GenerationType.AUTO)
-    private long   id;
-    
-    @Lob
-    private byte[] content;
-    
-    public AttachmentContent() {
-        
-    }    
-    
-    public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeLong( id );
-        out.writeInt( content.length );
-        out.write( content );        
-    }
-    
-    public void readExternal(ObjectInput in) throws IOException,
-                                            ClassNotFoundException {
-        id = in.readLong();
-        content = new byte[ in.readInt() ];
-        in.read( content );
-    }
-
-    public long getId() {
-        return id;
-    }
-
-    public void setId(long id) {
-        this.id = id;
-    }
-
-    public byte[] getContent() {
-        return content;
-    }
-
-    public void setContent(byte[] content) {
-        this.content = content;
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + Arrays.hashCode( content );
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if ( this == obj ) return true;
-        if ( obj == null ) return false;
-        if ( !(obj instanceof AttachmentContent) ) return false;
-        AttachmentContent other = (AttachmentContent) obj;
-        if ( !Arrays.equals( content,
-                             other.content ) ) return false;
-        return true;
-    }
-        
-}

Copied: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Content.java (from rev 22401, labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/AttachmentContent.java)
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Content.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Content.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -0,0 +1,76 @@
+package org.drools.task;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Arrays;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+
+ at Entity
+public class Content implements Externalizable {
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private long   id;
+    
+    @Lob
+    private byte[] content;
+    
+    public Content() {
+        
+    }    
+    
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeLong( id );
+        out.writeInt( content.length );
+        out.write( content );        
+    }
+    
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        id = in.readLong();
+        content = new byte[ in.readInt() ];
+        in.read( content );
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public byte[] getContent() {
+        return content;
+    }
+
+    public void setContent(byte[] content) {
+        this.content = content;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + Arrays.hashCode( content );
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( !(obj instanceof Content) ) return false;
+        Content other = (Content) obj;
+        if ( !Arrays.equals( content,
+                             other.content ) ) return false;
+        return true;
+    }
+        
+}


Property changes on: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Content.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Deadline.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Deadline.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Deadline.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -58,7 +58,7 @@
             date = new Date( in.readLong() );
         }
         documentation = CollectionUtils.readI18NTextList( in );
-        escalations = CollectionUtils.readIEscalationList( in );       
+        escalations = CollectionUtils.readEscalationList( in );       
     }
 
     public long getId() {

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/EmailNotification.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/EmailNotification.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/EmailNotification.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -0,0 +1,82 @@
+package org.drools.task;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.ManyToMany;
+import javax.persistence.OneToMany;
+
+
+ at Entity
+public class EmailNotification extends Notification {
+    @OneToMany(cascade = CascadeType.ALL)
+    private Map<String, EmailNotificationHeader> emailHeaders;
+    
+    @Override
+    public void writeExternal(ObjectOutput out) throws IOException {
+        super.writeExternal( out );
+        if ( emailHeaders != null ) {
+            out.writeInt( emailHeaders.size() );
+            for ( EmailNotificationHeader header : emailHeaders.values() ) {
+                header.writeExternal( out );
+            }
+        } else {
+            out.writeInt( 0 );
+        }
+    }
+    
+    @Override
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        super.readExternal( in );
+        int size = in.readInt();
+        if ( size > 0 ) {
+            emailHeaders = new HashMap<String, EmailNotificationHeader>(size);
+            for ( int i = 0; i < size; i++ ) {
+                EmailNotificationHeader header = new EmailNotificationHeader();
+                header.readExternal( in );
+                emailHeaders.put( header.getLanguage(), header);
+            }
+        }
+    }
+    
+    public NotificationType getNotificationType() {
+        return NotificationType.Email;
+    }        
+
+    public Map<String, EmailNotificationHeader> getEmailHeaders() {
+        return emailHeaders;
+    }
+
+    public void setEmailHeaders(Map<String, EmailNotificationHeader> emailHeaders) {
+        this.emailHeaders = emailHeaders;
+    }    
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((emailHeaders == null) ? 0 : emailHeaders.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( !super.equals( obj ) ) return false;
+        if ( !(obj instanceof EmailNotification) ) return false;
+        EmailNotification other = (EmailNotification) obj;
+        if ( emailHeaders == null ) {
+            if ( other.emailHeaders != null ) return false;
+        } else if ( !emailHeaders.equals( other.emailHeaders ) ) return false;
+        return true;
+    }    
+    
+    
+    
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/EmailNotificationHeader.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/EmailNotificationHeader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/EmailNotificationHeader.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -0,0 +1,186 @@
+/**
+ * 
+ */
+package org.drools.task;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+
+ at Entity
+public class EmailNotificationHeader implements Externalizable {
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private long   id;
+    
+    private String language;    
+    
+    @Column( name = "replyToAddress" ) // just rename for consistency
+    private String replyTo;
+        
+    @Column( name = "fromAddress" ) // have to rename as schema's break otherwise
+    private String from;
+    
+    private String subject;
+    
+    @Lob
+    private String body;
+    
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeLong( id );
+        
+        if ( language != null ) {
+            out.writeBoolean( true );
+            out.writeUTF( language );
+        } else {
+            out.writeBoolean( false );
+        }
+        
+        if ( subject != null ) {
+            out.writeBoolean( true );
+            out.writeUTF( subject );
+        } else {
+            out.writeBoolean( false );
+        }
+        
+        if ( replyTo != null ) {
+            out.writeBoolean( true );
+            out.writeUTF( replyTo );
+        } else {
+            out.writeBoolean( false );
+        }
+        
+        if ( from != null ) {
+            out.writeBoolean( true );
+            out.writeUTF( from );
+        } else {
+            out.writeBoolean( false );
+        }        
+        
+        if ( body != null ) {
+            out.writeBoolean( true );
+            out.writeUTF( body );
+        } else {
+            out.writeBoolean( false );
+        }          
+    }
+
+    
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        id = in.readLong();
+        
+        if ( in.readBoolean() ) {
+            language = in.readUTF();
+        }
+        
+        if ( in.readBoolean() ) {
+            subject = in.readUTF();
+        }
+     
+        if ( in.readBoolean() ) {
+            replyTo = in.readUTF();
+        }
+        
+        if ( in.readBoolean() ) {
+            from = in.readUTF();
+        }
+        
+        if ( in.readBoolean() ) {
+            body = in.readUTF();
+        }        
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public String getLanguage() {
+        return language;
+    }
+
+    public void setLanguage(String language) {
+        this.language = language;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getBody() {
+        return body;
+    }
+
+    public void setBody(String body) {
+        this.body = body;
+    }
+
+    public String getReplyTo() {
+        return replyTo;
+    }
+
+    public void setReplyTo(String replyTo) {
+        this.replyTo = replyTo;
+    }
+
+    public String getFrom() {
+        return from;
+    }
+
+    public void setFrom(String from) {
+        this.from = from;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((subject == null) ? 0 : subject.hashCode());
+        result = prime * result + ((body == null) ? 0 : body.hashCode());
+        result = prime * result + ((from == null) ? 0 : from.hashCode());
+        result = prime * result + ((language == null) ? 0 : language.hashCode());
+        result = prime * result + ((replyTo == null) ? 0 : replyTo.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( !(obj instanceof EmailNotificationHeader) ) return false;
+        EmailNotificationHeader other = (EmailNotificationHeader) obj;
+        if ( subject == null ) {
+            if ( other.subject != null ) return false;
+        } else if ( !subject.equals( other.subject ) ) return false;
+        if ( body == null ) {
+            if ( other.body != null ) return false;
+        } else if ( !body.equals( other.body ) ) return false;
+        if ( from == null ) {
+            if ( other.from != null ) return false;
+        } else if ( !from.equals( other.from ) ) return false;
+        if ( language == null ) {
+            if ( other.language != null ) return false;
+        } else if ( !language.equals( other.language ) ) return false;
+        if ( replyTo == null ) {
+            if ( other.replyTo != null ) return false;
+        } else if ( !replyTo.equals( other.replyTo ) ) return false;
+        return true;
+    }
+          
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/I18NText.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/I18NText.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/I18NText.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -5,6 +5,7 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.io.Serializable;
+import java.util.List;
 
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
@@ -93,6 +94,22 @@
         } else if ( !text.equals( other.text ) ) return false;
         return true;
     }
+    
+    public static String getLocalText(List<I18NText> list, String prefferedLanguage, String defaultLanguage) {
+        for ( I18NText text : list) {
+            if ( text.getLanguage().equals( prefferedLanguage )) {
+                return text.getText();
+            }
+        }
+        if (  defaultLanguage == null ) {
+            for ( I18NText text : list) {
+                if ( text.getLanguage().equals( defaultLanguage )) {
+                    return text.getText();
+                }
+            }    
+        }
+        return "";
+    }
 
 
     

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Notification.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Notification.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Notification.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -15,7 +15,9 @@
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
 import javax.persistence.Lob;
+import javax.persistence.ManyToMany;
 import javax.persistence.OneToMany;
 
 import org.drools.task.utils.CollectionUtils;
@@ -31,13 +33,13 @@
     private List<I18NText>                   documentation = Collections.emptyList();
 
     private int                              priority;
-
-    @OneToMany
-    @JoinColumn(name = "Notification_Recipients_Id", nullable = true)
+    
+    @ManyToMany
+    @JoinTable(name = "Notification_Recipients", joinColumns = @JoinColumn(name = "task_id"), inverseJoinColumns = @JoinColumn(name = "entity_id"))    
     private List<OrganizationalEntity>       recipients = Collections.emptyList();;
 
-    @OneToMany
-    @JoinColumn(name = "Notification_BusinessAdministrators_Id", nullable = true)
+    @ManyToMany
+    @JoinTable(name = "Notification_BusinessAdministrators", joinColumns = @JoinColumn(name = "task_id"), inverseJoinColumns = @JoinColumn(name = "entity_id"))
     private List<OrganizationalEntity>       businessAdministrators = Collections.emptyList();
 
     @OneToMany(cascade = CascadeType.ALL)
@@ -74,7 +76,8 @@
         
         recipients = CollectionUtils.readOrganizationalEntityList( in );
         businessAdministrators = CollectionUtils.readOrganizationalEntityList( in );
-        
+                
+        documentation = CollectionUtils.readI18NTextList( in );
         names = CollectionUtils.readI18NTextList( in );
         subjects = CollectionUtils.readI18NTextList( in );
         descriptions = CollectionUtils.readI18NTextList( in );        
@@ -87,6 +90,10 @@
     public void setId(long id) {
         this.id = id;
     }
+    
+    public NotificationType getNotificationType() {
+        return NotificationType.Default;
+    }
 
     public List<I18NText> getDocumentation() {
         return documentation;

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/NotificationType.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/NotificationType.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/NotificationType.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -0,0 +1,5 @@
+package org.drools.task;
+
+public enum NotificationType {
+    Default, Email;
+}

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Task.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Task.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/Task.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -166,7 +166,7 @@
     
     public List<I18NText> getDescriptions() {
         return descriptions;
-    }
+    }    
 
     public void setDescriptions(List<I18NText> descriptions) {
         this.descriptions = descriptions;

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/TaskData.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/TaskData.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/TaskData.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -44,12 +44,11 @@
     
     private long             workItemId = -1;
     
-    private AccessType       accessType;
+    private AccessType       documentAccessType;
 
-    private String           contentType;
+    private String           documentType;
 
-    @Lob
-    private byte[]           document;
+    private long             documentContentId;
 
     @OneToMany(cascade = CascadeType.ALL)
     @JoinColumn(name = "TaskData_Comments_Id", nullable = true)
@@ -239,7 +238,31 @@
     public long getWorkItemId() {
     	return workItemId;
     }
-      
+             
+    public AccessType getDocumentAccessType() {
+        return documentAccessType;
+    }
+
+    public void setDocumentAccessType(AccessType accessType) {
+        this.documentAccessType = accessType;
+    }
+
+    public String getDocumentType() {
+        return documentType;
+    }        
+
+    public long getDocumentContentId() {
+        return documentContentId;
+    }
+
+    public void setDocumentContentId(long documentContentId) {
+        this.documentContentId = documentContentId;
+    }
+
+    public void setDocumentType(String documentType) {
+        this.documentType = documentType;
+    }
+
     public List<Comment> getComments() {
         return comments;
     }
@@ -308,7 +331,18 @@
         if ( activationTime == null ) {
             if ( other.activationTime != null ) return false;
         } else if ( activationTime.getTime() != other.activationTime.getTime() ) return false;
-
+                
+        if ( workItemId != other.workItemId ) return false;
+        
+        if ( documentAccessType == null ) {
+            if ( other.documentAccessType != null ) return false;
+        } else if ( !documentAccessType.equals( other.documentAccessType ) ) return false;
+        
+        if ( documentContentId != other.documentContentId ) return false;
+        if ( documentType == null ) {
+            if ( other.documentType != null ) return false;
+        } else if ( !documentType.equals( other.documentType ) ) return false;                
+        
         return CollectionUtils.equals( attachments,
                                        other.attachments ) && CollectionUtils.equals( comments,
                                                                                       other.comments );

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/UserInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/UserInfo.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/UserInfo.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -0,0 +1,15 @@
+package org.drools.task;
+
+import java.util.Iterator;
+
+public interface UserInfo {
+    String getDisplayName(OrganizationalEntity entity);
+    
+    Iterator<OrganizationalEntity> getMembersForGroup(Group group);
+    
+    boolean hasEmail(Group group);
+    
+    String getEmailForEntity(OrganizationalEntity entity);
+    
+    String getLanguageForEntity(OrganizationalEntity entity);
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/WorkItemNotification.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/WorkItemNotification.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/WorkItemNotification.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -0,0 +1,59 @@
+package org.drools.task;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+
+import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.WorkItemHandler;
+import org.drools.process.instance.WorkItemManager;
+import org.mvel.MVEL;
+import org.mvel.compiler.ExpressionCompiler;
+
+public class WorkItemNotification {
+    private String workItemExp;
+    private WorkItemHandler workItemHandler;
+    private String docVar = "doc";
+
+    public void executeWorkItem(Task task,
+                                Notification notification,
+                                List<OrganizationalEntity> recipients,
+                                List<OrganizationalEntity> businessAdministrators,
+                                WorkItemManager workItemManager,
+                                EntityManagerFactory emf) {
+        EntityManager em = emf.createEntityManager();
+        
+        TaskData taskData = task.getTaskData();
+        
+        // First compile the associated document, we assume this returns a single structure
+        // That can be used in the main work item evaluation.
+        Content content = null;
+        if ( taskData.getDocumentAccessType() == AccessType.Inline ) {
+            content = em.find( Content.class,
+                               taskData.getDocumentContentId() );
+        }
+        ExpressionCompiler compiler = new ExpressionCompiler( new String( content.getContent() ) );
+        Serializable expr = compiler.compile();
+        Object object = MVEL.executeExpression( expr );
+        
+        Map<String, Object> vars = new HashMap<String, Object>();
+        vars.put( docVar, object );
+        // for now will have to assume the recipient is a User, we need to figure out if Groups have an alias
+        // of if we list all the individuals in the gruop.
+        for ( OrganizationalEntity recipient : recipients  ) {
+            vars.put( "user", recipient );
+            WorkItem workItem = (WorkItem) MVEL.executeExpression( expr, vars );
+            workItemHandler.executeWorkItem( workItem, workItemManager );
+        }
+        
+
+
+
+        
+
+    }
+}

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/CommandName.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/CommandName.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/CommandName.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -31,8 +31,10 @@
     AddAttachmentResponse,
     DeleteAttachmentRequest,
     DeleteAttachmentResponse,    
-    GetAttachmentContentRequest,
-    GetAttachmentContentResponse,
+    SetDocumentContentRequest,
+    SetDocumentContentResponse,
+    GetContentRequest,
+    GetContentResponse,
     
     AddCommentRequest,
     AddCommentResponse,

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/DefaultEscalatedDeadlineHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/DefaultEscalatedDeadlineHandler.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/DefaultEscalatedDeadlineHandler.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -1,25 +1,143 @@
 package org.drools.task.service;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Map.Entry;
+
 import javax.persistence.EntityManager;
 
+import org.drools.process.instance.WorkItemManager;
+import org.drools.process.instance.impl.WorkItemImpl;
+import org.drools.process.workitem.email.EmailWorkItemHandler;
+import org.drools.task.AccessType;
+import org.drools.task.Content;
 import org.drools.task.Deadline;
+import org.drools.task.EmailNotification;
+import org.drools.task.EmailNotificationHeader;
 import org.drools.task.Escalation;
+import org.drools.task.Group;
+import org.drools.task.I18NText;
 import org.drools.task.Notification;
+import org.drools.task.NotificationType;
+import org.drools.task.OrganizationalEntity;
 import org.drools.task.Reassignment;
 import org.drools.task.Task;
+import org.drools.task.TaskData;
+import org.drools.task.User;
+import org.drools.task.UserInfo;
+import org.drools.util.ChainedProperties;
+import org.mvel.MVEL;
+import org.mvel.compiler.ExpressionCompiler;
+import org.mvel.templates.TemplateRuntime;
 
-public class DefaultEscalatedDeadlineHandler implements EscalatedDeadlineHandler {
+public class DefaultEscalatedDeadlineHandler
+    implements
+    EscalatedDeadlineHandler {
 
+    private UserInfo     userInfo;
+
+    private String       from;
+
+    private String       replyTo;
+
+    EmailWorkItemHandler handler;
+
+    WorkItemManager      manager;
+    
+    public DefaultEscalatedDeadlineHandler() {
+        handler = new EmailWorkItemHandler();
+        ChainedProperties conf = new ChainedProperties("process.email.conf");
+//        String host = conf.getProperty( "host", null );
+//        String port = conf.getProperty( "port", "25" );
+//        String userName = conf.getProperty( "userName", null );
+//        String password = conf.getProperty( "password", null );       
+        
+        from = conf.getProperty( "from", null );
+        replyTo = conf.getProperty( "replyTo", null );
+        
+ 
+    }
+    
+    public UserInfo getUserInfo() {
+        return userInfo;
+    }
+
+    public void setUserInfo(UserInfo userInfo) {
+        this.userInfo = userInfo;
+    }
+
+    public String getFrom() {
+        return from;
+    }
+
+    public void setFrom(String from) {
+        this.from = from;
+    }
+
+    public String getReplyTo() {
+        return replyTo;
+    }
+
+    public void setReplyTo(String replyTo) {
+        this.replyTo = replyTo;
+    }
+
+    public EmailWorkItemHandler getHandler() {
+        return handler;
+    }
+
+    public void setHandler(EmailWorkItemHandler handler) {
+        this.handler = handler;
+    }
+
+    public WorkItemManager getManager() {
+        return manager;
+    }
+
+    public void setManager(WorkItemManager manager) {
+        this.manager = manager;
+    }
+
     public void executeEscalatedDeadline(Task task,
                                          Deadline deadline,
-                                         EntityManager em) {
-        
+                                         EntityManager em,
+                                         TaskService service) {
+
         for ( Escalation escalation : deadline.getEscalations() ) {
             // we won't impl constraints for now
             //escalation.getConstraints()
+            String language = "en-UK";
+            for ( Notification notification : escalation.getNotifications() ) {
+                if ( notification.getNotificationType() == NotificationType.Email) {
+                    executeEmailNotification( (EmailNotification) notification, task, em );
+                }
+                //                I18NText name = null;
+                //                I18NText subject = null;
+                //                I18NText description = null;
+                //                for ( I18NText item : notification.getNames() ) {
+                //                    if ( item.getLanguage().equals( language ) ) {
+                //                        name = item;
+                //                        break;
+                //                    }
+                //                }
+                //                for ( I18NText item : notification.getSubjects() ) {
+                //                    if ( item.getLanguage().equals( language ) ) {
+                //                        subject = item;
+                //                        break;
+                //                    }
+                //                }
+                //                for ( I18NText item : notification.getDescriptions() ) {
+                //                    if ( item.getLanguage().equals( language ) ) {
+                //                        description = item;
+                //                        break;
+                //                    }
+                //                }                
 
-            for ( Notification notification : escalation.getNotifications() ) {
-                //notification.g
             }
 
             for ( Reassignment reassignment : escalation.getReassignments() ) {
@@ -31,4 +149,126 @@
         em.getTransaction().commit();
     }
 
+    public void executeEmailNotification(EmailNotification notification,
+                                         Task task,
+                                         EntityManager em) {
+        Map<String, EmailNotificationHeader> headers = notification.getEmailHeaders();
+
+        // group users into languages
+        Map<String, List<User>> users = new HashMap<String, List<User>>();
+        for ( OrganizationalEntity entity : notification.getBusinessAdministrators() ) {
+            if ( entity instanceof Group ) {
+                buildMapByLanguage( users,
+                                    (Group) entity );
+            } else {
+                buildMapByLanguage( users,
+                                    (User) entity );
+            }
+        }
+
+        for ( OrganizationalEntity entity : notification.getRecipients() ) {
+            if ( entity instanceof Group ) {
+                buildMapByLanguage( users,
+                                    (Group) entity );
+            } else {
+                buildMapByLanguage( users,
+                                    (User) entity );
+            }
+        }
+
+        TaskData taskData = task.getTaskData();
+        Map<String, Object> doc = null;
+        if ( taskData != null ) {
+            Content content = em.find( Content.class,
+                                       taskData.getDocumentContentId() );
+            if ( content != null ) {
+                ExpressionCompiler compiler = new ExpressionCompiler( new String( content.getContent() ) );
+                doc = (Map<String, Object>) MVEL.executeExpression( compiler.compile() );
+            } else {
+                doc = Collections.emptyMap();
+            }
+        }
+
+        for ( Iterator<Entry<String, List<User>>> it = users.entrySet().iterator(); it.hasNext(); ) {
+            Entry<String, List<User>> entry = it.next();
+            EmailNotificationHeader header = headers.get( entry.getKey()  );
+
+            Map<String, Object> email = new HashMap<String, Object>();
+            StringBuilder to = new StringBuilder();
+            boolean first = true;
+            for ( User user : entry.getValue() ) {
+                if ( !first ) {
+                    to.append( ';' );
+                }
+                String emailAddress = userInfo.getEmailForEntity( user );
+                to.append( emailAddress );
+                first = false;
+            }
+            email.put( "To",
+                       to.toString() );
+
+            if ( header.getFrom() != null && header.getFrom().trim().length() > 0 ) {
+                email.put( "From",
+                           header.getFrom() );
+            } else {
+                email.put( "From",
+                           from );
+            }
+
+            if ( header.getReplyTo() != null && header.getReplyTo().trim().length() > 0 ) {
+                email.put( "Reply-To",
+                           header.getReplyTo() );
+            } else {
+                email.put( "Reply-To",
+                           replyTo );
+            }
+
+            Map<String, Object> vars = new HashMap<String, Object>();
+            vars.put( "doc",
+                      doc );
+            String subject = (String) TemplateRuntime.eval( header.getSubject(),
+                                                            vars );
+            String body = (String) TemplateRuntime.eval( header.getBody(),
+                                                         vars );
+
+            email.put( "Subject",
+                       subject );
+            email.put( "Body",
+                       body );
+
+            WorkItemImpl workItem = new WorkItemImpl();
+            workItem.setParameters( email );
+
+            handler.executeWorkItem( workItem,
+                                     manager );
+
+        }
+    }
+
+    private void buildMapByLanguage(Map<String, List<User>> map,
+                                    Group group) {
+        for ( Iterator<OrganizationalEntity> it = userInfo.getMembersForGroup( group ); it.hasNext(); ) {
+            OrganizationalEntity entity = it.next();
+            if ( entity instanceof Group ) {
+                buildMapByLanguage( map,
+                                    (Group) entity );
+            } else {
+                buildMapByLanguage( map,
+                                    (User) entity );
+            }
+        }
+    }
+
+    private void buildMapByLanguage(Map<String, List<User>> map,
+                                    User user) {
+        String language = userInfo.getLanguageForEntity( user );
+        List<User> list = map.get( language );
+        if ( list == null ) {
+            list = new ArrayList<User>();
+            map.put( language,
+                     list );
+        }
+        list.add( user );
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/EscalatedDeadlineHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/EscalatedDeadlineHandler.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/EscalatedDeadlineHandler.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -9,5 +9,5 @@
 import org.drools.task.Task;
 
 public interface EscalatedDeadlineHandler {
-    public void executeEscalatedDeadline(Task task, Deadline deadline, EntityManager em);
+    public void executeEscalatedDeadline(Task task, Deadline deadline, EntityManager em, TaskService service);
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskClient.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskClient.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskClient.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -20,15 +20,16 @@
 import org.apache.mina.transport.socket.nio.NioSocketConnector;
 import org.drools.task.AccessType;
 import org.drools.task.Attachment;
-import org.drools.task.AttachmentContent;
+import org.drools.task.Content;
 import org.drools.task.Comment;
 import org.drools.task.Task;
 import org.drools.task.User;
 import org.drools.task.service.TaskClientHandler.AddAttachmentResponseHandler;
 import org.drools.task.service.TaskClientHandler.AddCommentResponseHandler;
 import org.drools.task.service.TaskClientHandler.AddTaskResponseHandler;
-import org.drools.task.service.TaskClientHandler.GetAttachmentContentResponseHandler;
+import org.drools.task.service.TaskClientHandler.GetContentResponseHandler;
 import org.drools.task.service.TaskClientHandler.GetTaskResponseHandler;
+import org.drools.task.service.TaskClientHandler.SetDocumentResponseHandler;
 import org.drools.task.service.TaskClientHandler.TaskSummaryResponseHandler;
 
 public class MinaTaskClient
@@ -145,8 +146,8 @@
     }
     
     
-    public void addAttachment(long taskId, Attachment attachment, AttachmentContent content, AddAttachmentResponseHandler responseHandler ) {
-        List args = new ArrayList( 2 );
+    public void addAttachment(long taskId, Attachment attachment, Content content, AddAttachmentResponseHandler responseHandler ) {
+        List args = new ArrayList( 3 );
         args.add( taskId );
         args.add( attachment );
         args.add( content );
@@ -167,10 +168,23 @@
         session.write( cmd );
     }    
     
-    public void getAttachmentContent(long contentId, GetAttachmentContentResponseHandler responseHandler) {
+    public void setDocumentContent(long taskId,
+                                   Content content, 
+                                   SetDocumentResponseHandler responseHandler ) {    
+        List args = new ArrayList( 2 );
+        args.add( taskId );
+        args.add( content );
+        Command cmd = new Command( counter.getAndIncrement(), CommandName.SetDocumentContentRequest, args);   
+        
+        handler.addResponseHandler( cmd.getId(), responseHandler );
+        
+        session.write( cmd );         
+    }
+    
+    public void getContent(long contentId, GetContentResponseHandler responseHandler) {
         List args = new ArrayList( 1 );
         args.add( contentId );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.GetAttachmentContentRequest, args);  
+        Command cmd = new Command( counter.getAndIncrement(), CommandName.GetContentRequest, args);  
         
         handler.addResponseHandler( cmd.getId(), responseHandler );   
         

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/SendIcal.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/SendIcal.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/SendIcal.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -0,0 +1,284 @@
+package org.drools.task.service;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Properties;
+import java.util.TimeZone;
+import java.util.UUID;
+
+import javax.activation.CommandInfo;
+import javax.activation.DataHandler;
+import javax.activation.MailcapCommandMap;
+import javax.activation.MimetypesFileTypeMap;
+import javax.mail.BodyPart;
+import javax.mail.Message;
+import javax.mail.Multipart;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+import javax.mail.util.ByteArrayDataSource;
+
+import org.drools.process.workitem.email.Connection;
+import org.drools.task.Deadline;
+import org.drools.task.I18NText;
+import org.drools.task.Task;
+import org.drools.task.TaskData;
+import org.drools.task.User;
+import org.drools.task.UserInfo;
+import org.drools.util.ChainedProperties;
+
+import junit.framework.TestCase;
+
+//import net.fortuna.ical4j.model.Calendar;
+//import net.fortuna.ical4j.model.DateTime;
+//import net.fortuna.ical4j.model.TimeZone;
+//import net.fortuna.ical4j.model.TimeZoneRegistry;
+//import net.fortuna.ical4j.model.TimeZoneRegistryFactory;
+//import net.fortuna.ical4j.model.component.VEvent;
+//import net.fortuna.ical4j.model.component.VTimeZone;
+//import net.fortuna.ical4j.model.component.VToDo;
+//import net.fortuna.ical4j.model.property.CalScale;
+//import net.fortuna.ical4j.model.property.Description;
+//import net.fortuna.ical4j.model.property.Method;
+//import net.fortuna.ical4j.model.property.Priority;
+//import net.fortuna.ical4j.model.property.ProdId;
+//import net.fortuna.ical4j.model.property.Uid;
+//import net.fortuna.ical4j.model.property.Version;
+
+public class SendIcal {
+    private static SimpleDateFormat df              = new SimpleDateFormat(  "yyyyMMdd'T'HHmmss" );
+    static {
+        df.setTimeZone( TimeZone.getTimeZone("UTC") );
+    }
+
+    private Properties              connection;
+    private String                  defaultLanguage;
+    
+    private static SendIcal instance = new SendIcal();
+    
+    public static SendIcal getInstance() {
+        return instance;
+    }
+
+    SendIcal() {
+        ChainedProperties conf = new ChainedProperties( "process.email.conf" );
+        String host = conf.getProperty( "host",
+                                        null );
+        String port = conf.getProperty( "port",
+                                        "25" );
+        //        userName = conf.getProperty( "userName", null );
+        //        password = conf.getProperty( "password", null );   
+        
+        connection = new Properties();
+
+        if ( host != null && host.trim().length() > 0 ) {
+            connection.put( "mail.smtp.host",
+                            host );
+        }
+        if ( port != null && port.trim().length() > 0 ) {
+            connection.put( "mail.smtp.port",
+                            Integer.parseInt( port ) );
+        }
+
+        defaultLanguage = conf.getProperty( "defaultLanguage",
+                                            "en-UK" );
+    }
+
+    public void sendIcalForTask(Task task,
+                                UserInfo userInfo) {
+        TaskData data = task.getTaskData();
+        User owner = data.getActualOwner();
+        User creator = data.getCreatedBy();
+        Date createdOn = data.getCreatedOn();
+        
+        if ( task.getDeadlines() == null ) {
+            return;
+        }
+
+        // get earliest start deadline
+        List<Deadline> startDeadlines = task.getDeadlines().getStartDeadlines();
+        Deadline start = null;
+        for ( Deadline deadline : startDeadlines ) {
+            if ( start == null || start.getDate().getTime() > deadline.getDate().getTime() ) {
+                start = deadline;
+            }
+        }
+
+        // get latest end deadline
+        List<Deadline> endDeadlines = task.getDeadlines().getEndDeadLines();
+        Deadline end = null;
+        for ( Deadline deadline : endDeadlines ) {
+            if ( end == null || end.getDate().getTime() < deadline.getDate().getTime() ) {
+                end = deadline;
+            }
+        }
+
+        String language = userInfo.getLanguageForEntity( owner );
+        String name = I18NText.getLocalText( task.getNames(),
+                                             language,
+                                             defaultLanguage );
+        String summary = I18NText.getLocalText( task.getSubjects(),
+                                                language,
+                                                defaultLanguage );
+        String description = I18NText.getLocalText( task.getDescriptions(),
+                                                    language,
+                                                    defaultLanguage );
+        // send ical for start
+        if ( start != null ) {
+            try {
+                sendIcal(task.getId(), name, summary, description, task.getPriority(), start.getDate(), owner, creator, createdOn, userInfo, "Start");
+            } catch ( Exception e ) {
+                
+            }
+        }
+        
+        // send ical for end
+        if ( end != null ) {
+            try {
+                sendIcal(task.getId(), name, summary, description, task.getPriority(), end.getDate(), owner, creator, createdOn, userInfo, "End");
+            } catch ( Exception e ) {
+                
+            }
+        }
+    }
+
+    public void sendIcal(long taskId,
+                         String name,
+                         String summary,
+                         String description,
+                         int priority,
+                         Date startDate,                       
+                         User owner,
+                         User creator,
+                         Date createdOn,    
+                         UserInfo userInfo,
+                         String type) throws Exception {
+        MimetypesFileTypeMap mimetypes = (MimetypesFileTypeMap) MimetypesFileTypeMap.getDefaultFileTypeMap();
+        mimetypes.addMimeTypes( "text/calendar ics ICS" );
+
+        MailcapCommandMap mailcap = (MailcapCommandMap) MailcapCommandMap.getDefaultCommandMap();
+        mailcap.addMailcap( "text/calendar;; x-java-content-handler=com.sun.mail.handlers.text_plain" );
+
+        System.out.println( connection );
+        Session session = Session.getInstance( connection,
+                                               null );
+
+        // Define message
+        MimeMessage message = new MimeMessage( session );
+        message.setHeader( "Content-Class",
+                           "urn:content-classes:calendarmessage" );
+        message.setHeader( "Content-ID",
+                           "calendar_message" );
+
+        String creatorEmail = userInfo.getEmailForEntity( creator );
+        message.setFrom( new InternetAddress( creatorEmail ) );
+        message.setReplyTo( new InternetAddress[]{new InternetAddress( creatorEmail )} );
+        message.addRecipient( Message.RecipientType.TO,
+                              new InternetAddress( userInfo.getEmailForEntity( owner ) ) );
+        message.setSubject( "Task Assignment " + type + " Event: " + name );
+        message.setSentDate( new Date() );
+
+        // Create a Multipart
+        Multipart multipart = new MimeMultipart( "alternative" );
+
+        // Add text message
+        BodyPart messageBodyPart = new MimeBodyPart();
+        String text = "Summary\n-------\n\n" + summary + "\n\nDescription\n-----------\n\n" + description;
+        messageBodyPart.setText( text );
+        messageBodyPart.setDataHandler( new DataHandler( new ByteArrayDataSource( text,
+                                                                                  "text/plain" ) ) );
+        multipart.addBodyPart( messageBodyPart );
+
+        // Add ical
+        messageBodyPart = new MimeBodyPart();
+        String filename = "ical-" + type + "-"+ taskId + ".ics";
+        messageBodyPart.setFileName( filename );
+        messageBodyPart.setHeader( "Content-Class",
+                                   "urn:content-classes:calendarmessage" );
+        messageBodyPart.setHeader( "Content-ID",
+                                   "calendar_message" );
+        String icalStr = getIcal( summary,
+                                  description,
+                                  startDate,
+                                  priority,
+                                  userInfo.getDisplayName( creator ),
+                                  creatorEmail,
+                                  type );
+        System.out.println( icalStr );
+        messageBodyPart.setDataHandler( new DataHandler( new ByteArrayDataSource( icalStr,
+                                                                                  "text/calendar; charset=US-ASCII; " ) ) );
+        multipart.addBodyPart( messageBodyPart );
+
+        message.setContent( multipart );
+
+        Transport.send( message );
+    }
+
+    private String getIcal(String summary,
+                           String description,
+                           Date date,
+                           int priority,
+                           String organizerDisplayName,
+                           String organizerEmail,
+                           String type) {
+        StringBuilder builder = new StringBuilder();
+        builder.append( "BEGIN:VCALENDAR\n" );
+        builder.append( "PRODID:-//iCal4j 1.0//EN\n" );
+        builder.append( "CALSCALE:GREGORIAN\n" );
+        builder.append( "VERSION:2.0\n" );
+        builder.append( "METHOD:REQUEST\n" );
+        builder.append( "BEGIN:VEVENT\n" );
+        builder.append( "DTSTART;TZID=UTC:" + df.format( date ) + "\n" );
+        builder.append( "UID:" + UUID.randomUUID().toString() + "\n" );
+        builder.append( "ORGANIZER;CN=\"" + organizerDisplayName + "\":mailto:" + organizerEmail + "\n" );
+        builder.append( "DTSTAMP;TZID=UTC:" + df.format( new Date() ) + "\n" );
+        builder.append( "SUMMARY:\"Task " + type + " : " + summary + "\"\n" );
+        builder.append( "DESCRIPTION:\"" + description + "\"\n" );
+        builder.append( "PRIORITY:" + priority + "\n" );
+        builder.append( "END:VEVENT\n" );
+        builder.append( "END:VCALENDAR\n" );
+        return builder.toString();
+//        String str = "";
+//        str += "BEGIN:VCALENDAR\n";
+//        str += "PRODID:-//Apple Inc.//iCal 3.0//EN\n";
+//        str += "CALSCALE:GREGORIAN\n";
+//        str += "VERSION:2.0\n";
+//        str += "METHOD:REQUEST\n";
+//        str += "BEGIN:VTIMEZONE\n";
+//        str += "TZID:US/Mountain\n";
+//        str += "BEGIN:DAYLIGHT\n";
+//        str += "TZOFFSETFROM:-0700\n";
+//        str += "TZOFFSETTO:-0600\n";
+//        str += "DTSTART:20070311T020000\n";
+//        str += "RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\n";
+//        str += "TZNAME:MDT\n";
+//        str += "END:DAYLIGHT\n";
+//        str += "BEGIN:STANDARD\n";
+//        str += "TZOFFSETFROM:-0600\n";
+//        str += "TZOFFSETTO:-0700\n";
+//        str += "DTSTART:20071104T020000\n";
+//        str += "RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\n";
+//        str += "TZNAME:MST\n";
+//        str += "END:STANDARD\n";
+//        str += "END:VTIMEZONE\n";
+//        str += "BEGIN:VEVENT\n";
+//        //        str += "SEQUENCE:4\n";
+//        str += "DTSTART;TZID=US/Mountain:20080911T180000\n";
+//        //        str += "DURATION:PT1H\n";
+//        str += "UID:EC585E23-E48D-435A-B351-C6B7ABA9A949\n";
+//        str += "ORGANIZER;CN=\"Zachery Jensen\":mailto:zjensen at edustructures.com\n";
+//        str += "DTSTAMP:20080910T235058Z\n";
+//        str += "SUMMARY:Test Todo\n";
+//        //        str += "ATTENDEE;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;VP=TRUE:mailto:Mproctor at redhat.com\n";
+//        //        str += "ATTENDEE;CN=\"Zachery Jensen\";PARTSTAT=ACCEPTED:mailto:zjensen at edustructures.com\n";
+//        //        str += "CREATED:20080910T235039Z\n";
+//        //        str += "LOCATION:Test Location\n";
+//        str += "END:VEVENT\n";
+//        str += "END:VCALENDAR\n";
+//        return str;  
+    }
+}

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskClientHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskClientHandler.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskClientHandler.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -7,7 +7,7 @@
 import org.apache.mina.core.service.IoHandlerAdapter;
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
-import org.drools.task.AttachmentContent;
+import org.drools.task.Content;
 import org.drools.task.Task;
 import org.drools.task.query.TaskSummary;
 
@@ -76,14 +76,22 @@
                 }
                 break;                
             }         
-            case GetAttachmentContentResponse : {
-                AttachmentContent content = ( AttachmentContent ) cmd.getArguments().get( 0 );
-                GetAttachmentContentResponseHandler responseHandler = (GetAttachmentContentResponseHandler) responseHandlers.remove( cmd.getId() );
+            case GetContentResponse : {
+                Content content = ( Content ) cmd.getArguments().get( 0 );
+                GetContentResponseHandler responseHandler = (GetContentResponseHandler) responseHandlers.remove( cmd.getId() );
                 if ( responseHandler != null ) {
                     responseHandler.execute( content );
                 }
                 break;
-            }            
+            }    
+            case SetDocumentContentResponse : {
+                long contentId = ( Long ) cmd.getArguments().get( 0 );
+                SetDocumentResponseHandler responseHandler = (SetDocumentResponseHandler) responseHandlers.remove( cmd.getId() );
+                if ( responseHandler != null ) {
+                    responseHandler.execute( contentId );
+                }
+                break;                    
+            }
             case Query_TaskSummaryResponse : {
                 List<TaskSummary> results = ( List<TaskSummary> ) cmd.getArguments().get( 0 );
                 TaskSummaryResponseHandler responseHandler = ( TaskSummaryResponseHandler ) responseHandlers.remove( cmd.getId() );
@@ -133,8 +141,12 @@
         public void execute(long attachmentId, long contentId);
     }        
     
-    public static interface GetAttachmentContentResponseHandler extends ResponseHandler {
-        public void execute(AttachmentContent attachmentContent);
+    public static interface SetDocumentResponseHandler extends ResponseHandler {
+        public void execute(long contentId);
+    }      
+    
+    public static interface GetContentResponseHandler extends ResponseHandler {
+        public void execute(Content content);
     }    
     
     public static interface TaskSummaryResponseHandler extends ResponseHandler {

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServerHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServerHandler.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServerHandler.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -10,7 +10,7 @@
 import org.apache.mina.core.session.IoSession;
 import org.drools.task.AccessType;
 import org.drools.task.Attachment;
-import org.drools.task.AttachmentContent;
+import org.drools.task.Content;
 import org.drools.task.Comment;
 import org.drools.task.Task;
 import org.drools.task.query.TaskSummary;
@@ -130,10 +130,10 @@
             }
             case  AddAttachmentRequest : {
                 Attachment attachment = ( Attachment ) cmd.getArguments().get( 1 );
-                AttachmentContent content = ( AttachmentContent ) cmd.getArguments().get( 2 ); 
+                Content content = ( Content ) cmd.getArguments().get( 2 ); 
                 service.addAttachment( (Long) cmd.getArguments().get( 0 ), attachment, content );
                 
-                List args = new ArrayList( 1 );
+                List args = new ArrayList( 2 );
                 args.add( attachment.getId() );
                 args.add( content.getId() );
                 Command resultsCmnd = new Command( cmd.getId(),
@@ -149,13 +149,26 @@
                 service.deleteAttachment( taskId, attachmentId, contentId );
                 break;
             }
-            case GetAttachmentContentRequest : {
+            case  SetDocumentContentRequest : {
+                long taskId = ( Long ) cmd.getArguments().get( 0 );
+                Content content = ( Content ) cmd.getArguments().get( 1 ); 
+                service.setDocumentContent( taskId, content );
+                
+                List args = new ArrayList( 1 );
+                args.add( content.getId() );
+                Command resultsCmnd = new Command( cmd.getId(),
+                                                   CommandName.SetDocumentContentResponse,
+                                                   args );
+                session.write( resultsCmnd );                    
+                break;
+            }            
+            case GetContentRequest : {
                 long contentId = ( Long ) cmd.getArguments().get( 0 );
-                AttachmentContent content = service.getAttachmentContent( contentId );
+                Content content = service.getContent( contentId );
                 List args = new ArrayList( 1 );
                 args.add( content );
                 Command resultsCmnd = new Command( cmd.getId(),
-                                                   CommandName.GetAttachmentContentResponse,
+                                                   CommandName.GetContentResponse,
                                                    args );
                 session.write( resultsCmnd );                                
                 break;                

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskService.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskService.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskService.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -18,7 +18,7 @@
 
 import org.drools.task.AccessType;
 import org.drools.task.Attachment;
-import org.drools.task.AttachmentContent;
+import org.drools.task.Content;
 import org.drools.task.Comment;
 import org.drools.task.Deadline;
 import org.drools.task.Group;
@@ -28,6 +28,7 @@
 import org.drools.task.Task;
 import org.drools.task.TaskData;
 import org.drools.task.User;
+import org.drools.task.UserInfo;
 import org.drools.task.query.DeadlineSummary;
 import org.drools.task.query.TaskSummary;
 
@@ -50,6 +51,8 @@
     ScheduledThreadPoolExecutor      scheduler;
 
     private EscalatedDeadlineHandler escalatedDeadlineHandler;
+    
+    private UserInfo userInfo;
 
     public TaskService(EntityManagerFactory emf) {
         this.emf = emf;
@@ -87,7 +90,7 @@
             unescalatedDeadlines = em.createQuery( toString( reader ) );
             long now = System.currentTimeMillis();
             for ( Object object : unescalatedDeadlines.getResultList() ) {
-                DeadlineSummary summary = (DeadlineSummary) object;
+                DeadlineSummary summary = (DeadlineSummary) object;                
                 scheduler.schedule( new ScheduledTaskDeadline( summary.getTaskId(),
                                                                summary.getDeadlineId(),
                                                                this ),
@@ -98,8 +101,16 @@
             throw new RuntimeException( "Unable to inialize TaskService, could not load and schedule oustanding deadlines",
                                         e );
         }
+    }    
+    
+    public UserInfo getUserinfo() {
+        return userInfo;
     }
 
+    public void setUserinfo(UserInfo userInfo) {
+        this.userInfo = userInfo;
+    }
+
     public EntityManagerFactory getEntityManagerFactory() {
         return emf;
     }
@@ -135,7 +146,7 @@
             if ( potentialOwners.size() == 1 ) {
                 // if there is a single potential owner, assign and set status to Reserved
                 taskData.setActualOwner( (User) potentialOwners.get( 0 ) );
-                taskData.setStatus( Status.Reserved );
+                taskData.setStatus( Status.Reserved );                
             } else if ( potentialOwners.size() > 1 ) {
                 // multiple potential owners, so set to Ready so one can claim.
                 taskData.setStatus( Status.Ready );
@@ -192,7 +203,12 @@
                 }
             }
         }
-    }
+        
+        if ( task.getTaskData().getStatus() == Status.Reserved ) {
+            // Task was reserved so owner should get icals
+            SendIcal.getInstance().sendIcalForTask( task, userInfo );
+        }
+    }    
 
     public void claim(long taskId,
                       long userId) {
@@ -213,6 +229,9 @@
                 taskData.setStatus( Status.Reserved );
                 taskData.setActualOwner( user );
                 em.getTransaction().commit();
+                
+                // Task was reserved so owner should get icals
+                SendIcal.getInstance().sendIcalForTask( task, userInfo );
             } else {
                 // @TODO Error
             }
@@ -230,7 +249,6 @@
         
         TaskData taskData = task.getTaskData();
         
-
         // Status must be Read or Reserved
         if ( taskData.getStatus() == Status.Ready ) {
             // if Ready must be potentialOwner
@@ -438,7 +456,7 @@
 
     public void addAttachment(long taskId,
                               Attachment attachment,
-                              AttachmentContent content) {
+                              Content content) {
         Task task = em.find( Task.class,
                              taskId );
 
@@ -450,7 +468,7 @@
 
         em.persist( content );
         attachment.setSize( content.getContent().length );
-        attachment.setContentId( content.getId() );
+        attachment.setAttachmentContentId( content.getId() );
 
         List<Attachment> list = task.getTaskData().getAttachments();
         if ( list == null || list == Collections.<Attachment> emptyList() ) {
@@ -461,16 +479,34 @@
         list.add( attachment );
         em.getTransaction().commit();
     }
+    
+    public void setDocumentContent(long taskId,
+                                   Content content) {
+        Task task = em.find( Task.class,
+                             taskId );
 
-    public AttachmentContent getAttachmentContent(long contentId) {
-        AttachmentContent content = em.find( AttachmentContent.class,
+        if ( task == null ) {
+            // throw some exception
+        }
+
+        em.getTransaction().begin();
+
+        em.persist( content );
+        
+        task.getTaskData().setDocumentContentId( content.getId() );
+        
+        em.getTransaction().commit();
+    }
+
+    public Content getContent(long contentId) {
+        Content content = em.find( Content.class,
                                              contentId );
         return content;
     }
 
     public void deleteAttachment(long taskId,
                                  long attachmentId,
-                                 long attachmentContentId) {
+                                 long contentId) {
         // @TODO I can't get this to work with HQL deleting the Attachment. Hibernate needs both the item removed from the collection
         // and also the item deleted, so for now have to load the entire Task, I suspect that this is due to using the same EM which 
         // is caching things.
@@ -488,9 +524,9 @@
         }
 
         // we do this as HQL to avoid streaming in the entire HQL
-        String deleteContent = "delete from AttachmentContent where id = :id";
+        String deleteContent = "delete from Content where id = :id";
         em.createQuery( deleteContent ).setParameter( "id",
-                                                      attachmentContentId ).executeUpdate();
+                                                      contentId ).executeUpdate();
 
         em.getTransaction().commit();
     }
@@ -608,7 +644,8 @@
 
         escalatedDeadlineHandler.executeEscalatedDeadline( task,
                                                            deadline,
-                                                           localEm );
+                                                           localEm,
+                                                           this );
         localEm.close();
     }
     

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/utils/CollectionUtils.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/utils/CollectionUtils.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/utils/CollectionUtils.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -20,10 +20,12 @@
 import org.drools.task.Comment;
 import org.drools.task.Deadline;
 import org.drools.task.Deadlines;
+import org.drools.task.EmailNotification;
 import org.drools.task.Escalation;
 import org.drools.task.Group;
 import org.drools.task.I18NText;
 import org.drools.task.Notification;
+import org.drools.task.NotificationType;
 import org.drools.task.OrganizationalEntity;
 import org.drools.task.Reassignment;
 import org.drools.task.User;
@@ -139,6 +141,7 @@
     public static void writeNotificationList(List<Notification> list, ObjectOutput out) throws IOException {
         out.writeInt( list.size() );
         for( Notification item : list ) {
+            out.writeUTF( item.getNotificationType().toString() );
             item.writeExternal( out );
         }
     }    
@@ -147,7 +150,18 @@
         int size = in.readInt();
         List<Notification> list = new ArrayList<Notification>(size);
         for ( int i = 0; i < size; i++ ) {
-            Notification item = new Notification();
+            Notification item = null;
+            switch( NotificationType.valueOf(  in.readUTF() ) ) {
+                case Default : {
+                    item = new Notification();
+                    break;
+                }
+                case Email : {
+                    item = new EmailNotification();
+                    break;
+                }
+            }
+             
             item.readExternal( in );
             list.add( item );
         }
@@ -198,7 +212,7 @@
         }
     }    
     
-    public static List<Escalation> readIEscalationList(ObjectInput in) throws IOException, ClassNotFoundException  {
+    public static List<Escalation> readEscalationList(ObjectInput in) throws IOException, ClassNotFoundException  {
         int size = in.readInt();
         List<Escalation> list = new ArrayList<Escalation>(size);
         for ( int i = 0; i < size; i++ ) {

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/drools.process.email.conf
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/drools.process.email.conf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/drools.process.email.conf	2008-09-12 17:44:38 UTC (rev 22723)
@@ -0,0 +1,8 @@
+from = from at domain.com
+replyTo = replyTo at domain.com
+host = localhost
+#host = smtp.corp.redhat.com
+port = 25
+defaultLanguage = en-UK
+#userName =
+#password =
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/persistence.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/persistence.xml	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/resources/META-INF/persistence.xml	2008-09-12 17:44:38 UTC (rev 22723)
@@ -4,7 +4,7 @@
     <persistence-unit name="org.drools.task">
         <provider>org.hibernate.ejb.HibernatePersistence</provider>
         <class>org.drools.task.Attachment</class>
-        <class>org.drools.task.AttachmentContent</class>        
+        <class>org.drools.task.Content</class>        
         <class>org.drools.task.BooleanExpression</class>        
         <class>org.drools.task.Comment</class>
         <class>org.drools.task.Deadline</class>
@@ -15,6 +15,8 @@
         <class>org.drools.task.Group</class>
         <class>org.drools.task.I18NText</class>
         <class>org.drools.task.Notification</class>
+        <class>org.drools.task.EmailNotification</class>
+        <class>org.drools.task.EmailNotificationHeader</class>
         <class>org.drools.task.PeopleAssignments</class>
         <class>org.drools.task.Reassignment</class>
         <class>org.drools.task.Status</class>
@@ -37,7 +39,7 @@
 	        <property name="hibernate.connection.password" value="sasa"/>	
 	        <property name="hibernate.connection.autocommit" value="false" /> 	               
 	        <property name="hibernate.max_fetch_depth" value="3"/>
-		    <property name="hibernate.hbm2ddl.auto" value="update" />
+		    <property name="hibernate.hbm2ddl.auto" value="create" />
             <property name="hibernate.show_sql" value="true" />		    
 	    </properties>        
     </persistence-unit>

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/BaseTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/BaseTest.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/BaseTest.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -117,6 +117,8 @@
         context.addImport( "Deadlines", Deadlines.class );
         context.addImport( "Delegation", Delegation.class );
         context.addImport( "Escalation", Escalation.class );
+        context.addImport( "EmailNotification", EmailNotification.class );
+        context.addImport( "EmailNotificationHeader", EmailNotificationHeader.class );        
         context.addImport( "Group", Group.class );
         context.addImport( "I18NText", I18NText.class );
         context.addImport( "Notification", Notification.class );

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/MockUserInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/MockUserInfo.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/MockUserInfo.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -0,0 +1,65 @@
+package org.drools.task;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class MockUserInfo implements UserInfo {
+    
+    private Map<Group, List<OrganizationalEntity>> groups = new HashMap<Group, List<OrganizationalEntity>>();
+    
+    private Map<OrganizationalEntity, String> emails = new HashMap<OrganizationalEntity, String>();
+    
+    private Map<OrganizationalEntity, String> languages = new HashMap<OrganizationalEntity, String>();  
+    
+    public Map<Group, List<OrganizationalEntity>> getGroups() {
+        return groups;
+    }
+
+    public void setGroups(Map<Group, List<OrganizationalEntity>> groups) {
+        this.groups = groups;
+    }
+
+    public Map<OrganizationalEntity, String> getEmails() {
+        return emails;
+    }
+
+    public void setEmails(Map<OrganizationalEntity, String> emails) {
+        this.emails = emails;
+    }
+
+    public String getEmailForEntity(OrganizationalEntity entity) {
+        return emails.get( entity );
+    }        
+
+    public Map<OrganizationalEntity, String> getLanguages() {
+        return languages;
+    }
+
+    public void setLanguages(Map<OrganizationalEntity, String> languages) {
+        this.languages = languages;
+    }
+
+    public Iterator<OrganizationalEntity> getMembersForGroup(Group group) {
+        return groups.get( group ).iterator();
+    }
+
+    public boolean hasEmail(Group group) {
+        return emails.containsKey( group );
+    }
+    
+    public String getDisplayName(OrganizationalEntity entity) {
+        if (entity instanceof User) {
+            return ((User)entity).getDisplayName();
+        } else {
+            return ((Group)entity).getDisplayName();
+        }
+    }
+
+    public String getLanguageForEntity(OrganizationalEntity entity) {
+        return languages.get( entity );
+    }
+    
+    
+}

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/ModelPersistenceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/ModelPersistenceTest.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/ModelPersistenceTest.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -59,7 +59,6 @@
     }
     
     public void testfullHibernateRoundtripWithAdditionalMVELCheck() throws Exception {
-
         Task task1 = new Task();
         task1.setPriority( 100 );
 
@@ -105,6 +104,10 @@
         taskData.setCreatedOn( new Date( 10000000 ) );
         taskData.setExpirationTime( new Date( 10000000 ) );
         taskData.setStatus( Status.Created );
+        
+        taskData.setDocumentAccessType( AccessType.Inline );
+        taskData.setDocumentType( "mvel" );
+        taskData.setDocumentContentId( 20 );
 
         List<Attachment> attachments = new ArrayList<Attachment>();
         taskData.setAttachments( attachments );
@@ -116,7 +119,7 @@
         attachment.setContentType( "text" );
         attachment.setName( "file.txt" );
         attachment.setSize( 5000);
-        attachment.setContentId( 5 );
+        attachment.setAttachmentContentId( 5 );
         attachments.add( attachment );
 
         attachment = new Attachment();
@@ -126,7 +129,7 @@
         attachment.setContentType( "text" );
         attachment.setName( "file2.txt" );
         attachment.setSize( 500 );
-        attachment.setContentId( 3 );
+        attachment.setAttachmentContentId( 3 );
         attachments.add( attachment );
 
         List<Comment> comments = new ArrayList<Comment>();
@@ -352,7 +355,7 @@
         Map  vars = new HashedMap();
         vars.put( "users", users );
         vars.put( "groups", groups );          
-        vars.put( "bytes1", new byte[]{1, 0, 0, 1} );        
+        vars.put( "bytes1", new byte[]{1, 0, 0, 1} ); 
         Task task3= (Task) eval( reader, vars );               
         
         assertNotSame( task1,

Deleted: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingGetAttachmentContentResponseHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingGetAttachmentContentResponseHandler.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingGetAttachmentContentResponseHandler.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -1,32 +0,0 @@
-/**
- * 
- */
-package org.drools.task.service;
-
-import org.drools.task.AttachmentContent;
-import org.drools.task.service.TaskClientHandler.GetAttachmentContentResponseHandler;
-
-public class BlockingGetAttachmentContentResponseHandler implements GetAttachmentContentResponseHandler {
-    private volatile AttachmentContent attachmentContent;
-
-    public synchronized void execute(AttachmentContent attachmentContent) {
-        this.attachmentContent = attachmentContent;
-        notifyAll();                
-    }
-    
-    public synchronized AttachmentContent getAttachmentContent() {
-        if ( attachmentContent == null ) {                  
-            try {
-                wait( 3000 );
-            } catch ( InterruptedException e ) {
-                // swallow as this is just a notifiation
-            }
-        }
-        
-        if ( attachmentContent == null ) {
-            throw new RuntimeException("Timeout : unable to retrieve Attachment Content" );
-        }
-        
-        return attachmentContent;
-    }       
-}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingGetContentResponseHandler.java (from rev 22401, labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingGetAttachmentContentResponseHandler.java)
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingGetContentResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingGetContentResponseHandler.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -0,0 +1,32 @@
+/**
+ * 
+ */
+package org.drools.task.service;
+
+import org.drools.task.Content;
+import org.drools.task.service.TaskClientHandler.GetContentResponseHandler;
+
+public class BlockingGetContentResponseHandler implements GetContentResponseHandler {
+    private volatile Content content;
+
+    public synchronized void execute(Content content) {
+        this.content = content;
+        notifyAll();                
+    }
+    
+    public synchronized Content getContent() {
+        if ( content == null ) {                  
+            try {
+                wait( 3000 );
+            } catch ( InterruptedException e ) {
+                // swallow as this is just a notifiation
+            }
+        }
+        
+        if ( content == null ) {
+            throw new RuntimeException("Timeout : unable to retrieve Attachment Content" );
+        }
+        
+        return content;
+    }       
+}
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingGetContentResponseHandler.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingSetContentResponseHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingSetContentResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingSetContentResponseHandler.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -0,0 +1,33 @@
+/**
+ * 
+ */
+package org.drools.task.service;
+
+import org.drools.task.service.TaskClientHandler.SetDocumentResponseHandler;
+
+public class BlockingSetContentResponseHandler implements SetDocumentResponseHandler {
+    private volatile long contentId;
+    private volatile boolean wait = true;
+
+    public synchronized void execute(long contentId) {
+        this.contentId = contentId;
+        wait = false;
+        notifyAll();                
+    }    
+    
+    public synchronized long getContentId() {
+        if ( wait ) {                  
+            try {
+                wait( 3000 );
+            } catch ( InterruptedException e ) {
+                // swallow as this is just a notifiation
+            }
+        }
+        
+        if ( wait ) {
+            throw new RuntimeException("Timeout : unable to retrieve Content Id" );
+        }
+        
+        return contentId;
+    }
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/IcalTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/IcalTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/IcalTest.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -0,0 +1,113 @@
+package org.drools.task.service;
+
+import java.io.StringReader;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMessage.RecipientType;
+
+import org.apache.commons.collections.map.HashedMap;
+import org.apache.mina.transport.socket.nio.NioSocketConnector;
+import org.drools.task.BaseTest;
+import org.drools.task.MockUserInfo;
+import org.drools.task.Task;
+import org.subethamail.wiser.Wiser;
+import org.subethamail.wiser.WiserMessage;
+
+public class IcalTest extends BaseTest {
+    MinaTaskServer server;
+    MinaTaskClient client;
+    
+    Wiser wiser;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        server = new MinaTaskServer( taskService );
+        Thread thread = new Thread( server );
+        thread.start();
+        Thread.sleep( 500 );
+
+        client = new MinaTaskClient( "client 1",
+                                     new TaskClientHandler() );
+        NioSocketConnector connector = new NioSocketConnector();
+        SocketAddress address = new InetSocketAddress( "127.0.0.1",
+                                                       9123 );
+        client.connect( connector,
+                        address );
+        
+        wiser = new Wiser();
+        wiser.start();
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        client.disconnect();
+        server.stop();
+        
+        wiser.stop();
+    }
+    
+    public void test1() throws Exception {
+        Map  vars = new HashedMap();     
+        vars.put( "users", users );
+        vars.put( "groups", groups );        
+        vars.put( "now", new Date() );
+        
+        String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { createdOn = now, createdBy = users['tony'], activationTime = now}), ";        
+        str += "peopleAssignments = (with ( new PeopleAssignments() ) {potentialOwners = [users['steve' ], users['tony' ]]}), ";        
+        str += "names = [ new I18NText( 'en-UK', 'This is my task name')],";
+        str += "subjects = [ new I18NText( 'en-UK', 'This is my task subject')],";
+        str += "descriptions = [ new I18NText( 'en-UK', 'This is my task description')],";
+        str += "deadlines = (with (new Deadlines() ) {";
+        str += "    startDeadlines = [ ";
+        str += "       (with (new Deadline()) {";
+        str += "           date = now";
+        str += "       } ) ],";
+        str += "    endDeadlines = ["; 
+        str += "        (with (new Deadline()) {";
+        str += "             date = new Date( now.time + ( 1000 * 60 * * 60 * 24 ) )"; // set to tomorrow
+        str += "        } ) ]";
+        str += "} ) })";
+        
+        MockUserInfo userInfo = new MockUserInfo();
+        userInfo.getEmails().put( users.get("tony"), "tony at domain.com" );
+        userInfo.getEmails().put( users.get("steve"), "steve at domain.com" );
+        
+        userInfo.getLanguages().put(  users.get("tony"), "en-UK" );
+        userInfo.getLanguages().put(  users.get("steve"), "en-UK" );
+        taskService.setUserinfo( userInfo );         
+      
+        BlockingAddTaskResponseHandler addTaskResponseHandler = new BlockingAddTaskResponseHandler();
+        Task task = ( Task )  eval( new StringReader( str ), vars );
+        client.addTask( task, addTaskResponseHandler );
+        
+        long taskId = addTaskResponseHandler.getTaskId();        
+        
+        client.claim( taskId, users.get( "steve" ).getId() );
+        
+        Thread.sleep( 3000 );
+        
+        assertEquals(2, wiser.getMessages().size() );  
+        
+        List<String> list = new ArrayList<String>(2);
+        list.add( wiser.getMessages().get( 0 ).getEnvelopeReceiver() );
+        list.add( wiser.getMessages().get( 1 ).getEnvelopeReceiver() );
+        
+        assertTrue( list.contains("steve at domain.com"));
+        assertTrue( list.contains("steve at domain.com"));     
+        MimeMessage msg = (( WiserMessage  ) wiser.getMessages().get( 0 )).getMimeMessage();
+        
+//        assertEquals( "My Body", msg.getContent() );
+//        assertEquals( "My Subject", msg.getSubject() );
+        assertEquals( "tony at domain.com", ((InternetAddress)msg.getFrom()[0]).getAddress() );
+        assertEquals( "tony at domain.com", ((InternetAddress)msg.getReplyTo()[0]).getAddress() );
+        assertEquals( "steve at domain.com", ((InternetAddress)msg.getRecipients( RecipientType.TO )[0]).getAddress() );        
+    }
+}

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceCommentsAndAttachmentsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceCommentsAndAttachmentsTest.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceCommentsAndAttachmentsTest.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -16,7 +16,7 @@
 import org.apache.mina.transport.socket.nio.NioSocketConnector;
 import org.drools.task.AccessType;
 import org.drools.task.Attachment;
-import org.drools.task.AttachmentContent;
+import org.drools.task.Content;
 import org.drools.task.BaseTest;
 import org.drools.task.Comment;
 import org.drools.task.Deadline;
@@ -57,7 +57,7 @@
         server.stop();
     }
 
-    public void testAddComment() {
+    public void testAddRemoveComment() {
         Map  vars = new HashedMap();     
         vars.put( "users", users );
         vars.put( "groups", groups );        
@@ -157,13 +157,13 @@
         attachment.setContentType( "txt" );
         
         byte[] bytes = "Ths is my attachment text1".getBytes();
-        AttachmentContent content = new AttachmentContent();
+        Content content = new Content();
         content.setContent( bytes );
         
         BlockingAddAttachmentResponseHandler addAttachmentResponseHandler = new BlockingAddAttachmentResponseHandler();
         client.addAttachment( taskId, attachment, content, addAttachmentResponseHandler);
         assertTrue( addAttachmentResponseHandler.getAttachmentId() != attachment.getId() );
-        assertTrue( addAttachmentResponseHandler.getContentId() != attachment.getContentId() );
+        assertTrue( addAttachmentResponseHandler.getContentId() != attachment.getAttachmentContentId() );
         
         BlockingGetTaskResponseHandler getTaskResponseHandler = new BlockingGetTaskResponseHandler(); 
         client.getTask( taskId, getTaskResponseHandler );
@@ -182,17 +182,17 @@
         assertEquals( bytes.length, returnedAttachment.getSize() );
         
         assertEquals( (long) addAttachmentResponseHandler.getAttachmentId(), (long) returnedAttachment.getId() );
-        assertEquals( (long) addAttachmentResponseHandler.getContentId(),  (long) returnedAttachment.getContentId() );        
+        assertEquals( (long) addAttachmentResponseHandler.getContentId(),  (long) returnedAttachment.getAttachmentContentId() );        
         
         // Make the same as the returned tasks, so we can test equals
         task.getTaskData().setAttachments( attachments1 );
         task.getTaskData().setStatus( Status.Created );
         assertEquals(task, task1);            
         
-        BlockingGetAttachmentContentResponseHandler  getAttachmentContentResponseHandler = new BlockingGetAttachmentContentResponseHandler();
-        client.getAttachmentContent( returnedAttachment.getContentId(), getAttachmentContentResponseHandler );
-        AttachmentContent attachmentContent = getAttachmentContentResponseHandler.getAttachmentContent();
-        assertEquals( "Ths is my attachment text1", new String( attachmentContent.getContent() ) );
+        BlockingGetContentResponseHandler  getResponseHandler = new BlockingGetContentResponseHandler();
+        client.getContent( returnedAttachment.getAttachmentContentId(), getResponseHandler );
+        content = getResponseHandler.getContent();
+        assertEquals( "Ths is my attachment text1", new String( content.getContent() ) );
         
         // test we can have multiple attachments
         
@@ -205,7 +205,7 @@
         attachment.setContentType( "txt" );
         
         bytes = "Ths is my attachment text2".getBytes();
-        content = new AttachmentContent();
+        content = new Content();
         content.setContent( bytes );
         
         addAttachmentResponseHandler = new BlockingAddAttachmentResponseHandler();
@@ -220,14 +220,14 @@
         List<Attachment> attachments2 = task1.getTaskData().getAttachments();
         assertEquals(2, attachments2.size() );
         
-        getAttachmentContentResponseHandler = new BlockingGetAttachmentContentResponseHandler();
-        client.getAttachmentContent( addAttachmentResponseHandler.getContentId(), getAttachmentContentResponseHandler );
-        attachmentContent = getAttachmentContentResponseHandler.getAttachmentContent();
-        assertEquals( "Ths is my attachment text2", new String( attachmentContent.getContent() ) );        
+        getResponseHandler = new BlockingGetContentResponseHandler();
+        client.getContent( addAttachmentResponseHandler.getContentId(), getResponseHandler );
+        content = getResponseHandler.getContent();
+        assertEquals( "Ths is my attachment text2", new String( content.getContent() ) );        
         
         // make two collections the same and compare
         attachment.setSize( 26 );
-        attachment.setContentId( addAttachmentResponseHandler.getContentId() );
+        attachment.setAttachmentContentId( addAttachmentResponseHandler.getContentId() );
         attachments1.add( attachment );
         assertTrue( CollectionUtils.equals( attachments2, attachments1 ) );      
         

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceEmailNotificationTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceEmailNotificationTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceEmailNotificationTest.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -0,0 +1,134 @@
+package org.drools.task.service;
+
+import java.io.InputStreamReader;
+import java.io.StringReader;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMessage.RecipientType;
+
+import org.apache.commons.collections.map.HashedMap;
+import org.apache.mina.transport.socket.nio.NioSocketConnector;
+import org.drools.process.instance.WorkItemManager;
+import org.drools.process.instance.impl.DefaultWorkItemManager;
+import org.drools.process.instance.impl.WorkItemImpl;
+import org.drools.process.workitem.email.EmailWorkItemHandler;
+import org.drools.task.BaseTest;
+import org.drools.task.Content;
+import org.drools.task.EmailNotification;
+import org.drools.task.MockUserInfo;
+import org.drools.task.Task;
+import org.drools.task.User;
+import org.drools.task.service.DefaultEscalatedDeadlineHandler;
+import org.mvel.MVEL;
+import org.mvel.compiler.ExpressionCompiler;
+import org.mvel.templates.CompiledTemplate;
+import org.mvel.templates.TemplateCompiler;
+import org.mvel.templates.TemplateRuntime;
+import org.subethamail.wiser.Wiser;
+import org.subethamail.wiser.WiserMessage;
+
+public class TaskServiceEmailNotificationTest extends BaseTest {
+    MinaTaskServer server;
+    MinaTaskClient client;
+    
+    Wiser wiser;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        server = new MinaTaskServer( taskService );
+        Thread thread = new Thread( server );
+        thread.start();
+        Thread.sleep( 500 );
+
+        client = new MinaTaskClient( "client 1",
+                                     new TaskClientHandler() );
+        NioSocketConnector connector = new NioSocketConnector();
+        SocketAddress address = new InetSocketAddress( "127.0.0.1",
+                                                       9123 );
+        client.connect( connector,
+                        address );
+        
+        wiser = new Wiser();
+        wiser.start();
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        client.disconnect();
+        server.stop();
+        
+        wiser.stop();
+    }
+    
+    public void testDelayedEmailNotificationOnDeadline() throws Exception {
+        Map  vars = new HashedMap();     
+        vars.put( "users", users );
+        vars.put( "groups", groups );
+        vars.put( "now", new Date() ); 
+        
+        DefaultEscalatedDeadlineHandler notificationHandler = new DefaultEscalatedDeadlineHandler();
+        notificationHandler.getHandler().setConnection( "localhost", "25", null, null );
+        WorkItemManager manager = new DefaultWorkItemManager( null );
+        notificationHandler.setManager( manager );
+        
+        MockUserInfo userInfo = new MockUserInfo();
+        userInfo.getEmails().put( users.get("tony"), "tony at domain.com" );
+        userInfo.getEmails().put( users.get("darth"), "darth at domain.com" );
+        
+        userInfo.getLanguages().put(  users.get("tony"), "en-UK" );
+        userInfo.getLanguages().put(  users.get("darth"), "en-UK" );
+        notificationHandler.setUserInfo( userInfo );    
+        
+        taskService.setEscalatedDeadlineHandler( notificationHandler );
+        
+        String string = toString( new InputStreamReader( getClass().getResourceAsStream( "Notification1.mvel" ) ) );
+            
+        BlockingAddTaskResponseHandler addTaskResponseHandler = new BlockingAddTaskResponseHandler();
+        Task task = ( Task )  eval( new StringReader( string ), vars );
+        client.addTask( task, addTaskResponseHandler );
+        long taskId = addTaskResponseHandler.getTaskId();    
+                                        
+        Content content = new Content();
+        content.setContent( "['subject' : 'My Subject', 'body' : 'My Body']".getBytes() );
+        BlockingSetContentResponseHandler setContentResponseHandler  = new BlockingSetContentResponseHandler();
+        client.setDocumentContent( taskId, content, setContentResponseHandler );
+        long contentId = setContentResponseHandler.getContentId();
+        
+        // emails should not be set yet
+        assertEquals(0, wiser.getMessages().size() );             
+        Thread.sleep( 1000 );
+        
+        // nor yet
+        assertEquals(0, wiser.getMessages().size() );     
+        
+        Thread.sleep( 6000 );
+        
+        // 1 email with two recipients should now exist
+        assertEquals(2, wiser.getMessages().size() );        
+        
+        List<String> list = new ArrayList<String>(2);
+        list.add( wiser.getMessages().get( 0 ).getEnvelopeReceiver() );
+        list.add( wiser.getMessages().get( 1 ).getEnvelopeReceiver() );
+        
+        assertTrue( list.contains("tony at domain.com"));
+        assertTrue( list.contains("darth at domain.com"));
+        
+        
+        MimeMessage msg = (( WiserMessage  ) wiser.getMessages().get( 0 )).getMimeMessage();
+        assertEquals( "My Body", msg.getContent() );
+        assertEquals( "My Subject", msg.getSubject() );
+        assertEquals( "from at domain.com", ((InternetAddress)msg.getFrom()[0]).getAddress() );
+        assertEquals( "replyTo at domain.com", ((InternetAddress)msg.getReplyTo()[0]).getAddress() );
+        assertEquals( "tony at domain.com", ((InternetAddress)msg.getRecipients( RecipientType.TO )[0]).getAddress() );
+        assertEquals( "darth at domain.com", ((InternetAddress)msg.getRecipients( RecipientType.TO )[1]).getAddress() );        
+    }
+}

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceEscalationTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceEscalationTest.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceEscalationTest.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -116,13 +116,17 @@
         EscalatedDeadlineHandler {
 
         List<Item> list = new ArrayList<Item>();
+        
+        TaskService taskService;
 
         public void executeEscalatedDeadline(Task task,
                                              Deadline deadline,
-                                             EntityManager em) {
+                                             EntityManager em,
+                                             TaskService taskService) {
             list.add( new Item( task,
                                 deadline,
-                                em ) );
+                                em,
+                                taskService ) );
         }
         
         public List<Item> getList() {
@@ -136,7 +140,8 @@
 
             public Item(Task task,
                         Deadline deadline,
-                        EntityManager em) {
+                        EntityManager em,
+                        TaskService taskService) {
                 this.deadline = deadline;
                 this.em = em;
                 this.task = task;
@@ -165,6 +170,16 @@
             public void setEntityManager(EntityManager em) {
                 this.em = em;
             }
+
+            public EntityManager getEm() {
+                return em;
+            }
+
+            public void setEm(EntityManager em) {
+                this.em = em;
+            }
+            
+            
         }
     }
 }

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceLifeCycleTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceLifeCycleTest.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceLifeCycleTest.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -16,7 +16,7 @@
 import org.apache.mina.transport.socket.nio.NioSocketConnector;
 import org.drools.task.AccessType;
 import org.drools.task.Attachment;
-import org.drools.task.AttachmentContent;
+import org.drools.task.Content;
 import org.drools.task.BaseTest;
 import org.drools.task.Comment;
 import org.drools.task.Deadline;
@@ -26,7 +26,7 @@
 import org.drools.task.service.TaskClientHandler.AddAttachmentResponseHandler;
 import org.drools.task.service.TaskClientHandler.AddCommentResponseHandler;
 import org.drools.task.service.TaskClientHandler.AddTaskResponseHandler;
-import org.drools.task.service.TaskClientHandler.GetAttachmentContentResponseHandler;
+import org.drools.task.service.TaskClientHandler.GetContentResponseHandler;
 import org.drools.task.service.TaskClientHandler.GetTaskResponseHandler;
 import org.drools.task.service.TaskClientHandler.TaskSummaryResponseHandler;
 import org.drools.task.service.TaskServiceEscalationTest.MockEscalatedDeadlineHandler.Item;

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/resources/org/drools/task/FullyPopulatedTask.mvel
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/resources/org/drools/task/FullyPopulatedTask.mvel	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/resources/org/drools/task/FullyPopulatedTask.mvel	2008-09-12 17:44:38 UTC (rev 22723)
@@ -15,6 +15,9 @@
         createdOn = new Date( 10000000 ),
         expirationTime = new Date( 10000000 ),
         status = Status.Ready,
+        documentAccessType = AccessType.Inline,
+        documentType = "mvel",
+        documentContentId = 20,
         attachments = [ 
             (with ( new Attachment() ) {
                 accessType = AccessType.Inline,
@@ -23,7 +26,7 @@
                 contentType = "text",
                 name = "file.txt",
                 size = 5000,
-                contentId = 5           
+                attachmentContentId = 5           
              }),
              (with ( new Attachment() ) {
                  accessType = AccessType.Url, 
@@ -32,7 +35,7 @@
                  contentType = "text",
                  name = "file2.txt",
                  size = 500,
-                 contentId = 3
+                 attachmentContentId = 3
              })
         ],
         comments = [ 

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/resources/org/drools/task/service/Notification1.mvel
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/resources/org/drools/task/service/Notification1.mvel	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/resources/org/drools/task/service/Notification1.mvel	2008-09-12 17:44:38 UTC (rev 22723)
@@ -0,0 +1,29 @@
+with ( new Task() ) { 
+    taskData = (with ( new TaskData() ) {
+                   documentAccessType = AccessType.Inline,
+                   documentType = "MVEL"
+                }),
+    deadlines = ( with ( new Deadlines() ) {
+        startDeadlines = [ 
+            (with (new Deadline()) {
+                date = new Date( now.time + 5000 ),            
+                escalations = [ 
+                    (with (new Escalation()) {
+                        name = "My Start Escalation",
+                        constraints = [new BooleanExpression( "mvel", "true" )],
+                        notifications = [ 
+                            (with (new EmailNotification()) {
+                                recipients = [ users['tony' ], users['darth' ] ],
+                                emailHeaders = [ 'en-UK' : (with (new EmailNotificationHeader()) { 
+                                    language = 'en-UK',
+                                    subject = "@{doc.subject}",
+                                    body = "@{doc.body}"
+                                }) ]                                                                                                                                                                                  
+                            }) 
+                        ]                                               
+                    }) 
+                ]
+            })
+        ]
+    })        
+};
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-workitems/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-workitems/.classpath	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-workitems/.classpath	2008-09-12 17:44:38 UTC (rev 22723)
@@ -1,48 +1,34 @@
-<classpath>
-  <classpathentry kind="src" path="src/main/java"/>
-  <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
-  <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
-  <classpathentry kind="output" path="target/classes"/>
-  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-  <classpathentry kind="var" path="M2_REPO/commons-io/commons-io/1.4/commons-io-1.4.jar"/>
-  <classpathentry kind="var" path="M2_REPO/javax/activation/activation/1.1/activation-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/javax/mail/mail/1.4/mail-1.4.jar"/>
-  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-compress/1.0-SNAPSHOT/commons-compress-1.0-SNAPSHOT.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-exec/1.0.0-SNAPSHOT/commons-exec-1.0.0-SNAPSHOT.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-finder/1.0-SNAPSHOT/commons-finder-1.0-SNAPSHOT.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-cli/2.0-SNAPSHOT/commons-cli-2.0-SNAPSHOT.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/drools/drools-compiler/5.0.0.SNAPSHOT/drools-compiler-5.0.0.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-compiler/5.0.0.SNAPSHOT/drools-compiler-5.0.0.SNAPSHOT-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/drools/drools-core/5.0.0.SNAPSHOT/drools-core-5.0.0.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-core/5.0.0.SNAPSHOT/drools-core-5.0.0.SNAPSHOT-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-SNAPSHOT/mvel-2.0-SNAPSHOT.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0.1/antlr-runtime-3.0.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/antlr/gunit/1.0.1/gunit-1.0.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/antlr/antlr/3.0.1/antlr-3.0.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.7/antlr-2.7.7.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
-  <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/drools/drools-process-task/5.0.0.SNAPSHOT/drools-process-task-5.0.0.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-process-task/5.0.0.SNAPSHOT/drools-process-task-5.0.0.SNAPSHOT-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/apache/mina/mina-core/2.0.0-M3/mina-core-2.0.0-M3.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.4.3/slf4j-api-1.4.3.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-jdk14/1.5.2/slf4j-jdk14-1.5.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-entitymanager/3.4.0.GA/hibernate-entitymanager-3.4.0.GA.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hibernate/ejb3-persistence/1.0.2.GA/ejb3-persistence-1.0.2.GA.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-commons-annotations/3.1.0.GA/hibernate-commons-annotations-3.1.0.GA.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-annotations/3.4.0.GA/hibernate-annotations-3.4.0.GA.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-core/3.3.0.SP1/hibernate-core-3.3.0.SP1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.1/commons-collections-3.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/javax/transaction/jta/1.1/jta-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/javassist/javassist/3.4.GA/javassist-3.4.GA.jar"/>
-  <classpathentry kind="var" path="M2_REPO/com/h2database/h2/1.0.77/h2-1.0.77.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.0.1/jmock-2.5.0.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/subethamail/subethasmtp-wiser/1.2/subethasmtp-wiser-1.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/subethamail/subethasmtp-smtp/1.2/subethasmtp-smtp-1.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.13/log4j-1.2.13.jar"/>
-  <classpathentry kind="var" path="M2_REPO/logkit/logkit/1.0.1/logkit-1.0.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.jar"/>
-  <classpathentry kind="var" path="M2_REPO/javax/servlet/servlet-api/2.3/servlet-api-2.3.jar"/>
+<classpath>
+  <classpathentry kind="src" path="src/main/java"/>
+  <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+  <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="var" path="M2_REPO/commons-io/commons-io/1.4/commons-io-1.4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/activation/activation/1.1/activation-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/mail/mail/1.4/mail-1.4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-compress/1.0-SNAPSHOT/commons-compress-1.0-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-exec/1.0.0-SNAPSHOT/commons-exec-1.0.0-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-finder/1.0-SNAPSHOT/commons-finder-1.0-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-cli/2.0-SNAPSHOT/commons-cli-2.0-SNAPSHOT.jar"/>
+  <classpathentry kind="src" path="/drools-compiler"/>
+  <classpathentry kind="src" path="/drools-core"/>
+  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-SNAPSHOT/mvel-2.0-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0.1/antlr-runtime-3.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/antlr/gunit/1.0.1/gunit-1.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/antlr/antlr/3.0.1/antlr-3.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.7/antlr-2.7.7.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
+  <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.0.1/jmock-2.5.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/subethamail/subethasmtp-wiser/1.2/subethasmtp-wiser-1.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/subethamail/subethasmtp-smtp/1.2/subethasmtp-smtp-1.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.13/log4j-1.2.13.jar"/>
+  <classpathentry kind="var" path="M2_REPO/logkit/logkit/1.0.1/logkit-1.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/servlet/servlet-api/2.3/servlet-api-2.3.jar"/>
 </classpath>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-workitems/.project
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-workitems/.project	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-workitems/.project	2008-09-12 17:44:38 UTC (rev 22723)
@@ -1,13 +1,16 @@
-<projectDescription>
-  <name>drools-workitems</name>
-  <comment>A rule production system</comment>
-  <projects/>
-  <buildSpec>
-    <buildCommand>
-      <name>org.eclipse.jdt.core.javabuilder</name>
-    </buildCommand>
-  </buildSpec>
-  <natures>
-    <nature>org.eclipse.jdt.core.javanature</nature>
-  </natures>
+<projectDescription>
+  <name>drools-workitems</name>
+  <comment>A rule production system</comment>
+  <projects>
+    <project>drools-compiler</project>
+    <project>drools-core</project>
+  </projects>
+  <buildSpec>
+    <buildCommand>
+      <name>org.eclipse.jdt.core.javabuilder</name>
+    </buildCommand>
+  </buildSpec>
+  <natures>
+    <nature>org.eclipse.jdt.core.javanature</nature>
+  </natures>
 </projectDescription>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-workitems/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-workitems/pom.xml	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-workitems/pom.xml	2008-09-12 17:44:38 UTC (rev 22723)
@@ -10,7 +10,7 @@
 
   <artifactId>drools-workitems</artifactId>
   <packaging>jar</packaging>
-  <name>Drools :: WorkItems</name>
+  <name>Drools :: Process :: WorkItems</name>
 
   <build/>
 
@@ -24,11 +24,6 @@
       <groupId>org.drools</groupId>
       <artifactId>drools-compiler</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.drools</groupId>
-      <artifactId>drools-process-task</artifactId>
-      <version>5.0.0.SNAPSHOT</version>
-    </dependency>
 
     <!-- External dependencies -->
     <dependency>

Modified: labs/jbossrules/trunk/drools-process/drools-workitems/src/main/java/org/drools/process/workitem/email/SendHtml.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-workitems/src/main/java/org/drools/process/workitem/email/SendHtml.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-workitems/src/main/java/org/drools/process/workitem/email/SendHtml.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -38,7 +38,11 @@
             Properties props = new Properties();
             // XXX - could use Session.getTransport() and Transport.connect()
             // XXX - assume we're using SMTP
-            if ( mailhost != null ) props.put( "mail.smtp.host", mailhost );
+            if ( mailhost != null && mailhost.trim().length() > 0 ) props.put( "mail.smtp.host", mailhost );
+            if ( connection.getPort() != null && connection.getPort().trim().length() > 0 ) {
+                props.put( "mail.smtp.port", Integer.parseInt( connection.getPort() ) );                
+            }               
+                        
             // Get a Session object
             Session session = Session.getInstance( props, null );
             if ( debug ) session.setDebug( true );
@@ -69,7 +73,7 @@
             // send the thing off
             Transport.send( msg );
         } catch ( Exception e ) {
-            e.printStackTrace();
+            throw new RuntimeException( "Unable to send email", e );
         }
     }
 

Modified: labs/jbossrules/trunk/drools-process/drools-workitems/src/main/java/org/drools/process/workitem/wsht/WSHumanTaskHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-workitems/src/main/java/org/drools/process/workitem/wsht/WSHumanTaskHandler.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-workitems/src/main/java/org/drools/process/workitem/wsht/WSHumanTaskHandler.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -5,114 +5,114 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.mina.transport.socket.nio.NioSocketConnector;
-import org.drools.process.instance.WorkItem;
-import org.drools.process.instance.WorkItemHandler;
-import org.drools.process.instance.WorkItemManager;
-import org.drools.task.I18NText;
-import org.drools.task.OrganizationalEntity;
-import org.drools.task.PeopleAssignments;
-import org.drools.task.Status;
-import org.drools.task.Task;
-import org.drools.task.TaskData;
-import org.drools.task.User;
-import org.drools.task.service.MinaTaskClient;
-import org.drools.task.service.TaskClientHandler;
-import org.drools.task.service.TaskClientHandler.AddTaskResponseHandler;
+//import org.apache.mina.transport.socket.nio.NioSocketConnector;
+//import org.drools.process.instance.WorkItem;
+//import org.drools.process.instance.WorkItemHandler;
+//import org.drools.process.instance.WorkItemManager;
+//import org.drools.task.I18NText;
+//import org.drools.task.OrganizationalEntity;
+//import org.drools.task.PeopleAssignments;
+//import org.drools.task.Status;
+//import org.drools.task.Task;
+//import org.drools.task.TaskData;
+//import org.drools.task.User;
+//import org.drools.task.service.MinaTaskClient;
+//import org.drools.task.service.TaskClientHandler;
+//import org.drools.task.service.TaskClientHandler.AddTaskResponseHandler;
 
-public class WSHumanTaskHandler implements WorkItemHandler {
+public class WSHumanTaskHandler {//implements WorkItemHandler {
+//
+//	private String ipAddress = "127.0.0.1";
+//	private int port = 9123;
+//
+//	public void setConnection(String ipAddress, int port) {
+//		this.ipAddress = ipAddress;
+//		this.port = port;
+//	}
+//
+//	public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+//		// TODO: cache client and keep client open ?
+//		MinaTaskClient client = new MinaTaskClient(
+//			"org.drools.process.workitem.wsht.WSHumanTaskHandler", new TaskClientHandler());
+//		NioSocketConnector connector = new NioSocketConnector();
+//		SocketAddress address = new InetSocketAddress(ipAddress, port);
+//		client.connect(connector, address);
+//		
+//		Task task = new Task();
+//		String taskName = (String) workItem.getParameter("TaskName");
+//		if (taskName != null) {
+//			List<I18NText> names = new ArrayList<I18NText>();
+//			names.add(new I18NText("en-UK", taskName));
+//			task.setNames(names);
+//		}
+//		String comment = (String) workItem.getParameter("Comment");
+//		if (comment != null) {
+//			List<I18NText> descriptions = new ArrayList<I18NText>();
+//			descriptions.add(new I18NText("en-UK", comment));
+//			task.setDescriptions(descriptions);
+//			List<I18NText> subjects = new ArrayList<I18NText>();
+//			subjects.add(new I18NText("en-UK", comment));
+//			task.setSubjects(subjects);
+//		}
+//		String priority = (String) workItem.getParameter("Priority");
+//		if (priority != null) {
+//			try {
+//				task.setPriority(new Integer(priority));
+//			} catch (NumberFormatException e) {
+//				// do nothing
+//			}
+//		}
+//		TaskData taskData = new TaskData();
+//		taskData.setWorkItemId(workItem.getId());
+//		taskData.setStatus(Status.Created);
+//		task.setTaskData(taskData);
+//		String actorId = (String) workItem.getParameter("ActorId");
+//		if (actorId != null) {
+//			PeopleAssignments assignments = new PeopleAssignments();
+//			List<OrganizationalEntity> potentialOwners = new ArrayList<OrganizationalEntity>();
+//			User user = new User();
+//			user.setId(new Long(actorId));
+//			potentialOwners.add(user);
+//			assignments.setPotentialOwners(potentialOwners);
+//			task.setPeopleAssignments(assignments);
+//			//taskData.setActualOwner(user);
+//			//taskData.setCreatedBy(user);
+//			//taskData.setCreatedOn(new Date());
+//			//taskData.setActivationTime(new Date());
+//		}
+//		client.addTask(task, new BlockingAddTaskResponseHandler());
+//		client.disconnect();
+//	}
+//
+//	public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+//		// TODO
+//	}
+//	
+//	private class BlockingAddTaskResponseHandler implements AddTaskResponseHandler {
+//        private volatile long taskId;
+//        private volatile boolean wait = true;
+//
+//        public synchronized void execute(long taskId) {
+//            this.taskId = taskId;
+//            wait = false;
+//            notifyAll();                
+//        }
+//        
+//        public synchronized long getTaskId() {
+//            if ( wait ) {                  
+//                try {
+//                    wait( 3000 );
+//                } catch ( InterruptedException e ) {
+//                    // swallow as this is just a notifiation
+//                }
+//            }
+//            
+//            if ( wait ) {
+//                throw new RuntimeException("Timeout : unable to retrieve Task Id" );
+//            }
+//            
+//            return taskId;
+//        }       
+//    }
 
-	private String ipAddress = "127.0.0.1";
-	private int port = 9123;
-
-	public void setConnection(String ipAddress, int port) {
-		this.ipAddress = ipAddress;
-		this.port = port;
-	}
-
-	public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
-		// TODO: cache client and keep client open ?
-		MinaTaskClient client = new MinaTaskClient(
-			"org.drools.process.workitem.wsht.WSHumanTaskHandler", new TaskClientHandler());
-		NioSocketConnector connector = new NioSocketConnector();
-		SocketAddress address = new InetSocketAddress(ipAddress, port);
-		client.connect(connector, address);
-		
-		Task task = new Task();
-		String taskName = (String) workItem.getParameter("TaskName");
-		if (taskName != null) {
-			List<I18NText> names = new ArrayList<I18NText>();
-			names.add(new I18NText("en-UK", taskName));
-			task.setNames(names);
-		}
-		String comment = (String) workItem.getParameter("Comment");
-		if (comment != null) {
-			List<I18NText> descriptions = new ArrayList<I18NText>();
-			descriptions.add(new I18NText("en-UK", comment));
-			task.setDescriptions(descriptions);
-			List<I18NText> subjects = new ArrayList<I18NText>();
-			subjects.add(new I18NText("en-UK", comment));
-			task.setSubjects(subjects);
-		}
-		String priority = (String) workItem.getParameter("Priority");
-		if (priority != null) {
-			try {
-				task.setPriority(new Integer(priority));
-			} catch (NumberFormatException e) {
-				// do nothing
-			}
-		}
-		TaskData taskData = new TaskData();
-		taskData.setWorkItemId(workItem.getId());
-		taskData.setStatus(Status.Created);
-		task.setTaskData(taskData);
-		String actorId = (String) workItem.getParameter("ActorId");
-		if (actorId != null) {
-			PeopleAssignments assignments = new PeopleAssignments();
-			List<OrganizationalEntity> potentialOwners = new ArrayList<OrganizationalEntity>();
-			User user = new User();
-			user.setId(new Long(actorId));
-			potentialOwners.add(user);
-			assignments.setPotentialOwners(potentialOwners);
-			task.setPeopleAssignments(assignments);
-			//taskData.setActualOwner(user);
-			//taskData.setCreatedBy(user);
-			//taskData.setCreatedOn(new Date());
-			//taskData.setActivationTime(new Date());
-		}
-		client.addTask(task, new BlockingAddTaskResponseHandler());
-		client.disconnect();
-	}
-
-	public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
-		// TODO
-	}
-	
-	private class BlockingAddTaskResponseHandler implements AddTaskResponseHandler {
-        private volatile long taskId;
-        private volatile boolean wait = true;
-
-        public synchronized void execute(long taskId) {
-            this.taskId = taskId;
-            wait = false;
-            notifyAll();                
-        }
-        
-        public synchronized long getTaskId() {
-            if ( wait ) {                  
-                try {
-                    wait( 3000 );
-                } catch ( InterruptedException e ) {
-                    // swallow as this is just a notifiation
-                }
-            }
-            
-            if ( wait ) {
-                throw new RuntimeException("Timeout : unable to retrieve Task Id" );
-            }
-            
-            return taskId;
-        }       
-    }
-
 }

Modified: labs/jbossrules/trunk/drools-process/drools-workitems/src/test/java/org/drools/process/workitem/email/EmailWorkItemHandlerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-workitems/src/test/java/org/drools/process/workitem/email/EmailWorkItemHandlerTest.java	2008-09-12 16:17:23 UTC (rev 22722)
+++ labs/jbossrules/trunk/drools-process/drools-workitems/src/test/java/org/drools/process/workitem/email/EmailWorkItemHandlerTest.java	2008-09-12 17:44:38 UTC (rev 22723)
@@ -28,6 +28,10 @@
         wiser.stop();
     }
     
+    public void test1() {
+        
+    }
+    
     public void testSingleTo() throws Exception {
         EmailWorkItemHandler handler = new EmailWorkItemHandler();
         handler.setConnection( "localhost", "25", null, null );   




More information about the jboss-svn-commits mailing list