[jbpm-commits] JBoss JBPM SVN: r2450 - in projects/spec/trunk/modules: api/src/main/java/org/jbpm/api/model/builder and 19 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Tue Sep 30 11:07:25 EDT 2008


Author: thomas.diesler at jboss.com
Date: 2008-09-30 11:07:24 -0400 (Tue, 30 Sep 2008)
New Revision: 2450

Added:
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Assignment.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/AssignmentImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/MessageImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ParticipantImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/MessageBuilderImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/ExpressionEvaluator.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/MessageSender.java
Modified:
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/EndEvent.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Event.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Message.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Process.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/PropertySupport.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/StartEvent.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/builder/ProcessBuilder.java
   projects/spec/trunk/modules/cts/pom.xml
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/activity/ActivityInputSetTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/activity/ActivityOutputSetTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/activity/ActivityPropertyTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/endevent/EndEventMessageTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/exclusive/ExclusiveGatewayMergeTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/inclusive/InclusiveGatewayMergeTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/parallel/ParallelGatewayMergeTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/process/ProcessPropertyTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/processbuilder/ProcessCatalog.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/startevent/StartEventSignalTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/ReceiveTaskTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/SendTaskTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/TaskExecutionHandlerTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/simplemerge/SimpleMergeTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/synchronization/SynchronizationTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/casedata/CaseDataTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/taskdata/TaskDataTest.java
   projects/spec/trunk/modules/impl/pom.xml
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EndEventImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EventImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/NodeImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/PropertyImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StartEventImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/EventBuilderImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/ProcessBuilderImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/DelegatingExecutionContext.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/TokenExecutorImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ExecutionServiceImpl.java
Log:
ProcessPropertyTest - pass

Added: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Assignment.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Assignment.java	                        (rev 0)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Assignment.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -0,0 +1,65 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.model;
+
+//$Id$
+
+/**
+ * An Assignment, which is used in the definition of attributes for Process,
+ * Activity, Event, Gateway, and Gate.
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 08-Jul-2008
+ */
+public interface Assignment
+{
+  public enum AssignTime
+  {
+    Start, End
+  }
+
+  /**
+   * The target for the Assignment MUST be a Property of the Process or the activity
+   * itself.
+   */
+  Property getTo();
+  
+  /**
+   * The Expression MUST be made up of a combination of Values, Properties, and
+   * Attributes, which are separated by operators such as add or multiply. The expression
+   * language is defined in the ExpressionLanguage attribute of the Business Process
+   * Diagram
+   */
+  Expression getFrom();
+
+  /**
+   * An Assignment MAY have a AssignTime setting. If the Object is an activity (Task,
+   * Sub-Process, or Process), then the Assignment MUST have an AssignTime.
+   * A value of Start means that the assignment SHALL occur at the start of the activity.
+   * This can be used to assign the higher-level (global) Properties of the Process to the
+   * (local) Properties of the activity as an input to the activity.
+   * A value of End means that the assignment SHALL occur at the end of the activity.
+   * This can be used to assign the (local) Properties of the activity to the higher-level
+   * (global) Properties of the Process as an output to the activity.
+   */
+  AssignTime getAssignTime();
+}


Property changes on: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Assignment.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/EndEvent.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/EndEvent.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/EndEvent.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -36,15 +36,7 @@
 public interface EndEvent extends Event
 {
   /**
-   * Defines the type of end result
-   */
-  enum ResultType
-  {
-    None, Message, Error, Compensation, Link, Multiple 
-  }
-  
-  /**
    * Get the type od end result
    */
-  ResultType getResultType();
+  EventDetailType getResultType();
 }
\ No newline at end of file

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Event.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Event.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Event.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -42,7 +42,25 @@
   };
   
   /**
+   * Defines the type of event detail
+   */
+  enum EventDetailType
+  {
+    None, Message, Error, Compensation, Link, Multiple, Timer, Rule, Signal 
+  }
+  
+  /**
    * Get the type of this event
    */
   EventType getEventType();
+  
+  /**
+   * Get the associated signal ref
+   */
+  Signal getSignalRef();
+  
+  /**
+   * Get the associated message ref
+   */
+  Message getMessageRef();
 }
\ No newline at end of file

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Message.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Message.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Message.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -21,8 +21,10 @@
  */
 package org.jbpm.api.model;
 
+import java.io.Serializable;
 
 
+
 //$Id$
 
 /**
@@ -32,7 +34,7 @@
  * @author thomas.diesler at jboss.com
  * @since 21-Jul-2008
  */
-public interface Message extends PropertySupport
+public interface Message extends PropertySupport, Serializable
 {
   /**
    * Name is an attribute that is text description of the Message.

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Process.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Process.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Process.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -24,6 +24,7 @@
 //$Id$
 
 import java.util.List;
+import java.util.Set;
 
 import javax.management.ObjectName;
 
@@ -82,6 +83,24 @@
    */
   Node getNode(String name);
   
+  /**
+   * One or more assignment expressions MAY be made for the object. The Assignment SHALL be performed as defined by the
+   * AssignTime attribute.
+   */
+  List<Assignment> getAssignments();
+  
+  /**
+   * Get the list of associated {@link Message} objects.
+   * @return An empty list if there are none
+   */
+  Set<Message> getMessages();
+
+  /**
+   * Get an associated {@link Message} by name.
+   * @return null if not found
+   */
+  Message getMessage(String msgName);
+  
   // Runtime Aspects ==================================================================================================== 
   
   /**

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/PropertySupport.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/PropertySupport.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/PropertySupport.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -39,7 +39,18 @@
   Property getProperty(String name);
 
   /**
-   * Get the list of property names
+   * Add a property 
    */
-  Set<Property> getProperties();
+  void addProperty(Property prop);
+
+  /**
+   * Remove a property 
+   */
+  boolean removeProperty(String name);
+
+  /**
+   * Get the set of property names
+   */
+  Set<String> getPropertyNames();
+  
 }
\ No newline at end of file

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/StartEvent.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/StartEvent.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/StartEvent.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -34,14 +34,6 @@
 public interface StartEvent extends Event
 {
   /**
-   * Defines the start trigger type
-   */
-  enum TriggerType
-  {
-    None, Message, Timer, Rule, Signal 
-  }
-  
-  /**
    * Get the outgoing SequenceFlow
    */
   SequenceFlow getOutFlow();
@@ -49,5 +41,5 @@
   /**
    * Get the start trigger type
    */
-  TriggerType getTriggerType();
+  EventDetailType getTriggerType();
 }
\ No newline at end of file

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/builder/ProcessBuilder.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/builder/ProcessBuilder.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/builder/ProcessBuilder.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -25,9 +25,10 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
-import org.jbpm.api.model.EndEvent.ResultType;
+import org.jbpm.api.model.Assignment.AssignTime;
+import org.jbpm.api.model.Event.EventDetailType;
+import org.jbpm.api.model.Expression.ExpressionLanguage;
 import org.jbpm.api.model.Gateway.GatewayType;
-import org.jbpm.api.model.StartEvent.TriggerType;
 import org.jbpm.api.model.Task.TaskType;
 import org.jbpm.api.runtime.ExecutionHandler;
 import org.jbpm.api.runtime.FlowHandler;
@@ -65,9 +66,9 @@
   EventBuilder addStartEvent(String name);
 
   /**
-   * Add a SartEvent with a given name and TriggerType
+   * Add a SartEvent with a given name and ResultType
    */
-  EventBuilder addStartEvent(String name, TriggerType triggerType);
+  EventBuilder addStartEvent(String name, EventDetailType ResultType);
 
   /**
    * Add an IntermediateEvent with a given name
@@ -82,7 +83,7 @@
   /**
    * Add an EndEvent with a given name and ResultType
    */
-  EventBuilder addEndEvent(String name, ResultType resultType);
+  EventBuilder addEndEvent(String name, EventDetailType resultType);
 
   /**
    * Add a Task of {@link TaskType} NONE with a given name
@@ -102,15 +103,29 @@
   /**
    * Add a {@link Message} with a given name.
    */
-  MessageBuilder addMessage(String name);
+  MessageBuilder addProcessMessage(String name);
   
   /**
-   * Add a process property
+   * Add a {@link Property} to the process
    */
-  ProcessBuilder addProperty(String name, String value);
+  ProcessBuilder addProcessProperty(String name, String value);
   
+  /**
+   * Add a {@link Property} to the current node
+   */
+  ProcessBuilder addNodeProperty(String name, String value);
   
   /**
+   * Add an Assignment to the Process.
+   */
+  ProcessBuilder addProcessAssignment(AssignTime time, ExpressionLanguage lang, String fromExpr, String toProp);
+  
+  /**
+   * Add an Assignment to the current {@link Node}.
+   */
+  ProcessBuilder addNodeAssignment(AssignTime time, ExpressionLanguage lang, String fromExpr, String toProp);
+  
+  /**
    * Add an {@link ExecutionHandler} with a given Class
    */
   <T extends ExecutionHandler> ProcessBuilder addExecutionHandler(Class<T> clazz);

Modified: projects/spec/trunk/modules/cts/pom.xml
===================================================================
--- projects/spec/trunk/modules/cts/pom.xml	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/pom.xml	2008-09-30 15:07:24 UTC (rev 2450)
@@ -82,7 +82,6 @@
             <exclude>org/jbpm/test/cts/gateway/parallel/ParallelGatewayMergeTest.java</exclude>
             <exclude>org/jbpm/test/cts/gateway/parallel/ParallelGatewaySplitTest.java</exclude>
             <exclude>org/jbpm/test/cts/processmanager/ProcessManagerTest.java</exclude>
-            <exclude>org/jbpm/test/cts/process/ProcessPropertyTest.java</exclude>
             <exclude>org/jbpm/test/cts/signalmanager/SignalManagerTest.java</exclude>
             <exclude>org/jbpm/test/cts/startevent/StartEventSignalTest.java</exclude>
             <exclude>org/jbpm/test/cts/task/ReceiveTaskTest.java</exclude>

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/activity/ActivityInputSetTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/activity/ActivityInputSetTest.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/activity/ActivityInputSetTest.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -27,7 +27,7 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
-import org.jbpm.api.model.EndEvent.ResultType;
+import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
 import org.jbpm.api.model.builder.ProcessBuilderService;
@@ -84,8 +84,8 @@
     procBuilder.addProcess("ActivityInputSet").addStartEvent("Start").addSequenceFlow("TaskA");
     //TaskBuilder taskBuilder = procBuilder.addTask("TaskA");
     //taskBuilder.addInputSet().addPropertyInput("frog").addSequenceFlow("End");
-    procBuilder.addEndEvent("End", ResultType.Message).addMessageRef("EndMessage");
-    MessageBuilder msgBuilder = procBuilder.addMessage("EndMessage");
+    procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
+    MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("frog", null, true);
     Process proc = procBuilder.getProcess();
     return proc;

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/activity/ActivityOutputSetTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/activity/ActivityOutputSetTest.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/activity/ActivityOutputSetTest.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -27,7 +27,7 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
-import org.jbpm.api.model.EndEvent.ResultType;
+import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
 import org.jbpm.api.model.builder.ProcessBuilderService;
@@ -64,8 +64,8 @@
     procBuilder.addProcess("ActivityInputSet").addStartEvent("Start").addSequenceFlow("TaskA");
     //TaskBuilder taskBuilder = procBuilder.addTask("TaskA");
     //taskBuilder.addOutputSet().addPropertyOutput("frog", "kermit").addSequenceFlow("End");
-    procBuilder.addEndEvent("End", ResultType.Message).addMessageRef("EndMessage");
-    MessageBuilder msgBuilder = procBuilder.addMessage("EndMessage");
+    procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
+    MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("frog", null, true);
     Process proc = procBuilder.getProcess();
     return proc;

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/activity/ActivityPropertyTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/activity/ActivityPropertyTest.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/activity/ActivityPropertyTest.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -27,7 +27,7 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
-import org.jbpm.api.model.EndEvent.ResultType;
+import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
 import org.jbpm.api.model.builder.ProcessBuilderService;
@@ -62,10 +62,10 @@
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("ActivityProperties").addStartEvent("Start").addSequenceFlow("TaskA");
     TaskBuilder taskBuilder = procBuilder.addTask("TaskA");
-    taskBuilder.addProperty("foo", "bar").addSequenceFlow("End");
+    taskBuilder.addProcessProperty("foo", "bar").addSequenceFlow("End");
     //taskBuilder.addAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "ActivityProperties_TaskA_foo", "propValue");
-    procBuilder.addEndEvent("End", ResultType.Message).addMessageRef("EndMessage");
-    MessageBuilder msgBuilder = procBuilder.addMessage("EndMessage");
+    procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
+    MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("propValue", null, true);
     Process proc = procBuilder.getProcess();
     return proc;

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/endevent/EndEventMessageTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/endevent/EndEventMessageTest.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/endevent/EndEventMessageTest.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -27,7 +27,7 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
-import org.jbpm.api.model.EndEvent.ResultType;
+import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
 import org.jbpm.api.model.builder.ProcessBuilderService;
@@ -64,8 +64,8 @@
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("EndEventMessage").addStartEvent("Start");
     procBuilder.addSequenceFlow("TaskA").addTask("TaskA").addSequenceFlow("End");
-    procBuilder.addEndEvent("End", ResultType.Message).addMessageRef("EndMessage");
-    MessageBuilder msgBuilder = procBuilder.addMessage("EndMessage");
+    procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
+    MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("kermit", null, true);
     Process proc = procBuilder.getProcess();
     return proc;

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/exclusive/ExclusiveGatewayMergeTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/exclusive/ExclusiveGatewayMergeTest.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/exclusive/ExclusiveGatewayMergeTest.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -29,10 +29,9 @@
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
 import org.jbpm.api.model.Signal;
-import org.jbpm.api.model.EndEvent.ResultType;
+import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.Gateway.GatewayType;
 import org.jbpm.api.model.Signal.SignalType;
-import org.jbpm.api.model.StartEvent.TriggerType;
 import org.jbpm.api.model.builder.EventBuilder;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
@@ -166,19 +165,19 @@
   public Process getProcess() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
-    EventBuilder eventBuilder = procBuilder.addProcess(getName()).addStartEvent("StartA", TriggerType.Signal);
+    EventBuilder eventBuilder = procBuilder.addProcess(getName()).addStartEvent("StartA", EventDetailType.Signal);
     eventBuilder.addSignalRef(SignalType.SYSTEM_START_TRIGGER, "A");
     TaskBuilder taskBuilder = procBuilder.addSequenceFlow("TaskA").addTask("TaskA");
     //taskBuilder.addAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "'TaskA'", "taskValue");
     taskBuilder.addSequenceFlow("Merge");
-    eventBuilder = procBuilder.addStartEvent("StartB", TriggerType.Signal);
+    eventBuilder = procBuilder.addStartEvent("StartB", EventDetailType.Signal);
     eventBuilder.addSignalRef(SignalType.SYSTEM_START_TRIGGER, "B");
     taskBuilder = procBuilder.addSequenceFlow("TaskB").addTask("TaskB");
     //taskBuilder.addAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "'TaskB'", "taskValue");
     taskBuilder.addSequenceFlow("Merge");
     procBuilder.addGateway("Merge", GatewayType.Exclusive).addSequenceFlow("End");
-    procBuilder.addEndEvent("End", ResultType.Message).addMessageRef("EndMessage");
-    MessageBuilder msgBuilder = procBuilder.addMessage("EndMessage");
+    procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
+    MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("taskValue", null, true);
     Process proc = procBuilder.getProcess();
     return proc;

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/inclusive/InclusiveGatewayMergeTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/inclusive/InclusiveGatewayMergeTest.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/inclusive/InclusiveGatewayMergeTest.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -29,9 +29,9 @@
 import org.jbpm.api.client.SignalListener;
 import org.jbpm.api.model.Process;
 import org.jbpm.api.model.Signal;
+import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.Gateway.GatewayType;
 import org.jbpm.api.model.Signal.SignalType;
-import org.jbpm.api.model.StartEvent.TriggerType;
 import org.jbpm.api.model.builder.EventBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
 import org.jbpm.api.model.builder.ProcessBuilderService;
@@ -77,9 +77,9 @@
   public Process getProcess() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
-    EventBuilder eventBuilder = procBuilder.addProcess(getName()).addStartEvent("StartA", TriggerType.Signal);
+    EventBuilder eventBuilder = procBuilder.addProcess(getName()).addStartEvent("StartA", EventDetailType.Signal);
     eventBuilder.addSignalRef(SignalType.SYSTEM_START_TRIGGER, "A");
-    eventBuilder = procBuilder.addSequenceFlow("Merge").addStartEvent("StartB", TriggerType.Signal);
+    eventBuilder = procBuilder.addSequenceFlow("Merge").addStartEvent("StartB", EventDetailType.Signal);
     eventBuilder.addSignalRef(SignalType.SYSTEM_START_TRIGGER, "B");
     procBuilder.addSequenceFlow("Merge").addGateway("Merge", GatewayType.Inclusive).addSequenceFlow("End");
     procBuilder.addEndEvent("End");

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/parallel/ParallelGatewayMergeTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/parallel/ParallelGatewayMergeTest.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/parallel/ParallelGatewayMergeTest.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -29,10 +29,9 @@
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
 import org.jbpm.api.model.Signal;
-import org.jbpm.api.model.EndEvent.ResultType;
+import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.Gateway.GatewayType;
 import org.jbpm.api.model.Signal.SignalType;
-import org.jbpm.api.model.StartEvent.TriggerType;
 import org.jbpm.api.model.builder.EventBuilder;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
@@ -158,19 +157,19 @@
   public Process getProcess() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
-    EventBuilder eventBuilder = procBuilder.addProcess(getName()).addStartEvent("StartA", TriggerType.Signal);
+    EventBuilder eventBuilder = procBuilder.addProcess(getName()).addStartEvent("StartA", EventDetailType.Signal);
     eventBuilder.addSignalRef(SignalType.SYSTEM_START_TRIGGER, "A");
     TaskBuilder taskBuilder = procBuilder.addSequenceFlow("TaskA").addTask("TaskA");
     //taskBuilder.addAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "'TaskA'", "taskValueA");
     taskBuilder.addSequenceFlow("Merge");
-    eventBuilder = procBuilder.addStartEvent("StartB", TriggerType.Signal);
+    eventBuilder = procBuilder.addStartEvent("StartB", EventDetailType.Signal);
     eventBuilder.addSignalRef(SignalType.SYSTEM_START_TRIGGER, "B");
     taskBuilder = procBuilder.addSequenceFlow("TaskB").addTask("TaskB");
     //taskBuilder.addAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "'TaskB'", "taskValueB");
     taskBuilder.addSequenceFlow("Merge");
     procBuilder.addGateway("Merge", GatewayType.Parallel).addSequenceFlow("End");
-    procBuilder.addEndEvent("End", ResultType.Message).addMessageRef("EndMessage");
-    MessageBuilder msgBuilder = procBuilder.addMessage("EndMessage");
+    procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
+    MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("taskValueA", null, true).addProperty("taskValueB", null, true);
     Process proc = procBuilder.getProcess();
     return proc;

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/process/ProcessPropertyTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/process/ProcessPropertyTest.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/process/ProcessPropertyTest.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -27,7 +27,9 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
-import org.jbpm.api.model.EndEvent.ResultType;
+import org.jbpm.api.model.Assignment.AssignTime;
+import org.jbpm.api.model.Event.EventDetailType;
+import org.jbpm.api.model.Expression.ExpressionLanguage;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
 import org.jbpm.api.model.builder.ProcessBuilderService;
@@ -66,10 +68,10 @@
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("ProcessProperties").addStartEvent("Start").addSequenceFlow("TaskA");
-    //procBuilder.addAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "ProcessProperties_foo", "propValue");
-    procBuilder.addProperty("foo", "bar").addTask("TaskA").addSequenceFlow("End");
-    procBuilder.addEndEvent("End", ResultType.Message).addMessageRef("EndMessage");
-    MessageBuilder msgBuilder = procBuilder.addMessage("EndMessage");
+    procBuilder.addProcessAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "ProcessProperties_foo", "propValue");
+    procBuilder.addProcessProperty("foo", "bar").addTask("TaskA").addSequenceFlow("End");
+    procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
+    MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("propValue", null, true);
     Process proc = procBuilder.getProcess();
     return proc;

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/processbuilder/ProcessCatalog.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/processbuilder/ProcessCatalog.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/processbuilder/ProcessCatalog.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -44,9 +44,9 @@
   public static Process getDefaultProcess()
   {
     ProcessBuilder builder = ProcessBuilderService.locateProcessBuilder();
-    builder.addProcess("Proc").addProperty("proP1", "valP1").addProperty("proP2", "valP2");
+    builder.addProcess("Proc").addProcessProperty("proP1", "valP1").addProcessProperty("proP2", "valP2");
     builder.addStartEvent("Start").addSequenceFlow("Task");
-    builder.addTask("Task").addProperty("proT1", "valT1").addProperty("proT2", "valT2");
+    builder.addTask("Task").addNodeProperty("proT1", "valT1").addNodeProperty("proT2", "valT2");
     builder.addSequenceFlow("End").addEndEvent("End");
     Process proc = builder.getProcess();
     return proc;
@@ -57,7 +57,7 @@
     TestCase.assertNotNull("Process not null", wasProc);
     TestCase.assertEquals("Proc", wasProc.getName());
 
-    TestCase.assertEquals("Two proc props", 2, wasProc.getProperties().size());
+    TestCase.assertEquals("Two proc props", 2, wasProc.getPropertyNames().size());
     TestCase.assertEquals("valP1", wasProc.getProperty("proP1").getValue());
     TestCase.assertEquals("valP2", wasProc.getProperty("proP2").getValue());
     
@@ -69,9 +69,9 @@
     TestCase.assertNotNull("Task not null", task);
     TestCase.assertNotNull("End not null", end);
 
-    TestCase.assertEquals("No start props", 0, start.getProperties().size());
-    TestCase.assertEquals("Two task props", 2, task.getProperties().size());
-    TestCase.assertEquals("No end props", 0, end.getProperties().size());
+    TestCase.assertEquals("No start props", 0, start.getPropertyNames().size());
+    TestCase.assertEquals("Two task props", 2, task.getPropertyNames().size());
+    TestCase.assertEquals("No end props", 0, end.getPropertyNames().size());
     
     TestCase.assertEquals("valT1", task.getProperty("proT1").getValue());
     TestCase.assertEquals("valT2", task.getProperty("proT2").getValue());

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/startevent/StartEventSignalTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/startevent/StartEventSignalTest.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/startevent/StartEventSignalTest.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -30,9 +30,8 @@
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
 import org.jbpm.api.model.Signal;
-import org.jbpm.api.model.EndEvent.ResultType;
+import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.Signal.SignalType;
-import org.jbpm.api.model.StartEvent.TriggerType;
 import org.jbpm.api.model.builder.EventBuilder;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
@@ -125,13 +124,13 @@
   public Process getProcess() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
-    EventBuilder eventBuilder = procBuilder.addProcess("StartEventSignal").addStartEvent("StartA", TriggerType.Signal);
+    EventBuilder eventBuilder = procBuilder.addProcess("StartEventSignal").addStartEvent("StartA", EventDetailType.Signal);
     eventBuilder.addSignalRef(SignalType.SYSTEM_START_TRIGGER, "A");
     TaskBuilder taskBuilder = procBuilder.addSequenceFlow("TaskA").addTask("TaskA");
     //taskBuilder.addAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "'TaskA'", "taskValue");
     taskBuilder.addSequenceFlow("End");
-    procBuilder.addEndEvent("End", ResultType.Message).addMessageRef("EndMessage");
-    MessageBuilder msgBuilder = procBuilder.addMessage("EndMessage");
+    procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
+    MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("taskValue", null, true);
     Process proc = procBuilder.getProcess();
     return proc;

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/ReceiveTaskTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/ReceiveTaskTest.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/ReceiveTaskTest.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -30,7 +30,7 @@
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
 import org.jbpm.api.model.Signal;
-import org.jbpm.api.model.EndEvent.ResultType;
+import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.Signal.SignalType;
 import org.jbpm.api.model.Task.TaskType;
 import org.jbpm.api.model.builder.EventBuilder;
@@ -152,13 +152,13 @@
   protected Process getProcess() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
-    MessageBuilder msgBuilder = procBuilder.addProcess("ReceiveTaskTest").addMessage("ReceiveTaskMessage");
+    MessageBuilder msgBuilder = procBuilder.addProcess("ReceiveTaskTest").addProcessMessage("ReceiveTaskMessage");
     msgBuilder.addProperty("foo", null, true);
-    msgBuilder = procBuilder.addMessage("EndEventMessage");
+    msgBuilder = procBuilder.addProcessMessage("EndEventMessage");
     msgBuilder.addToRef(getTestID()).addProperty("foo", null, true);
     procBuilder.addStartEvent("Start").addSequenceFlow("TaskA");
     procBuilder.addTask("TaskA", TaskType.Receive).addMessageRef("ReceiveTaskMessage");
-    EventBuilder eventBuilder = procBuilder.addSequenceFlow("End").addEndEvent("End", ResultType.Message);
+    EventBuilder eventBuilder = procBuilder.addSequenceFlow("End").addEndEvent("End", EventDetailType.Message);
     eventBuilder.addMessageRef("EndEventMessage");
     return procBuilder.getProcess();
   }

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/SendTaskTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/SendTaskTest.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/SendTaskTest.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -77,7 +77,7 @@
   protected Process getProcess() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
-    MessageBuilder msgBuilder = procBuilder.addProcess("SendTaskTest").addMessage("SendTaskMessage");
+    MessageBuilder msgBuilder = procBuilder.addProcess("SendTaskTest").addProcessMessage("SendTaskMessage");
     msgBuilder.addToRef(getTestID()).addProperty("foo", null, true);
     procBuilder.addStartEvent("Start").addSequenceFlow("TaskA");
     procBuilder.addTask("TaskA", TaskType.Send).addMessageRef("SendTaskMessage");

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/TaskExecutionHandlerTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/TaskExecutionHandlerTest.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/TaskExecutionHandlerTest.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -57,11 +57,11 @@
   protected Process getProcess() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
-    procBuilder.addProcess("TaskExecutionHandlerTest").addProperty("procProp", "kermit");
+    procBuilder.addProcess("TaskExecutionHandlerTest").addProcessProperty("procProp", "kermit");
     //procBuilder.addAssignment(Assignment.AssignTime.Start, Expression.ExpressionLanguage.MVEL, "TaskExecutionHandlerTest_procProp == 'kermit'", "procAssign");
     procBuilder.addStartEvent("Start").addSequenceFlow("TaskA");
     TaskBuilder taskBuilder = procBuilder.addTask("TaskA");
-    taskBuilder.addProperty("taskProp", "piggy").addExecutionHandler(TaskExecutionHandler.class).addSequenceFlow("End");
+    taskBuilder.addProcessProperty("taskProp", "piggy").addExecutionHandler(TaskExecutionHandler.class).addSequenceFlow("End");
     //taskBuilder.addAssignment(Assignment.AssignTime.Start, Expression.ExpressionLanguage.MVEL, "TaskExecutionHandlerTest_TaskA_taskProp == 'piggy'", "taskAssign");
     procBuilder.addEndEvent("End");
     return procBuilder.getProcess();

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/simplemerge/SimpleMergeTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/simplemerge/SimpleMergeTest.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/simplemerge/SimpleMergeTest.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -30,8 +30,8 @@
 import org.jbpm.api.model.Gateway;
 import org.jbpm.api.model.Process;
 import org.jbpm.api.model.Signal;
+import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.Signal.SignalType;
-import org.jbpm.api.model.StartEvent.TriggerType;
 import org.jbpm.api.model.builder.EventBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
 import org.jbpm.api.model.builder.ProcessBuilderService;
@@ -77,9 +77,9 @@
   public Process getProcess() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
-    EventBuilder eventBuilder = procBuilder.addProcess(getName()).addStartEvent("StartA", TriggerType.Signal);
+    EventBuilder eventBuilder = procBuilder.addProcess(getName()).addStartEvent("StartA", EventDetailType.Signal);
     eventBuilder.addSignalRef(SignalType.SYSTEM_START_TRIGGER, "A");
-    eventBuilder = procBuilder.addSequenceFlow("Merge").addStartEvent("StartB", TriggerType.Signal);
+    eventBuilder = procBuilder.addSequenceFlow("Merge").addStartEvent("StartB", EventDetailType.Signal);
     eventBuilder.addSignalRef(SignalType.SYSTEM_START_TRIGGER, "B");
     procBuilder.addSequenceFlow("Merge").addGateway("Merge", Gateway.GatewayType.Inclusive).addSequenceFlow("End");
     procBuilder.addEndEvent("End");

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/synchronization/SynchronizationTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/synchronization/SynchronizationTest.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/synchronization/SynchronizationTest.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -30,9 +30,8 @@
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
 import org.jbpm.api.model.Signal;
-import org.jbpm.api.model.EndEvent.ResultType;
+import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.Signal.SignalType;
-import org.jbpm.api.model.StartEvent.TriggerType;
 import org.jbpm.api.model.builder.EventBuilder;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
@@ -160,19 +159,19 @@
   public Process getProcess() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
-    EventBuilder eventBuilder = procBuilder.addProcess("Synchronization").addStartEvent("StartA", TriggerType.Signal);
+    EventBuilder eventBuilder = procBuilder.addProcess("Synchronization").addStartEvent("StartA", EventDetailType.Signal);
     eventBuilder.addSignalRef(SignalType.SYSTEM_START_TRIGGER, "A");
     TaskBuilder taskBuilder = procBuilder.addSequenceFlow("TaskA").addTask("TaskA");
     //taskBuilder.addAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "'TaskA'", "taskValueA");
     taskBuilder.addSequenceFlow("Merge");
-    eventBuilder = procBuilder.addStartEvent("StartB", TriggerType.Signal);
+    eventBuilder = procBuilder.addStartEvent("StartB", EventDetailType.Signal);
     eventBuilder.addSignalRef(SignalType.SYSTEM_START_TRIGGER, "B");
     taskBuilder = procBuilder.addSequenceFlow("TaskB").addTask("TaskB");
     //taskBuilder.addAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "'TaskB'", "taskValueB");
     taskBuilder.addSequenceFlow("Merge");
     procBuilder.addGateway("Merge", Gateway.GatewayType.Parallel).addSequenceFlow("End");
-    procBuilder.addEndEvent("End", ResultType.Message).addMessageRef("EndMessage");
-    MessageBuilder msgBuilder = procBuilder.addMessage("EndMessage");
+    procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
+    MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("taskValueA", null, true).addProperty("taskValueB", null, true);
     Process proc = procBuilder.getProcess();
     return proc;

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/casedata/CaseDataTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/casedata/CaseDataTest.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/casedata/CaseDataTest.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -27,7 +27,7 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
-import org.jbpm.api.model.EndEvent.ResultType;
+import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
 import org.jbpm.api.model.builder.ProcessBuilderService;
@@ -60,10 +60,10 @@
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("CaseData");
     //procBuilder.addAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "CaseData_foo", "propValue");
-    procBuilder.addProperty("foo", "bar").addStartEvent("Start").addSequenceFlow("TaskA");
+    procBuilder.addProcessProperty("foo", "bar").addStartEvent("Start").addSequenceFlow("TaskA");
     procBuilder.addTask("TaskA").addSequenceFlow("End");
-    procBuilder.addEndEvent("End", ResultType.Message).addMessageRef("EndMessage");
-    MessageBuilder msgBuilder = procBuilder.addMessage("EndMessage");
+    procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
+    MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("propValue", null, true);
     Process proc = procBuilder.getProcess();
     return proc;

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/taskdata/TaskDataTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/taskdata/TaskDataTest.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/taskdata/TaskDataTest.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -27,7 +27,7 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
-import org.jbpm.api.model.EndEvent.ResultType;
+import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
 import org.jbpm.api.model.builder.ProcessBuilderService;
@@ -61,10 +61,10 @@
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("TaskData").addStartEvent("Start").addSequenceFlow("TaskA");
     TaskBuilder taskBuilder = procBuilder.addTask("TaskA");
-    taskBuilder.addProperty("foo", "bar").addSequenceFlow("End");
+    taskBuilder.addProcessProperty("foo", "bar").addSequenceFlow("End");
     //taskBuilder.addAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "TaskData_TaskA_foo", "foo");
-    procBuilder.addEndEvent("End", ResultType.Message).addMessageRef("EndMessage");
-    MessageBuilder msgBuilder = procBuilder.addMessage("EndMessage");
+    procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
+    MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("foo", null, true);
     Process proc = procBuilder.getProcess();
     return proc;

Modified: projects/spec/trunk/modules/impl/pom.xml
===================================================================
--- projects/spec/trunk/modules/impl/pom.xml	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/impl/pom.xml	2008-09-30 15:07:24 UTC (rev 2450)
@@ -33,6 +33,7 @@
     <hibernate.version>3.2.6.ga</hibernate.version>
     <hibernate.annotations.version>3.3.1.GA</hibernate.annotations.version>
     <hibernate.validator.version>3.0.0.ga</hibernate.validator.version>
+    <mvel.version>1.3.7-java1.5</mvel.version>
   </properties>
 
   <!-- DependencyManagement -->
@@ -53,6 +54,11 @@
         <artifactId>hibernate-validator</artifactId>
         <version>${hibernate.validator.version}</version>
       </dependency>
+      <dependency>
+        <groupId>org.mvel</groupId>
+        <artifactId>mvel</artifactId>
+        <version>${mvel.version}</version>
+      </dependency>
     </dependencies>
   </dependencyManagement>
   
@@ -75,6 +81,10 @@
       <groupId>org.hibernate</groupId>
       <artifactId>hibernate-validator</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.mvel</groupId>
+      <artifactId>mvel</artifactId>
+    </dependency>
   </dependencies>
 
   <!-- Profiles -->

Added: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/AssignmentImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/AssignmentImpl.java	                        (rev 0)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/AssignmentImpl.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -0,0 +1,72 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.ri.model;
+
+//$Id$
+
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+
+import org.jbpm.api.model.Assignment;
+import org.jbpm.api.model.Expression;
+import org.jbpm.api.model.Property;
+
+/**
+ * An Assignment, which is used in the definition of attributes for Process, Activities, Events, Gateways, and Gates.
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 08-Jul-2008
+ */
+ at Entity(name = "Assignment")
+public class AssignmentImpl implements Assignment
+{
+  @Enumerated(EnumType.STRING)
+  private AssignTime assignTime;
+  @Embedded
+  private ExpressionImpl from;
+  @Embedded
+  private PropertyImpl to;
+
+  public AssignmentImpl(AssignTime assignTime, ExpressionImpl from, PropertyImpl to)
+  {
+    this.assignTime = assignTime;
+    this.from = from;
+    this.to = to;
+  }
+
+  public AssignTime getAssignTime()
+  {
+    return assignTime;
+  }
+
+  public Expression getFrom()
+  {
+    return from;
+  }
+
+  public Property getTo()
+  {
+    return to;
+  }
+}
\ No newline at end of file


Property changes on: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/AssignmentImpl.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EndEventImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EndEventImpl.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EndEventImpl.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -25,8 +25,6 @@
 
 import javax.management.ObjectName;
 import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
 import javax.persistence.Transient;
 
 import org.jbpm.api.Constants;
@@ -64,9 +62,6 @@
   // provide logging
   final static Logger log = LoggerFactory.getLogger(EndEventImpl.class);
 
-  @Enumerated(EnumType.STRING)
-  private ResultType resultType = ResultType.None;
-
   public EndEventImpl(String name)
   {
     super(name);
@@ -78,14 +73,14 @@
   {
   }
 
-  public ResultType getResultType()
+  public EventDetailType getResultType()
   {
-    return resultType;
+    return detailType;
   }
   
-  public void setResultType(ResultType resultType)
+  public void setResultType(EventDetailType resultType)
   {
-    this.resultType = resultType;
+    this.detailType = resultType;
   }
 
   @Override

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EventImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EventImpl.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EventImpl.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -27,15 +27,22 @@
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
 import javax.persistence.MappedSuperclass;
+import javax.persistence.Transient;
 
 import org.jbpm.api.Constants;
+import org.jbpm.api.InvalidProcessException;
 import org.jbpm.api.client.ProcessEngine;
 import org.jbpm.api.model.Event;
+import org.jbpm.api.model.Message;
+import org.jbpm.api.model.Node;
+import org.jbpm.api.model.Process;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.builder.ObjectNameFactory;
+import org.jbpm.api.runtime.ExecutionHandler;
 import org.jbpm.api.runtime.SignalHandler;
 import org.jbpm.api.runtime.Token;
 import org.jbpm.api.service.SignalService;
+import org.jbpm.ri.runtime.MessageSender;
 
 /**
  * An Event is something that “happens” during the course of a business process. <p/> These Events affect the flow of
@@ -47,12 +54,19 @@
 @MappedSuperclass
 public class EventImpl extends NodeImpl implements Event
 {
-  // provide serial version UID
   private static final long serialVersionUID = 1L;
 
   @Enumerated(EnumType.STRING)
   protected EventType eventType;
 
+  @Enumerated(EnumType.STRING)
+  protected EventDetailType detailType = EventDetailType.None;
+
+  @Transient
+  private MessageImpl messageRef;
+  @Transient
+  private Signal signalRef;
+  
   public EventImpl(String name)
   {
     super(name);
@@ -73,12 +87,54 @@
     return oname;
   }
 
+  @Override
   public EventType getEventType()
   {
     return eventType;
   }
 
   @Override
+  public Message getMessageRef()
+  {
+    return messageRef;
+  }
+
+  public void setMessageRef(MessageImpl messageRef)
+  {
+    this.messageRef = messageRef;
+  }
+
+  @Override
+  public Signal getSignalRef()
+  {
+    return signalRef;
+  }
+
+  public void setSignalRef(Signal signalRef)
+  {
+    this.signalRef = signalRef;
+  }
+  
+  @Override
+  protected ExecutionHandler getDefaultExecutionHandler()
+  {
+    final Node thisNode = this;
+    return new ExecutionHandler()
+    {
+      private static final long serialVersionUID = 1L;
+
+      public void execute(Token token)
+      {
+        if (detailType == EventDetailType.Message &&  getMessageRef() != null)
+        {
+          MessageSender messageSender = new MessageSender(thisNode, getMessageRef());
+          messageSender.sendMessage(token);
+        }
+      }
+    };
+  }
+
+  @Override
   protected SignalHandler getDefaultSignalHandler()
   {
     return new SignalHandler()
@@ -100,4 +156,26 @@
       }
     };
   }
+
+  @Override
+  protected void initialize(Process proc)
+  {
+    super.initialize(proc);
+    
+    if (detailType == EventDetailType.Signal && signalRef == null)
+      throw new InvalidProcessException("Event with detail type 'Signal' must have a signalRef");
+    if (detailType != EventDetailType.Signal && signalRef != null)
+      throw new InvalidProcessException("Event with detail type '" + detailType + "' cannot have a signalRef");
+    
+    if (detailType == EventDetailType.Message && messageRef == null)
+      throw new InvalidProcessException("Event with detail type 'Message' must have a messageRef");
+    if (detailType != EventDetailType.Message && messageRef != null)
+      throw new InvalidProcessException("Event with detail type '" + detailType + "' cannot have a messageRef");
+    
+    if (messageRef != null)
+    {
+      ProcessImpl procImpl = (ProcessImpl)proc;
+      procImpl.initializeMessageRef(messageRef);
+    }
+  }
 }
\ No newline at end of file

Added: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/MessageImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/MessageImpl.java	                        (rev 0)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/MessageImpl.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -0,0 +1,140 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.ri.model;
+
+//$Id$
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+
+import org.jbpm.api.model.Message;
+import org.jbpm.api.model.Participant;
+import org.jbpm.api.model.Property;
+
+/**
+ * A Message, which is used in the definition of attributes for a @{link StartEvent},
+ * 
+ * @{EndEvent, @{IntermediateEvent}, @{Task}, and @{MessageFlow}
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 21-Jul-2008
+ */
+ at Entity(name = "Message")
+public class MessageImpl implements Message
+{
+  private static final long serialVersionUID = 1L;
+  
+  @Basic
+  private String name;
+  @Transient
+  private Participant fromRef;
+  @Transient
+  private Participant toRef;
+  @Transient
+  private Set<Property> props = new HashSet<Property>();
+
+  public MessageImpl(String name)
+  {
+    if (name == null)
+      throw new IllegalArgumentException("Message name cannot be null");
+    
+    this.name = name;
+  }
+
+  public MessageImpl(String name, Participant targetID, Participant sourceID)
+  {
+    this(name);
+    this.toRef = targetID;
+    this.fromRef = sourceID;
+  }
+
+  public String getName()
+  {
+    return name;
+  }
+
+  @Override
+  public Property getProperty(String name)
+  {
+    for (Property prop : props)
+    {
+      if (prop.getName().equals(name))
+        return prop;
+    }
+    return null;
+  }
+
+  @Override
+  public Set<String> getPropertyNames()
+  {
+    Set<String> names = new HashSet<String>();
+    for (Property prop : props)
+    {
+      names.add(prop.getName());
+    }
+    return names;
+  }
+
+  @Override
+  public void addProperty(Property prop)
+  {
+    props.add(prop);
+  }
+
+  @Override
+  public boolean removeProperty(String name)
+  {
+    return props.remove(name);
+  }
+
+  public Participant getFromRef()
+  {
+    return fromRef;
+  }
+
+  public void setFromRef(Participant fromRef)
+  {
+    this.fromRef = fromRef;
+  }
+
+  public Participant getToRef()
+  {
+    return toRef;
+  }
+
+  public void setToRef(Participant toRef)
+  {
+    this.toRef = toRef;
+  }
+
+  public String toString()
+  {
+    StringBuilder str = new StringBuilder("Message[name=" + name + ",props=");
+    str.append(getPropertyNames());
+    str.append("]");
+    return str.toString();
+  }
+}


Property changes on: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/MessageImpl.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/NodeImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/NodeImpl.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/NodeImpl.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -37,10 +37,12 @@
 import javax.persistence.InheritanceType;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
+import javax.persistence.Transient;
 
 import org.hibernate.annotations.IndexColumn;
 import org.jbpm.api.InvalidProcessException;
 import org.jbpm.api.NameNotUniqueException;
+import org.jbpm.api.model.Assignment;
 import org.jbpm.api.model.EndEvent;
 import org.jbpm.api.model.Node;
 import org.jbpm.api.model.Process;
@@ -94,6 +96,9 @@
   @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = PropertyImpl.class)
   protected Set<Property> properties = new HashSet<Property>();
 
+  @Transient
+  private List<Assignment> assignments = new ArrayList<Assignment>();
+  
   @Basic
   private String execHandler;
   private transient ExecutionHandler customExecHandler;
@@ -144,6 +149,7 @@
     this.name = name;
   }
   
+  @Override
   public Property getProperty(String name)
   {
     for (Property prop : properties)
@@ -154,16 +160,39 @@
     return null;
   }
 
-  public Set<Property> getProperties()
+  @Override
+  public Set<String> getPropertyNames()
   {
-    return Collections.unmodifiableSet(properties);
+    Set<String> names = new HashSet<String>();
+    for (Property prop : properties)
+    {
+      names.add(prop.getName());
+    }
+    return names;
   }
 
+  @Override
+  public boolean removeProperty(String name)
+  {
+    return properties.remove(name);
+  }
+
+  @Override
   public void addProperty(Property prop)
   {
     properties.add(prop);
   }
   
+  public List<Assignment> getAssignments()
+  {
+    return Collections.unmodifiableList(assignments);
+  }
+
+  public void addAssignment(AssignmentImpl assignment)
+  {
+    this.assignments.add(assignment);
+  }
+
   public List<SequenceFlow> getInFlows()
   {
     return inFlows;

Added: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ParticipantImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ParticipantImpl.java	                        (rev 0)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ParticipantImpl.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -0,0 +1,71 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.ri.model;
+
+//$Id$
+
+import javax.management.ObjectName;
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.jbpm.api.model.Participant;
+import org.jbpm.api.model.builder.ObjectNameFactory;
+
+/**
+ * A Participant, which is used in the definition of attributes for a @{link Pool}, @{link Message}, and @{link
+ * WebService}
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 21-Jul-2008
+ */
+ at Entity(name = "Participant")
+public class ParticipantImpl implements Participant
+{
+  @Id @GeneratedValue
+  @SuppressWarnings("unused")
+  private int id;
+  
+  @Basic
+  protected String name;
+  
+  public ParticipantImpl(ObjectName name)
+  {
+    if (name == null)
+      throw new IllegalArgumentException("Cannot create participant with name: null");
+
+    this.name = name.getCanonicalName();
+  }
+
+  @Override
+  public ObjectName getName()
+  {
+    return ObjectNameFactory.create(name);
+  }
+
+  @Override
+  public String toString()
+  {
+    return "Participant[" + getName() + "]";
+  }
+}


Property changes on: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ParticipantImpl.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessImpl.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessImpl.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -43,7 +43,9 @@
 import org.jbpm.api.Constants;
 import org.jbpm.api.InvalidProcessException;
 import org.jbpm.api.client.ProcessEngine;
+import org.jbpm.api.model.Assignment;
 import org.jbpm.api.model.EndEvent;
+import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Node;
 import org.jbpm.api.model.Process;
 import org.jbpm.api.model.Property;
@@ -81,6 +83,12 @@
   @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = PropertyImpl.class)
   private Set<Property> properties = new HashSet<Property>();
 
+  @Transient
+  private Set<Message> messages = new HashSet<Message>();
+  
+  @Transient
+  private List<Assignment> assignments = new ArrayList<Assignment>();
+  
   @Transient 
   private transient ProcessEngine engine;
   
@@ -139,6 +147,7 @@
     this.status = status;
   }
 
+  @Override
   public Property getProperty(String name)
   {
     for (Property prop : properties)
@@ -149,16 +158,29 @@
     return null;
   }
 
-  public Set<Property> getProperties()
+  @Override
+  public void addProperty(Property prop)
   {
-    return Collections.unmodifiableSet(properties);
+    properties.add(prop);
   }
   
-  public void addProperty(Property prop)
+  @Override
+  public Set<String> getPropertyNames()
   {
-    properties.add(prop);
+    Set<String> names = new HashSet<String>();
+    for (Property prop : properties)
+    {
+      names.add(prop.getName());
+    }
+    return names;
   }
-  
+
+  @Override
+  public boolean removeProperty(String name)
+  {
+    return properties.remove(name);
+  }
+
   public void addNode(NodeImpl nodeImpl)
   {
     if (nodeImpl == null)
@@ -170,7 +192,7 @@
 
   public List<Node> getNodes()
   {
-    return nodes;
+    return Collections.unmodifiableList(nodes);
   }
 
   public Node getNode(String name)
@@ -217,6 +239,42 @@
   }
   
   @Override
+  public Set<Message> getMessages()
+  {
+    return Collections.unmodifiableSet(messages);
+  }
+
+  public void addMessage(Message msg)
+  {
+    if (getMessage(msg.getName()) != null)
+      throw new InvalidProcessException("Duplicate message: " + msg);
+
+    messages.add(msg);
+  }
+
+  @Override
+  public Message getMessage(String msgName)
+  {
+    for (Message msg : messages)
+    {
+      if (msg.getName().equals(msgName))
+        return msg;
+    }
+    return null;
+  }
+  
+  @Override
+  public List<Assignment> getAssignments()
+  {
+    return Collections.unmodifiableList(assignments);
+  }
+
+  public void addAssignment(AssignmentImpl assignment)
+  {
+    this.assignments.add(assignment);
+  }
+
+  @Override
   public void initialize(Process proc)
   {
     if (status != ProcessStatus.None)
@@ -257,6 +315,25 @@
     runtimeException = null;
   }
 
+  protected void initializeMessageRef(MessageImpl msgRef)
+  {
+    String msgName = msgRef.getName();
+    MessageImpl procMsg = (MessageImpl)getMessage(msgName);
+    if (procMsg == null)
+      throw new IllegalStateException("Cannot obtain process message: " + msgName);
+
+    if (msgRef.getFromRef() == null && procMsg.getFromRef() != null)
+      msgRef.setFromRef(procMsg.getFromRef());
+    if (msgRef.getToRef() == null && procMsg.getToRef() != null)
+      msgRef.setToRef(procMsg.getToRef());
+
+    for (String propName : procMsg.getPropertyNames())
+    {
+      Property prop = procMsg.getProperty(propName);
+      msgRef.addProperty(prop);
+    }
+  }
+  
   // Runtime Aspects ====================================================================================================
   
   public RuntimeException getRuntimeException()

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/PropertyImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/PropertyImpl.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/PropertyImpl.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -54,23 +54,28 @@
   @Basic
   private boolean isCorrelation;
 
-  public PropertyImpl(String name, String value)
+  public PropertyImpl(String name, Object value)
   {
-    this.value = value;
     this.name = name;
+    initPropertyValue(value);
   }
 
-  public PropertyImpl(String name, String value, boolean isCorrelation)
+  public PropertyImpl(String name, Object value, boolean isCorrelation)
   {
     this.name = name;
-    this.value = value;
     this.isCorrelation = isCorrelation;
+    initPropertyValue(value);
   }
 
   // persistence ctor
   protected PropertyImpl()
   {
   }
+  
+  private void initPropertyValue(Object value)
+  {
+    this.value = (value != null ? value.toString() : null);
+  }
 
   public String getName()
   {

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StartEventImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StartEventImpl.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StartEventImpl.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -25,8 +25,6 @@
 
 import javax.management.ObjectName;
 import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
 import javax.persistence.Transient;
 
 import org.jbpm.api.Constants;
@@ -59,9 +57,6 @@
   // Provide logging
   final static Logger log = LoggerFactory.getLogger(StartEventImpl.class);
 
-  @Enumerated(EnumType.STRING)
-  private TriggerType triggerType = TriggerType.None;
-
   public StartEventImpl(String name)
   {
     super(name);
@@ -73,14 +68,14 @@
   {
   }
 
-  public TriggerType getTriggerType()
+  public EventDetailType getTriggerType()
   {
-    return triggerType;
+    return detailType;
   }
 
-  public void setTriggerType(TriggerType triggerType)
+  public void setTriggerType(EventDetailType detailType)
   {
-    this.triggerType = triggerType;
+    this.detailType = detailType;
   }
 
   @Override

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/EventBuilderImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/EventBuilderImpl.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/EventBuilderImpl.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -23,10 +23,12 @@
 
 //$Id$
 
-import org.jbpm.api.NotImplementedException;
 import org.jbpm.api.model.Event;
+import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.Signal.SignalType;
 import org.jbpm.api.model.builder.EventBuilder;
+import org.jbpm.ri.model.EventImpl;
+import org.jbpm.ri.model.MessageImpl;
 
 /**
  * The EventBuilder can be used to build an {@link Event} dynamically.
@@ -43,11 +45,22 @@
 
   public EventBuilder addMessageRef(String msgName)
   {
-    throw new NotImplementedException();
+    EventImpl eventImpl = getEvent();
+    eventImpl.setMessageRef(new MessageImpl(msgName));
+    return this;
   }
 
-  public EventBuilder addSignalRef(SignalType signalType, String signalMessage)
+  public EventBuilder addSignalRef(SignalType signalType, String message)
   {
-    throw new NotImplementedException();
+    EventImpl eventImpl = getEvent();
+    eventImpl.setSignalRef(new Signal(node.getKey(), signalType, message));
+    return this;
   }
+  
+  private EventImpl getEvent()
+  {
+    if (node instanceof Event == false)
+      throw new IllegalStateException("Last added flow object is not an Event: " + node);
+    return (EventImpl)node;
+  }
 }
\ No newline at end of file

Added: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/MessageBuilderImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/MessageBuilderImpl.java	                        (rev 0)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/MessageBuilderImpl.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.ri.model.builder;
+
+//$Id$
+
+import javax.management.ObjectName;
+
+import org.jbpm.api.model.Message;
+import org.jbpm.api.model.Property;
+import org.jbpm.api.model.builder.MessageBuilder;
+import org.jbpm.ri.model.MessageImpl;
+import org.jbpm.ri.model.ParticipantImpl;
+import org.jbpm.ri.model.PropertyImpl;
+
+
+/**
+ * A MessageBuilder can be used to build a {@link Message} dynamically.
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 08-Jul-2008
+ */
+public class MessageBuilderImpl implements MessageBuilder
+{
+  private MessageImpl message;
+  
+  public MessageBuilder newMessage(String name)
+  {
+    message = new MessageImpl(name);
+    return this;
+  }
+
+  public MessageBuilder addToRef(ObjectName toRef)
+  {
+    message.setToRef(new ParticipantImpl(toRef));
+    return this;
+  }
+  
+  public MessageBuilder addFromRef(ObjectName fromRef)
+  {
+    message.setFromRef(new ParticipantImpl(fromRef));
+    return this;
+  }
+
+  public MessageBuilder addProperty(String name, Object value)
+  {
+    Property prop = new PropertyImpl(name, value);
+    message.addProperty(prop);
+    return this;
+  }
+
+  public MessageBuilder addProperty(String name, Object value, boolean isCorrelation)
+  {
+    Property prop = new PropertyImpl(name, value, isCorrelation);
+    message.addProperty(prop);
+    return this;
+  }
+
+  public Message getMessage()
+  {
+    return message;
+  }
+}
\ No newline at end of file


Property changes on: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/MessageBuilderImpl.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/ProcessBuilderImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/ProcessBuilderImpl.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/ProcessBuilderImpl.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -26,9 +26,10 @@
 import org.jbpm.api.NotImplementedException;
 import org.jbpm.api.client.ProcessEngine;
 import org.jbpm.api.model.Process;
-import org.jbpm.api.model.EndEvent.ResultType;
+import org.jbpm.api.model.Assignment.AssignTime;
+import org.jbpm.api.model.Event.EventDetailType;
+import org.jbpm.api.model.Expression.ExpressionLanguage;
 import org.jbpm.api.model.Gateway.GatewayType;
-import org.jbpm.api.model.StartEvent.TriggerType;
 import org.jbpm.api.model.Task.TaskType;
 import org.jbpm.api.model.builder.EventBuilder;
 import org.jbpm.api.model.builder.GatewayBuilder;
@@ -38,8 +39,10 @@
 import org.jbpm.api.runtime.ExecutionHandler;
 import org.jbpm.api.runtime.FlowHandler;
 import org.jbpm.api.runtime.SignalHandler;
+import org.jbpm.ri.model.AssignmentImpl;
 import org.jbpm.ri.model.EndEventImpl;
 import org.jbpm.ri.model.EventImpl;
+import org.jbpm.ri.model.ExpressionImpl;
 import org.jbpm.ri.model.NodeImpl;
 import org.jbpm.ri.model.ProcessImpl;
 import org.jbpm.ri.model.PropertyImpl;
@@ -109,10 +112,10 @@
     return new EventBuilderImpl(this);
   }
 
-  public EventBuilder addStartEvent(String name, TriggerType triggerType)
+  public EventBuilder addStartEvent(String name, EventDetailType ResultType)
   {
     StartEventImpl startImpl = new StartEventImpl(name);
-    startImpl.setTriggerType(triggerType);
+    startImpl.setTriggerType(ResultType);
     addNode(node = startImpl);
     return new EventBuilderImpl(this);
   }
@@ -129,7 +132,7 @@
     return new EventBuilderImpl(this);
   }
 
-  public EventBuilder addEndEvent(String name, ResultType resultType)
+  public EventBuilder addEndEvent(String name, EventDetailType resultType)
   {
     EndEventImpl endImpl = new EndEventImpl(name);
     endImpl.setResultType(resultType);
@@ -207,49 +210,81 @@
     return new GatewayBuilderImpl(this);
   }
 
+  public ProcessBuilder addProcessAssignment(AssignTime time, ExpressionLanguage lang, String fromExpr, String toProp)
+  {
+    AssignmentImpl assignment = getAssignment(time, lang, fromExpr, toProp);
+    getProcessInternal().addAssignment(assignment);
+    return this;
+  }
+  
+  public ProcessBuilder addNodeAssignment(AssignTime time, ExpressionLanguage lang, String fromExpr, String toProp)
+  {
+    AssignmentImpl assignment = getAssignment(time, lang, fromExpr, toProp);
+    getNodeInternal().addAssignment(assignment);
+    return this;
+  }
+
+  private AssignmentImpl getAssignment(AssignTime time, ExpressionLanguage lang, String fromExpr, String toProp)
+  {
+    ExpressionImpl from = new ExpressionImpl(lang, fromExpr);
+    PropertyImpl to = new PropertyImpl(toProp, null);
+    AssignmentImpl assignment = new AssignmentImpl(time, from, to);
+    return assignment;
+  }
+  
   public <T extends ExecutionHandler> ProcessBuilder addExecutionHandler(Class<T> clazz)
   {
-    node.setExecutionHandler(clazz);
+    getNodeInternal().setExecutionHandler(clazz);
     return this;
   }
 
   public <T extends FlowHandler> ProcessBuilder addFlowHandler(Class<T> clazz)
   {
-    node.setFlowHandler(clazz);
+    getNodeInternal().setFlowHandler(clazz);
     return this;
   }
 
   public <T extends SignalHandler> ProcessBuilder addSignalHandler(Class<T> clazz)
   {
-    node.setSignalHandler(clazz);
+    getNodeInternal().setSignalHandler(clazz);
     return this;
   }
 
-  public MessageBuilder addMessage(String name)
+  public MessageBuilder addProcessMessage(String name)
   {
-    throw new NotImplementedException();
+    MessageBuilder msgBuilder = new MessageBuilderImpl().newMessage(name);
+    getProcessInternal().addMessage(msgBuilder.getMessage());
+    return msgBuilder;
   }
 
-  public ProcessBuilder addProperty(String name, String value)
+  public ProcessBuilder addProcessProperty(String name, String value)
   {
     PropertyImpl prop = new PropertyImpl(name, value);
-    if (node != null)
-    {
-      node.addProperty(prop);
-    }
-    else
-    {
-      proc.addProperty(prop);
-    }
+    getProcessInternal().addProperty(prop);
     return this;
   }
 
+  public ProcessBuilder addNodeProperty(String name, String value)
+  {
+    PropertyImpl prop = new PropertyImpl(name, value);
+    getNodeInternal().addProperty(prop);
+    return this;
+  }
+
   private ProcessBuilder addNode(NodeImpl nodeImpl)
   {
     getProcessInternal().addNode(nodeImpl);
     return this;
   }
 
+  private NodeImpl getNodeInternal()
+  {
+    if (node == null)
+      throw new IllegalStateException("No node available");
+
+    return node;
+  }
+
   private ProcessImpl getProcessInternal()
   {
     if (proc == null)

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/DelegatingExecutionContext.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/DelegatingExecutionContext.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/DelegatingExecutionContext.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -47,14 +47,14 @@
   private String procPrefix;
   private Process proc;
 
-  DelegatingExecutionContext(Node flowObject, ExecutionContext delegate)
+  DelegatingExecutionContext(Node node, ExecutionContext delegate)
   {
-    this.node = flowObject;
+    this.node = node;
     this.delegate = delegate;
 
-    proc = flowObject.getProcess();
+    proc = node.getProcess();
     procPrefix = proc.getName() + ".";
-    activityPrefix = procPrefix + flowObject.getName() + ".";
+    activityPrefix = procPrefix + node.getName() + ".";
   }
 
   public Object getAttachment(String name)
@@ -97,16 +97,16 @@
     Collection<Key> keys = new ArrayList<Key>(delegate.getAttachmentKeys());
 
     // Add activity property keys
-    for (Property prop : node.getProperties())
+    for (String propName : node.getPropertyNames())
     {
-      Key key = new Key(null, activityPrefix + prop.getName());
+      Key key = new Key(null, activityPrefix + propName);
       keys.add(key);
     }
 
     // Add process property keys
-    for (Property prop : proc.getProperties())
+    for (String propName : proc.getPropertyNames())
     {
-      Key key = new Key(null, procPrefix + prop.getName());
+      Key key = new Key(null, procPrefix + propName);
       keys.add(key);
     }
 

Added: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/ExpressionEvaluator.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/ExpressionEvaluator.java	                        (rev 0)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/ExpressionEvaluator.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -0,0 +1,76 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.ri.runtime;
+
+//$Id$
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jbpm.api.model.Expression;
+import org.jbpm.api.model.Expression.ExpressionLanguage;
+import org.jbpm.api.runtime.ExecutionContext;
+import org.jbpm.api.runtime.Token;
+import org.jbpm.api.runtime.Attachments.Key;
+import org.mvel.MVEL;
+
+/**
+ * Evaluates an expression for a given token
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 08-Jul-2008
+ */
+public class ExpressionEvaluator
+{
+  private Expression expr;
+
+  public ExpressionEvaluator(Expression expr)
+  {
+    this.expr = expr;
+  }
+
+  /**
+   * Evaluate an expression for a given token. <p/> Note that <code>propName.replace(".", "_")</code> applies to
+   * property names for MVEL expressions, because the dot notation has special meaning in MVEL.
+   */
+  public Object evaluateExpression(Token token)
+  {
+    ExpressionLanguage exprLang = expr.getExpressionLanguage();
+    if (exprLang == ExpressionLanguage.MVEL)
+    {
+      String mvel = expr.getExpressionBody();
+      ExecutionContext exContext = token.getExecutionContext();
+      Map<String, Object> vars = new HashMap<String, Object>();
+      for (Key key : exContext.getAttachmentKeys())
+      {
+        String name = key.getNamePart();
+        Object value = exContext.getAttachment(name);
+        vars.put(name.replace(".", "_"), value);
+      }
+      return MVEL.eval(mvel, vars);
+    }
+    else
+    {
+      throw new IllegalStateException("Unsupported expression language: " + exprLang);
+    }
+  }
+}
\ No newline at end of file


Property changes on: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/ExpressionEvaluator.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/MessageSender.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/MessageSender.java	                        (rev 0)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/MessageSender.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -0,0 +1,97 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.ri.runtime;
+
+//$Id$
+
+import javax.management.ObjectName;
+
+import org.jbpm.api.client.ProcessEngine;
+import org.jbpm.api.model.Message;
+import org.jbpm.api.model.Node;
+import org.jbpm.api.model.Participant;
+import org.jbpm.api.model.builder.MessageBuilder;
+import org.jbpm.api.runtime.ExecutionContext;
+import org.jbpm.api.runtime.Token;
+import org.jbpm.api.service.MessageService;
+import org.jbpm.ri.model.MessageImpl;
+import org.jbpm.ri.model.ParticipantImpl;
+import org.jbpm.ri.model.builder.MessageBuilderImpl;
+
+
+/**
+ * A helper that sends messages
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 16-Aug-2008
+ */
+public class MessageSender
+{
+  private Node fromNode;
+  private Participant fromRef;
+  private Message messageRef;
+  
+  public MessageSender(Node fromNode, Message messageRef)
+  {
+    this.fromNode = fromNode;
+    this.messageRef = messageRef;
+    this.fromRef = new ParticipantImpl(fromNode.getProcess().getKey());
+    
+    if (messageRef == null)
+      throw new IllegalArgumentException("MessageRef cannot be null");
+  }
+
+  /**
+   * Extract message content from the token and send the message
+   * to it's recipient.
+   */
+  public void sendMessage(Token token)
+  {
+    ExecutionContext exContext = token.getExecutionContext();
+    MessageBuilder msgBuilder = new MessageBuilderImpl();
+
+    Participant toRef = messageRef.getToRef();
+    if (toRef == null)
+      throw new IllegalStateException("Cannot obtain target participant");
+
+    ObjectName targetID = toRef.getName();
+    msgBuilder.newMessage(messageRef.getName());
+    msgBuilder.addToRef(targetID);
+
+    // Copy the properties from the execution context
+    // to the send message
+    for (String propName : messageRef.getPropertyNames())
+    {
+      Object value = exContext.getAttachment(propName);
+      if (value == null)
+        throw new IllegalStateException("Cannot obtain property: " + propName);
+
+      msgBuilder.addProperty(propName, value);
+    }
+    MessageImpl msg = (MessageImpl)msgBuilder.getMessage();
+    msg.setFromRef(fromRef);
+
+    ProcessEngine engine = fromNode.getProcess().getProcessEngine();
+    MessageService msgService = engine.getService(MessageService.class);
+    msgService.sendMessage(msg);
+  }
+}
\ No newline at end of file


Property changes on: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/MessageSender.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/TokenExecutorImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/TokenExecutorImpl.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/TokenExecutorImpl.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -31,8 +31,6 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.jbpm.api.model.Node;
 import org.jbpm.api.model.Process;
 import org.jbpm.api.model.SequenceFlow;
@@ -44,6 +42,8 @@
 import org.jbpm.api.runtime.TokenExecutor;
 import org.jbpm.api.runtime.Token.TokenStatus;
 import org.jbpm.ri.model.ProcessImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * The {@link FlowHandler} invokes the TokenExecutor to schedule {@link ConnectingObject} objects together with their
@@ -55,7 +55,7 @@
 public class TokenExecutorImpl implements TokenExecutor
 {
   // provide logging
-  private static final Log log = LogFactory.getLog(TokenExecutorImpl.class);
+  final static Logger log = LoggerFactory.getLogger(TokenExecutorImpl.class);
 
   private RuntimeProcess rtProc;
   private ExecutorService executor = Executors.newCachedThreadPool();
@@ -228,7 +228,7 @@
           ExecutionHandler execHandler = getExecutionHandler(node);
           FlowHandler flowHandler = getFlowHandler(node);
 
-          // Synchronize execution on the target FlowObject
+          // Synchronize execution on the target Node
           synchronized (node)
           {
             // Create a Token that includes properties from the current Activity
@@ -237,7 +237,7 @@
             // Throw the Enter Signal
             sigHandler.throwEnterSignal(tokCopy);
 
-            // Execute the target FlowObject
+            // Execute the target Node
             execHandler.execute(tokCopy);
 
             // Transfer the token to the FlowHandler

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ExecutionServiceImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ExecutionServiceImpl.java	2008-09-30 11:01:11 UTC (rev 2449)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ExecutionServiceImpl.java	2008-09-30 15:07:24 UTC (rev 2450)
@@ -28,28 +28,36 @@
 
 import javax.management.ObjectName;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.jbpm.api.BPMException;
 import org.jbpm.api.InvalidProcessException;
 import org.jbpm.api.ProcessTimeoutException;
 import org.jbpm.api.client.ProcessEngine;
+import org.jbpm.api.model.Assignment;
+import org.jbpm.api.model.Expression;
 import org.jbpm.api.model.Process;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.StartEvent;
+import org.jbpm.api.model.Assignment.AssignTime;
+import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.Process.ProcessStatus;
 import org.jbpm.api.model.Signal.SignalType;
-import org.jbpm.api.model.StartEvent.TriggerType;
 import org.jbpm.api.runtime.Attachments;
+import org.jbpm.api.runtime.ExecutionContext;
+import org.jbpm.api.runtime.Token;
 import org.jbpm.api.runtime.TokenExecutor;
 import org.jbpm.api.service.ExecutionService;
 import org.jbpm.api.service.ProcessService;
 import org.jbpm.api.service.SignalService;
 import org.jbpm.ri.model.ProcessImpl;
 import org.jbpm.ri.model.SequenceFlowImpl;
+import org.jbpm.ri.runtime.DelegatingToken;
+import org.jbpm.ri.runtime.ExpressionEvaluator;
+import org.jbpm.ri.runtime.MutableToken;
 import org.jbpm.ri.runtime.RuntimeProcess;
 import org.jbpm.ri.runtime.RuntimeProcessImpl;
 import org.jbpm.ri.runtime.TokenImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * The process manager is the entry point to create, find and otherwise manage processes.
@@ -60,7 +68,7 @@
 public class ExecutionServiceImpl extends ExecutionService implements MutableService
 {
   // provide logging
-  private static final Log log = LogFactory.getLog(ExecutionServiceImpl.class);
+  final static Logger log = LoggerFactory.getLogger(ExecutionServiceImpl.class);
 
   // The map of active runtime processes
   private Map<ObjectName, RuntimeProcess> runtimeProcesses = new HashMap<ObjectName, RuntimeProcess>();
@@ -138,14 +146,14 @@
           }
           catch (InterruptedException ex)
           {
-            log.error(ex);
+            log.error("Process interrupted", ex);
           }
         }
       }
     }
     
     // Do the start time assignments
-    // startTimeAssignments(proc, initialToken);
+    startTimeAssignments(proc, initialToken);
     
     // Start the initial token
     tokenExecutor.start(initialToken);
@@ -169,6 +177,24 @@
       procService.registerProcess(proc);
   }
 
+  // Evaluate the Start time assignments
+  private void startTimeAssignments(Process proc, Token token)
+  {
+    DelegatingToken delegatingToken = new DelegatingToken((MutableToken)token);
+    ExecutionContext exContext = token.getExecutionContext();
+    for (Assignment ass : proc.getAssignments())
+    {
+      if (ass.getAssignTime() == AssignTime.Start)
+      {
+        Expression expr = ass.getFrom();
+        ExpressionEvaluator exprEvaluator = new ExpressionEvaluator(expr);
+        Object result = exprEvaluator.evaluateExpression(delegatingToken);
+        String propName = ass.getTo().getName();
+        exContext.addAttachment(propName, result);
+      }
+    }
+  }
+  
   public ProcessStatus waitForEnd(Process proc)
   {
     return waitForEndInternal(proc, 0);
@@ -226,13 +252,13 @@
       {
         RuntimeException rte = new ProcessTimeoutException("Process timeout after " + timeout + "ms for: " + proc.getKey());
         procImpl.setRuntimeException(rte);
-        log.error(rte);
+        log.error(rte.getMessage());
         throw rte;
       }
     }
     catch (InterruptedException ex)
     {
-      log.warn(ex);
+      log.warn("Process interrupted", ex);
     }
     finally
     {
@@ -261,7 +287,7 @@
     StartEvent start = null;
     for (StartEvent aux : proc.getNodes(StartEvent.class))
     {
-      if (aux.getTriggerType() == TriggerType.None)
+      if (aux.getTriggerType() == EventDetailType.None)
       {
         if (start != null)
           throw new InvalidProcessException("Process cannot have multiple start events with no trigger");
@@ -331,7 +357,7 @@
             }
             catch (InterruptedException ex)
             {
-              log.error(ex);
+              log.error("Process interrupted", ex);
             }
           }
           




More information about the jbpm-commits mailing list