Author: rebody
Date: 2010-08-12 06:18:37 -0400 (Thu, 12 Aug 2010)
New Revision: 6588
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MapBinding.java
jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/MapWireTest.java
Log:
JBPM-2753 simplified map descript
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-08-12
08:58:39 UTC (rev 6587)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/MapBinding.java 2010-08-12
10:18:37 UTC (rev 6588)
@@ -28,17 +28,19 @@
import org.jbpm.pvm.internal.util.XmlUtil;
import org.jbpm.pvm.internal.wire.Descriptor;
import org.jbpm.pvm.internal.wire.descriptor.MapDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.StringDescriptor;
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 creating a {@link java.util.Map}.
- *
+ *
* See schema docs for more details.
- *
+ *
* @author Tom Baeyens
* @author Guillaume Porcher (documentation)
+ * @author Huisheng Xu
*/
public class MapBinding extends WireDescriptorBinding {
@@ -52,9 +54,9 @@
if (AbstractCollectionBinding.verify(className, Map.class, parse, parser)) {
descriptor.setClassName(className);
}
-
+
Boolean isSynchronized = XmlUtil.attributeBoolean(element, "synchronized",
parse);
- if (isSynchronized!=null) {
+ if (isSynchronized != null) {
descriptor.setSynchronized(isSynchronized);
}
@@ -63,25 +65,13 @@
List<Element> elements = XmlUtil.elements(element);
for (Element entryElement: elements) {
if ("entry".equals(entryElement.getLocalName())) {
- // key
- Element keyElement = XmlUtil.element(entryElement, "key");
- Element keyDescriptorElement = (keyElement!=null ? XmlUtil.element(keyElement) :
null);
- Descriptor keyDescriptor = (Descriptor) parser.parseElement(keyDescriptorElement,
parse, WireParser.CATEGORY_DESCRIPTOR);
- // value
- Element valueElement = XmlUtil.element(entryElement, "value");
- Element valueDescriptorElement = (valueElement!=null ?
XmlUtil.element(valueElement) : null);
- Descriptor valueDescriptor = (Descriptor)
parser.parseElement(valueDescriptorElement, parse, WireParser.CATEGORY_DESCRIPTOR);
-
- if ( (keyDescriptor!=null)
- && (valueDescriptor!=null)
- ) {
- keyDescriptors.add(keyDescriptor);
- valueDescriptors.add(valueDescriptor);
+ if (XmlUtil.attribute(entryElement, "key") == null) {
+ this.processFullMode(element, entryElement, keyDescriptors, valueDescriptors,
parse, parser);
} else {
- parse.addProblem("entry must have key and value element with a single
descriptor as contents: "+XmlUtil.toString(entryElement), element);
+ this.processEasyMode(element, entryElement, keyDescriptors, valueDescriptors,
parse, parser);
}
} else {
- parse.addProblem("map can only contain entry elements:
"+XmlUtil.toString(entryElement));
+ parse.addProblem("map can only contain entry elements: " +
XmlUtil.toString(entryElement));
}
}
@@ -89,4 +79,97 @@
descriptor.setValueDescriptors(valueDescriptors);
return descriptor;
}
-}
\ No newline at end of file
+
+ /**
+ * full mode.
+ *
+ * <pre>
+ * <map>
+ * <entry>
+ * <key>
+ * <string value="input_file_a" />
+ * </key>
+ * <value>
+ * <string value="some_filename" />
+ * </value>
+ * </entry>
+ * <entry>
+ * <key>
+ * <string value="another_input" />
+ * </key>
+ * <value>
+ * <string value="1234" />
+ * </value>
+ * </entry>
+ * </map>
+ * </pre>
+ */
+ protected void processFullMode(Element element,
+ Element entryElement,
+ List<Descriptor> keyDescriptors,
+ List<Descriptor> valueDescriptors,
+ Parse parse,
+ Parser parser) {
+ // key
+ Element keyElement = XmlUtil.element(entryElement, "key");
+ Element keyDescriptorElement = (keyElement != null ? XmlUtil.element(keyElement) :
null);
+ Descriptor keyDescriptor = (Descriptor) parser.parseElement(keyDescriptorElement,
parse, WireParser.CATEGORY_DESCRIPTOR);
+ // value
+ Element valueElement = XmlUtil.element(entryElement, "value");
+ Element valueDescriptorElement = (valueElement != null ?
XmlUtil.element(valueElement) : null);
+ Descriptor valueDescriptor = (Descriptor) parser.parseElement(valueDescriptorElement,
parse, WireParser.CATEGORY_DESCRIPTOR);
+
+ if ( (keyDescriptor != null)
+ && (valueDescriptor != null)
+ ) {
+ keyDescriptors.add(keyDescriptor);
+ valueDescriptors.add(valueDescriptor);
+ } else {
+ parse.addProblem("entry must have key and value element with a single
descriptor as contents: "
+ + XmlUtil.toString(entryElement), element);
+ }
+ }
+
+ /**
+ * easy mode.
+ *
+ * <pre>
+ * <map>
+ * <entry key="input_file_a" value="some_filename" />
+ * <entry key="another_input" value="1234" />
+ * </map>
+ * </pre>
+ */
+ protected void processEasyMode(Element element,
+ Element entryElement,
+ List<Descriptor> keyDescriptors,
+ List<Descriptor> valueDescriptors,
+ Parse parse,
+ Parser parser) {
+ // key
+ String keyAttribute = XmlUtil.attribute(entryElement, "key");
+ Descriptor keyDescriptor = this.createStringDescriptor(keyAttribute);
+ // value
+ String valueAttribute = XmlUtil.attribute(entryElement, "value");
+ Descriptor valueDescriptor = this.createStringDescriptor(valueAttribute);
+
+ if ( (keyDescriptor != null)
+ && (valueDescriptor != null)
+ ) {
+ keyDescriptors.add(keyDescriptor);
+ valueDescriptors.add(valueDescriptor);
+ } else {
+ parse.addProblem("entry must have key and value attributes: "
+ + XmlUtil.toString(entryElement), element);
+ }
+ }
+
+ protected Descriptor createStringDescriptor(String value) {
+ if (value == null) {
+ return null;
+ }
+ StringDescriptor stringDescriptor = new StringDescriptor();
+ stringDescriptor.setValue(value);
+ return stringDescriptor;
+ }
+}
Modified:
jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/MapWireTest.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/MapWireTest.java 2010-08-12
08:58:39 UTC (rev 6587)
+++
jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/MapWireTest.java 2010-08-12
10:18:37 UTC (rev 6588)
@@ -96,4 +96,20 @@
assertTextPresent("entry must have key and value element with a single
descriptor as contents", problems.get(2).getMsg());
assertTextPresent("entry must have key and value element with a single
descriptor as contents", problems.get(3).getMsg());
}
+
+ public void testEasyMap() {
+ WireContext wireContext = createWireContext(
+ "<objects>" +
+ " <map name='m'>" +
+ " <entry key='true' value='null'/>" +
+ " <entry key='a' value='5'/>" +
+ " </map>" +
+ "</objects>"
+ );
+
+ Map m = (Map) wireContext.get("m");
+ assertEquals(m.toString(), 2, m.size());
+ assertEquals("null", m.get("true"));
+ assertEquals("5", m.get("a"));
+ }
}