[jbpm-commits] JBoss JBPM SVN: r6398 - in jbpm4/trunk/modules: bpmn/src/main/java/org/jbpm/bpmn/flownodes and 11 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Jun 10 07:10:41 EDT 2010


Author: alex.guizar at jboss.com
Date: 2010-06-10 07:10:39 -0400 (Thu, 10 Jun 2010)
New Revision: 6398

Modified:
   jbpm4/trunk/modules/api/src/main/resources/jpdl-4.4.xsd
   jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/AbstractTaskBinding.java
   jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ServiceTaskBinding.java
   jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/StartEventBinding.java
   jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/UserTaskBinding.java
   jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/parser/BindingsParser.java
   jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/parser/BpmnParser.java
   jbpm4/trunk/modules/enterprise/src/main/java/org/jbpm/enterprise/internal/wire/binding/EjbRemoteCommandServiceBinding.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/AssignActivity.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/AssignBinding.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/EndBinding.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/HqlBinding.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JavaBinding.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JmsBinding.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JpdlBinding.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/SubProcessBinding.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/repository/JpdlDeployer.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlBindingsParser.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/UnresolvedTransition.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/EventListenerReference.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/TagBinding.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/XmlUtil.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/AbstractCollectionBinding.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/BasicTypeBinding.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/CommandServiceBinding.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/HibernateConfigurationBinding.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/HibernateSessionBinding.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/JobExecutorBinding.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MailTemplateBinding.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MapBinding.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MessageSessionBinding.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/ObjectBinding.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/PropertiesBinding.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/xml/Parser.java
   jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/activity/assign/AssignTest.java
   jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/activity/assign/Person.java
   jbpm4/trunk/modules/userguide/src/main/docbook/en/modules/ch06-Jpdl.xml
Log:
JBPM-2775: complete, test and document assign activity

Modified: jbpm4/trunk/modules/api/src/main/resources/jpdl-4.4.xsd
===================================================================
--- jbpm4/trunk/modules/api/src/main/resources/jpdl-4.4.xsd	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/api/src/main/resources/jpdl-4.4.xsd	2010-06-10 11:10:39 UTC (rev 6398)
@@ -382,6 +382,23 @@
         </complexType>
       </element>
 
+      <!-- ~~~ ASSIGN ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+      <element name="assign">
+        <annotation><documentation>Assigns a source value to a target location
+        </documentation></annotation>
+        <complexType>
+          <complexContent>
+            <extension base="tns:assignType">
+              <sequence>
+                <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+                <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+              </sequence>
+              <attributeGroup ref="tns:activityAttributes" />
+            </extension>
+          </complexContent>
+        </complexType>
+      </element>
+
       <!-- ~~~ CUSTOM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
       <element name="custom">
         <annotation><documentation>Uses a user defined, custom implementation of 
@@ -1051,6 +1068,45 @@
       of the script evaluation will be stored</documentation></annotation>
     </attribute>
   </complexType>
+
+  <complexType name="assignType">
+    <sequence>
+      <element name="description" minOccurs="0" maxOccurs="unbounded" type="string" />
+      <element name="from" minOccurs="0">
+        <annotation>
+          <documentation>Descriptor that constructs the source value</documentation>
+        </annotation>
+        <complexType>
+          <group ref="tns:wireObjectGroup" />
+        </complexType>
+      </element>
+    </sequence>
+    <attribute name="from-expr" type="string">
+      <annotation>
+        <documentation>Expression that resolves the source value</documentation>
+      </annotation>
+    </attribute>
+    <attribute name="lang" type="string">
+      <annotation>
+        <documentation>Language in which from-expr is written</documentation>
+      </annotation>
+    </attribute>
+    <attribute name="from-var" type="string">
+      <annotation>
+        <documentation>Variable that provides the source value</documentation>
+      </annotation>
+    </attribute>
+    <attribute name="to-expr" type="string">
+      <annotation>
+        <documentation>Expression that resolves the target location</documentation>
+      </annotation>
+    </attribute>
+    <attribute name="to-var" type="string">
+      <annotation>
+        <documentation>Variable that provides the target location</documentation>
+      </annotation>
+    </attribute>
+  </complexType>
   
   <complexType name="qlType">
     <sequence>
@@ -1277,6 +1333,15 @@
           </complexContent>
         </complexType>
       </element>
+      <element name="assign">
+        <complexType>
+          <complexContent>
+            <extension base="tns:assignType">
+              <attribute name="propagation" type="tns:booleanValueType" />
+            </extension>
+          </complexContent>
+        </complexType>
+      </element>
       <element name="script">
         <complexType>
           <complexContent>

Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/AbstractTaskBinding.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/AbstractTaskBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/AbstractTaskBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -35,13 +35,13 @@
   }
 
   protected void addActivityResources(TaskDefinitionImpl taskDefinition, BpmnActivity taskActivity, Element element, Parse parse) {
-    Element performer = XmlUtil.element(element, PERFORMER, false, parse);
+    Element performer = XmlUtil.element(element, PERFORMER);
     if (performer != null) {
       taskActivity.addActivityResource(addPerformer(taskDefinition, PERFORMER, performer, parse));
     }
 
     // Overrides 'performer'
-    Element humanPerformer = XmlUtil.element(element, HUMAN_PERFORMER, false, parse);
+    Element humanPerformer = XmlUtil.element(element, HUMAN_PERFORMER);
     if (humanPerformer != null) {
       taskActivity.addActivityResource(addPerformer(taskDefinition, HUMAN_PERFORMER, humanPerformer, parse));
     }
@@ -54,19 +54,19 @@
 
   private ActivityResource addPerformer(TaskDefinitionImpl taskDefinition, String type, Element performer, Parse parse) {
 
-    String resourceRef = XmlUtil.attribute(performer, "resourceRef", true, parse);
+    String resourceRef = XmlUtil.attribute(performer, "resourceRef", parse);
     
     BpmnProcessDefinition bpmnProcessDefinition = parse.contextStackFind(BpmnProcessDefinition.class);
     
     ActivityResource activityResource = new ActivityResource();
     activityResource.setResourceRef(bpmnProcessDefinition.getResource(resourceRef));
 
-    String scope = XmlUtil.attribute(performer, "jbpm:type", false, parse); // Todo refactor for namespaces
+    String scope = XmlUtil.attribute(performer, "jbpm:type"); // Todo refactor for namespaces
 
-    Element rae = XmlUtil.element(performer, "resourceAssignmentExpression", false, parse);
+    Element rae = XmlUtil.element(performer, "resourceAssignmentExpression");
     if (rae != null) {
-      String formalExpression = XmlUtil.element(rae, "formalExpression", true, parse).getTextContent().trim();
-      String lang = XmlUtil.attribute(rae, "language", false, parse);
+      String formalExpression = XmlUtil.element(rae, "formalExpression", parse).getTextContent().trim();
+      String lang = XmlUtil.attribute(rae, "language");
       Expression expression = Expression.create(formalExpression, lang);
       if (PERFORMER.equals(type) || HUMAN_PERFORMER.equals(type)) {
         taskDefinition.setAssigneeExpression(expression);

Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ServiceTaskBinding.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ServiceTaskBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/ServiceTaskBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -47,7 +47,7 @@
     BpmnProcessDefinition bpmnProcessDefinition = parse.contextStackFind(BpmnProcessDefinition.class);
         
     // Operation parsing
-    String operationRef = XmlUtil.attribute(element, "operationRef", true, parse, null);
+    String operationRef = XmlUtil.attribute(element, "operationRef", parse);
     Element operationElement = bpmnProcessDefinition.getOperations().get(operationRef);
     if (operationElement == null) {
         parse.addProblem("No operation found for operationRef " + operationRef, operationElement);

Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/StartEventBinding.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/StartEventBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/StartEventBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -56,7 +56,7 @@
       parse.addProblem("multiple start events not yet supported", element);
     }
     
-    String id = XmlUtil.attribute(element, "id", true, parse);
+    String id = XmlUtil.attribute(element, "id", parse);
     Element eventDefinition = XmlUtil.element(element);
     if (eventDefinition != null && "timerEventDefinition".equals(eventDefinition.getNodeName())) {
       return createTimerStartEvent(processDefinition, eventDefinition, id, bpmnParser, parse);

Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/UserTaskBinding.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/UserTaskBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/UserTaskBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -48,9 +48,9 @@
     
     addActivityResources(taskDefinition, taskActivity, element, parse);
 
-    Element rendering = XmlUtil.element(element, "rendering", false, parse);
+    Element rendering = XmlUtil.element(element, "rendering");
     if (rendering != null) {
-      Element jBPMForm = XmlUtil.element(rendering, "form", false, parse);
+      Element jBPMForm = XmlUtil.element(rendering, "form");
       taskDefinition.setFormResourceName(jBPMForm != null ? jBPMForm.getTextContent().trim() : null);
     }
 

Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/parser/BindingsParser.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/parser/BindingsParser.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/parser/BindingsParser.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -53,7 +53,7 @@
   }
 
   protected Binding instantiateBinding(Element bindingElement, Parse parse) {
-    String bindingClassName = XmlUtil.attribute(bindingElement, "binding", true, parse);
+    String bindingClassName = XmlUtil.attribute(bindingElement, "binding", parse);
 
     log.trace("adding bpmn binding " + bindingClassName);
 

Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/parser/BpmnParser.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/parser/BpmnParser.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/parser/BpmnParser.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -118,8 +118,8 @@
     parse.contextStackPush(processDefinition);
     try {
 
-      String id = XmlUtil.attribute(processElement, "id", true, parse);
-      String name = XmlUtil.attribute(processElement, "name", false, parse);
+      String id = XmlUtil.attribute(processElement, "id", parse);
+      String name = XmlUtil.attribute(processElement, "name");
       
       if (id != null && !"".equals(id)) {
         processDefinition.setName(id);        
@@ -207,7 +207,7 @@
     for (Element dataElement : XmlUtil.elements(element, "dataObject")) {
       VariableDefinitionImpl variableDefinition = new VariableDefinitionImpl();
 
-      String name = XmlUtil.attribute(dataElement, "id", true, parse);
+      String name = XmlUtil.attribute(dataElement, "id", parse);
       variableDefinition.setName(name);
 
       String typeRef = XmlUtil.attribute(dataElement, "itemSubjectRef");
@@ -222,9 +222,9 @@
   public void parseActivities(Element element, Parse parse, CompositeElementImpl compositeElement) {
     List<Element> elements = XmlUtil.elements(element);
     for (Element nestedElement : elements) {
-      String tagName = XmlUtil.getTagLocalName(nestedElement);
-      String name = XmlUtil.attribute(nestedElement, "name", false, parse);
-      String id = XmlUtil.attribute(nestedElement, "id", true, parse);
+      String tagName = nestedElement.getLocalName();
+      String name = XmlUtil.attribute(nestedElement, "name");
+      String id = XmlUtil.attribute(nestedElement, "id", parse);
 
       TagBinding activityBinding = (TagBinding) getBinding(nestedElement, CATEGORY_ACTIVITY);
       if (activityBinding == null) {
@@ -258,10 +258,10 @@
     for (Element transitionElement : transitionElements) {
       
       // Parse attributes
-      String transitionName = XmlUtil.attribute(transitionElement, "name", false, parse);
-      String transitionId = XmlUtil.attribute(transitionElement, "id", true, parse);
-      String sourceRef = XmlUtil.attribute(transitionElement, "sourceRef", true, parse);
-      String targetRef = XmlUtil.attribute(transitionElement, "targetRef", true, parse);
+      String transitionName = XmlUtil.attribute(transitionElement, "name");
+      String transitionId = XmlUtil.attribute(transitionElement, "id", parse);
+      String sourceRef = XmlUtil.attribute(transitionElement, "sourceRef", parse);
+      String targetRef = XmlUtil.attribute(transitionElement, "targetRef", parse);
 
       if (log.isDebugEnabled()) {
         log.debug(transitionId + ": " + sourceRef + " -> " + targetRef);        

Modified: jbpm4/trunk/modules/enterprise/src/main/java/org/jbpm/enterprise/internal/wire/binding/EjbRemoteCommandServiceBinding.java
===================================================================
--- jbpm4/trunk/modules/enterprise/src/main/java/org/jbpm/enterprise/internal/wire/binding/EjbRemoteCommandServiceBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/enterprise/src/main/java/org/jbpm/enterprise/internal/wire/binding/EjbRemoteCommandServiceBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -41,10 +41,10 @@
   }
 
   public Object parse(Element element, Parse parse, Parser parser) {
-    String initialContextFactory = XmlUtil.attribute(element, "initial-context-factory", true, parse); 
-    String providerUrl = XmlUtil.attribute(element, "provider-url", true, parse); 
-    String urlPkgPrefixes = XmlUtil.attribute(element, "url-pkg-prefixes", true, parse);
-    String jndiName = XmlUtil.attribute(element, "jndi-name", false, parse, "jbpm/CommandExecutor");
+    String initialContextFactory = XmlUtil.attribute(element, "initial-context-factory", parse); 
+    String providerUrl = XmlUtil.attribute(element, "provider-url", parse); 
+    String urlPkgPrefixes = XmlUtil.attribute(element, "url-pkg-prefixes", parse);
+    String jndiName = XmlUtil.attribute(element, "jndi-name", "jbpm/CommandExecutor");
     
     EjbRemoteCommandService ejbRemoteCommandService = new EjbRemoteCommandService(initialContextFactory, providerUrl, urlPkgPrefixes, jndiName);
     Descriptor descriptor = new ProvidedObjectDescriptor(ejbRemoteCommandService, true);

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/AssignActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/AssignActivity.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/AssignActivity.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -24,11 +24,10 @@
 import org.jbpm.api.model.OpenExecution;
 import org.jbpm.pvm.internal.el.Expression;
 import org.jbpm.pvm.internal.el.UelValueExpression;
-import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
 import org.jbpm.pvm.internal.wire.Descriptor;
 import org.jbpm.pvm.internal.wire.WireContext;
 
-
 /**
  * @author Tom Baeyens
  */
@@ -37,38 +36,46 @@
   private static final long serialVersionUID = 1L;
 
   protected Expression fromExpression;
-  protected Descriptor fromValueDescriptor;
+  protected String fromVariable;
+  protected Descriptor fromDescriptor;
 
-  protected String toVariableName;
   protected UelValueExpression toExpression;
+  protected String toVariable;
 
   void perform(OpenExecution execution) throws Exception {
     Object value = null;
-    
-    if (fromExpression!=null) {
+
+    if (fromExpression != null) {
       value = fromExpression.evaluate(execution);
-      
-    } else if (fromValueDescriptor!=null) {
-      value = WireContext.create(fromValueDescriptor, (ScopeInstanceImpl) execution);
     }
-    
-    if (toVariableName!=null) {
-      execution.setVariable(toVariableName, value);
-    } else {
+    else if (fromVariable != null) {
+      value = execution.getVariable(fromVariable);
+    }
+    else if (fromDescriptor != null) {
+      value = WireContext.create(fromDescriptor, (ExecutionImpl) execution);
+    }
+
+    if (toExpression != null) {
       toExpression.setValue(execution, value);
     }
+    else {
+      execution.setVariable(toVariable, value);
+    }
   }
 
-  public void setToVariableName(String variableName) {
-    this.toVariableName = variableName;
+  public void setFromDescriptor(Descriptor descriptor) {
+    fromDescriptor = descriptor;
   }
-  public void setFromValueDescriptor(Descriptor valueDescriptor) {
-    this.fromValueDescriptor = valueDescriptor;
+  public void setFromExpression(Expression expression) {
+    fromExpression = expression;
   }
-  public void setFromExpression(Expression fromExpression) {
-    this.fromExpression = fromExpression;
+  public void setFromVariable(String variableName) {
+    fromVariable = variableName;
   }
-  public void setToExpression(UelValueExpression toExpression) {
-    this.toExpression = toExpression;
+  public void setToExpression(UelValueExpression expression) {
+    toExpression = expression;
   }
+  public void setToVariable(String variableName) {
+    toVariable = variableName;
+  }
 }

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/AssignBinding.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/AssignBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/AssignBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -33,12 +33,18 @@
 import org.jbpm.pvm.internal.xml.Parse;
 import org.w3c.dom.Element;
 
-
 /**
  * @author Tom Baeyens
  */
 public class AssignBinding extends JpdlBinding {
-  
+
+  private static final String FROM_EXPR = "from-expr";
+  private static final String LANG = "lang";
+  private static final String FROM_VAR = "from-var";
+  private static final String FROM_DESC = "from";
+  private static final String TO_EXPR = "to-expr";
+  private static final String TO_VAR = "to-var";
+
   public AssignBinding() {
     super("assign");
   }
@@ -46,43 +52,47 @@
   public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
     AssignActivity assignActivity = new AssignActivity();
 
-    String toVar = XmlUtil.attribute(element, "to-var");
-    String toExpr = XmlUtil.attribute(element, "to-expr");
-    if (toVar!=null) {
-      assignActivity.setToVariableName(toVar);
-    } else if (toExpr!=null) {
-      Expression expression = Expression.create(toExpr, Expression.LANGUAGE_UEL_VALUE);
-      assignActivity.setToExpression((UelValueExpression) expression);
+    // from expression
+    if (element.hasAttribute(FROM_EXPR)) {
+      String lang = XmlUtil.attribute(element, LANG);
+      Expression fromExpression = Expression.create(element.getAttribute(FROM_EXPR), lang);
+      assignActivity.setFromExpression(fromExpression);
     }
-
-    String exprText = XmlUtil.attribute(element, "expr");
-    String exprType = XmlUtil.attribute(element, "expr-type");
-
-    // if there is an expr specified
-    if (exprText!=null) {
-      Expression expression = Expression.create(exprText, exprType);
-      assignActivity.setFromExpression(expression);
-
-    } else { // there is no expr specified
-      Set<String> descriptorTagNames = WireParser.getInstance().getBindings().getTagNames(WireParser.CATEGORY_DESCRIPTOR);
-      Descriptor valueDescriptor = null;
-      List<Element> assignContentElements = XmlUtil.elements(element);
-      
-      for (int i=0; ((i<assignContentElements.size()) && (valueDescriptor==null)); i++) {
-        Element assignContentElement = assignContentElements.get(i);
-        String assignContentElementTagName = XmlUtil.getTagLocalName(assignContentElement);
-        if (descriptorTagNames.contains(assignContentElementTagName)) {
-          valueDescriptor = parser.parseDescriptor(assignContentElement, parse);
+    // from variable
+    else if (element.hasAttribute(FROM_VAR)) {
+      assignActivity.setFromVariable(element.getAttribute(FROM_VAR));
+    }
+    else {
+      // neither expression nor variable
+      Element fromElement = XmlUtil.element(element, FROM_DESC);
+      if (fromElement != null) {
+        Set<String> descriptorTags = WireParser.getInstance()
+          .getBindings()
+          .getTagNames(WireParser.CATEGORY_DESCRIPTOR);
+        Element descriptorElement = XmlUtil.element(fromElement);
+        if (descriptorElement != null
+          && descriptorTags.contains(descriptorElement.getTagName())) {
+          Descriptor descriptor = parser.parseDescriptor(descriptorElement, parse);
+          assignActivity.setFromDescriptor(descriptor);
         }
+        else {
+          parse.addProblem("missing descriptor element", fromElement);
+        }
       }
-
-      if (valueDescriptor!=null) {
-        assignActivity.setFromValueDescriptor(valueDescriptor);
-      } else {
-        parse.addProblem("no value for assignment specified.  'assign' must have attribute 'expr' or a wire object element.", element);
+      else {
+        parse.addProblem("missing " + FROM_EXPR + " attribute, " + FROM_VAR + " attribute or "
+          + FROM_DESC + " element", element);
       }
     }
-    
+
+    if (element.hasAttribute(TO_VAR)) {
+      assignActivity.setToVariable(element.getAttribute(TO_VAR));
+    }
+    else if (element.hasAttribute(TO_EXPR)) {
+      Expression expression = Expression.create(element.getAttribute(TO_EXPR), Expression.LANGUAGE_UEL_VALUE);
+      assignActivity.setToExpression((UelValueExpression) expression);
+    }
+
     return assignActivity;
   }
 }

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/EndBinding.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/EndBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/EndBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -43,12 +43,12 @@
   public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
     
     boolean endProcessInstance = true;
-    String ends = XmlUtil.attribute(element, "ends", false, parse);
+    String ends = XmlUtil.attribute(element, "ends");
     if ("execution".equalsIgnoreCase(ends)) {
       endProcessInstance = false;
     }
     
-    String state = XmlUtil.attribute(element, "state", false, parse);
+    String state = XmlUtil.attribute(element, "state");
     
     EndActivity endActivity = new EndActivity();
     endActivity.setEndProcessInstance(endProcessInstance);

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/HqlBinding.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/HqlBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/HqlBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -51,17 +51,18 @@
   public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
     HqlActivity hqlActivity = createHqlActivity();
     
-    Element queryElement = XmlUtil.element(element, "query", true, parse);
+    Element queryElement = XmlUtil.element(element, "query", parse);
     if (queryElement!=null) {
       String query = XmlUtil.getContentText(queryElement);
       hqlActivity.setQuery(query);
     }
     
-    if (XmlUtil.attributeBoolean(element, "unique", false, parse, Boolean.FALSE)) {
-      hqlActivity.setResultUnique(true);
+    Boolean resultUnique = XmlUtil.attributeBoolean(element, "unique", parse);
+    if (resultUnique!=null) {
+      hqlActivity.setResultUnique(resultUnique);
     }
     
-    String variableName = XmlUtil.attribute(element, "var", true, parse);
+    String variableName = XmlUtil.attribute(element, "var", parse);
     hqlActivity.setResultVariableName(variableName);
     
     Element parametersElement = XmlUtil.element(element, "parameters");

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JavaBinding.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JavaBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JavaBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -47,8 +47,8 @@
 
   public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
     JavaActivity javaActivity = new JavaActivity();
-    if (XmlUtil.attribute(element, "method", true, parse, null)!=null) {      
-      String jndiName = XmlUtil.attribute(element, "ejb-jndi-name", false, parse, null); 
+    if (XmlUtil.attribute(element, "method", parse)!=null) {      
+      String jndiName = XmlUtil.attribute(element, "ejb-jndi-name"); 
       if (jndiName != null) {
         parseEjbInvocation(javaActivity, element, parse, parser);
       } else {

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JmsBinding.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JmsBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JmsBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -51,13 +51,13 @@
 
     // attributes /////////////////////////////////////////////////////////////
 
-    String connectionFactoryName = XmlUtil.attribute(element, "connection-factory", true, parse);
+    String connectionFactoryName = XmlUtil.attribute(element, "connection-factory", parse);
     jmsActivity.setConnectionFactoryName(connectionFactoryName);
 
-    String destinationName = XmlUtil.attribute(element, "destination", true, parse);
+    String destinationName = XmlUtil.attribute(element, "destination", parse);
     jmsActivity.setDestinationName(destinationName);
 
-    Boolean transacted = XmlUtil.attributeBoolean(element, "transacted", false, parse, null);
+    Boolean transacted = XmlUtil.attributeBoolean(element, "transacted", parse);
     if (transacted!=null) {
       jmsActivity.setTransacted(transacted);
     }
@@ -77,7 +77,7 @@
 
     // elements ///////////////////////////////////////////////////////////////
 
-    Element textElement = XmlUtil.element(element, "text", false, parse);
+    Element textElement = XmlUtil.element(element, "text");
     if (textElement != null) {
       String expressionText = XmlUtil.getContentText(textElement);
       jmsActivity.setType("text");
@@ -85,7 +85,7 @@
       jmsActivity.setTextExpression(expression);
     }
 
-    Element objectElement = XmlUtil.element(element, "object", false, parse);
+    Element objectElement = XmlUtil.element(element, "object");
     if (objectElement != null) {
       jmsActivity.setType("object");
       String expressionText = XmlUtil.attribute(objectElement, "expr");
@@ -93,7 +93,7 @@
       jmsActivity.setObjectExpression(expression);
     }
 
-    Element mapElement = XmlUtil.element(element, "map", false, parse);
+    Element mapElement = XmlUtil.element(element, "map");
     if (mapElement != null) {
       jmsActivity.setType("map");
       Descriptor descriptor = parser.parseDescriptor(mapElement, parse);

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JpdlBinding.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JpdlBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JpdlBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -21,22 +21,15 @@
  */
 package org.jbpm.jpdl.internal.activity;
 
+import org.w3c.dom.Element;
 
-import java.util.List;
-
-import org.jbpm.api.model.Event;
 import org.jbpm.jpdl.internal.xml.JpdlParser;
-import org.jbpm.jpdl.internal.xml.UnresolvedTransitions;
 import org.jbpm.pvm.internal.model.ActivityImpl;
-import org.jbpm.pvm.internal.model.TimerDefinitionImpl;
-import org.jbpm.pvm.internal.model.TransitionImpl;
 import org.jbpm.pvm.internal.util.TagBinding;
 import org.jbpm.pvm.internal.util.XmlUtil;
 import org.jbpm.pvm.internal.xml.Parse;
 import org.jbpm.pvm.internal.xml.Parser;
-import org.w3c.dom.Element;
 
-
 /**
  * @author Tom Baeyens
  */
@@ -53,7 +46,7 @@
   }
 
   public void parseName(Element element, ActivityImpl activity, Parse parse) {
-    String name = XmlUtil.attribute(element, "name", isNameRequired(), parse);
+    String name = XmlUtil.attribute(element, "name", isNameRequired() ? parse : null);
     
     if (name!=null) {
       // basic name validation

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/SubProcessBinding.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/SubProcessBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/SubProcessBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -154,8 +154,8 @@
     Map<String, String> swimlaneMappings = new HashMap<String, String>();
 
     for (Element inElement: XmlUtil.elements(element, "swimlane-mapping")) {
-      String swimlane = XmlUtil.attribute(inElement, "swimlane", true, parse);
-      String subSwimlane = XmlUtil.attribute(inElement, "sub-swimlane", true, parse);
+      String swimlane = XmlUtil.attribute(inElement, "swimlane", parse);
+      String subSwimlane = XmlUtil.attribute(inElement, "sub-swimlane", parse);
 
       swimlaneMappings.put(swimlane, subSwimlane);
     }

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/repository/JpdlDeployer.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/repository/JpdlDeployer.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/repository/JpdlDeployer.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -67,7 +67,7 @@
         .execute()
         .getDocument();
       Element documentElement = document.getDocumentElement();
-      String tagName = XmlUtil.getTagLocalName(documentElement);
+      String tagName = documentElement.getLocalName();
       
       if ("process-update".equals(tagName)) {
         updateJpdlProcessResource(deployment, resourceName, document);
@@ -173,7 +173,7 @@
     Map<String, Element> activityMap = new HashMap<String, Element>();
     
     for (Element element: XmlUtil.elements(containerElement)) {
-      String tagName = XmlUtil.getTagLocalName(element);
+      String tagName = element.getLocalName();
       if (activityNames.contains(tagName)) {
         String activityName = element.getAttribute("name");
         activityMap.put(activityName, element);

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlBindingsParser.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlBindingsParser.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlBindingsParser.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -51,7 +51,7 @@
   }
 
   protected Binding instantiateBinding(Element bindingElement, Parse parse) {
-    String bindingClassName = XmlUtil.attribute(bindingElement, "binding", true, parse);
+    String bindingClassName = XmlUtil.attribute(bindingElement, "binding", parse);
 
     log.trace("adding jpdl binding "+bindingClassName);
 
@@ -60,7 +60,7 @@
         Class<?> bindingClass = ReflectUtil.classForName(bindingClassName);
         TagBinding binding = (TagBinding) bindingClass.newInstance();
 
-        String tagLocalName = XmlUtil.getTagLocalName(bindingElement);
+        String tagLocalName = bindingElement.getLocalName();
         if ("activity".equals(tagLocalName)) {
           binding.setCategory(JpdlParser.CATEGORY_ACTIVITY);
         } else if ("eventlistener".equals(tagLocalName)) {

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -160,7 +160,7 @@
     parse.contextStackPush(processDefinition);
     try {
       // process attribues
-      String name = XmlUtil.attribute(documentElement, "name", true, parse);
+      String name = XmlUtil.attribute(documentElement, "name", parse);
       processDefinition.setName(name);
 
       // make the process language version available for bindings
@@ -210,12 +210,12 @@
       String packageName = XmlUtil.attribute(documentElement, "package");
       processDefinition.setPackageName(packageName);
 
-      Integer version = XmlUtil.attributeInteger(documentElement, "version", false, parse);
+      Integer version = XmlUtil.attributeInteger(documentElement, "version", parse);
       if (version!=null) {
         processDefinition.setVersion(version);
       }
 
-      String key = XmlUtil.attribute(documentElement, "key", false, parse);
+      String key = XmlUtil.attribute(documentElement, "key");
       if (key!=null) {
         processDefinition.setKey(key);
       }
@@ -232,7 +232,7 @@
       // swimlanes
       List<Element> swimlaneElements = XmlUtil.elements(documentElement, "swimlane");
       for (Element swimlaneElement: swimlaneElements) {
-        String swimlaneName = XmlUtil.attribute(swimlaneElement, "name", true, parse);
+        String swimlaneName = XmlUtil.attribute(swimlaneElement, "name", parse);
         if (swimlaneName!=null) {
           SwimlaneDefinitionImpl swimlaneDefinition = 
               processDefinition.createSwimlaneDefinition(swimlaneName);
@@ -282,7 +282,7 @@
   public void parseActivities(Element documentElement, Parse parse, CompositeElementImpl compositeElement) {
     List<Element> elements = XmlUtil.elements(documentElement);
     for (Element nestedElement : elements) {
-      String tagName = XmlUtil.getTagLocalName(nestedElement);
+      String tagName = nestedElement.getLocalName();
       if ("on".equals(tagName) 
           || "timer".equals(tagName)
           || "swimlane".equals(tagName) 
@@ -391,7 +391,7 @@
     // event listeners
     List<Element> onElements = XmlUtil.elements(element, "on");
     for (Element onElement: onElements) {
-      String eventName = XmlUtil.attribute(onElement, "event", true, parse);
+      String eventName = XmlUtil.attribute(onElement, "event", parse);
       parseOnEvent(onElement, parse, scopeElement, eventName);
 
       Element timerElement = XmlUtil.element(onElement, "timer");
@@ -431,8 +431,9 @@
             eventListenerReference = event.createEventListenerReference(eventListenerDescriptor);
           }
           
-          if (XmlUtil.attributeBoolean(eventListenerElement, "propagation", false, parse, false)) {
-            eventListenerReference.setPropagationEnabled(true);
+          Boolean propagationEnabled = XmlUtil.attributeBoolean(eventListenerElement, "propagation", parse);
+          if (propagationEnabled!=null) {
+            eventListenerReference.setPropagationEnabled(propagationEnabled);
           }
           
           continuationText = XmlUtil.attribute(eventListenerElement, "continue");
@@ -455,7 +456,7 @@
           }
 
         } else {
-          String tagName = XmlUtil.getTagLocalName(eventListenerElement);
+          String tagName = eventListenerElement.getLocalName();
           if ( ! ( (observableElement instanceof TransitionImpl)
                    && ( "condition".equals(tagName)
                         || "timer".equals(tagName)
@@ -473,7 +474,7 @@
     List<Element> transitionElements = XmlUtil.elements(element, "transition");
     UnresolvedTransitions unresolvedTransitions = parse.contextStackFind(UnresolvedTransitions.class);
     for (Element transitionElement: transitionElements) {
-      String transitionName = XmlUtil.attribute(transitionElement, "name", false, parse);
+      String transitionName = XmlUtil.attribute(transitionElement, "name");
 
       Element timerElement = XmlUtil.element(transitionElement, "timer");
       if (timerElement!=null) {
@@ -538,7 +539,7 @@
     String duedate = XmlUtil.attribute(element, "duedate");
     taskDefinition.setDueDateDescription(duedate);
 
-    Integer priority = XmlUtil.attributeInteger(element, "priority", false, parse);
+    Integer priority = XmlUtil.attributeInteger(element, "priority", parse);
     if (priority != null) {
       taskDefinition.setPriority(priority);
     }
@@ -586,13 +587,13 @@
     for (Element variableElement: XmlUtil.elements(element, "variable")) {
       VariableDefinitionImpl variableDefinition = scopeElement.createVariableDefinition();
 
-      String name = XmlUtil.attribute(variableElement, "name", true, parse);
+      String name = XmlUtil.attribute(variableElement, "name", parse);
       variableDefinition.setName(name);
       
-      String type = XmlUtil.attribute(variableElement, "type", true, parse);
+      String type = XmlUtil.attribute(variableElement, "type", parse);
       variableDefinition.setTypeName(type);
       
-      Boolean isHistoryEnabled = XmlUtil.attributeBoolean(variableElement, "history", false, parse);
+      Boolean isHistoryEnabled = XmlUtil.attributeBoolean(variableElement, "history", parse);
       if (isHistoryEnabled != null) {
         variableDefinition.setHistoryEnabled(isHistoryEnabled);
       }
@@ -710,7 +711,7 @@
       userCodeReference.setCached(false);
     }
 
-    Boolean isCached = XmlUtil.attributeBoolean(element, "cache", false, parse, null);
+    Boolean isCached = XmlUtil.attributeBoolean(element, "cache", parse);
     if (isCached!=null) {
       userCodeReference.setCached(isCached.booleanValue());
     }
@@ -719,7 +720,7 @@
   }
 
   public ObjectDescriptor parseObjectDescriptor(Element element, Parse parse) {
-    return (ObjectDescriptor) ObjectBinding.parseObjectDescriptor(element, parse, WireParser.getInstance());
+    return ObjectBinding.parseObjectDescriptor(element, parse, WireParser.getInstance());
   }
 
   public Descriptor parseDescriptor(Element element, Parse parse) {

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/UnresolvedTransition.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/UnresolvedTransition.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/UnresolvedTransition.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -36,7 +36,7 @@
     this.transitionElement = transitionElement;
   }
   public void resolve(ProcessDefinitionImpl processDefinition, Parse parse) {
-    String to = XmlUtil.attribute(transitionElement, "to", true, parse);
+    String to = XmlUtil.attribute(transitionElement, "to", parse);
     if (to!=null) {
       ActivityImpl destination = (ActivityImpl) processDefinition.findActivity(to);
       if (destination!=null) {

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/EventListenerReference.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/EventListenerReference.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/EventListenerReference.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -33,10 +33,10 @@
   private static final long serialVersionUID = 1L;
 
   protected EventListener eventListener;
-  protected boolean isEventListenerStateful= false;
+  protected boolean isEventListenerStateful;
   protected Descriptor eventListenerDescriptor;
   /** does this action accept propagated events ?  */
-  protected boolean isPropagationEnabled = false;
+  protected boolean isPropagationEnabled;
   protected Continuation continuation = Continuation.SYNCHRONOUS;
 
   /** does this action accept propagated events ?  Default is false. */

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/TagBinding.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/TagBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/TagBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -59,7 +59,7 @@
        ) {
       return false;
     }
-    String elementTagLocalName = XmlUtil.getTagLocalName(element);
+    String elementTagLocalName = element.getLocalName();
     if (!tagName.equals(elementTagLocalName)) {
       return false;
     }

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/XmlUtil.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/XmlUtil.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/XmlUtil.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -28,9 +28,6 @@
 import java.util.Set;
 import java.util.StringTokenizer;
 
-import org.jbpm.api.JbpmException;
-import org.jbpm.pvm.internal.xml.Parse;
-
 import javax.xml.namespace.QName;
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.Transformer;
@@ -43,11 +40,12 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
 
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.xml.Parse;
+
 /**
  * convenience methods to make reading org.w3c.dom models easier.
- *
  * @author Tom Baeyens
  */
 public class XmlUtil {
@@ -57,52 +55,32 @@
   }
 
   public static List<Element> elements(Element element, String tagName) {
-    if (element==null) {
+    if (element == null || !element.hasChildNodes()) {
       return Collections.emptyList();
     }
-    NodeList activityList = element.getChildNodes();
-    if ( (activityList == null)
-         || (activityList.getLength()==0)
-       ) {
-      return Collections.emptyList();
-    }
+
     List<Element> elements = new ArrayList<Element>();
-    for (int i = 0; i < activityList.getLength(); i++) {
-      Node child = activityList.item(i);
-      if (Element.class.isAssignableFrom(child.getClass())) {
+    for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
+      if (child.getNodeType() == Node.ELEMENT_NODE) {
         Element childElement = (Element) child;
-        String childTagName = getTagLocalName(childElement);
-        if (childTagName.equals(tagName)) {
-          if (elements == null) {
-            elements = new ArrayList<Element>();
-          }
-          elements.add(childElement);
-        }
+        String childTagName = childElement.getLocalName();
+
+        if (tagName.equals(childTagName)) elements.add(childElement);
       }
     }
     return elements;
   }
 
   public static List<Element> elements(Element element, Set<String> allowedTagNames) {
-    if (element==null) {
+    if (element == null || !element.hasChildNodes()) {
       return Collections.emptyList();
     }
-    NodeList activityList = element.getChildNodes();
-    if ( (activityList == null)
-         || (activityList.getLength()==0)
-       ) {
-      return Collections.emptyList();
-    }
+
     List<Element> elements = new ArrayList<Element>();
-    for (int i = 0; i < activityList.getLength(); i++) {
-      Node child = activityList.item(i);
-      if (Element.class.isAssignableFrom(child.getClass())) {
+    for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
+      if (child.getNodeType() == Node.ELEMENT_NODE) {
         Element childElement = (Element) child;
-        String childTagName = getTagLocalName(childElement);
-        if (allowedTagNames.contains(childTagName)) {
-          if (elements == null) {
-            elements = new ArrayList<Element>();
-          }
+        if (allowedTagNames.contains(child.getLocalName())) {
           elements.add(childElement);
         }
       }
@@ -111,95 +89,68 @@
   }
 
   public static Element element(Element element, String tagName) {
-    return element(element, tagName, false, null);
+    return element(element, tagName, null);
   }
 
-  public static Element element(Element element, String tagName, boolean required, Parse parse) {
-    if (element==null) {
-      return null;
-    }
-    NodeList activityList = element.getChildNodes();
-    for (int i = 0; (i < activityList.getLength()); i++) {
-      Node child = activityList.item(i);
-      if ((Element.class.isAssignableFrom(child.getClass())) && (getTagLocalName((Element) child)).equals(tagName)) {
-        return (Element) child;
+  public static Element element(Element element, String tagName, Parse parse) {
+    if (element != null && element.hasChildNodes()) {
+      for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
+        if (child.getNodeType() == Node.ELEMENT_NODE && tagName.equals(child.getLocalName())) {
+          return (Element) child;
+        }
       }
     }
-    
-    if (required && (parse!=null)) {
-      parse.addProblem("nested element <"+XmlUtil.getTagLocalName(element)+"><"+tagName+" ... />... is required", element);
+
+    if (parse != null) {
+      parse.addProblem("missing element " + tagName, element);
     }
     return null;
   }
 
-
   public static List<Element> elements(Element element) {
-    if (element==null) {
+    if (element == null || !element.hasChildNodes()) {
       return Collections.emptyList();
     }
-    NodeList activityList = element.getChildNodes();
-    if ( (activityList == null)
-         || (activityList.getLength()==0)
-       ) {
-      return Collections.emptyList();
-    }
+
     List<Element> elements = new ArrayList<Element>();
-    if ((activityList != null) && (activityList.getLength() > 0)) {
-      elements = new ArrayList<Element>();
-      for (int i = 0; i < activityList.getLength(); i++) {
-        Node activity = activityList.item(i);
-        if (activity instanceof Element) {
-          elements.add((Element) activity);
-        }
+    for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
+      if (child.getNodeType() == Node.ELEMENT_NODE) {
+        elements.add((Element) child);
       }
     }
     return elements;
   }
 
-  public static List<Element> elements(Element element, String ns, String localName) {
-    if (element==null) {
+  public static List<Element> elements(Element element, String namespace, String localName) {
+    if (element == null || !element.hasChildNodes()) {
       return Collections.emptyList();
     }
-    NodeList activityList = element.getChildNodes();
-    if ( (activityList == null)
-         || (activityList.getLength()==0)
-       ) {
-      return Collections.emptyList();
-    }
-    List<Element> matchingElements = new ArrayList<Element>();
-    NodeList nl = element.getChildNodes();
-    for (int i=0;i<nl.getLength();i++) {
-      Node n = nl.item(i);
-      if (n instanceof Element && n.getLocalName() != null && n.getLocalName().equals(localName) && n.getNamespaceURI() != null && n.getNamespaceURI().equals(ns)) {
-        matchingElements.add((Element)n);
+
+    List<Element> elements = new ArrayList<Element>();
+    for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
+      String childNamespace = element.getNamespaceURI();
+      if (child.getNodeType() == Node.ELEMENT_NODE
+        && (namespace != null ? namespace.equals(childNamespace) : childNamespace == null)
+        && localName.equals(element.getLocalName())) {
+        elements.add((Element) child);
       }
     }
-    return matchingElements;
+    return elements;
   }
 
   public static List<Element> elementsQName(Element element, Set<QName> allowedTagNames) {
-    if (element==null) {
+    if (element == null || !element.hasChildNodes()) {
       return Collections.emptyList();
     }
-    NodeList activityList = element.getChildNodes();
-    if ( (activityList == null)
-         || (activityList.getLength()==0)
-       ) {
-      return Collections.emptyList();
-    }
+
     List<Element> elements = new ArrayList<Element>();
-    if (activityList != null) {
-      for (int i = 0; i < activityList.getLength(); i++) {
-        Node child = activityList.item(i);
-        if (Element.class.isAssignableFrom(child.getClass())) {
-          Element childElement = (Element) child;
-          QName childElementQName = new QName(childElement.getNamespaceURI(), childElement.getLocalName());
-          if (allowedTagNames.contains(childElementQName)) {
-            if (elements == null) {
-              elements = new ArrayList<Element>();
-            }
-            elements.add(childElement);
-          }
+    for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
+      if (child.getNodeType() == Node.ELEMENT_NODE) {
+        Element childElement = (Element) child;
+        QName childQName = new QName(childElement.getNamespaceURI(),
+          childElement.getLocalName());
+        if (allowedTagNames.contains(childQName)) {
+          elements.add(childElement);
         }
       }
     }
@@ -207,12 +158,14 @@
   }
 
   public static Element element(Element element) {
-    Element onlyChild = null;
-    List<Element> elements = elements(element);
-    if (!elements.isEmpty()) {
-      onlyChild = elements.get(0);
+    if (element != null && element.hasChildNodes()) {
+      for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
+        if (child.getNodeType() == Node.ELEMENT_NODE) {
+          return (Element) child;
+        }
+      }
     }
-    return onlyChild;
+    return null;
   }
 
   public static String toString(Node node) {
@@ -226,7 +179,7 @@
       StringWriter stringWriter = new StringWriter();
       transformer.transform(new DOMSource(node), new StreamResult(stringWriter));
       return stringWriter.toString();
-    } 
+    }
     catch (TransformerException e) {
       throw new JbpmException("could not transform dom node to string", e);
     }
@@ -238,8 +191,7 @@
 
   public static boolean isTextOnly(Element element) {
     for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
-      if (child.getNodeType() == Node.ELEMENT_NODE)
-        return false;
+      if (child.getNodeType() == Node.ELEMENT_NODE) return false;
     }
     return true;
   }
@@ -259,130 +211,118 @@
   }
 
   public static List<Node> contents(Element element) {
-    NodeList activityList = element.getChildNodes();
-    if ((activityList == null) || (activityList.getLength() == 0)) {
+    if (element == null || !element.hasChildNodes()) {
       return Collections.emptyList();
     }
 
     List<Node> contents = new ArrayList<Node>();
-    for (int i = 0; i < activityList.getLength(); i++) {
-      contents.add((Node) activityList.item(i));
+    for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
+      contents.add(child);
     }
-
     return contents;
   }
 
-  public static String getTagLocalName(Element element) {
-    if (element == null) {
-      return null;
-    }
-    String localName = element.getLocalName();
-    if (localName != null) {
-      return localName;
-    }
-    return element.getTagName();
-  }
-
-  /** the attribute value or null if the attribute is not present */
+  /**
+   * retrieves an attribute value by name.
+   * @return the attribute value or <code>null</code> if there is no such attribute
+   */
   public static String attribute(Element element, String attributeName) {
     Attr attribute = element.getAttributeNode(attributeName);
     return attribute != null ? attribute.getValue() : null;
   }
 
-  /** convenience method to combine extraction of a string attribute value.
-   * 
-   * If the attribute exists, it is returned.  If the attribute is not present, null 
-   * is returned.  The attribute is not present and it is required, 
-   * a problem will be added to the parse.  */
-  public static String attribute(Element element, String attributeName, boolean required, Parse parse) {
-    return attribute(element, attributeName, required, parse, null);
+  /**
+   * retrieves an attribute value by name.
+   * @return the attribute value or <code>defaultValue</code> if there is no such attribute
+   */
+  public static String attribute(Element element, String attributeName, String defaultValue) {
+    return attribute(element, attributeName, null, defaultValue);
   }
 
-  /** convenience method to combine extraction of a string attribute value.
-   * 
-   * If the attribute exists, it is returned.  If the attribute is not present, the 
-   * defaultValue is returned.  The attribute is not present and it is required, 
-   * a problem will be added to the parse.  */
-  public static String attribute(Element element, String attributeName, boolean required, Parse parse, String defaultValue) {
+  /**
+   * retrieves an attribute value by name. if the attribute is not present, a problem will be
+   * added to the parse.
+   * @return the attribute value or <code>null</code> if there is no such attribute
+   */
+  public static String attribute(Element element, String attributeName, Parse parse) {
+    return attribute(element, attributeName, parse, null);
+  }
+
+  /**
+   * retrieves an attribute value by name. if the attribute is not present, a problem will be
+   * added to the parse.
+   * @return the attribute value or <code>defaultValue</code> if there is no such attribute
+   */
+  public static String attribute(Element element, String attributeName, Parse parse,
+    String defaultValue) {
     Attr attribute = element.getAttributeNode(attributeName);
     if (attribute != null) {
       String value = attribute.getValue();
-      if (value.length() == 0 && required) {
-        parse.addProblem("attribute <"+XmlUtil.getTagLocalName(element)+" "+attributeName+"=\"\" is empty", element);
+      if (value.length() == 0) {
+        parse.addProblem("attribute <"+element.getLocalName()+" "+attributeName+"=\"\" is empty", element);
       }
       return value;
     }
 
-    if (required) {
-      parse.addProblem("attribute <"+XmlUtil.getTagLocalName(element)+" "+attributeName+"=\"...\" is required", element);
+    if (parse != null) {
+      parse.addProblem("attribute <"+element.getLocalName()+" "+attributeName+"=\"...\" is required", element);
     }
-    
     return defaultValue;
   }
-  
-  
-  /** parse an attribute as an integer. */
-  public static Integer attributeInteger(Element element, String attributeName, boolean required, Parse parse) {
-    String valueText = attribute(element, attributeName, required, parse);
 
-    if (valueText!=null) {
+  /** retrieves an attribute value by name. */
+  public static Integer attributeInteger(Element element, String attributeName, Parse parse) {
+    Attr attribute = element.getAttributeNode(attributeName);
+    if (attribute != null) {
+      String attributeValue = attribute.getValue();
       try {
-        return Integer.parseInt(valueText);
-      } catch (NumberFormatException e) {
-        parse.addProblem(errorMessageAttribute(element, attributeName, valueText, "value not parsable as integer"), element);
+        return Integer.parseInt(attributeValue);
       }
+      catch (NumberFormatException e) {
+        parse.addProblem(errorMessageAttribute(element, attributeName, attributeValue, e.getMessage()), element);
+      }
     }
-
     return null;
   }
 
   /** parse an attribute as an boolean. */
-  public static Boolean attributeBoolean(Element element, String attributeName, boolean required, Parse parse) {
-    return attributeBoolean(element, attributeName, required, parse, null);
-  }
-  
-  /** parse an attribute as an boolean. */
-  public static Boolean attributeBoolean(Element element, String attributeName, boolean required, Parse parse, Boolean defaultValue) {
-    String valueText = attribute(element, attributeName, required, parse);
-    if (valueText!=null) {
-      Boolean value = parseBooleanValue(valueText);
-      if (value==null) {
-        parse.addProblem(errorMessageAttribute(element, attributeName, valueText, "value not in {true, enabled, on, false, disabled, off}"), element);
-      }
-      return value; 
+  public static Boolean attributeBoolean(Element element, String attributeName, Parse parse) {
+    Attr attribute = element.getAttributeNode(attributeName);
+    if (attribute != null) {
+      String attributeValue = attribute.getValue();
+      Boolean value = parseBooleanValue(attributeValue);
+      if (value != null) return value;
+
+      String message = errorMessageAttribute(element, attributeName, attributeValue,
+        "value not in {true, enabled, on, false, disabled, off}");
+      parse.addProblem(message, element);
     }
-    return defaultValue;
+    return null;
   }
 
   public static Boolean parseBooleanValue(String valueText) {
-    if (valueText!=null) {
+    if (valueText != null) {
       // if we have to check for value true
-      if ( ("true".equals(valueText))
-          || ("enabled".equals(valueText))
-          || ("on".equals(valueText))
-        ) {
-       return Boolean.TRUE;
-
-      } else if ( ("false".equals(valueText))
-           || ("disabled".equals(valueText))
-           || ("off".equals(valueText))
-        ) {
+      if ("true".equals(valueText) || "enabled".equals(valueText) || "on".equals(valueText)) {
+        return Boolean.TRUE;
+      }
+      if ("false".equals(valueText) || "disabled".equals(valueText) || "off".equals(valueText)) {
         return Boolean.FALSE;
       }
     }
-    
     return null;
   }
-  
-  public static String errorMessageAttribute(Element element, String attributeName, String attributeValue, String message) {
-    return "attribute <"+XmlUtil.getTagLocalName(element)+" "+attributeName+"=\""+attributeValue+"\" "+message;
+
+  public static String errorMessageAttribute(Element element, String attributeName,
+    String attributeValue, String message) {
+    return "attribute <" + element.getLocalName() + " " + attributeName + "=\""
+      + attributeValue + "\" " + message;
   }
 
   public static List<String> parseList(Element element, String singularTagName) {
     // a null value for text represents a wildcard
     String text = XmlUtil.attribute(element, singularTagName + "s");
-    // so next we'll convert a '*' into the text null value, which indicates a
-    // wildcard
+    // convert '*' into the text null value, which indicates a wildcard
     if ("*".equals(text)) {
       text = null;
     }
@@ -396,9 +336,7 @@
 
   /**
    * parses comma or space separated list. A null return value means a wildcard.
-   *
-   * @return List of tokens or null if the commaSeparatedListText is null, '*',
-   *         or empty
+   * @return List of tokens or null if the commaSeparatedListText is null, '*', or empty
    */
   public static List<String> parseCommaSeparatedList(String commaSeparatedListText) {
     List<String> entries = null;
@@ -434,7 +372,8 @@
       int colonIndex = text.indexOf(':');
       if (colonIndex == -1) {
         namespaceValue = new NamespaceValue(null, text);
-      } else {
+      }
+      else {
         String prefix = text.substring(0, colonIndex);
         String localPart = null;
         if (text.length() > colonIndex + 1) {
@@ -451,16 +390,19 @@
 
     NamespaceValue namespaceValue = attributeNamespaceValue(element, attributeName);
     String text = attribute(element, attributeName);
-    if (namespaceValue!=null) {
-      if (namespaceValue.prefix==null) {
+    if (namespaceValue != null) {
+      if (namespaceValue.prefix == null) {
         qname = new QName(text);
-      } else {
+      }
+      else {
         String uri = element.lookupNamespaceURI(namespaceValue.prefix);
-        if (uri==null) {
-          throw new JbpmException("unknown prefix in qname "+text);
-        } else if (namespaceValue.localPart==null) {
-          throw new JbpmException("no local part in qname "+text);
-        } else {
+        if (uri == null) {
+          throw new JbpmException("unknown prefix in qname " + text);
+        }
+        else if (namespaceValue.localPart == null) {
+          throw new JbpmException("no local part in qname " + text);
+        }
+        else {
           qname = new QName(uri, namespaceValue.localPart, namespaceValue.prefix);
         }
       }

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/AbstractCollectionBinding.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/AbstractCollectionBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/AbstractCollectionBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -28,9 +28,9 @@
       descriptor.setClassName(className);
     }
 
-    Boolean isSynchronized = XmlUtil.attributeBoolean(element, "synchronized", false, parse);
+    Boolean isSynchronized = XmlUtil.attributeBoolean(element, "synchronized", parse);
     if (isSynchronized!=null) {
-      descriptor.setSynchronized(isSynchronized.booleanValue());
+      descriptor.setSynchronized(isSynchronized);
     }
 
     List<Descriptor> valueDescriptors = new ArrayList<Descriptor>();

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/BasicTypeBinding.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/BasicTypeBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/BasicTypeBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -20,14 +20,14 @@
       String value = element.getAttribute("value");
       descriptor = createDescriptor(value, element, parse);
     } else {
-      parse.addProblem("attribute 'value' is required in element '"+XmlUtil.getTagLocalName(element)+"': "+XmlUtil.toString(element), element);
+      parse.addProblem("attribute 'value' is required in element '"+element.getLocalName()+"': "+XmlUtil.toString(element), element);
     }
     
     return descriptor;
   }
   
   public String createValueExceptionMessage(String message, Element element) {
-    return XmlUtil.getTagLocalName(element)+" has invalid formatted value attribute: "+(message!=null ? message+": " : "")+XmlUtil.toString(element);
+    return element.getLocalName()+" has invalid formatted value attribute: "+(message!=null ? message+": " : "")+XmlUtil.toString(element);
   }
 
   /** subclasses can be sure that the value is not null.

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/CommandServiceBinding.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/CommandServiceBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/CommandServiceBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -23,17 +23,17 @@
 
 import java.util.List;
 
+import org.w3c.dom.Element;
+
 import org.jbpm.pvm.internal.cmd.CommandService;
 import org.jbpm.pvm.internal.svc.AsyncCommandService;
 import org.jbpm.pvm.internal.svc.DefaultCommandService;
-import org.jbpm.pvm.internal.svc.SerializeInterceptor;
 import org.jbpm.pvm.internal.util.XmlUtil;
 import org.jbpm.pvm.internal.wire.Descriptor;
 import org.jbpm.pvm.internal.wire.descriptor.CommandServiceDescriptor;
 import org.jbpm.pvm.internal.wire.xml.WireParser;
 import org.jbpm.pvm.internal.xml.Parse;
 import org.jbpm.pvm.internal.xml.Parser;
-import org.w3c.dom.Element;
 
 /** parses a descriptor for a creating {@link DefaultCommandService}.
  * 
@@ -67,11 +67,13 @@
   }
 
   protected CommandService getCommandService(Element element, Parse parse, Parser parser) {
-    if ( XmlUtil.attributeBoolean(element, "async", false, parse, Boolean.FALSE)) {
+    Boolean async = XmlUtil.attributeBoolean(element, "async", parse);
+    if (Boolean.TRUE.equals(async)) {
+      AsyncCommandService asyncCommandService = new AsyncCommandService();
 
-      AsyncCommandService asyncCommandService = new AsyncCommandService();
-      if (XmlUtil.attributeBoolean(element, "propagate-auth", false, parse)) {
-        asyncCommandService.setPropagateUserId(true);
+      Boolean propagateUserId = XmlUtil.attributeBoolean(element, "propagate-auth", parse);
+      if (propagateUserId!=null) {
+        asyncCommandService.setPropagateUserId(propagateUserId);
       }
       return asyncCommandService;
     }

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/HibernateConfigurationBinding.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/HibernateConfigurationBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/HibernateConfigurationBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -88,7 +88,7 @@
     List<Element> configElements = XmlUtil.elements(element);
     for (Element configElement: configElements) {
 
-      if ("cfg".equals(XmlUtil.getTagLocalName(configElement))) {
+      if ("cfg".equals(configElement.getLocalName())) {
         if (configElement.hasAttribute("resource")) {
           String resource = configElement.getAttribute("resource");
           log.trace("adding hibernate configuration resource "+resource);
@@ -108,7 +108,7 @@
           parse.addProblem("exactly 1 attribute in {resource, file, url} was expected in cfg: "+XmlUtil.toString(configElement), element);
         }
 
-      } else if ("mapping".equals(XmlUtil.getTagLocalName(configElement))) {
+      } else if ("mapping".equals(configElement.getLocalName())) {
         if (configElement.hasAttribute("resource")) {
           String resource = configElement.getAttribute("resource");
           log.trace("adding hibernate mapping resource "+resource);
@@ -133,11 +133,11 @@
           parse.addProblem("exactly 1 attribute in {resource, file, class, url} was expected in mapping: "+XmlUtil.toString(element));
         }
 
-      } else if ("properties".equals(XmlUtil.getTagLocalName(configElement))) {
+      } else if ("properties".equals(configElement.getLocalName())) {
         PropertiesDescriptor propertiesDescriptor = (PropertiesDescriptor) propertiesBinding.parse(configElement, parse, parser);
         descriptor.setPropertiesDescriptor(propertiesDescriptor);
 
-      } else if ("cache-configuration".equals(XmlUtil.getTagLocalName(configElement))) {
+      } else if ("cache-configuration".equals(configElement.getLocalName())) {
         StreamInput streamSource = null;
 
         String cacheUsage = configElement.getAttribute("usage");
@@ -192,11 +192,11 @@
           if (cacheElements!=null) {
             for (Element cacheElement : cacheElements) {
 
-              if ("class-cache".equals(XmlUtil.getTagLocalName(cacheElement))) {
+              if ("class-cache".equals(cacheElement.getLocalName())) {
                 String className = cacheElement.getAttribute("class");
                 descriptor.addClassToCache(className, cacheUsage);
 
-              } else if ("collection-cache".equals(XmlUtil.getTagLocalName(cacheElement))) {
+              } else if ("collection-cache".equals(cacheElement.getLocalName())) {
                 String collection = cacheElement.getAttribute("collection");
                 descriptor.addCollectionToCache(collection, cacheUsage);
 

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/HibernateSessionBinding.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/HibernateSessionBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/HibernateSessionBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -46,12 +46,12 @@
       descriptor.setFactoryName(element.getAttribute("factory"));
     }
     
-    Boolean tx = XmlUtil.attributeBoolean(element, "tx", false, parse);
+    Boolean tx = XmlUtil.attributeBoolean(element, "tx", parse);
     if (tx!=null) {
       descriptor.setTx(tx);
     }
 
-    Boolean useCurrent = XmlUtil.attributeBoolean(element, "current", false, parse);
+    Boolean useCurrent = XmlUtil.attributeBoolean(element, "current", parse);
     // if usage of current session is specified
     if (useCurrent!=null) {
       // set it accordingly
@@ -60,7 +60,7 @@
       descriptor.setClose( !useCurrent );
     }
     
-    Boolean close = XmlUtil.attributeBoolean(element, "close", false, parse);
+    Boolean close = XmlUtil.attributeBoolean(element, "close", parse);
     if (close!=null) {
       descriptor.setClose(close);
     }

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/JobExecutorBinding.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/JobExecutorBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/JobExecutorBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -75,7 +75,8 @@
     parseIntAttribute(element, "lock", descriptor, "lockMillis", parse);
 
     // by default invoke the start method, unless auto-start is disabled
-    if (XmlUtil.attributeBoolean(element, "auto-start", false, parse, true)) {
+    Boolean autoStart = XmlUtil.attributeBoolean(element, "auto-start", parse);
+    if (autoStart == null || autoStart.booleanValue()) {
       InvokeOperation invokeStartOperation = new InvokeOperation();
       invokeStartOperation.setMethodName("start");
       descriptor.addOperation(invokeStartOperation);
@@ -87,7 +88,7 @@
   }
 
   private void parseIntAttribute(Element element, String attributeName, ObjectDescriptor descriptor, String fieldName, Parse parse) {
-    Integer intValue = XmlUtil.attributeInteger(element, attributeName, false, parse);
+    Integer intValue = XmlUtil.attributeInteger(element, attributeName, parse);
     if (intValue!=null) {
       descriptor.addInjection(fieldName, new IntegerDescriptor(intValue));
     }

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MailTemplateBinding.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MailTemplateBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MailTemplateBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -67,7 +67,7 @@
 
     // create the mail template and add it to the registry
     MailTemplate mailTemplate = parseMailTemplate(element, parse);
-    String templateName = XmlUtil.attribute(element, "name", true, parse);
+    String templateName = XmlUtil.attribute(element, "name", parse);
     templateRegistry.addTemplate(templateName, mailTemplate);
 
     return templateRegistryDescriptor;

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MapBinding.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MapBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MapBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -53,16 +53,16 @@
       descriptor.setClassName(className);
     }
     
-    Boolean isSynchronized = XmlUtil.attributeBoolean(element, "synchronized", false, parse);
+    Boolean isSynchronized = XmlUtil.attributeBoolean(element, "synchronized", parse);
     if (isSynchronized!=null) {
-      descriptor.setSynchronized(isSynchronized.booleanValue());
+      descriptor.setSynchronized(isSynchronized);
     }
 
     List<Descriptor> keyDescriptors = new ArrayList<Descriptor>();
     List<Descriptor> valueDescriptors = new ArrayList<Descriptor>();
     List<Element> elements = XmlUtil.elements(element);
     for (Element entryElement: elements) {
-      if ("entry".equals(XmlUtil.getTagLocalName(entryElement))) {
+      if ("entry".equals(entryElement.getLocalName())) {
         // key
         Element keyElement = XmlUtil.element(entryElement, "key");
         Element keyDescriptorElement = (keyElement!=null ? XmlUtil.element(keyElement) : null);

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MessageSessionBinding.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MessageSessionBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MessageSessionBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -59,7 +59,7 @@
         JndiDescriptor jndiDescriptor = new JndiDescriptor(jmsSessionJndiName);
         objectDescriptor.addInjection("jmsSession", jndiDescriptor);
       } else {
-        parse.addProblem("attribute <"+XmlUtil.getTagLocalName(element)+" session-jndi=\"...\" is required when target=\"jms\"", element);
+        parse.addProblem("attribute <"+element.getLocalName()+" session-jndi=\"...\" is required when target=\"jms\"", element);
       }
       
       if (element.hasAttribute("destination-jndi")) {
@@ -67,7 +67,7 @@
         JndiDescriptor jndiDescriptor = new JndiDescriptor(jmsDestinationJndiName);
         objectDescriptor.addInjection("jmsDestination", jndiDescriptor);
       } else {
-        parse.addProblem("attribute <"+XmlUtil.getTagLocalName(element)+" destination-jndi=\"...\" is required when target=\"jms\"", element);
+        parse.addProblem("attribute <"+element.getLocalName()+" destination-jndi=\"...\" is required when target=\"jms\"", element);
       }
 
     } else {

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/ObjectBinding.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/ObjectBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/ObjectBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -73,7 +73,6 @@
   public static ObjectDescriptor parseObjectDescriptor(Element element, Parse parse, Parser parser) {
     ObjectDescriptor descriptor = new ObjectDescriptor();
 
-    Parser wireParser = (Parser) parser;
     String className = XmlUtil.attribute(element, "class");
     String expr = XmlUtil.attribute(element, "expr");
     String factoryObjectName = XmlUtil.attribute(element, "factory");
@@ -91,7 +90,7 @@
       Element constructorElement = XmlUtil.element(element, "constructor");
       if (constructorElement!=null) {
         List<Element> argElements = XmlUtil.elements(constructorElement, "arg");
-        List<ArgDescriptor> argDescriptors = wireParser.parseArgs(argElements, parse);
+        List<ArgDescriptor> argDescriptors = parser.parseArgs(argElements, parse);
         descriptor.setArgDescriptors(argDescriptors);
 
         if (element.hasAttribute("method")) {
@@ -123,7 +122,7 @@
       descriptor.setMethodName(element.getAttribute("method"));
 
       List<Element> argElements = XmlUtil.elements(element, "arg");
-      List<ArgDescriptor> argDescriptors = wireParser.parseArgs(argElements, parse);
+      List<ArgDescriptor> argDescriptors = parser.parseArgs(argElements, parse);
       descriptor.setArgDescriptors(argDescriptors);
     } else if ( (factoryObjectName!=null)
                 || (factoryElement!=null)
@@ -161,9 +160,9 @@
     descriptor.setOperations(operations);
 
     // autowiring
-    Boolean isAutoWireEnabled = XmlUtil.attributeBoolean(element, "auto-wire", false, parse);
+    Boolean isAutoWireEnabled = XmlUtil.attributeBoolean(element, "auto-wire", parse);
     if (isAutoWireEnabled!=null) {
-      descriptor.setAutoWireEnabled(isAutoWireEnabled.booleanValue());
+      descriptor.setAutoWireEnabled(isAutoWireEnabled);
     }
     return descriptor;
   }

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/PropertiesBinding.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/PropertiesBinding.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/PropertiesBinding.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -59,9 +59,9 @@
       descriptor.setUrl(element.getAttribute("url"));
     }
     
-    Boolean isXml = XmlUtil.attributeBoolean(element, "is-xml", false, parse);
+    Boolean isXml = XmlUtil.attributeBoolean(element, "is-xml", parse);
     if (isXml!=null) {
-      descriptor.setXml(isXml.booleanValue());
+      descriptor.setXml(isXml);
     }
 
     List<Descriptor> keyDescriptors = new ArrayList<Descriptor>();
@@ -69,7 +69,7 @@
 
     List<Element> elements = XmlUtil.elements(element);
     for (Element propertyElement: elements) {
-      if ("property".equals(XmlUtil.getTagLocalName(propertyElement))) {
+      if ("property".equals(propertyElement.getLocalName())) {
         // key
         String name = XmlUtil.attribute(propertyElement, "name");
         // value

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/xml/Parser.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/xml/Parser.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/xml/Parser.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -507,7 +507,7 @@
   public Object parseElement(Element element, Parse parse, String category) {
 
     Object object = null;
-    String tagName = XmlUtil.getTagLocalName(element);
+    String tagName = element.getLocalName();
 
     Binding binding = getBinding(element, category);
 

Modified: jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/activity/assign/AssignTest.java
===================================================================
--- jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/activity/assign/AssignTest.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/activity/assign/AssignTest.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -21,113 +21,112 @@
  */
 package org.jbpm.test.activity.assign;
 
-import java.util.HashMap;
+import java.util.Collections;
 import java.util.Map;
 
 import org.jbpm.api.ProcessInstance;
 import org.jbpm.test.JbpmTestCase;
 
-
 /**
  * @author Tom Baeyens
  */
 public class AssignTest extends JbpmTestCase {
 
-  public void testValueExpressionToVar() {
-    deployJpdlXmlString(
-      "<process name='AssignTest'>" +
-      "  <start>" +
-      "    <transition to='resolve' />" +
-      "  </start>" +
-      "  <assign name='resolve' expr='#{person.name}' to-var='result'>" +
-      "    <transition to='wait' />" +
-      "  </assign>" +
-      "  <state name='wait' />" +
-      "</process>"
-    );
-    
+  public void testFromExprToVar() {
+    deployJpdlXmlString("<process name='AssignTest' xmlns='http://jbpm.org/4.4/jpdl'>"
+      + "  <start>"
+      + "    <transition to='resolve' />"
+      + "  </start>"
+      + "  <assign name='resolve' from-expr='#{person.name}' to-var='result'>"
+      + "    <transition to='wait' />"
+      + "  </assign>"
+      + "  <state name='wait' />"
+      + "</process>");
+
     Person person = new Person();
     person.setName("johndoe");
+    Map<String, ?> variables = Collections.singletonMap("person", person);
 
-    Map<String, Object> variables = new HashMap<String, Object>();
-    variables.put("person", person);
     ProcessInstance processInstance = executionService.startProcessInstanceByKey("AssignTest", variables);
-    executionService.signalExecutionById(processInstance.getId());
-    
     assertEquals("johndoe", executionService.getVariable(processInstance.getId(), "result"));
   }
 
-  public void testMethodExpressionToVar() {
-    deployJpdlXmlString(
-      "<process name='AssignTest'>" +
-      "  <start>" +
-      "    <transition to='resolve' />" +
-      "  </start>" +
-      "  <assign name='resolve' expr='#{person.hello()}' to-var='result'>" +
-      "    <transition to='wait' />" +
-      "  </assign>" +
-      "  <state name='wait' />" +
-      "</process>"
-    );
-    
+  public void testFromMethodExprToVar() {
+    deployJpdlXmlString("<process name='AssignTest' xmlns='http://jbpm.org/4.4/jpdl'>"
+      + "  <start>"
+      + "    <transition to='resolve' />"
+      + "  </start>"
+      + "  <assign name='resolve' from-expr='#{person.toString()}' to-var='result'>"
+      + "    <transition to='wait' />"
+      + "  </assign>"
+      + "  <state name='wait' />"
+      + "</process>");
+
     Person person = new Person();
     person.setName("johndoe");
+    Map<String, ?> variables = Collections.singletonMap("person", person);
 
-    Map<String, Object> variables = new HashMap<String, Object>();
-    variables.put("person", person);
     ProcessInstance processInstance = executionService.startProcessInstanceByKey("AssignTest", variables);
-    executionService.signalExecutionById(processInstance.getId());
-    
-    assertEquals("goodby", executionService.getVariable(processInstance.getId(), "result"));
+    assertEquals("Person(johndoe)", executionService.getVariable(processInstance.getId(), "result"));
   }
 
-  public void testMethodWithParameterExpressionToVar() {
-    deployJpdlXmlString(
-      "<process name='AssignTest'>" +
-      "  <start>" +
-      "    <transition to='resolve' />" +
-      "  </start>" +
-      "  <assign name='resolve' expr=\"#{person.hello('Joe')}\" to-var='result'>" +
-      "    <transition to='wait' />" +
-      "  </assign>" +
-      "  <state name='wait' />" +
-      "</process>"
-    );
-    
+  public void testFromMethodParamExprToVar() {
+    deployJpdlXmlString("<process name='AssignTest' xmlns='http://jbpm.org/4.4/jpdl'>"
+      + "  <start>"
+      + "    <transition to='resolve' />"
+      + "  </start>"
+      + "  <assign name='resolve' from-expr=\"#{person.sayHi('Joe')}\" to-var='result'>"
+      + "    <transition to='wait' />"
+      + "  </assign>"
+      + "  <state name='wait' />"
+      + "</process>");
+
     Person person = new Person();
     person.setName("johndoe");
+    Map<String, ?> variables = Collections.singletonMap("person", person);
 
-    Map<String, Object> variables = new HashMap<String, Object>();
-    variables.put("person", person);
     ProcessInstance processInstance = executionService.startProcessInstanceByKey("AssignTest", variables);
-    executionService.signalExecutionById(processInstance.getId());
-    
     assertEquals("Hi, Joe", executionService.getVariable(processInstance.getId(), "result"));
   }
 
-  public void testWireObjectToExpression() {
-    deployJpdlXmlString(
-      "<process name='AssignTest'>" +
-      "  <start>" +
-      "    <transition to='resolve' />" +
-      "  </start>" +
-      "  <assign name='resolve' to-expr='#{person.address.street}'>" +
-      "    <string value='gasthuisstraat' />" +
-      "    <transition to='wait' />" +
-      "  </assign>" +
-      "  <state name='wait' />" +
-      "</process>"
-    );
-    
+  public void testFromDescToExpr() {
+    deployJpdlXmlString("<process name='AssignTest' xmlns='http://jbpm.org/4.4/jpdl'>"
+      + "  <start>"
+      + "    <transition to='resolve' />"
+      + "  </start>"
+      + "  <assign name='resolve' to-expr='#{person.address.street}'>"
+      + "    <from><string value='gasthuisstraat' /></from>"
+      + "    <transition to='wait' />"
+      + "  </assign>"
+      + "  <state name='wait' />"
+      + "</process>");
+
     Person person = new Person();
     person.setName("johndoe");
+    Map<String, ?> variables = Collections.singletonMap("person", person);
 
-    Map<String, Object> variables = new HashMap<String, Object>();
-    variables.put("person", person);
     ProcessInstance processInstance = executionService.startProcessInstanceByKey("AssignTest", variables);
-    executionService.signalExecutionById(processInstance.getId());
-    
     person = (Person) executionService.getVariable(processInstance.getId(), "person");
     assertEquals("gasthuisstraat", person.getAddress().getStreet());
   }
+
+  public void testFromVarToVar() {
+    deployJpdlXmlString("<process name='AssignTest' xmlns='http://jbpm.org/4.4/jpdl'>"
+      + "  <start>"
+      + "    <transition to='resolve' />"
+      + "  </start>"
+      + "  <assign name='resolve' from-var='person' to-var='result'>"
+      + "    <transition to='wait' />"
+      + "  </assign>"
+      + "  <state name='wait' />"
+      + "</process>");
+
+    Person person = new Person();
+    person.setName("johndoe");
+    Map<String, ?> variables = Collections.singletonMap("person", person);
+
+    ProcessInstance processInstance = executionService.startProcessInstanceByKey("AssignTest", variables);
+    person = (Person) executionService.getVariable(processInstance.getId(), "result");
+    assertEquals("johndoe", person.getName());
+  }
 }

Modified: jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/activity/assign/Person.java
===================================================================
--- jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/activity/assign/Person.java	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/activity/assign/Person.java	2010-06-10 11:10:39 UTC (rev 6398)
@@ -23,38 +23,33 @@
 
 import java.io.Serializable;
 
-
 /**
  * @author Tom Baeyens
  */
 public class Person implements Serializable {
 
   private static final long serialVersionUID = 1L;
-  
+
   String name;
   Address address = new Address();
   String[] emails;
-  
-  public String hello() {
-    return "goodby";
+
+  public String sayHi(String name) {
+    return "Hi, " + name;
   }
-  
-  public String hello(String name) {
-    return "Hi, "+name;
-  }
-  
+
   public String getName() {
     return name;
   }
-  
+
   public void setName(String name) {
     this.name = name;
   }
-  
+
   public Address getAddress() {
     return address;
   }
-  
+
   public void setAddress(Address address) {
     this.address = address;
   }
@@ -66,4 +61,8 @@
   public void setEmails(String[] emails) {
     this.emails = emails;
   }
+
+  public String toString() {
+    return "Person(" + name + ')';
+  }
 }

Modified: jbpm4/trunk/modules/userguide/src/main/docbook/en/modules/ch06-Jpdl.xml
===================================================================
--- jbpm4/trunk/modules/userguide/src/main/docbook/en/modules/ch06-Jpdl.xml	2010-06-09 17:46:55 UTC (rev 6397)
+++ jbpm4/trunk/modules/userguide/src/main/docbook/en/modules/ch06-Jpdl.xml	2010-06-10 11:10:39 UTC (rev 6398)
@@ -2165,11 +2165,102 @@
       </para>
     </section>
 
+    <!-- ### ASSIGN ######################################################## -->
+
+    <section id="assign">
+      <title><literal>assign</literal></title>
+      <para>The <literal>assign</literal> activity retrieves a value and assigns it
+      to a target location.</para>
+      <table><title><literal>assign</literal> attributes:</title>
+        <tgroup cols="5" rowsep="1" colsep="1">
+          <thead>
+            <row>
+              <entry>Attribute</entry>
+              <entry>Type</entry>
+              <entry>Default</entry>
+              <entry>Required?</entry>
+              <entry>Description</entry>
+            </row>
+          </thead>
+          <tbody>
+            <row>
+              <entry><literal>from-var</literal></entry>
+              <entry>string</entry>
+              <entry></entry>
+              <entry morerows="1">one of <literal>from-var</literal>, <literal>from-expr</literal>, <literal>from</literal> is required</entry>
+              <entry>variable that provides the source value</entry>
+            </row>
+            <row>
+              <entry><literal>from-expr</literal></entry>
+              <entry>expression</entry>
+              <entry></entry>
+              <entry>expression that resolves the source value</entry>
+            </row>
+            <row>
+              <entry><literal>lang</literal></entry>
+              <entry>string</entry>
+              <entry>default <emphasis role="bold">expression</emphasis> language defined in <xref linkend="scripting"/></entry>
+              <entry>optional</entry>
+              <entry>language in which <literal>from-expr</literal> is written</entry>
+            </row>
+            <row>
+              <entry><literal>to-var</literal></entry>
+              <entry>string</entry>
+              <entry></entry>
+              <entry morerows="1">one of <literal>to-var</literal>, <literal>to-expr</literal> is required</entry>
+              <entry>variable that provides the target location</entry>
+            </row>
+            <row>
+              <entry><literal>to-expr</literal></entry>
+              <entry>expression</entry>
+              <entry></entry>
+              <entry>expression that resolves the target location</entry>
+            </row>
+          </tbody>
+        </tgroup>
+      </table>
+      <table><title><literal>assign</literal> elements:</title>
+        <tgroup cols="3" rowsep="1" colsep="1">
+          <thead>
+            <row>
+              <entry>Element</entry>
+              <entry>Multiplicity</entry>
+              <entry>Description</entry>
+            </row>
+          </thead>
+          <tbody>
+            <row>
+              <entry><literal>from</literal></entry>
+              <entry>0..1</entry>
+              <entry>descriptor that constructs the source value</entry>
+            </row>
+          </tbody>
+        </tgroup>
+      </table>
+      <para>Every form of <literal>from</literal> can be combined with any form
+      of <literal>to</literal>. The listing below simply assigns a variable to
+      another.</para>
+      <programlisting><![CDATA[<assign name='resolve' from-expr='#{person.name}' to-var='result'>
+  <transition to='wait' />
+</assign>]]></programlisting>
+      <para>The next example shows an expression value being assigned to a
+      variable.</para>
+      <programlisting><![CDATA[<assign name='resolve' from-var='person' to-var='result'>
+  <transition to='wait' />
+</assign>]]></programlisting>
+      <para>Our last example presents a value constructed by a descriptor being
+      assigned to the expression location.</para>
+      <programlisting><![CDATA[<assign name='resolve' to-expr='#{person.address.street}'>
+  <from><string value='gasthuisstraat' /></from>
+  <transition to='wait' />
+</assign>]]></programlisting>
+    </section>
+
     <!-- ### HQL ########################################################### -->
 
     <section id="hql">
       <title><literal>hql</literal></title>
-      <para>With the<literal>hql</literal> activity, a HQL query can be performed 
+      <para>With the <literal>hql</literal> activity, a HQL query can be performed 
       on the database and the result is stored in a process variable. 
       </para>
       <table><title><literal>hql</literal> attributes:</title>



More information about the jbpm-commits mailing list