You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beehive.apache.org by ek...@apache.org on 2005/09/15 22:04:36 UTC

svn commit: r289303 - in /beehive/trunk/system-controls/src/ejb: build.xml org/apache/beehive/controls/system/ejb/DOMUtils.java org/apache/beehive/controls/system/ejb/DomUtils.java org/apache/beehive/controls/system/ejb/EJBControlAssembler.java schema/

Author: ekoneil
Date: Thu Sep 15 13:04:30 2005
New Revision: 289303

URL: http://svn.apache.org/viewcvs?rev=289303&view=rev
Log:
Remove EJB control dependence on XMLBeans at assembly time.  DOM is now used to modify the EJB DD.

Contribution from Chad Schoettger.

BB: self
Test: manual


Added:
    beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/DOMUtils.java   (with props)
    beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/DomUtils.java   (with props)
Removed:
    beehive/trunk/system-controls/src/ejb/schema/
Modified:
    beehive/trunk/system-controls/src/ejb/build.xml
    beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/EJBControlAssembler.java

Modified: beehive/trunk/system-controls/src/ejb/build.xml
URL: http://svn.apache.org/viewcvs/beehive/trunk/system-controls/src/ejb/build.xml?rev=289303&r1=289302&r2=289303&view=diff
==============================================================================
--- beehive/trunk/system-controls/src/ejb/build.xml (original)
+++ beehive/trunk/system-controls/src/ejb/build.xml Thu Sep 15 13:04:30 2005
@@ -7,27 +7,12 @@
     <property name="module.dir" location="${src.dir}/ejb"/>
 
     <path id="module.classpath">
-        <pathelement path="${classes.dir}/${module.name}-xbean"/>
         <path refid="controls.dependency.path"/>
         <path refid="ejb.dependency.path"/>
         <path refid="velocity.dependency.path"/>
-        <path refid="xbean.dependency.path"/>
         <path refid="tools.dependency.path"/>
     </path>
 
-    <!-- =================================================================== -->
-    <!-- clean - cleans the EJB Control                                      -->
-    <!-- =================================================================== -->
-    <target name="clean" description="Deletes all generated files.">
-        <delete dir="${classes.dir}/${module.name}"/>
-        <delete dir="${classes.dir}/${module.name}-xbean"/>
-        <delete dir="${gen.src.dir}/${module.name}"/>
-        <delete file="${build.lib.dir}/${ejbcontrol.jar.name}"/>
-    </target>
-
-    <!-- =================================================================== -->
-    <!-- build - build the EJB Control                                       -->
-    <!-- =================================================================== -->
     <target name="build" description="Builds EJB control sources">
 
         <echo>compile module: ${module.name}</echo>
@@ -36,12 +21,9 @@
         <echo>debug: ${compile.debug}</echo>
 
         <mkdir dir="${classes.dir}/${module.name}"/>
-        <mkdir dir="${classes.dir}/${module.name}-xbean"/>
         <mkdir dir="${gen.src.dir}/${module.name}"/>
 
-        <build-schemas srcdir="${module.dir}/schema" destdir="${classes.dir}/${module.name}-xbean"/>
-
-        <build-controls srcdir="${module.dir}" 
+        <build-controls srcdir="${module.dir}"
                         destdir="${classes.dir}/${module.name}"
                         tempdir="${gen.src.dir}/${module.name}" 
                         classpathref="module.classpath"/>
@@ -58,7 +40,12 @@
             <attribute name="Web-Service-Control-Version" value="${beehive.version}"/>
           </manifest>
         </control-jar>
-        <control-jar destfile="${build.lib.dir}/${ejbcontrol.jar.name}" basedir="${classes.dir}/${module.name}-xbean" update="true"/>
+    </target>
+
+    <target name="clean" description="Deletes all generated files.">
+        <delete dir="${classes.dir}/${module.name}"/>
+        <delete dir="${gen.src.dir}/${module.name}"/>
+        <delete file="${build.lib.dir}/${ejbcontrol.jar.name}"/>
     </target>
 
 </project>

Added: beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/DOMUtils.java
URL: http://svn.apache.org/viewcvs/beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/DOMUtils.java?rev=289303&view=auto
==============================================================================
--- beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/DOMUtils.java (added)
+++ beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/DOMUtils.java Thu Sep 15 13:04:30 2005
@@ -0,0 +1,192 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.beehive.controls.system.ejb;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+/**
+ * Some simple DOM utility methods.
+ */
+final class DomUtils {
+
+    /**
+     * <p>Returns the first child element with the given name. Returns
+     * <code>null</code> if not found.</p>
+     *
+     * @param parent parent element
+     * @param name   name of the child element
+     * @return child element
+     */
+    static Element getChildElementByName(Element parent, String name) {
+        NodeList children = parent.getChildNodes();
+
+        for (int i = 0; i < children.getLength(); i++) {
+            Node node = children.item(i);
+            if (node.getNodeType() == Node.ELEMENT_NODE) {
+                Element element = (Element) node;
+                if (element.getTagName().equals(name)) {
+                    return element;
+                }
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * <p>Returns a list of child elements with the given
+     * name. Returns an empty list if there are no such child
+     * elements.</p>
+     *
+     * @param parent parent element
+     * @param name   name of the child element
+     * @return child elements
+     */
+    static List getChildElementsByName(Element parent, String name) {
+        List elements = new ArrayList();
+
+        NodeList children = parent.getChildNodes();
+
+        for (int i = 0; i < children.getLength(); i++) {
+            Node node = children.item(i);
+            if (node.getNodeType() == Node.ELEMENT_NODE) {
+                Element element = (Element) node;
+                if (element.getTagName().equals(name)) {
+                    elements.add(element);
+                }
+            }
+        }
+
+        return elements;
+    }
+
+    /**
+     * <p>Returns the text value of a child element. Returns
+     * <code>null</code> if there is no child element found.</p>
+     *
+     * @param parent parent element
+     * @param name   name of the child element
+     * @return text value
+     */
+    static String getChildElementText(Element parent, String name) {
+        // Get children
+        List list = DomUtils.getChildElementsByName(parent, name);
+
+        if (list.size() == 1) {
+            Element child = (Element) list.get(0);
+
+            StringBuffer buf = new StringBuffer();
+
+            NodeList children = child.getChildNodes();
+            for (int i = 0; i < children.getLength(); i++) {
+                Node node = children.item(i);
+                if (node.getNodeType() == Node.TEXT_NODE ||
+                        node.getNodeType() == Node.CDATA_SECTION_NODE) {
+                    Text text = (Text) node;
+                    buf.append(text.getData().trim());
+                }
+            }
+
+            return buf.toString();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * <p>Returns the text value of a child element. Returns
+     * <code>null</code> if there is no child element found.</p>
+     *
+     * @param element element
+     * @return text value
+     */
+    static String getElementText(Element element) {
+        StringBuffer buf = new StringBuffer();
+
+        NodeList children = element.getChildNodes();
+        for (int i = 0; i < children.getLength(); i++) {
+            Node node = children.item(i);
+            if (node.getNodeType() == Node.TEXT_NODE ||
+                    node.getNodeType() == Node.CDATA_SECTION_NODE) {
+                Text text = (Text) node;
+                buf.append(text.getData().trim());
+            }
+        }
+
+        return buf.toString();
+    }
+
+    /**
+     * <p>Returns an array of text values of a child element. Returns
+     * <code>null</code> if there is no child element found.</p>
+     *
+     * @param parent parent element
+     * @param name   name of the child element
+     * @return text value
+     */
+    static String[] getChildElementTextArr(Element parent, String name) {
+        // Get all the elements
+        List children = getChildElementsByName(parent, name);
+
+        String str[] = new String[children.size()];
+
+        for (int i = 0; i < children.size(); i++) {
+            Node child = (Node) children.get(i);
+
+            StringBuffer buf = new StringBuffer();
+
+            NodeList nodes = child.getChildNodes();
+            for (int j = 0; j < nodes.getLength(); j++) {
+                Node node = nodes.item(j);
+                if (node.getNodeType() == Node.TEXT_NODE ||
+                        node.getNodeType() == Node.CDATA_SECTION_NODE) {
+                    Text text = (Text) node;
+                    buf.append(text.getData().trim());
+                }
+            }
+
+            str[i] = buf.toString();
+        }
+
+        return str;
+    }
+
+    /**
+     * <p>Retutns the value of the named attribute of the given
+     * element. If there is no such attribute, returns null.</p>
+     *
+     * @param element element
+     * @param name    name
+     * @return value
+     */
+    static String getAttributeValue(Element element, String name) {
+        Attr attribute = element.getAttributeNode(name);
+        if (attribute == null) {
+            return null;
+        } else {
+            return attribute.getValue();
+        }
+    }
+}

Propchange: beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/DOMUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/DomUtils.java
URL: http://svn.apache.org/viewcvs/beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/DomUtils.java?rev=289303&view=auto
==============================================================================
--- beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/DomUtils.java (added)
+++ beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/DomUtils.java Thu Sep 15 13:04:30 2005
@@ -0,0 +1,192 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.beehive.controls.system.ejb;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+/**
+ * Some simple DOM utility methods.
+ */
+final class DomUtils {
+
+    /**
+     * <p>Returns the first child element with the given name. Returns
+     * <code>null</code> if not found.</p>
+     *
+     * @param parent parent element
+     * @param name   name of the child element
+     * @return child element
+     */
+    static Element getChildElementByName(Element parent, String name) {
+        NodeList children = parent.getChildNodes();
+
+        for (int i = 0; i < children.getLength(); i++) {
+            Node node = children.item(i);
+            if (node.getNodeType() == Node.ELEMENT_NODE) {
+                Element element = (Element) node;
+                if (element.getTagName().equals(name)) {
+                    return element;
+                }
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * <p>Returns a list of child elements with the given
+     * name. Returns an empty list if there are no such child
+     * elements.</p>
+     *
+     * @param parent parent element
+     * @param name   name of the child element
+     * @return child elements
+     */
+    static List getChildElementsByName(Element parent, String name) {
+        List elements = new ArrayList();
+
+        NodeList children = parent.getChildNodes();
+
+        for (int i = 0; i < children.getLength(); i++) {
+            Node node = children.item(i);
+            if (node.getNodeType() == Node.ELEMENT_NODE) {
+                Element element = (Element) node;
+                if (element.getTagName().equals(name)) {
+                    elements.add(element);
+                }
+            }
+        }
+
+        return elements;
+    }
+
+    /**
+     * <p>Returns the text value of a child element. Returns
+     * <code>null</code> if there is no child element found.</p>
+     *
+     * @param parent parent element
+     * @param name   name of the child element
+     * @return text value
+     */
+    static String getChildElementText(Element parent, String name) {
+        // Get children
+        List list = DomUtils.getChildElementsByName(parent, name);
+
+        if (list.size() == 1) {
+            Element child = (Element) list.get(0);
+
+            StringBuffer buf = new StringBuffer();
+
+            NodeList children = child.getChildNodes();
+            for (int i = 0; i < children.getLength(); i++) {
+                Node node = children.item(i);
+                if (node.getNodeType() == Node.TEXT_NODE ||
+                        node.getNodeType() == Node.CDATA_SECTION_NODE) {
+                    Text text = (Text) node;
+                    buf.append(text.getData().trim());
+                }
+            }
+
+            return buf.toString();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * <p>Returns the text value of a child element. Returns
+     * <code>null</code> if there is no child element found.</p>
+     *
+     * @param element element
+     * @return text value
+     */
+    static String getElementText(Element element) {
+        StringBuffer buf = new StringBuffer();
+
+        NodeList children = element.getChildNodes();
+        for (int i = 0; i < children.getLength(); i++) {
+            Node node = children.item(i);
+            if (node.getNodeType() == Node.TEXT_NODE ||
+                    node.getNodeType() == Node.CDATA_SECTION_NODE) {
+                Text text = (Text) node;
+                buf.append(text.getData().trim());
+            }
+        }
+
+        return buf.toString();
+    }
+
+    /**
+     * <p>Returns an array of text values of a child element. Returns
+     * <code>null</code> if there is no child element found.</p>
+     *
+     * @param parent parent element
+     * @param name   name of the child element
+     * @return text value
+     */
+    static String[] getChildElementTextArr(Element parent, String name) {
+        // Get all the elements
+        List children = getChildElementsByName(parent, name);
+
+        String str[] = new String[children.size()];
+
+        for (int i = 0; i < children.size(); i++) {
+            Node child = (Node) children.get(i);
+
+            StringBuffer buf = new StringBuffer();
+
+            NodeList nodes = child.getChildNodes();
+            for (int j = 0; j < nodes.getLength(); j++) {
+                Node node = nodes.item(j);
+                if (node.getNodeType() == Node.TEXT_NODE ||
+                        node.getNodeType() == Node.CDATA_SECTION_NODE) {
+                    Text text = (Text) node;
+                    buf.append(text.getData().trim());
+                }
+            }
+
+            str[i] = buf.toString();
+        }
+
+        return str;
+    }
+
+    /**
+     * <p>Retutns the value of the named attribute of the given
+     * element. If there is no such attribute, returns null.</p>
+     *
+     * @param element element
+     * @param name    name
+     * @return value
+     */
+    static String getAttributeValue(Element element, String name) {
+        Attr attribute = element.getAttributeNode(name);
+        if (attribute == null) {
+            return null;
+        } else {
+            return attribute.getValue();
+        }
+    }
+}

Propchange: beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/DomUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/EJBControlAssembler.java
URL: http://svn.apache.org/viewcvs/beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/EJBControlAssembler.java?rev=289303&r1=289302&r2=289303&view=diff
==============================================================================
--- beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/EJBControlAssembler.java (original)
+++ beehive/trunk/system-controls/src/ejb/org/apache/beehive/controls/system/ejb/EJBControlAssembler.java Thu Sep 15 13:04:30 2005
@@ -17,20 +17,30 @@
  */
 package org.apache.beehive.controls.system.ejb;
 
-import java.io.IOException;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
-import java.lang.String;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
 
 import org.apache.beehive.controls.api.assembly.ControlAssembler;
-import org.apache.beehive.controls.api.assembly.ControlAssemblyException;
 import org.apache.beehive.controls.api.assembly.ControlAssemblyContext;
-import org.apache.xmlbeans.XmlCursor;
-import org.apache.xmlbeans.XmlException;
-import org.apache.xmlbeans.XmlOptions;
-
-import org.apache.beehive.controls.system.ejb.schemas.j2ee.*;
+import org.apache.beehive.controls.api.assembly.ControlAssemblyException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
 
 /**
  * The EJBControl needs to inject EJB reference entries into the
@@ -84,7 +94,7 @@
         System.err.println(" ejbLinkValue=" + ejbLinkValue );
 
         File ejbJarFile = ejbCtx.getEjbJarXml();
-        FileInputStream ejbJarStream = null;
+        FileInputStream ejbJarStream;
         try
         {
             ejbJarStream = new FileInputStream( ejbJarFile );
@@ -100,34 +110,35 @@
 
         try
         {
-            // get name of EJB reference to be inserted
-            String insertedEjbRefName = ei._refName;
-
             // get the existing <ejb-jar> XBean from the stream
-            EjbJarDocument ejbDoc = EjbJarDocument.Factory.parse(ejbJarStream);
+            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+            dbf.setValidating(false);
+            DocumentBuilder db = dbf.newDocumentBuilder();
+            Document ejbDoc = db.parse(ejbJarStream);
 
-            // copy ejbDoc XmlObject so can makes changes to it
-            ejbDoc = (EjbJarDocument)ejbDoc.copy();
-            EjbJarType ejbJarType = ejbDoc.getEjbJar();
-            EnterpriseBeansType entBeansType = ejbJarType.getEnterpriseBeans();
+            ejbJarStream.close();
+            ejbJarStream = null;
+
+
+            Element ejbJarType = ejbDoc.getDocumentElement();
+            Element entBeansType = DomUtils.getChildElementByName(ejbJarType, "enterprise-beans");
 
             // TODO: support Entity & other bean types
-            SessionBeanType[] sessionArray = entBeansType.getSessionArray();
-            for (int i=0; i<sessionArray.length; i++)
+            List sessionArray = DomUtils.getChildElementsByName(entBeansType, "session");
+            for ( Object e : sessionArray )
             {
-                SessionBeanType sessionBean = sessionArray[i];
-
-                if (ei._isLocal)
-                	insertEJBLocalRefInEJBJar(sessionBean, ei, ejbLinkValue);
-                else
-                	insertEJBRefInEJBJar(sessionBean, ei, ejbLinkValue);
+                Element sessionBean = (Element)e;
 
+                if (ei._isLocal) {
+                	insertEJBLocalRefInEJBJar(sessionBean, ei, ejbLinkValue, ejbDoc);
+                }
+                else {
+                	insertEJBRefInEJBJar(sessionBean, ei, ejbLinkValue, ejbDoc);
+                }
             }
 
             // overwrite existing ejb-jar.xml file with new document
-            XmlOptions xmlOpts = new XmlOptions();
-            xmlOpts.setSavePrettyPrint();
-            ejbDoc.save(ejbJarFile, xmlOpts);
+            writeXML(ejbDoc, ejbJarFile);
         }
         catch(IOException ioe)
         {
@@ -135,13 +146,15 @@
                 "attempting to write to file " + ejbJarFile.getAbsolutePath() +
                 ". Message: " + ioe.getMessage());
         }
-        catch(XmlException xe)
-        {
-            System.err.println("EJBControlAssembler: caught XmlException " +
-                "attempting xml manipulations. Message: " +
-                xe.getMessage());
-        }
-        finally
+        catch (ParserConfigurationException e) {
+            System.err.println("EJBControlAssembler: caught ParserConfigurationException " +
+                    "attempting to read to file " + ejbJarFile.getAbsolutePath() +
+                    ". Message: " + e.getMessage());
+        } catch (SAXException e) {
+            System.err.println("EJBControlAssembler: caught SAXException " +
+                    "attempting to read to file " + ejbJarFile.getAbsolutePath() +
+                    ". Message: " + e.getMessage());
+        } finally
         {
             try
             {
@@ -157,109 +170,97 @@
         }
     }
 
-    protected void insertEJBRefInEJBJar(SessionBeanType sessionBean, EJBInfo ei, String ejbLinkValue)
+    protected void insertEJBRefInEJBJar(Element sessionBean, EJBInfo ei, String ejbLinkValue, Document ejbDoc)
     {
         System.err.println("EJBControlAssembler.insertEJBRefInEJBJar() called");
-        System.err.println("ejbLinkValue =" + ejbLinkValue );
-        EjbRefType[] ejbRefArray = sessionBean.getEjbRefArray();
+        System.err.println("ejbLinkValue =" + ejbLinkValue);
+        List ejbRefArray = DomUtils.getChildElementsByName(sessionBean, "ejb-ref");
         String insertedEjbRefName = ei._refName;
-        XmlCursor ejbJarXmlCursor = null;
 
-        try {
-			for (int j=ejbRefArray.length-1; j>=0; j--)
-			{
-			    EjbRefType ejbRef = ejbRefArray[j];
-			    ejbJarXmlCursor = ejbRef.newCursor();
-			    String ejbRefName = ejbRef.getEjbRefName().getStringValue();
-			    if (insertedEjbRefName.equals(ejbRefName))
-			    {
-			        sessionBean.removeEjbRef(j);
-			        break;
-			    }
-			}
-			// insert a new <ejb-ref> entry and fill in the values
-		    EjbRefType insertedEjbRef = sessionBean.insertNewEjbRef(0);
-
-		    EjbRefNameType ejbRefName = insertedEjbRef.addNewEjbRefName();
-		    ejbRefName.setStringValue(insertedEjbRefName);
-
-		    EjbRefTypeType ejbRefType = insertedEjbRef.addNewEjbRefType();
-		    ejbRefType.setStringValue(ei._beanType);
-
-		    HomeType homeType = insertedEjbRef.addNewHome();
-		    homeType.setStringValue(ei._homeInterface.getName());
-		    RemoteType remoteType = insertedEjbRef.addNewRemote();
-		    remoteType.setStringValue(ei._beanInterface.getName());
-
-		    EjbLinkType ejbLink = insertedEjbRef.addNewEjbLink();
-		    ejbLink.setStringValue(ejbLinkValue);
-		}
-        finally
-        {
-            if (ejbJarXmlCursor != null)
-            {
-                ejbJarXmlCursor.dispose();
+        for (int j = ejbRefArray.size() - 1; j >= 0; j--) {
+            Element ejbRef = (Element) ejbRefArray.get(j);
+            String ejbRefName = DomUtils.getChildElementText(ejbRef, "ejb-ref-name");
+            if (insertedEjbRefName.equals(ejbRefName)) {
+                sessionBean.removeChild(ejbRef);
+                break;
             }
         }
 
+        // insert a new <ejb-ref> entry and fill in the values
+        Element insertedEjbRef = ejbDoc.createElement("ejb-ref");
+        sessionBean.insertBefore(insertedEjbRef, null);
+
+        Element ejbRefName = ejbDoc.createElement("ejb-ref-name");
+        ejbRefName.setTextContent(insertedEjbRefName);
+        insertedEjbRef.appendChild(ejbRefName);
+
+        Element ejbRefType = ejbDoc.createElement("ejb-ref-type");
+        ejbRefType.setTextContent(ei._beanType);
+        insertedEjbRef.appendChild(ejbRefType);
+
+        Element homeType = ejbDoc.createElement("home");
+        homeType.setTextContent(ei._homeInterface.getName());
+        insertedEjbRef.appendChild(homeType);
+
+        Element remoteType = ejbDoc.createElement("remote");
+        remoteType.setTextContent(ei._beanInterface.getName());
+        insertedEjbRef.appendChild(remoteType);
+
+        Element ejbLink = ejbDoc.createElement("ejb-link");
+        ejbLink.setTextContent(ejbLinkValue);
+        insertedEjbRef.appendChild(ejbLink);
     }
 
-    protected void insertEJBLocalRefInEJBJar(SessionBeanType sessionBean, EJBInfo ei, String ejbLinkValue)
+    protected void insertEJBLocalRefInEJBJar(Element sessionBean, EJBInfo ei, String ejbLinkValue, Document ejbDoc)
     {
         System.err.println("EJBControlAssembler.insertEJBLocalRefInEJBJar() called");
-        System.err.println("ejbLinkValue =" + ejbLinkValue );
-        EjbLocalRefType[] ejbLocalRefArray = sessionBean.getEjbLocalRefArray();
+        System.err.println("ejbLinkValue =" + ejbLinkValue);
+        List ejbLocalRefArray = DomUtils.getChildElementsByName(sessionBean, "ejb-local-ref");
         String insertedEjbRefName = ei._refName;
-        XmlCursor ejbJarXmlCursor = null;
 
-        try {
-			for (int j=ejbLocalRefArray.length-1; j>=0; j--)
-			{
-			    EjbLocalRefType ejbLocalRef = ejbLocalRefArray[j];
-			    ejbJarXmlCursor = ejbLocalRef.newCursor();
-			    String ejbRefName = ejbLocalRef.getEjbRefName().getStringValue();
-			    if (insertedEjbRefName.equals(ejbRefName))
-			    {
-			        sessionBean.removeEjbLocalRef(j);
-			        break;
-			    }
-			}
-			// insert a new <ejb-local-ref> entry and fill in the values
-        	EjbLocalRefType insertedEJBLocalRef = sessionBean.insertNewEjbLocalRef(0);
-
-            EjbRefNameType ejbRefName = insertedEJBLocalRef.addNewEjbRefName();
-            ejbRefName.setStringValue(insertedEjbRefName);
-
-            EjbRefTypeType ejbRefType = insertedEJBLocalRef.addNewEjbRefType();
-            ejbRefType.setStringValue(ei._beanType);
-
-            LocalHomeType homeType = insertedEJBLocalRef.addNewLocalHome();
-            homeType.setStringValue(ei._homeInterface.getName());
-            LocalType localType = insertedEJBLocalRef.addNewLocal();
-            localType.setStringValue(ei._beanInterface.getName());
-
-            EjbLinkType ejbLink = insertedEJBLocalRef.addNewEjbLink();
-            ejbLink.setStringValue(ejbLinkValue);
-		}
-        finally
-        {
-            if (ejbJarXmlCursor != null)
-            {
-                ejbJarXmlCursor.dispose();
+        for (int j = ejbLocalRefArray.size() - 1; j >= 0; j--) {
+            Element ejbLocalRef = (Element) ejbLocalRefArray.get(j);
+            String ejbRefName = DomUtils.getChildElementText(ejbLocalRef, "ejb-ref-name");
+            if (insertedEjbRefName.equals(ejbRefName)) {
+                sessionBean.removeChild(ejbLocalRef);
+                break;
             }
         }
 
+        // insert a new <ejb-local-ref> entry and fill in the values
+        Element insertedEjbLocalRef = ejbDoc.createElement("ejb-local-ref");
+        sessionBean.insertBefore(insertedEjbLocalRef, null);
+
+        Element ejbRefName = ejbDoc.createElement("ejb-ref-name");
+        ejbRefName.setTextContent(insertedEjbRefName);
+        insertedEjbLocalRef.appendChild(ejbRefName);
+
+        Element ejbRefType = ejbDoc.createElement("ejb-ref-type");
+        ejbRefType.setTextContent(ei._beanType);
+        insertedEjbLocalRef.appendChild(ejbRefType);
+
+        Element homeType = ejbDoc.createElement("local-home");
+        homeType.setTextContent(ei._homeInterface.getName());
+        insertedEjbLocalRef.appendChild(homeType);
+
+        Element localType = ejbDoc.createElement("local");
+        localType.setTextContent(ei._beanInterface.getName());
+        insertedEjbLocalRef.appendChild(localType);
+
+        Element ejbLink = ejbDoc.createElement("ejb-link");
+        ejbLink.setTextContent(ejbLinkValue);
+        insertedEjbLocalRef.appendChild(ejbLink);
     }
 
     protected void updateWebApp( ControlAssemblyContext.WebAppModule webAppCcc,
-            EJBInfo ei, String ejbLinkValue )
+                                 EJBInfo ei, String ejbLinkValue )
             throws ControlAssemblyException
-        {
+    {
 	        System.err.println("EJBControlAssembler.updateWebApp() called");
 	        System.err.println("ei =" + ei);
 	        System.err.println("ejbLinkValue =" + ejbLinkValue );
             File webXmlFile = webAppCcc.getWebXml();
-            FileInputStream webXmlStream = null;
+            FileInputStream webXmlStream;
             try
             {
                 webXmlStream = new FileInputStream( webXmlFile );
@@ -275,22 +276,24 @@
 
             try
             {
-                // get the existing <web-app> XBean from the stream
-                WebAppDocument webAppDoc = WebAppDocument.Factory.parse(webXmlStream);
+                // parse the web.xml file
+                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+                dbf.setValidating(false);
+                DocumentBuilder db = dbf.newDocumentBuilder();
+                Document webAppDoc = db.parse(webXmlStream);
+
+                webXmlStream.close();
+                webXmlStream = null;
 
-                // copy webAppDoc XmlObject so can makes changes to it
-                webAppDoc = (WebAppDocument)webAppDoc.copy();
-                WebAppType webAppType = webAppDoc.getWebApp();
+                Element webAppType = webAppDoc.getDocumentElement();
 
                 if (ei._isLocal)
-                	insertEJBLocalRefInWebApp(webAppType, ei, ejbLinkValue);
+                	insertEJBLocalRefInWebApp(webAppType, ei, ejbLinkValue, webAppDoc);
                 else
-                	insertEJBRefInWebApp(webAppType, ei, ejbLinkValue);
+                	insertEJBRefInWebApp(webAppType, ei, ejbLinkValue, webAppDoc);
 
                 // overwrite existing web.xml file with new document
-                XmlOptions xmlOpts = new XmlOptions();
-                xmlOpts.setSavePrettyPrint();
-                webAppDoc.save(webXmlFile, xmlOpts);
+                writeXML(webAppDoc, webXmlFile);
             }
             catch(IOException ioe)
             {
@@ -298,13 +301,15 @@
                     "attempting to write to file " + webXmlFile.getAbsolutePath() +
                     ". Message: " + ioe.getMessage());
             }
-            catch(XmlException xe)
-            {
-                System.err.println("ServiceControlAssembler: caught XmlException " +
-                    "attempting xml manipulations. Message: " +
-                    xe.getMessage());
-            }
-            finally
+            catch (ParserConfigurationException e) {
+                System.err.println("ServiceControlAssembler: caught ParserConfigurationException " +
+                        "attempting to read to file " + webXmlFile.getAbsolutePath() +
+                        ". Message: " + e.getMessage());
+            } catch (SAXException e) {
+                System.err.println("ServiceControlAssembler: caught SAXException " +
+                        "attempting to read to file " + webXmlFile.getAbsolutePath() +
+                        ". Message: " + e.getMessage());
+            } finally
             {
                 try
                 {
@@ -321,99 +326,145 @@
 
         }
 
-    protected void insertEJBRefInWebApp(WebAppType webAppType, EJBInfo ei, String ejbLinkValue)
-    {
+    protected void insertEJBRefInWebApp(Element webAppType, EJBInfo ei, String ejbLinkValue, Document webAppDoc) {
         System.err.println("EJBControlAssembler.insertEJBRefInWebApp() called");
-        System.err.println("ejbLinkValue =" + ejbLinkValue );
+        System.err.println("ejbLinkValue =" + ejbLinkValue);
 
-        EjbRefType[] ejbRefArray = webAppType.getEjbRefArray();
-        String insertedEjbRefName = ei._refName;
-        XmlCursor webXmlCursor = null;
+        List ejbRefArray = DomUtils.getChildElementsByName(webAppType, "ejb-ref");
 
-        try {
-			for (int j=ejbRefArray.length-1; j>=0; j--)
-			{
-			    EjbRefType ejbRef = ejbRefArray[j];
-			    webXmlCursor = ejbRef.newCursor();
-			    String ejbRefName = ejbRef.getEjbRefName().getStringValue();
-			    if (insertedEjbRefName.equals(ejbRefName))
-			    {
-			    	webAppType.removeEjbRef(j);
-			        break;
-			    }
-			}
-			// insert a new <ejb-ref> entry and fill in the values
-		    EjbRefType insertedEjbRef = webAppType.insertNewEjbRef(0);
-
-		    EjbRefNameType ejbRefName = insertedEjbRef.addNewEjbRefName();
-		    ejbRefName.setStringValue(insertedEjbRefName);
-
-		    EjbRefTypeType ejbRefType = insertedEjbRef.addNewEjbRefType();
-		    ejbRefType.setStringValue(ei._beanType);
-
-		    HomeType homeType = insertedEjbRef.addNewHome();
-		    homeType.setStringValue(ei._homeInterface.getName());
-		    RemoteType remoteType = insertedEjbRef.addNewRemote();
-		    remoteType.setStringValue(ei._beanInterface.getName());
-
-		    EjbLinkType ejbLink = insertedEjbRef.addNewEjbLink();
-		    ejbLink.setStringValue(ejbLinkValue);
-		}
-        finally
-        {
-            if (webXmlCursor != null)
-            {
-                webXmlCursor.dispose();
+        String insertedEjbRefName = ei._refName;
+        for (int j = ejbRefArray.size() - 1; j >= 0; j--) {
+            Element ejbRef = (Element) ejbRefArray.get(j);
+            String ejbRefName = DomUtils.getChildElementText(ejbRef, "ejb-ref-name");
+            if (insertedEjbRefName.equals(ejbRefName)) {
+                webAppType.removeChild(ejbRef);
+                break;
             }
         }
 
+        // insert a new <ejb-ref> entry and fill in the values
+        Element insertedEjbRef = webAppDoc.createElement("ejb-ref");
+        webAppType.insertBefore(insertedEjbRef, null);
+
+        Element ejbRefName = webAppDoc.createElement("ejb-ref-name");
+        ejbRefName.setTextContent(insertedEjbRefName);
+        insertedEjbRef.appendChild(ejbRefName);
+
+        Element ejbRefType = webAppDoc.createElement("ejb-ref-type");
+        ejbRefType.setTextContent(ei._beanType);
+        insertedEjbRef.appendChild(ejbRefType);
+
+        Element homeType = webAppDoc.createElement("home");
+        homeType.setTextContent(ei._homeInterface.getName());
+        insertedEjbRef.appendChild(homeType);
+
+        Element remoteType = webAppDoc.createElement("remote");
+        remoteType.setTextContent(ei._beanInterface.getName());
+        insertedEjbRef.appendChild(remoteType);
+
+        Element ejbLink = webAppDoc.createElement("ejb-link");
+        ejbLink.setTextContent(ejbLinkValue);
+        insertedEjbRef.appendChild(ejbLink);
     }
 
-    protected void insertEJBLocalRefInWebApp(WebAppType webAppType, EJBInfo ei, String ejbLinkValue)
+    protected void insertEJBLocalRefInWebApp(Element webAppType, EJBInfo ei, String ejbLinkValue, Document webAppDoc)
     {
         System.err.println("EJBControlAssembler.insertEJBLocalRefInWebApp() called");
-        System.err.println("ejbLinkValue =" + ejbLinkValue );
+        System.err.println("ejbLinkValue =" + ejbLinkValue);
 
-        EjbLocalRefType[] ejbLocalRefArray = webAppType.getEjbLocalRefArray();
+        List ejbLocalRefArray = DomUtils.getChildElementsByName(webAppType, "ejb-local-ref");
         String insertedEjbRefName = ei._refName;
-        XmlCursor webXmlCursor = null;
 
-        try {
-			for (int j=ejbLocalRefArray.length-1; j>=0; j--)
-			{
-			    EjbLocalRefType ejbLocalRef = ejbLocalRefArray[j];
-			    webXmlCursor = ejbLocalRef.newCursor();
-			    String ejbRefName = ejbLocalRef.getEjbRefName().getStringValue();
-			    if (insertedEjbRefName.equals(ejbRefName))
-			    {
-			    	webAppType.removeEjbLocalRef(j);
-			        break;
-			    }
-			}
-			// insert a new <ejb-local-ref> entry and fill in the values
-        	EjbLocalRefType insertedEJBLocalRef = webAppType.insertNewEjbLocalRef(0);
-
-            EjbRefNameType ejbRefName = insertedEJBLocalRef.addNewEjbRefName();
-            ejbRefName.setStringValue(insertedEjbRefName);
-
-            EjbRefTypeType ejbRefType = insertedEJBLocalRef.addNewEjbRefType();
-            ejbRefType.setStringValue(ei._beanType);
-
-            LocalHomeType homeType = insertedEJBLocalRef.addNewLocalHome();
-            homeType.setStringValue(ei._homeInterface.getName());
-            LocalType localType = insertedEJBLocalRef.addNewLocal();
-            localType.setStringValue(ei._beanInterface.getName());
-
-            EjbLinkType ejbLink = insertedEJBLocalRef.addNewEjbLink();
-            ejbLink.setStringValue(ejbLinkValue);
-		}
-        finally
-        {
-            if (webXmlCursor != null)
-            {
-            	webXmlCursor.dispose();
+        for (int j = ejbLocalRefArray.size() - 1; j >= 0; j--) {
+            Element ejbLocalRef = (Element) ejbLocalRefArray.get(j);
+            String ejbRefName = DomUtils.getChildElementText(ejbLocalRef, "ejb-ref-name");
+            if (insertedEjbRefName.equals(ejbRefName)) {
+                webAppType.removeChild(ejbLocalRef);
+                break;
             }
         }
 
+        // insert a new <ejb-local-ref> entry and fill in the values
+        Element insertedEjbLocalRef = webAppDoc.createElement("ejb-local-ref");
+        webAppType.insertBefore(insertedEjbLocalRef, null);
+
+        Element ejbRefName = webAppDoc.createElement("ejb-ref-name");
+        ejbRefName.setTextContent(insertedEjbRefName);
+        insertedEjbLocalRef.appendChild(ejbRefName);
+
+        Element ejbRefType = webAppDoc.createElement("ejb-ref-type");
+        ejbRefType.setTextContent(ei._beanType);
+        insertedEjbLocalRef.appendChild(ejbRefType);
+
+        Element homeType = webAppDoc.createElement("local-home");
+        homeType.setTextContent(ei._homeInterface.getName());
+        insertedEjbLocalRef.appendChild(homeType);
+
+        Element localType = webAppDoc.createElement("local");
+        localType.setTextContent(ei._beanInterface.getName());
+        insertedEjbLocalRef.appendChild(localType);
+
+        Element ejbLink = webAppDoc.createElement("ejb-link");
+        ejbLink.setTextContent(ejbLinkValue);
+        insertedEjbLocalRef.appendChild(ejbLink);
+    }
+
+    private void writeXML(Document doc, File outputFile)
+    {
+        TransformerFactory transformerFactory = TransformerFactory.newInstance();
+
+        try {
+            transformerFactory.setAttribute("indent-number", 2);
+        } catch (IllegalArgumentException e) {
+            // not a fatal error, just means underlying parser implementation does not support indent-number.
+            System.err.println("ServiceControlAssembler: Warning -- Caught IllegalArgumentException " +
+                    "attempting to set transformer factory attribute: 'indent-number'.  Message: " + e.getMessage());
+        }
+
+        Transformer transformer;
+        FileOutputStream fos = null;
+        try {
+
+            transformer= transformerFactory.newTransformer();
+
+            try {
+                transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+                transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, doc.getDoctype().getPublicId());
+                transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, doc.getDoctype().getSystemId());
+            } catch (IllegalArgumentException e) {
+                // just keep going not a fatal error, just means underlying parser implementation
+                // does not support one of these options.
+                System.err.println("ServiceControlAssembler: Warning -- Caught IllegalArgumentException " +
+                        "attempting to set transformer option.  Message: " + e.getMessage());
+            }
+
+            DOMSource source = new DOMSource(doc);
+            fos = new FileOutputStream(outputFile);
+            StreamResult stream = new StreamResult(fos);
+            transformer.transform(source, stream);
+
+        } catch (TransformerConfigurationException e) {
+            System.err.println("ServiceControlAssembler: caught TransformerConfigurationException " +
+                    "attempting to write to file " + outputFile.getAbsolutePath() +
+                    ". Message: " + e.getMessage());
+        } catch (FileNotFoundException e) {
+            System.err.println("*** Warning *** EJBControlAssembler aborted: " +
+                    "caught FileNotFoundException attempting to write file " +
+                    outputFile.getAbsolutePath() + ". Message: " +
+                    e.getMessage());
+        } catch (TransformerException e) {
+            System.err.println("ServiceControlAssembler: caught TransformerException " +
+                    "attempting to write to file " + outputFile.getAbsolutePath() +
+                    ". Message: " + e.getMessage());
+        } finally {
+
+            if (fos != null) {
+                try {
+                    fos.close();
+                } catch (IOException e) {
+                    // do nothing
+                }
+            }
+        }
     }
 }