[jbpm-commits] JBoss JBPM SVN: r5738 - in jbpm4/trunk/modules: jpdl/src/main/java/org/jbpm/jpdl/internal/xml and 4 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Tue Oct 13 12:25:53 EDT 2009


Author: tom.baeyens at jboss.com
Date: 2009-10-13 12:25:52 -0400 (Tue, 13 Oct 2009)
New Revision: 5738

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/xml/JpdlParser.java
   jbpm4/trunk/modules/jpdl/src/test/java/org/jbpm/test/update/ProcessUpdateTest.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/xml/Parser.java
   jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/ListWireTest.java
   jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/ObjectWireTest.java
   jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/SetWireTest.java
Log:
JBPM-2578 added pieces of merging of update dom into process dom

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	2009-10-13 09:40:39 UTC (rev 5737)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/repository/JpdlDeployer.java	2009-10-13 16:25:52 UTC (rev 5738)
@@ -23,6 +23,12 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.Transformer;
@@ -39,6 +45,8 @@
 import org.jbpm.pvm.internal.xml.Parser;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
 
 /**
  * @author Tom Baeyens
@@ -84,16 +92,20 @@
       .getDocument();
     Element processElement = processDocument.getDocumentElement();
     
-    Element updateProcessElement = updateDocument.getDocumentElement();
-    Element updateDescriptionElement = XmlUtil.element(updateProcessElement, "description");
-    if (updateDescriptionElement!=null) {
+    Element processUpdateElement = updateDocument.getDocumentElement();
+    Element processUpdateDescriptionElement = XmlUtil.element(processUpdateElement, "description");
+    if (processUpdateDescriptionElement!=null) {
       Element processDescriptionElement = XmlUtil.element(processElement, "description");
       if (processDescriptionElement!=null) {
         processElement.removeChild(processDescriptionElement);
       }
-      processElement.appendChild(updateDescriptionElement);
+      Node clonedDescriptionElement = processUpdateDescriptionElement.cloneNode(true);
+      processDocument.adoptNode(clonedDescriptionElement);
+      processElement.appendChild(clonedDescriptionElement);
     }
     
+    updateActivities(processDocument, processElement, processUpdateDescriptionElement);
+    
     try {
       Transformer transformer = TransformerFactory.newInstance().newTransformer();
       transformer.setOutputProperty(OutputKeys.INDENT, "yes");
@@ -102,10 +114,89 @@
       DOMSource source = new DOMSource(processDocument);
       transformer.transform(source, result);
       
-      byte[] bytes = result.getWriter().toString().getBytes();
+      String updatedProcessXml = result.getWriter().toString();
+      log.debug("updated process xml: \n"+updatedProcessXml);
+      byte[] bytes = updatedProcessXml.getBytes();
       deployment.addResourceFromInputStream(resourceName, new ByteArrayInputStream(bytes));
     } catch (Exception e) {
       throw new JbpmException("couldn't serialize updated process dom model", e);
     }
   }
+
+  private void updateActivities(Document processDocument, Element activityContainerElement, Element updateContainerElement) {
+    Set<String> activityNames = jpdlParser.getActivityTagNames();
+
+    Map<String, Element> processActivityMap = getActivityMap(activityContainerElement, activityNames);
+    Map<String, Element> updateActivityMap = getActivityMap(updateContainerElement, activityNames);
+    
+    for (String activityName: updateActivityMap.keySet()) {
+      Element processActivity = processActivityMap.get(activityName);
+      Element updateActivity = updateActivityMap.get(activityName);
+      String updateTagName = XmlUtil.getTagLocalName(updateActivity);
+
+      activityContainerElement.removeChild(processActivity);
+      Element mergedActivityElement = processDocument.createElement(updateTagName);
+      
+      mergeAttributes(mergedActivityElement, processActivity.getAttributes());
+      mergeAttributes(mergedActivityElement, updateActivity.getAttributes());
+      
+      Map<String, List<Element>> processActivityContents = getElementsByTagName(processActivity);
+      Map<String, List<Element>> updateActivityContents = getElementsByTagName(updateActivity);
+      
+      Set<String> allTagNames = new HashSet<String>(processActivityContents.keySet());
+      allTagNames.addAll(updateActivityContents.keySet());
+      
+      for (String tagName: allTagNames) {
+        List<Element> contentElements = processActivityContents.get(tagName);
+        if (contentElements==null) {
+          contentElements = new ArrayList<Element>();
+        }
+        List<Element> updateElements = updateActivityContents.get(tagName);
+        for (int i=0; i<contentElements.size(); i++) {
+          Element contentElement = contentElements.get(i);
+          Element updateElement = (updateElements!=null && updateElements.size()>i ? updateElements.get(i) : null);
+          if (updateElement!=null) {
+            mergeAttributes(contentElement, updateElement.getAttributes());
+          }
+        }
+      }
+    }
+  }
+
+  public Map<String, List<Element>> getElementsByTagName(Element element) {
+    Map<String, List<Element>> elementsByTagName = new HashMap<String, List<Element>>();
+    for (Element contentElement: XmlUtil.elements(element)) {
+      String tagName = XmlUtil.getTagLocalName(contentElement);
+      List<Element> tagElements = elementsByTagName.get(tagName);
+      if (tagElements==null) {
+        tagElements = new ArrayList<Element>();
+        elementsByTagName.put(tagName, tagElements);
+      }
+      tagElements.add(contentElement);
+    }
+    return elementsByTagName;
+  }
+
+  private void mergeAttributes(Element element, NamedNodeMap attributes) {
+    for (int i=0; i<attributes.getLength(); i++) {
+      Node attribute = attributes.item(i);
+      String attributeName = attribute.getNodeName();
+      String attributeValue = attribute.getNodeValue();
+      element.setAttribute(attributeName, attributeValue);
+    }
+  }
+
+  protected Map<String, Element> getActivityMap(Element containerElement, Set<String> activityNames) {
+    Map<String, Element> activityMap = new HashMap<String, Element>();
+    
+    for (Element element: XmlUtil.elements(containerElement)) {
+      String tagName = XmlUtil.getTagLocalName(element);
+      if (activityNames.contains(tagName)) {
+        String activityName = element.getAttribute("name");
+        activityMap.put(activityName, element);
+      }
+    }
+    
+    return activityMap;
+  }
 }

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	2009-10-13 09:40:39 UTC (rev 5737)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/xml/JpdlParser.java	2009-10-13 16:25:52 UTC (rev 5738)
@@ -769,4 +769,8 @@
 
     return userCodeReference;
   }
+  
+  public Set<String> getActivityTagNames() {
+    return getBindings().getTagNames(CATEGORY_ACTIVITY);
+  }
 }

Modified: jbpm4/trunk/modules/jpdl/src/test/java/org/jbpm/test/update/ProcessUpdateTest.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/test/java/org/jbpm/test/update/ProcessUpdateTest.java	2009-10-13 09:40:39 UTC (rev 5737)
+++ jbpm4/trunk/modules/jpdl/src/test/java/org/jbpm/test/update/ProcessUpdateTest.java	2009-10-13 16:25:52 UTC (rev 5738)
@@ -24,6 +24,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 
+import org.jbpm.api.ProcessInstance;
 import org.jbpm.pvm.internal.util.XmlUtil;
 import org.jbpm.pvm.internal.xml.Parser;
 import org.jbpm.test.JbpmTestCase;
@@ -36,9 +37,9 @@
  */
 public class ProcessUpdateTest extends JbpmTestCase {
   
-  public void testReplaceActivity() {
+  public void testUpdateProcessDescription() {
     String deploymentId = deployJpdlXmlString(
-      "<process name='DescriptionProcess'>" +
+      "<process name='UpdateProcessDescription'>" +
       "  <start>" +
       "    <transition to='s' />" +
       "  </start>" +
@@ -48,11 +49,11 @@
 
     updateJpdlXmlString( 
       deploymentId, 
-      "<update-process>" +
+      "<process-update>" +
       "  <description>" +
       "    This is a description" +
       "  </description>" +
-      "</update-process>"
+      "</process-update>"
     );
 
     InputStream inputStream = repositoryService.getResourceAsStream(deploymentId, "xmlstring.jpdl.xml");
@@ -73,7 +74,34 @@
     assertNotNull(stateSElement);
     assertEquals("s", stateSElement.getAttribute("name"));
   }
-  
+
+  public void testReplaceActivity() {
+    String deploymentId = deployJpdlXmlString(
+      "<process name='ReplaceActivity'>" +
+      "  <start>" +
+      "    <transition to='getDataFromDb' />" +
+      "  </start>" +
+      "  <sql name='getDataFromDb' var='nbrOfOrders'>" +
+      "    <query>COUNT * FROM ORDERS</query>" +
+      "    <transition to='wait' />" +
+      "  </sql>" +
+      "  <state name='wait' />" +
+      "</process>"
+    );
+
+    updateJpdlXmlString( 
+      deploymentId, 
+      "<process-update>" +
+      "  <java name='getDataFromDb' expr='#{541}' />" +
+      "</process-update>"
+    );
+
+    ProcessInstance processInstance = executionService.startProcessInstanceByKey("ReplaceActivity");
+    processInstance.isActive("wait");
+    
+    assertEquals(541, executionService.getVariable(processInstance.getId(), "nbrOfOrders"));
+  }
+
   public void updateJpdlXmlString(String deploymentId, String xmlString) {
     InputStream inputStream = new ByteArrayInputStream(xmlString.getBytes());
     repositoryService.updateDeploymentResource(deploymentId, "xmlstring.jpdl.xml", inputStream);

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	2009-10-13 09:40:39 UTC (rev 5737)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/AbstractCollectionBinding.java	2009-10-13 16:25:52 UTC (rev 5738)
@@ -40,6 +40,8 @@
       Descriptor valueDescriptor = (Descriptor) parser.parseElement(valueElement, parse, WireParser.CATEGORY_DESCRIPTOR);
       if (valueDescriptor!=null) {
         valueDescriptors.add(valueDescriptor);
+      } else {
+        parse.addProblem("unrecognized element: "+XmlUtil.toString(valueElement));
       }
     }
     descriptor.setValueDescriptors(valueDescriptors);

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	2009-10-13 09:40:39 UTC (rev 5737)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/xml/Parser.java	2009-10-13 16:25:52 UTC (rev 5738)
@@ -511,8 +511,8 @@
 
     if (binding!=null) {
       object = binding.parse(element, parse, this);
-    } else {
-      parse.addProblem("no element parser for tag "+tagName+(category!=null ? " in category "+category : " in the default category"), element);
+    } else if (log.isDebugEnabled()) {
+      log.debug("no element parser for tag "+tagName+(category!=null ? " in category "+category : " in the default category"));
     }
 
     return object;

Modified: jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/ListWireTest.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/ListWireTest.java	2009-10-13 09:40:39 UTC (rev 5737)
+++ jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/ListWireTest.java	2009-10-13 16:25:52 UTC (rev 5738)
@@ -97,7 +97,7 @@
     );
 
     assertEquals(problems.toString(), 1, problems.size());
-    assertTextPresent("no element parser for tag unknown-descriptor", problems.get(0).getMsg());
+    assertTextPresent("unrecognized element: <unknown-descriptor", problems.get(0).getMsg());
   }
 
   public static class TextElement {

Modified: jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/ObjectWireTest.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/ObjectWireTest.java	2009-10-13 09:40:39 UTC (rev 5737)
+++ jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/ObjectWireTest.java	2009-10-13 16:25:52 UTC (rev 5738)
@@ -504,9 +504,8 @@
       "</objects>"
     );
     assertNotNull(problems);
-    assertEquals(2L, problems.size());
-    assertTextPresent("no element parser for tag bad-descriptor in category descriptor", problems.get(0).getMsg());
-    assertTextPresent("unknown descriptor element bad-descriptor inside field operation: ", problems.get(1).getMsg());
+    assertEquals(1, problems.size());
+    assertTextPresent("unknown descriptor element bad-descriptor inside field operation: ", problems.get(0).getMsg());
   }
 
   public static class InheritedFieldInjectionClass extends FieldInjectionClass {
@@ -693,9 +692,8 @@
       "</objects>"
     );
     assertNotNull(problems);
-    assertEquals(2L, problems.size());
-    assertTextPresent("no element parser for tag bad-descriptor in category descriptor", problems.get(0).getMsg());
-    assertTextPresent("couldn't parse property content element as a value descriptor: ", problems.get(1).getMsg());
+    assertEquals(1, problems.size());
+    assertTextPresent("couldn't parse property content element as a value descriptor: ", problems.get(0).getMsg());
   }
 
   public void testMissingPropertySetter() {

Modified: jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/SetWireTest.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/SetWireTest.java	2009-10-13 09:40:39 UTC (rev 5737)
+++ jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/SetWireTest.java	2009-10-13 16:25:52 UTC (rev 5738)
@@ -58,7 +58,7 @@
       "</objects>"
     );
     assertNotNull(problems);
-    assertTextPresent("no element parser for tag unknown-descriptor", problems.get(0).getMsg());
+    assertTextPresent("unrecognized element: <unknown-descriptor", problems.get(0).getMsg());
   }
 
 }



More information about the jbpm-commits mailing list