[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