You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by aj...@apache.org on 2005/10/06 12:55:27 UTC

svn commit: r306583 [9/9] - in /webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2: databinding/ databinding/gen/ databinding/gen/impl/ databinding/symbolTable/ databinding/toJava/ databinding/utils/ databinding/utils/support/ wsdl/codeg...

Added: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/utils/XMLUtils.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/utils/XMLUtils.java?rev=306583&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/utils/XMLUtils.java (added)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/utils/XMLUtils.java Thu Oct  6 03:54:18 2005
@@ -0,0 +1,971 @@
+/*
+ * Copyright 2001-2004 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.
+ */
+
+package org.apache.axis2.databinding.utils;
+
+//import org.apache.axis.AxisEngine;
+//import org.apache.axis.Constants;
+//import org.apache.axis.InternalException;
+//import org.apache.axis.Message;
+//import org.apache.axis.MessageContext;
+//import org.apache.axis.AxisProperties;
+//import org.apache.axis.components.encoding.XMLEncoder;
+//import org.apache.axis.components.encoding.XMLEncoderFactory;
+//import org.apache.axis.components.logger.LogFactory;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.axis2.databinding.Constants;
+import org.w3c.dom.Attr;
+import org.w3c.dom.CharacterData;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+//import javax.xml.soap.SOAPException;
+//import javax.xml.soap.SOAPMessage;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamSource;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.ProtocolException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Stack;
+
+
+public class XMLUtils {
+    protected static Log log =
+        LogFactory.getLog(XMLUtils.class.getName());
+
+    public static final String httpAuthCharEncoding = "ISO-8859-1";
+    private static final String saxParserFactoryProperty =
+        "javax.xml.parsers.SAXParserFactory";
+
+//    private static DocumentBuilderFactory dbf = getDOMFactory();
+    private static SAXParserFactory       saxFactory;
+    private static Stack                  saxParsers = new Stack();
+    private static DefaultHandler doNothingContentHandler = new DefaultHandler();
+
+    private static String EMPTY = "";
+    private static ByteArrayInputStream bais = new ByteArrayInputStream(EMPTY.getBytes());
+
+    private static boolean tryReset= true;
+
+    protected static boolean enableParserReuse = false;
+
+//    private static class ThreadLocalDocumentBuilder extends ThreadLocal {
+//        protected Object initialValue() {
+//            try {
+//                return getDOMFactory().newDocumentBuilder();
+//            } catch (ParserConfigurationException e) {
+////                log.error(Messages.getMessage("parserConfigurationException00"),
+////                        e);
+//            }
+//            return null;
+//        }
+//    }
+//    private static ThreadLocalDocumentBuilder documentBuilder = new ThreadLocalDocumentBuilder();
+//
+//    static {
+//        // Initialize SAX Parser factory defaults
+//        initSAXFactory(null, true, false);
+//
+//        String value = AxisProperties.getProperty(AxisEngine.PROP_XML_REUSE_SAX_PARSERS,
+//                "" + false);
+//        if (value.equalsIgnoreCase("true") ||
+//                value.equals("1") ||
+//                value.equalsIgnoreCase("yes")) {
+//            enableParserReuse = true;
+//        } else {
+//            enableParserReuse = false;
+//        }
+//    }
+
+//    /**
+//     * Encode a string appropriately for XML.
+//     * @param orig the String to encode
+//     * @return a String in which XML special chars are repalced by entities
+//     */
+//    public static String xmlEncodeString(String orig)
+//    {
+//        XMLEncoder encoder = getXMLEncoder(MessageContext.getCurrentContext());
+//        return encoder.encode(orig);
+//    }
+//
+//    /**
+//     * Get the current XMLEncoder
+//     * @return XMLEncoder
+//     */
+//    public static XMLEncoder getXMLEncoder(MessageContext msgContext) {
+//        return getXMLEncoder(getEncoding(null, msgContext));
+//    }
+//
+//    /**
+//     * Get the XMLEncoder for specific encoding
+//     * @return XMLEncoder
+//     */
+//    public static XMLEncoder getXMLEncoder(String encoding) {
+//        XMLEncoder encoder = null;
+//        try {
+//            encoder = XMLEncoderFactory.getEncoder(encoding);
+//        } catch (Exception e) {
+//            log.error(Messages.getMessage("exception00"), e);
+//            encoder = XMLEncoderFactory.getDefaultEncoder();
+//        }
+//        return encoder;
+//    }
+//
+//    /**
+//     * Get the current encoding in effect
+//     * @return string
+//     */
+//    public static String getEncoding(MessageContext msgContext) {
+//        XMLEncoder encoder = getXMLEncoder(msgContext);
+//        return encoder.getEncoding();
+//    }
+//
+//    /**
+//     * Get the current encoding in effect
+//     * @return string
+//     */
+//    public static String getEncoding() {
+//        XMLEncoder encoder = getXMLEncoder(MessageContext.getCurrentContext());
+//        return encoder.getEncoding();
+//    }
+//
+//    /** Initialize the SAX parser factory.
+//     *
+//     * @param factoryClassName The (optional) class name of the desired
+//     *                         SAXParserFactory implementation. Will be
+//     *                         assigned to the system property
+//     *                         <b>javax.xml.parsers.SAXParserFactory</b>
+//     *                         unless this property is already set.
+//     *                         If <code>null</code>, leaves current setting
+//     *                         alone.
+//     * @param namespaceAware true if we want a namespace-aware parser
+//     * @param validating true if we want a validating parser
+//     *
+//     */
+//    public static void initSAXFactory(String factoryClassName,
+//                                      boolean namespaceAware,
+//                                      boolean validating)
+//    {
+//        if (factoryClassName != null) {
+//            try {
+//                saxFactory = (SAXParserFactory)Class.forName(factoryClassName).
+//                    newInstance();
+//                /*
+//                 * Set the system property only if it is not already set to
+//                 * avoid corrupting environments in which Axis is embedded.
+//                 */
+//                if (System.getProperty(saxParserFactoryProperty) == null) {
+//                    System.setProperty(saxParserFactoryProperty,
+//                                       factoryClassName);
+//                }
+//            } catch (Exception e) {
+//                log.error(Messages.getMessage("exception00"), e);
+//                saxFactory = null;
+//            }
+//       } else {
+//            saxFactory = SAXParserFactory.newInstance();
+//        }
+//        saxFactory.setNamespaceAware(namespaceAware);
+//        saxFactory.setValidating(validating);
+//
+//        // Discard existing parsers
+//        saxParsers.clear();
+//    }
+
+//    private static DocumentBuilderFactory getDOMFactory() {
+//        DocumentBuilderFactory dbf;
+//        try {
+//            dbf = DocumentBuilderFactory.newInstance();
+//            dbf.setNamespaceAware(true);
+//        }
+//        catch( Exception e ) {
+//            log.error(Messages.getMessage("exception00"), e );
+//            dbf = null;
+//        }
+//        return( dbf );
+//    }
+
+//    /**
+//     * Gets a DocumentBuilder
+//     * @return DocumentBuilder
+//     * @throws ParserConfigurationException
+//     */
+//    public static DocumentBuilder getDocumentBuilder() throws ParserConfigurationException {
+//        return (DocumentBuilder) documentBuilder.get();
+//    }
+
+    /**
+     * Releases a DocumentBuilder
+     * @param db
+     */
+    public static void releaseDocumentBuilder(DocumentBuilder db) {
+        try {
+            db.setErrorHandler(null); // setting implementation default
+        } catch (Throwable t) {
+            log.debug("Failed to set ErrorHandler to null on DocumentBuilder",
+                    t);
+        }
+        try {
+            db.setEntityResolver(null); // setting implementation default
+        } catch (Throwable t) {
+            log.debug("Failed to set EntityResolver to null on DocumentBuilder",
+                    t);
+        }
+    }
+
+//    /** Get a SAX parser instance from the JAXP factory.
+//     *
+//     * @return a SAXParser instance.
+//     */
+//    public static synchronized SAXParser getSAXParser() {
+//        if(enableParserReuse && !saxParsers.empty()) {
+//            return (SAXParser )saxParsers.pop();
+//        }
+//
+//        try {
+//            SAXParser parser = saxFactory.newSAXParser();
+//            XMLReader reader = parser.getXMLReader();
+//            // parser.getParser().setEntityResolver(new DefaultEntityResolver());
+//            // The above commented line and the following line are added
+//            // for preventing XXE (bug #14105).
+//            // We may need to uncomment the deprecated setting
+//            // in case that it is considered necessary.
+//            try {
+//                reader.setEntityResolver(new DefaultEntityResolver());
+//            } catch (Throwable t) {
+//                log.debug("Failed to set EntityResolver on DocumentBuilder", t);
+//            }
+//            reader.setFeature("http://xml.org/sax/features/namespace-prefixes", false);
+//            return parser;
+//        } catch (ParserConfigurationException e) {
+//            log.error(Messages.getMessage("parserConfigurationException00"), e);
+//            return null;
+//        } catch (SAXException se) {
+//            log.error(Messages.getMessage("SAXException00"), se);
+//            return null;
+//        }
+//    }
+
+
+    /** Return a SAX parser for reuse.
+     * @param parser A SAX parser that is available for reuse
+     */
+    public static void releaseSAXParser(SAXParser parser) {
+        if(!tryReset || !enableParserReuse) return;
+
+        //Free up possible ref. held by past contenthandler.
+        try{
+            XMLReader xmlReader= parser.getXMLReader();
+            if(null != xmlReader){
+                xmlReader.setContentHandler(doNothingContentHandler);
+                xmlReader.setDTDHandler(doNothingContentHandler);
+                try {
+                    xmlReader.setEntityResolver(doNothingContentHandler);
+                } catch (Throwable t) {
+                    log.debug("Failed to set EntityResolver on DocumentBuilder", t);
+                }
+                try {
+                    xmlReader.setErrorHandler(doNothingContentHandler);
+                } catch (Throwable t) {
+                    log.debug("Failed to set ErrorHandler on DocumentBuilder", t);
+                }
+
+                synchronized (XMLUtils.class ) {
+                    saxParsers.push(parser);
+                }
+            }
+            else {
+                tryReset= false;
+            }
+        } catch (org.xml.sax.SAXException e) {
+            tryReset= false;
+        }
+    }
+//    /**
+//     * Get an empty new Document
+//     *
+//     * @return Document
+//     * @throws ParserConfigurationException if construction problems occur
+//     */
+//    public static Document newDocument()
+//            throws ParserConfigurationException {
+//        DocumentBuilder db = null;
+//        try {
+//            db = getDocumentBuilder();
+//            Document doc = db.newDocument();
+//            return doc;
+//        } finally {
+//            if (db != null) {
+//                releaseDocumentBuilder(db);
+//            }
+//        }
+//    }
+
+//    /**
+//     * Get a new Document read from the input source
+//     * @return Document
+//     * @throws ParserConfigurationException if construction problems occur
+//     * @throws SAXException if the document has xml sax problems
+//     * @throws IOException if i/o exceptions occur
+//     */
+//    public static Document newDocument(InputSource inp)
+//            throws ParserConfigurationException, SAXException, IOException {
+//        DocumentBuilder db = null;
+//        try {
+//            db = getDocumentBuilder();
+//            try {
+//                db.setEntityResolver(new DefaultEntityResolver());
+//            } catch (Throwable t) {
+//                log.debug("Failed to set EntityResolver on DocumentBuilder", t);
+//            }
+//            try {
+//                db.setErrorHandler(new XMLUtils.ParserErrorHandler());
+//            } catch (Throwable t) {
+//                log.debug("Failed to set ErrorHandler on DocumentBuilder", t);
+//            }
+//            Document doc = db.parse(inp);
+//            return doc;
+//        } finally {
+//            if (db != null) {
+//                releaseDocumentBuilder(db);
+//            }
+//        }
+//    }
+
+    /**
+     * Get a new Document read from the input stream
+     * @return Document
+     * @throws ParserConfigurationException if construction problems occur
+     * @throws SAXException if the document has xml sax problems
+     * @throws IOException if i/o exceptions occur
+     */
+//    public static Document newDocument(InputStream inp)
+//        throws ParserConfigurationException, SAXException, IOException
+//    {
+//        return XMLUtils.newDocument(new InputSource(inp));
+//    }
+
+    /**
+     * Get a new Document read from the indicated uri
+     * @return Document
+     * @throws ParserConfigurationException if construction problems occur
+     * @throws SAXException if the document has xml sax problems
+     * @throws IOException if i/o exceptions occur
+     */
+//    public static Document newDocument(String uri)
+//        throws ParserConfigurationException, SAXException, IOException
+//    {
+//        // call the authenticated version as there might be
+//        // username/password info embeded in the uri.
+//        return XMLUtils.newDocument(uri, null, null);
+//    }
+
+//    /**
+//     * Create a new document from the given URI, use the username and password
+//     * if the URI requires authentication.
+//     * @param uri the resource to get
+//     * @param username basic auth username
+//     * @param password basic auth password
+//     * @throws ParserConfigurationException if construction problems occur
+//     * @throws SAXException if the document has xml sax problems
+//     * @throws IOException if i/o exceptions occur
+//     */
+//    public static Document newDocument(String uri, String username, String password)
+//        throws ParserConfigurationException, SAXException, IOException
+//     {
+//         InputSource ins = XMLUtils.getInputSourceFromURI(uri, username, password);
+//         Document doc = XMLUtils.newDocument(ins);
+//         // Close the Stream
+//         if (ins.getByteStream() != null) {
+//             ins.getByteStream().close();
+//         } else if (ins.getCharacterStream() != null) {
+//             ins.getCharacterStream().close();
+//         }
+//         return doc;
+//     }
+
+//    private static String privateElementToString(Element element,
+//                                                 boolean omitXMLDecl)
+//    {
+//        return DOM2Writer.nodeToString(element, omitXMLDecl);
+//    }
+
+//    /**
+//     * turn an element into an XML fragment
+//     * @param element
+//     * @return stringified element
+//     */
+//    public static String ElementToString(Element element) {
+//        return privateElementToString(element, true);
+//    }
+
+//    /**
+//     * turn a whole DOM document into XML
+//     * @param doc DOM document
+//     * @return string representation of the document, including XML declaration
+//     */
+//    public static String DocumentToString(Document doc) {
+//        return privateElementToString(doc.getDocumentElement(), false);
+//    }
+
+//    public static String PrettyDocumentToString(Document doc) {
+//        StringWriter sw = new StringWriter();
+//        PrettyElementToWriter(doc.getDocumentElement(), sw);
+//        return sw.toString();
+//    }
+
+//    public static void privateElementToWriter(Element element, Writer writer,
+//                                              boolean omitXMLDecl,
+//                                              boolean pretty) {
+//        DOM2Writer.serializeAsXML(element, writer, omitXMLDecl, pretty);
+//    }
+
+//    public static void ElementToStream(Element element, OutputStream out) {
+//        Writer writer = getWriter(out);
+//        privateElementToWriter(element, writer, true, false);
+//    }
+//
+//    public static void PrettyElementToStream(Element element, OutputStream out) {
+//        Writer writer = getWriter(out);
+//        privateElementToWriter(element, writer, true, true);
+//    }
+//
+//    public static void ElementToWriter(Element element, Writer writer) {
+//        privateElementToWriter(element, writer, true, false);
+//    }
+//
+//    public static void PrettyElementToWriter(Element element, Writer writer) {
+//        privateElementToWriter(element, writer, true, true);
+//    }
+//
+//    public static void DocumentToStream(Document doc, OutputStream out) {
+//        Writer writer = getWriter(out);
+//        privateElementToWriter(doc.getDocumentElement(), writer, false, false);
+//    }
+//
+//    public static void PrettyDocumentToStream(Document doc, OutputStream out) {
+//        Writer writer = getWriter(out);
+//        privateElementToWriter(doc.getDocumentElement(), writer, false, true);
+//    }
+
+    private static Writer getWriter(OutputStream os) {
+        Writer writer = null;
+        try {
+            writer = new OutputStreamWriter(os, "UTF-8");
+        } catch (UnsupportedEncodingException uee) {
+            //log.error(Messages.getMessage("exception00"), uee);
+            writer = new OutputStreamWriter(os);
+        }
+        return writer;
+    }
+
+//    public static void DocumentToWriter(Document doc, Writer writer) {
+//        privateElementToWriter(doc.getDocumentElement(), writer, false, false);
+//    }
+//
+//    public static void PrettyDocumentToWriter(Document doc, Writer writer) {
+//        privateElementToWriter(doc.getDocumentElement(), writer, false, true);
+//    }
+//    /**
+//     * Convert a simple string to an element with a text node
+//     *
+//     * @param namespace - element namespace
+//     * @param name - element name
+//     * @param string - value of the text node
+//     * @return element - an XML Element, null if no element was created
+//     */
+//    public static Element StringToElement(String namespace, String name, String string) {
+//        try {
+//            Document doc = XMLUtils.newDocument();
+//            Element element = doc.createElementNS(namespace, name);
+//            Text text = doc.createTextNode(string);
+//            element.appendChild(text);
+//            return element;
+//        }
+//        catch (ParserConfigurationException e) {
+//            // This should not occur
+//            throw new UnsupportedOperationException(e.getMessage());
+//        }
+//    }
+
+//    /**
+//     * get the inner XML inside an element as a string. This is done by
+//     * converting the XML to its string representation, then extracting the
+//     * subset between beginning and end tags.
+//     * @param element
+//     * @return textual body of the element, or null for no inner body
+//     */
+//    public static String getInnerXMLString(Element element) {
+//        String elementString = ElementToString(element);
+//        int start, end;
+//        start = elementString.indexOf(">") + 1;
+//        end = elementString.lastIndexOf("</");
+//        if (end > 0)
+//            return elementString.substring(start,end);
+//        else
+//            return null;
+//    }
+
+    public static String getPrefix(String uri, Node e) {
+        while (e != null && (e.getNodeType() == Element.ELEMENT_NODE)) {
+            NamedNodeMap attrs = e.getAttributes();
+            for (int n = 0; n < attrs.getLength(); n++) {
+                Attr a = (Attr)attrs.item(n);
+                String name;
+                if ((name = a.getName()).startsWith("xmlns:") &&
+                    a.getNodeValue().equals(uri)) {
+                    return name.substring(6);
+                }
+            }
+            e = e.getParentNode();
+        }
+        return null;
+    }
+
+    /**
+     * Searches for the namespace URI of the given prefix in the given DOM range.
+     *
+     * The namespace is not searched in parent of the "stopNode". This is
+     * usefull to get all the needed namespaces when you need to ouput only a
+     * subtree of a DOM document.
+     *
+     * @param prefix the prefix to find
+     * @param e the starting node
+     * @param stopNode null to search in all the document or a parent node where the search must stop.
+     * @return null if no namespace is found, or the namespace URI.
+     */
+    public static String getNamespace(String prefix, Node e, Node stopNode) {
+        while (e != null && (e.getNodeType() == Node.ELEMENT_NODE)) {
+            Attr attr = null;
+            if (prefix == null) {
+                attr = ((Element) e).getAttributeNode("xmlns");
+            } else {
+                attr = ((Element) e).getAttributeNodeNS(Constants.NS_URI_XMLNS,
+                        prefix);
+            }
+            if (attr != null) return attr.getValue();
+            if (e == stopNode)
+                return null;
+            e = e.getParentNode();
+        }
+        return null;
+    }
+
+    public static String getNamespace(String prefix, Node e) {
+        return getNamespace(prefix, e, null);
+    }
+
+    /**
+     * Return a QName when passed a string like "foo:bar" by mapping
+     * the "foo" prefix to a namespace in the context of the given Node.
+     *
+     * @return a QName generated from the given string representation
+     */
+    public static QName getQNameFromString(String str, Node e) {
+        return getQNameFromString(str, e, false);
+    }
+    /**
+     * Return a QName when passed a string like "foo:bar" by mapping
+     * the "foo" prefix to a namespace in the context of the given Node.
+     * If default namespace is found it is returned as part of the QName.
+     *
+     * @return a QName generated from the given string representation
+     */
+    public static QName getFullQNameFromString(String str, Node e) {
+        return getQNameFromString(str, e, true);
+    }
+    private static QName getQNameFromString(String str, Node e, boolean defaultNS) {
+        if (str == null || e == null)
+            return null;
+
+        int idx = str.indexOf(':');
+        if (idx > -1) {
+            String prefix = str.substring(0, idx);
+            String ns = getNamespace(prefix, e);
+            if (ns == null)
+                return null;
+            return new QName(ns, str.substring(idx + 1));
+        } else {
+            if (defaultNS) {
+                String ns = getNamespace(null, e);
+                if (ns != null)
+                    return new QName(ns, str);
+            }
+            return new QName("", str);
+        }
+    }
+
+    /**
+     * Return a string for a particular QName, mapping a new prefix
+     * if necessary.
+     */
+    public static String getStringForQName(QName qname, Element e)
+    {
+        String uri = qname.getNamespaceURI();
+        String prefix = getPrefix(uri, e);
+        if (prefix == null) {
+            int i = 1;
+            prefix = "ns" + i;
+            while (getNamespace(prefix, e) != null) {
+                i++;
+                prefix = "ns" + i;
+            }
+            e.setAttributeNS(Constants.NS_URI_XMLNS,
+                        "xmlns:" + prefix, uri);
+        }
+        return prefix + ":" + qname.getLocalPart();
+    }
+
+  /**
+   * Concat all the text and cdata node children of this elem and return
+   * the resulting text.
+   * (by Matt Duftler)
+   *
+   * @param parentEl the element whose cdata/text node values are to
+   *                 be combined.
+   * @return the concatanated string.
+   */
+  public static String getChildCharacterData (Element parentEl) {
+    if (parentEl == null) {
+      return null;
+    }
+    Node          tempNode = parentEl.getFirstChild();
+    StringBuffer  strBuf   = new StringBuffer();
+    CharacterData charData;
+
+    while (tempNode != null) {
+      switch (tempNode.getNodeType()) {
+        case Node.TEXT_NODE :
+        case Node.CDATA_SECTION_NODE : charData = (CharacterData)tempNode;
+                                       strBuf.append(charData.getData());
+                                       break;
+      }
+      tempNode = tempNode.getNextSibling();
+    }
+    return strBuf.toString();
+  }
+
+    public static class ParserErrorHandler implements ErrorHandler {
+        protected static Log log =
+            LogFactory.getLog(ParserErrorHandler.class.getName());
+        /**
+         * Returns a string describing parse exception details
+         */
+        private String getParseExceptionInfo(SAXParseException spe) {
+            String systemId = spe.getSystemId();
+            if (systemId == null) {
+                systemId = "null";
+            }
+            String info = "URI=" + systemId +
+                " Line=" + spe.getLineNumber() +
+                ": " + spe.getMessage();
+            return info;
+        }
+
+        // The following methods are standard SAX ErrorHandler methods.
+        // See SAX documentation for more info.
+
+        public void warning(SAXParseException spe) throws SAXException {
+            if (log.isDebugEnabled()) {}
+                //log.debug( Messages.getMessage("warning00", getParseExceptionInfo(spe)));
+        }
+
+        public void error(SAXParseException spe) throws SAXException {
+            String message = "Error: " + getParseExceptionInfo(spe);
+            throw new SAXException(message);
+        }
+
+        public void fatalError(SAXParseException spe) throws SAXException {
+            String message = "Fatal Error: " + getParseExceptionInfo(spe);
+            throw new SAXException(message);
+        }
+    }
+
+
+    /**
+     * Utility to get the bytes uri.
+     * Does NOT handle authenticated URLs,
+     * use getInputSourceFromURI(uri, username, password)
+     *
+     * @param uri the resource to get
+     * @see #getInputSourceFromURI(String uri, String username, String password)
+     */
+    public static InputSource getInputSourceFromURI(String uri) {
+        return new InputSource(uri);
+    }
+
+//    /**
+//     * Utility to get the bytes uri
+//     *
+//     * @param source the resource to get
+//     */
+//    public static InputSource sourceToInputSource(Source source) {
+//        if (source instanceof SAXSource) {
+//            return ((SAXSource) source).getInputSource();
+//        } else if (source instanceof DOMSource) {
+//            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+//            Node node = ((DOMSource)source).getNode();
+//            if (node instanceof Document) {
+//                node = ((Document)node).getDocumentElement();
+//            }
+//            Element domElement = (Element)node;
+//            ElementToStream(domElement, baos);
+//            InputSource  isource = new InputSource(source.getSystemId());
+//            isource.setByteStream(new ByteArrayInputStream(baos.toByteArray()));
+//            return isource;
+//        } else if (source instanceof StreamSource) {
+//            StreamSource ss      = (StreamSource) source;
+//            InputSource  isource = new InputSource(ss.getSystemId());
+//            isource.setByteStream(ss.getInputStream());
+//            isource.setCharacterStream(ss.getReader());
+//            isource.setPublicId(ss.getPublicId());
+//            return isource;
+//        } else {
+//            return getInputSourceFromURI(source.getSystemId());
+//        }
+//    }
+
+    /**
+     * Utility to get the bytes at a protected uri
+     *
+     * This will retrieve the URL if a username and password are provided.
+     * The java.net.URL class does not do Basic Authentication, so we have to
+     * do it manually in this routine.
+     *
+     * If no username is provided, we create an InputSource from the uri
+     * and let the InputSource go fetch the contents.
+     *
+     * @param uri the resource to get
+     * @param username basic auth username
+     * @param password basic auth password
+     */
+    private static InputSource getInputSourceFromURI(String uri,
+                                                     String username,
+                                                     String password)
+        throws IOException, ProtocolException, UnsupportedEncodingException
+    {
+        URL wsdlurl = null;
+        try {
+            wsdlurl = new URL(uri);
+        } catch (MalformedURLException e) {
+            // we can't process it, it might be a 'simple' foo.wsdl
+            // let InputSource deal with it
+            return new InputSource(uri);
+        }
+
+        // if no authentication, just let InputSource deal with it
+        if (username == null && wsdlurl.getUserInfo() == null) {
+            return new InputSource(uri);
+        }
+
+        // if this is not an HTTP{S} url, let InputSource deal with it
+        if (!wsdlurl.getProtocol().startsWith("http")) {
+            return new InputSource(uri);
+        }
+
+        URLConnection connection = wsdlurl.openConnection();
+        // Does this work for https???
+        if (!(connection instanceof HttpURLConnection)) {
+            // can't do http with this URL, let InputSource deal with it
+            return new InputSource(uri);
+        }
+        HttpURLConnection uconn = (HttpURLConnection) connection;
+        String userinfo = wsdlurl.getUserInfo();
+        uconn.setRequestMethod("GET");
+        uconn.setAllowUserInteraction(false);
+        uconn.setDefaultUseCaches(false);
+        uconn.setDoInput(true);
+        uconn.setDoOutput(false);
+        uconn.setInstanceFollowRedirects(true);
+        uconn.setUseCaches(false);
+
+        // username/password info in the URL overrides passed in values
+        String auth = null;
+        if (userinfo != null) {
+            auth = userinfo;
+        } else if (username != null) {
+            auth = (password == null) ? username : username + ":" + password;
+        }
+
+        if (auth != null) {
+            uconn.setRequestProperty("Authorization",
+                                     "Basic " +
+                                     base64encode(auth.getBytes(httpAuthCharEncoding)));
+        }
+
+        uconn.connect();
+
+        return new InputSource(uconn.getInputStream());
+    }
+
+    public static final String base64encode(byte[] bytes) {
+       // return new String(Base64.encode(bytes));
+        return null; //todo
+    }
+
+    public static InputSource getEmptyInputSource() {
+        return new InputSource(bais);
+    }
+
+    /**
+     * Find a Node with a given QName
+     *
+     * @param node parent node
+     * @param name QName of the child we need to find
+     * @return child node
+     */
+    public static Node findNode(Node node, QName name){
+        if(name.getNamespaceURI().equals(node.getNamespaceURI()) &&
+           name.getLocalPart().equals(node.getLocalName()))
+            return node;
+        NodeList children = node.getChildNodes();
+        for(int i=0;i<children.getLength();i++){
+            Node ret = findNode(children.item(i), name);
+            if(ret != null)
+                return ret;
+        }
+        return null;
+    }
+
+    /**
+     * Trim all new lines from text nodes.
+     *
+     * @param node
+     */
+    public static void normalize(Node node) {
+        if (node.getNodeType() == Node.TEXT_NODE) {
+            String data = ((Text) node).getData();
+            if (data.length() > 0) {
+                char ch = data.charAt(data.length()-1);
+                 if(ch == '\n' || ch == '\r' || ch == ' ') {
+                    String data2 = trim(data);
+                    ((Text) node).setData(data2);
+                 }
+            }
+        }
+        for (Node currentChild = node.getFirstChild(); currentChild != null; currentChild = currentChild.getNextSibling()) {
+            normalize(currentChild);
+        }
+    }
+
+    public static String trim(String str) {
+        if (str.length() == 0) {
+            return str;
+        }
+
+        if (str.length() == 1) {
+            if ("\r".equals(str) || "\n".equals(str)) {
+                return "";
+            } else {
+                return str;
+            }
+        }
+
+        int lastIdx = str.length() - 1;
+        char last = str.charAt(lastIdx);
+        while(lastIdx > 0) {
+            if(last != '\n' && last != '\r' && last != ' ')
+                break;
+            lastIdx--;
+            last = str.charAt(lastIdx);
+        }
+        if(lastIdx == 0)
+            return "";
+        return str.substring(0, lastIdx);
+    }
+
+    /**
+     * Converts a List with org.w3c.dom.Element objects to an Array
+     * with org.w3c.dom.Element objects.
+     * @param list List containing org.w3c.dom.Element objects
+     * @return Element[] Array with org.w3c.dom.Element objects
+     */
+    public static Element[] asElementArray(List list) {
+
+        Element[] elements = new Element[list.size()];
+
+        int i = 0;
+        Iterator detailIter = list.iterator();
+        while (detailIter.hasNext()) {
+            elements[i++] = (Element) detailIter.next();
+        }
+
+        return elements;
+    }
+
+//    public static String getEncoding(Message message,
+//                                     MessageContext msgContext) {
+//        return getEncoding(message, msgContext,
+//                XMLEncoderFactory.getDefaultEncoder());
+//    }
+//
+//    public static String getEncoding(Message message,
+//                                     MessageContext msgContext,
+//                                     XMLEncoder defaultEncoder) {
+//        String encoding = null;
+//        try {
+//            if(message != null) {
+//                encoding = (String) message.getProperty(SOAPMessage.CHARACTER_SET_ENCODING);
+//            }
+//        } catch (SOAPException e) {
+//        }
+//        if(msgContext == null) {
+//            msgContext = MessageContext.getCurrentContext();
+//        }
+//        if(msgContext != null && encoding == null){
+//            encoding = (String) msgContext.getProperty(SOAPMessage.CHARACTER_SET_ENCODING);
+//        }
+//        if (msgContext != null && encoding == null && msgContext.getAxisEngine() != null) {
+//            encoding = (String) msgContext.getAxisEngine().getOption(AxisEngine.PROP_XML_ENCODING);
+//        }
+//        if (encoding == null && defaultEncoder != null) {
+//            encoding = defaultEncoder.getEncoding();
+//        }
+//        return encoding;
+//    }
+}

Added: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/utils/support/BooleanHolder.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/utils/support/BooleanHolder.java?rev=306583&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/utils/support/BooleanHolder.java (added)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/utils/support/BooleanHolder.java Thu Oct  6 03:54:18 2005
@@ -0,0 +1,42 @@
+package org.apache.axis2.databinding.utils.support;
+/*
+ * Copyright 2004,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.
+ */
+
+/**
+ * A replacement for the javax.xml.rpc.holders;
+ */
+public class BooleanHolder {
+      /** The <code>boolean</code> contained by this holder. */
+    public boolean value;
+
+    /**
+     * Make a new <code>BooleanHolder</code> with a <code>null</code> value.
+     */
+    public BooleanHolder() {}
+
+    /**
+     * Make a new <code>BooleanHolder</code> with <code>value</code> as
+     * the value.
+     *
+     * @param value  the <code>boolean</code> to hold
+     */
+    public BooleanHolder(boolean value) {
+        this.value = value;
+    }
+
+
+
+}

Added: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/utils/support/IntHolder.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/utils/support/IntHolder.java?rev=306583&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/utils/support/IntHolder.java (added)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/utils/support/IntHolder.java Thu Oct  6 03:54:18 2005
@@ -0,0 +1,36 @@
+package org.apache.axis2.databinding.utils.support;
+/*
+ * Copyright 2004,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.
+ */
+
+public class IntHolder {
+    /** The <code>int</code> contained by this holder. */
+    public int value;
+
+    /**
+     * Make a new <code>IntHolder</code> with a <code>null</code> value.
+     */
+    public IntHolder() {}
+
+    /**
+     * Make a new <code>IntHolder</code> with <code>value</code> as
+     * the value.
+     *
+     * @param value  the <code>int</code> to hold
+     */
+    public IntHolder(int value) {
+        this.value = value;
+    }
+}

Added: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/utils/support/QNameHolder.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/utils/support/QNameHolder.java?rev=306583&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/utils/support/QNameHolder.java (added)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/databinding/utils/support/QNameHolder.java Thu Oct  6 03:54:18 2005
@@ -0,0 +1,38 @@
+package org.apache.axis2.databinding.utils.support;
+
+import javax.xml.namespace.QName;
+/*
+ * Copyright 2004,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.
+ */
+
+public class QNameHolder {
+    /** The <code>QName</code> contained by this holder. */
+    public QName value;
+
+    /**
+     * Make a new <code>QNameHolder</code> with a <code>null</code> value.
+     */
+    public QNameHolder() {}
+
+    /**
+     * Make a new <code>QNameHolder</code> with <code>value</code> as
+     * the value.
+     *
+     * @param value the <code>QName</code> to hold
+     */
+    public QNameHolder(QName value) {
+        this.value = value;
+    }
+}

Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/wsdl/codegen/emitter/MultiLanguageClientEmitter.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/wsdl/codegen/emitter/MultiLanguageClientEmitter.java?rev=306583&r1=306582&r2=306583&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/wsdl/codegen/emitter/MultiLanguageClientEmitter.java (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/wsdl/codegen/emitter/MultiLanguageClientEmitter.java Thu Oct  6 03:54:18 2005
@@ -861,10 +861,10 @@
         WSDLOperation operation ;
 
         for (Iterator iterator = col.iterator(); iterator.hasNext();) {
-        	
+
             List soapHeaderInputParameterList = new ArrayList();
             List soapHeaderOutputParameterList = new ArrayList();
-            
+
             operation = (WSDLOperation) iterator.next();
             methodElement = doc.createElement("method");
             String localPart = reformatName(operation.getName().getLocalPart(),false);

Added: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/wsdl/codegen/extension/Axis2DatabindingExtension.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/wsdl/codegen/extension/Axis2DatabindingExtension.java?rev=306583&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/wsdl/codegen/extension/Axis2DatabindingExtension.java (added)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/wsdl/codegen/extension/Axis2DatabindingExtension.java Thu Oct  6 03:54:18 2005
@@ -0,0 +1,52 @@
+package org.apache.axis2.wsdl.codegen.extension;
+
+import org.apache.axis2.wsdl.codegen.CodeGenConfiguration;
+import org.apache.axis2.wsdl.codegen.CodeGenerationException;
+import org.apache.axis2.wsdl.databinding.DefaultTypeMapper;
+import org.apache.axis2.databinding.gen.Parser;
+import org.apache.wsdl.WSDLTypes;
+/*
+ * Copyright 2004,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.
+ */
+
+public class Axis2DatabindingExtension extends AbstractCodeGenerationExtension{
+
+
+    public void init(CodeGenConfiguration configuration) {
+        this.configuration = configuration;
+    }
+
+    public void engage() {
+        try {
+            WSDLTypes typesList = configuration.getWom().getTypes();
+            if (typesList == null) {
+                //there are no types to be code generated
+                //However if the type mapper is left empty it will be a problem for the other
+                //processes. Hence the default type mapper is set to the configuration
+                this.configuration.setTypeMapper(new DefaultTypeMapper());
+                return;
+            }
+
+            //this should've done the generation!!!!
+            Parser parser = new Parser();
+            parser.run(configuration.getWom());
+
+
+
+        }catch(Exception e){
+            e.printStackTrace();
+        }
+    }
+}

Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/wsdl/codegen/extension/XMLBeansExtension.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/wsdl/codegen/extension/XMLBeansExtension.java?rev=306583&r1=306582&r2=306583&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/wsdl/codegen/extension/XMLBeansExtension.java (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/wsdl/codegen/extension/XMLBeansExtension.java Thu Oct  6 03:54:18 2005
@@ -120,8 +120,6 @@
                         // JDK version that is being used.
                         String s = DOM2Writer.nodeToString(element);
 
-                        
-
                         //write the schema to a file
                         File tempFile = File.createTempFile("temp", ".xsd", schemaFolder);
                         FileWriter writer = new FileWriter(tempFile);