[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