[jboss-svn-commits] JBL Code SVN: r5359 - in labs/jbossesb/trunk/product/core/common: src/org/jboss/soa/esb/helpers src/org/jboss/soa/esb/notification tests/src/org/jboss/soa/esb tests/src/org/jboss/soa/esb/helpers tests/src/org/jboss/soa/esb/notification
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Jul 31 10:00:39 EDT 2006
Author: tfennelly
Date: 2006-07-31 10:00:26 -0400 (Mon, 31 Jul 2006)
New Revision: 5359
Added:
labs/jbossesb/trunk/product/core/common/tests/src/org/jboss/soa/esb/notification/
labs/jbossesb/trunk/product/core/common/tests/src/org/jboss/soa/esb/notification/MacroExpanderUnitTest.java
labs/jbossesb/trunk/product/core/common/tests/src/org/jboss/soa/esb/notification/MacroExpanderUnitTest_expected1.xml
Modified:
labs/jbossesb/trunk/product/core/common/src/org/jboss/soa/esb/helpers/DomElement.java
labs/jbossesb/trunk/product/core/common/src/org/jboss/soa/esb/notification/MacroExpander.java
labs/jbossesb/trunk/product/core/common/tests/src/org/jboss/soa/esb/helpers/DomElementUnitTest.java
Log:
Added tests for the MacroExpander class. Fixed a few bugs in the DomElement and MacroExpander classes.
Modified: labs/jbossesb/trunk/product/core/common/src/org/jboss/soa/esb/helpers/DomElement.java
===================================================================
--- labs/jbossesb/trunk/product/core/common/src/org/jboss/soa/esb/helpers/DomElement.java 2006-07-31 13:25:46 UTC (rev 5358)
+++ labs/jbossesb/trunk/product/core/common/src/org/jboss/soa/esb/helpers/DomElement.java 2006-07-31 14:00:26 UTC (rev 5359)
@@ -32,6 +32,18 @@
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
+/**
+ * Wrapper class around the W3C DOM API.
+ * <p/>
+ * This clas attempts to remove some of the complexity of dealing with the W3C
+ * DOM API. It's basically a wrapper class around the {@link org.w3c.dom.Element}
+ * and {@link org.w3c.dom.Document} classes.
+ * <p/>
+ * It provides utility methods for constructing a DOM from a stream, adding/removing
+ * elements and attributes from the DOM, and methods for serializing the DOM.
+ *
+ * @author <a href="mailto:schifest at gmail.com">Esteban Shifman</a>
+ */
public class DomElement {
protected static final String LINE_BREAK = System.getProperty("line.separator");
@@ -294,10 +306,15 @@
addTextChild(p_sKey,p_saVal[i1]);
} //__________________________________
- public void addElemChild(DomElement p_oE) {
- p_oE.m_oParentDomElement = this;
+ public void addElemChild(DomElement p_oElementChild) {
+ p_oElementChild.m_oParentDomElement = this;
Document oDoc = m_oRootW3CElement.getOwnerDocument();
- m_oRootW3CElement.appendChild(oDoc.importNode(p_oE.m_oRootW3CElement, true));
+ // Need to clone the node because the Elements are from different Document - you'll get
+ // an exception if you simply try to append it.
+ Element clonedElement = (Element) oDoc.importNode(p_oElementChild.m_oRootW3CElement, true);
+ m_oRootW3CElement.appendChild(clonedElement);
+ // Reset W3C element of the child DomElement to be the cloned element.
+ p_oElementChild.m_oRootW3CElement = clonedElement;
} // __________________________________
public void rmvChildsByName(String p_sTagName) {
Modified: labs/jbossesb/trunk/product/core/common/src/org/jboss/soa/esb/notification/MacroExpander.java
===================================================================
--- labs/jbossesb/trunk/product/core/common/src/org/jboss/soa/esb/notification/MacroExpander.java 2006-07-31 13:25:46 UTC (rev 5358)
+++ labs/jbossesb/trunk/product/core/common/src/org/jboss/soa/esb/notification/MacroExpander.java 2006-07-31 14:00:26 UTC (rev 5359)
@@ -25,7 +25,20 @@
import java.util.*;
import org.jboss.soa.esb.helpers.*;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+/**
+ * MacroExpander class.
+ * <p/>
+ * This class takes a DOM and iterates over it, replacing all "macro" tokens in
+ * any attribute values using the values from the supplied Map.
+ *
+ * @author <a href="mailto:schifest at gmail.com">Esteban Shifman</a>
+ */
public class MacroExpander {
private static final String CTX_PREFIX = "@@ctx@@";
@@ -37,39 +50,61 @@
public static final String CTX_POST_FILE = CTX_PREFIX + "postFile";
- private static final String[] s_saMacros = { CTX_BATCH_UID, CTX_BATCH_NUM,
- CTX_INPUT_FILE, CTX_POST_FILE };
+ private static final String[] s_saMacros = {
+ CTX_BATCH_UID, CTX_BATCH_NUM, CTX_INPUT_FILE, CTX_POST_FILE };
- public static void replaceMacros(DomElement p_oParm, Map p_oMap) {
- String[] saAtt = p_oParm.getAttrKeys();
-
- for (int i1 = 0; i1 < saAtt.length; i1++) {
- String sKey = saAtt[i1];
- String sVal = p_oParm.getAttr(sKey);
+ /**
+ * Perform a macro replacement on the DOM tree attribute values
+ * of the supplied DomElement using the supplied macro token
+ * replacement map.
+ * @param domTree The DOM Tree to be operated on.
+ * @param replacementTokenMapMap The token replacement map.
+ */
+ public static void replaceMacros(DomElement domTree, Map replacementTokenMapMap) {
+ replaceMacros(domTree.getDomElement(), replacementTokenMapMap);
+ }
+
+ private static void replaceMacros(Element element, Map p_oMap) {
+ NamedNodeMap attributes = element.getAttributes();
+ int attribCount = attributes.getLength();
+
+ for (int i = 0; i < attribCount; i++) {
+ Attr attribute = (Attr) attributes.item(i);
+ String sVal = attribute.getValue();
boolean bSubst = false;
- int iWh = 0;
int iPos = 0;
- while (0 <= (iPos = sVal.indexOf(CTX_PREFIX, iWh))) {
+ while (0 <= (iPos = sVal.indexOf(CTX_PREFIX, 0))) {
String sRest = sVal.substring(iPos);
- for (int i2 = 0; i2 < s_saMacros.length; i2++) {
- String sMac = s_saMacros[i2];
- if (!sRest.startsWith(sMac))
+ for (int ii = 0; ii < s_saMacros.length; ii++) {
+ String sMac = s_saMacros[ii];
+ if (!sRest.startsWith(sMac)) {
continue;
+ }
Object oRpl = (null != p_oMap) ? p_oMap.get(sMac) : null;
- if (null == oRpl)
+ if (null == oRpl) {
continue;
+ }
bSubst = true;
- sVal = sVal.substring(0, iPos) + oRpl.toString()
- + sVal.substring(iPos + sMac.length());
+ sVal = sVal.substring(0, iPos) + oRpl.toString() + sVal.substring(iPos + sMac.length());
+ break;
}
}
- if (bSubst)
- p_oParm.setAttr(sKey, sVal);
+ if (bSubst) {
+ attribute.setValue(sVal);
+ }
}
- DomElement[] oaChilds = p_oParm.getAllElemChildren();
- for (int i1 = 0; i1 < oaChilds.length; i1++) {
- replaceMacros(oaChilds[i1], p_oMap);
+
+ // Iterate over the child elements and recursively call this method...
+ NodeList children = element.getChildNodes();
+ int childCount = children.getLength();
+ for (int i = 0; i < childCount; i++) {
+ Node child = children.item(i);
+
+ if(child.getNodeType() != Node.ELEMENT_NODE) {
+ continue;
+ }
+ replaceMacros((Element)child, p_oMap);
}
- } // _________________________
+ }
}
Modified: labs/jbossesb/trunk/product/core/common/tests/src/org/jboss/soa/esb/helpers/DomElementUnitTest.java
===================================================================
--- labs/jbossesb/trunk/product/core/common/tests/src/org/jboss/soa/esb/helpers/DomElementUnitTest.java 2006-07-31 13:25:46 UTC (rev 5358)
+++ labs/jbossesb/trunk/product/core/common/tests/src/org/jboss/soa/esb/helpers/DomElementUnitTest.java 2006-07-31 14:00:26 UTC (rev 5359)
@@ -226,8 +226,7 @@
domElement1.addElemChild(domElementX);
domElement1.addElemChild(domElementY1);
domElementX.addElemChild(domElementY2);
- assertEquals("<newDomElement><X/><Y1/></newDomElement>", domElement1.toString().trim());
- // REVIEW: Note how Y2 wasn't added to X???
+ assertEquals("<newDomElement><X><Y2/></X><Y1/></newDomElement>", domElement1.toString().trim());
}
public void test_rmvChildsByName() throws SAXException, IOException {
@@ -239,9 +238,9 @@
domElement1.addElemChild(domElementX);
domElement1.addElemChild(domElementY1);
domElementX.addElemChild(domElementY2);
- assertEquals("<newDomElement><X/><Y1/></newDomElement>", domElement1.toString().trim());
+ assertEquals("<newDomElement><X><Y2/></X><Y1/></newDomElement>", domElement1.toString().trim());
domElement1.rmvChildsByName("Y1");
- assertEquals("<newDomElement><X/></newDomElement>", domElement1.toString().trim());
+ assertEquals("<newDomElement><X><Y2/></X></newDomElement>", domElement1.toString().trim());
}
public void test_cloneObj() throws SAXException, IOException {
Added: labs/jbossesb/trunk/product/core/common/tests/src/org/jboss/soa/esb/notification/MacroExpanderUnitTest.java
===================================================================
--- labs/jbossesb/trunk/product/core/common/tests/src/org/jboss/soa/esb/notification/MacroExpanderUnitTest.java 2006-07-31 13:25:46 UTC (rev 5358)
+++ labs/jbossesb/trunk/product/core/common/tests/src/org/jboss/soa/esb/notification/MacroExpanderUnitTest.java 2006-07-31 14:00:26 UTC (rev 5359)
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.soa.esb.notification;
+
+import java.util.HashMap;
+
+import org.jboss.soa.esb.StreamUtils;
+import org.jboss.soa.esb.helpers.DomElement;
+
+import junit.framework.TestCase;
+
+/**
+ * MacroExpander unit tests.
+ * @author <a href="mailto:tom.fennelly at jboss.com">tom.fennelly at jboss.com</a>
+ */
+public class MacroExpanderUnitTest extends TestCase {
+
+ public void testReplaceMacros() {
+ DomElement rootDomEl = new DomElement("rootEl");
+ DomElement childDomEl = new DomElement("childEl");
+ HashMap map = new HashMap();
+
+ rootDomEl.addElemChild(childDomEl);
+ rootDomEl.setAttr("attrb1", "value1");
+ rootDomEl.setAttr("attrb2", MacroExpander.CTX_BATCH_NUM + "BatchNumValue");
+ childDomEl.setAttr("attrb1", MacroExpander.CTX_BATCH_UID + "UIDValue");
+ map.put(MacroExpander.CTX_BATCH_NUM, "ReplacementBNV!");
+ map.put(MacroExpander.CTX_BATCH_UID, "ReplacementUIDV!");
+
+ MacroExpander.replaceMacros(rootDomEl, map);
+ String expected = new String(StreamUtils.readStream(getClass().getResourceAsStream("MacroExpanderUnitTest_expected1.xml")));
+ assertEquals(expected.trim(), rootDomEl.toString().trim());
+ }
+}
Added: labs/jbossesb/trunk/product/core/common/tests/src/org/jboss/soa/esb/notification/MacroExpanderUnitTest_expected1.xml
===================================================================
--- labs/jbossesb/trunk/product/core/common/tests/src/org/jboss/soa/esb/notification/MacroExpanderUnitTest_expected1.xml 2006-07-31 13:25:46 UTC (rev 5358)
+++ labs/jbossesb/trunk/product/core/common/tests/src/org/jboss/soa/esb/notification/MacroExpanderUnitTest_expected1.xml 2006-07-31 14:00:26 UTC (rev 5359)
@@ -0,0 +1 @@
+<rootEl attrb1="value1" attrb2="ReplacementBNV!BatchNumValue"><childEl attrb1="ReplacementUIDV!UIDValue"/></rootEl>
\ No newline at end of file
More information about the jboss-svn-commits
mailing list