Author: jochen
Date: Thu Aug 24 12:56:34 2006
New Revision: 434486

URL: http://svn.apache.org/viewvc?rev=434486&view=rev
Log:
Added a unit test for external schema bindings.

Added:
    
webservices/jaxme/branches/MAVEN/projects/jm/src/test/java/org/apache/ws/jaxme/junit/BindingsTest.java
    webservices/jaxme/branches/MAVEN/projects/jm/src/test/resources/bindings/
    
webservices/jaxme/branches/MAVEN/projects/jm/src/test/resources/bindings/bindings.jxb
    
webservices/jaxme/branches/MAVEN/projects/jm/src/test/resources/bindings/bindings.xsd
    
webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/junit/BindingsTest.java
    webservices/jaxme/branches/b0_5/src/test/jaxb/bindings/
    webservices/jaxme/branches/b0_5/src/test/jaxb/bindings/bindings.jxb
    webservices/jaxme/branches/b0_5/src/test/jaxb/bindings/bindings.xsd
Modified:
    
webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/impl/Inliner.java
    webservices/jaxme/branches/MAVEN/projects/jm/src/test/resources/build.xml
    
webservices/jaxme/branches/MAVEN/projects/xs/src/main/java/org/apache/ws/jaxme/xs/impl/XSLogicalParser.java
    
webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/impl/Inliner.java
    webservices/jaxme/branches/b0_5/src/test/jaxb/build.xml
    
webservices/jaxme/branches/b0_5/src/xs/org/apache/ws/jaxme/xs/impl/XSLogicalParser.java

Modified: 
webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/impl/Inliner.java
URL: 
http://svn.apache.org/viewvc/webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/impl/Inliner.java?rev=434486&r1=434485&r2=434486&view=diff
==============================================================================
--- 
webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/impl/Inliner.java
 (original)
+++ 
webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/impl/Inliner.java
 Thu Aug 24 12:56:34 2006
@@ -17,31 +17,31 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
 
+import javax.xml.XMLConstants;
+import javax.xml.namespace.NamespaceContext;
 import javax.xml.namespace.QName;
-import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
+import javax.xml.parsers.SAXParserFactory;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
 
-import org.apache.ws.jaxme.logging.Logger;
-import org.apache.ws.jaxme.logging.LoggerAccess;
+import org.apache.ws.jaxme.util.DOMBuilder;
 import org.apache.ws.jaxme.util.DOMSerializer;
 import org.apache.ws.jaxme.xs.SchemaTransformer;
 import org.apache.ws.jaxme.xs.XSParser;
 import org.apache.ws.jaxme.xs.jaxb.impl.JAXBParser;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
-import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
@@ -57,7 +57,6 @@
  * http://wiki.apache.org/ws/JaxMe/ExternalSchemaBindings</a>.
  */
 public class Inliner implements SchemaTransformer {
-       private static final Logger log = LoggerAccess.getLogger(Inliner.class);
        private final Document[] bindings;
        private XMLReader transformedXMLReader;
        private InputSource transformedInputSource;
@@ -68,19 +67,25 @@
                bindings = pBindings;
        }
 
-       private DocumentBuilder newDocumentBuilder() throws 
ParserConfigurationException {
-               final DocumentBuilderFactory dbf = 
DocumentBuilderFactory.newInstance();
-               dbf.setNamespaceAware(true);
-               dbf.setValidating(false);
-               return dbf.newDocumentBuilder();
-       }
-
        private Document read(InputSource pSource, XMLReader pReader)
                        throws SAXException, ParserConfigurationException, 
IOException {
-               DocumentBuilder db = newDocumentBuilder();
-               db.setEntityResolver(pReader.getEntityResolver());
-               db.setErrorHandler(pReader.getErrorHandler());
-               return db.parse(pSource);
+               SAXParserFactory spf = SAXParserFactory.newInstance();
+               spf.setNamespaceAware(true);
+               spf.setValidating(false);
+               XMLReader xr = spf.newSAXParser().getXMLReader();
+               xr.setEntityResolver(pReader.getEntityResolver());
+               xr.setErrorHandler(pReader.getErrorHandler());
+               DOMBuilder db = new DOMBuilder();
+               db.setPrefixMappingIsAttribute(true);
+               DocumentBuilderFactory dbf = 
DocumentBuilderFactory.newInstance();
+               dbf.setValidating(false);
+               dbf.setNamespaceAware(true);
+               Document doc = dbf.newDocumentBuilder().newDocument();
+               db.setDocument(doc);
+               db.setTarget(doc);
+               xr.setContentHandler(db);
+               xr.parse(pSource);
+               return doc;
        }
 
        private boolean isURIMatching(String pURI, Element pBindings) {
@@ -108,44 +113,145 @@
                return false;
        }
 
-       private void apply(Element pSchema, Element pBindings, String pURI) 
throws XPathExpressionException {
+       private void apply(final Node pTarget, Element pBindings, String pURI)
+                       throws XPathExpressionException, SAXException {
                final Attr nodeAttr = pBindings.getAttributeNodeNS(null, 
"node");
                if (!isURIMatching(pURI, pBindings)) {
                        return;
                }
                if (nodeAttr == null) {
-                       importChilds(pSchema, pBindings, pURI);
+                       importChilds(pTarget, pBindings, pURI);
                } else {
                        final XPath xpath = 
XPathFactory.newInstance().newXPath();
-                       final NodeList nodes = (NodeList) 
xpath.evaluate(nodeAttr.getValue(), pSchema, XPathConstants.NODESET);
+                       NamespaceContext ctx = new NamespaceContext(){
+                               public Iterator getPrefixes(String pURI) {
+                                       if (pURI == null) {
+                                               throw new 
IllegalArgumentException("The URI must not be null.");
+                                       }
+                                       if 
(XMLConstants.XML_NS_URI.equals(pURI)) {
+                                               return 
Collections.singletonList(XMLConstants.XML_NS_PREFIX).iterator();
+                                       }
+                                       if 
(XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(pURI)) {
+                                               return 
Collections.singletonList(XMLConstants.XMLNS_ATTRIBUTE).iterator();
+                                       }
+                                       List list = 
getPrefixDeclarations(pTarget);
+                                       List result = new ArrayList();
+                                       for (int i = 0;  i < list.size();  i += 
2) {
+                                               if (pURI.equals(list.get(i+1))) 
{
+                                                       String prefix = 
(String) list.get(i);
+                                                       if 
(!result.contains(prefix)) {
+                                                               
result.add(prefix);
+                                                       }
+                                               }
+                                       }
+                                       return result.iterator();
+                               }
+                               public String getPrefix(String pURI) {
+                                       String result = null;
+                                       Iterator iter = getPrefixes(pURI);
+                                       if (iter.hasNext()) {
+                                               result = (String) iter.next();
+                                       } else {
+                                               if ("".equals(pURI)) {
+                                                       result = 
XMLConstants.DEFAULT_NS_PREFIX;
+                                               }
+                                       }
+                                       return result;
+                               }
+                               public String getNamespaceURI(String pPrefix) {
+                                       if (pPrefix == null) {
+                                               throw new 
IllegalArgumentException("The prefix must not be null.");
+                                       }
+                                       String result = null;
+                                       if 
(XMLConstants.XML_NS_PREFIX.equals(pPrefix)) {
+                                               result = 
XMLConstants.XML_NS_URI;
+                                       } else if 
(XMLConstants.XMLNS_ATTRIBUTE.equals(pPrefix)) {
+                                               result = 
XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
+                                       } else {
+                                               List list = 
getPrefixDeclarations(pTarget);
+                                               for (int i = 0;  i < 
list.size();  i += 2) {
+                                                       if 
(pPrefix.equals(list.get(i))) {
+                                                               result = 
(String) list.get(i+1);
+                                                               break;
+                                                       }
+                                               }
+                                               if (result == null  &&  
pPrefix.equals(XMLConstants.DEFAULT_NS_PREFIX)) {
+                                                       result = "";
+                                               }
+                                       }
+                                       return result;
+                               }
+                               private List getPrefixDeclarations(Node 
pTarget) {
+                                       List list = new ArrayList();
+                                       addPrefixDeclarations(pTarget, list);
+                                       return list;
+                               }
+                               private void addPrefixDeclarations(Node pNode, 
List pList) {
+                                       if (pNode == null) {
+                                               return;
+                                       }
+                                       if (pNode.getNodeType() == 
Node.ELEMENT_NODE) {
+                                               Element e = (Element) pNode;
+                                               if (e.getNamespaceURI() == null 
 ||  "".equals(e.getNamespaceURI())) {
+                                                       
pList.add(XMLConstants.DEFAULT_NS_PREFIX);
+                                                       
pList.add(e.getPrefix());
+                                               } else {
+                                                       
pList.add(e.getPrefix());
+                                                       
pList.add(e.getNamespaceURI());
+                                               }
+                                               NamedNodeMap attrs = 
e.getAttributes();
+                                               for (int i = 0;  i < 
attrs.getLength();  i++) {
+                                                       Attr attr = (Attr) 
attrs.item(i);
+                                                       if 
(XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(attr.getNamespaceURI())) {
+                                                               
pList.add(attr.getPrefix());
+                                                               
pList.add(attr.getValue());
+                                                       } else if (null == 
attr.getNamespaceURI()  &&  
XMLConstants.XMLNS_ATTRIBUTE.equals(attr.getLocalName())) {
+                                                               
pList.add(attr.getLocalName());
+                                                               
pList.add(attr.getValue());
+                                                       }
+                                               }
+                                       }
+                                       
addPrefixDeclarations(pNode.getParentNode(), pList);
+                               }
+                       };
+                       xpath.setNamespaceContext(ctx);
+                       final NodeList nodes = (NodeList) 
xpath.evaluate(nodeAttr.getValue(), pTarget, XPathConstants.NODESET);
                        for (int i = 0;  i < nodes.getLength();  i++) {
                                final Node node = nodes.item(i);
                                if (node.getNodeType() == Node.ELEMENT_NODE
                                        &&  
XSParser.XML_SCHEMA_URI.equals(node.getNamespaceURI())) {
-                                       importChilds((Element) node, pBindings, 
pURI);
+                                       importChilds(node, pBindings, pURI);
                                }
                        }
                }
        }
 
-       private void importChilds(Element pTarget, Node pSource, String pURI) 
throws XPathExpressionException {
+       private void importChilds(Node pTarget, Node pSource, String pURI)
+                       throws XPathExpressionException, SAXException {
                final Document doc = pTarget.getOwnerDocument();
-               DocumentFragment df = doc.createDocumentFragment();
+               Element appInfoElement = null;
                for (Node child = pSource.getFirstChild();  child != null;  
child = child.getNextSibling()) {
-                       if (child.getNodeType() == Node.ELEMENT_NODE
-                               &&  
JAXBParser.JAXB_SCHEMA_URI.equals(child.getNamespaceURI())
-                               &&  "bindings".equals(child.getLocalName())) {
-                               apply(pTarget, (Element) child, pURI);
+                       if (child.getNodeType() != Node.ELEMENT_NODE) {
+                               continue;
+                       }
+                       Element e = (Element) child;
+                       if 
(JAXBParser.JAXB_SCHEMA_URI.equals(e.getNamespaceURI())
+                               &&  "bindings".equals(e.getLocalName())) {
+                               apply(pTarget, e, pURI);
                        } else {
-                               df.appendChild(doc.importNode(child, true));
+                               if (appInfoElement == null) {
+                                       if (pTarget.getNodeType() != 
Node.ELEMENT_NODE) {
+                                               throw new SAXException("Attempt 
to import childs into a node of type " +
+                                                               
pTarget.getNodeType() + ", perhaps invalid XPath expression?");
+                                       }
+                                       Element targetElement = (Element) 
pTarget;
+                                       final String prefix = 
pTarget.getPrefix();
+                                       Element annotationElement = 
getChild(targetElement, prefix, "annotation");
+                                       appInfoElement = 
getChild(annotationElement, prefix, "appinfo");
+                               }
+                               appInfoElement.appendChild(doc.importNode(e, 
true));
                        }
                }
-               if (df.hasChildNodes()) {
-                       String prefix = pTarget.getPrefix();
-                       Element annotationElement = getChild(pTarget, prefix, 
"annotation");
-                       Element appInfoElement = getChild(annotationElement, 
prefix, "appInfo");
-                       appInfoElement.appendChild(df);
-               }
        }
 
        private Element getChild(Element pParent, String pPrefix, String pName) 
{
@@ -164,20 +270,8 @@
                return e;
        }
 
-       private String asString(Document pDocument) throws SAXException {
-               final StringWriter sw = new StringWriter();
-               try {
-                       
TransformerFactory.newInstance().newTransformer().transform(new 
DOMSource(pDocument), new StreamResult(sw));
-               } catch (TransformerException e) {
-                       throw new SAXException(e);
-               }
-               return sw.toString();
-       }
-
        public void parse(InputSource pSource, XMLReader pReader) throws 
ParserConfigurationException, SAXException, IOException {
-               final String mName = "parse";
                final String uri = pSource.getSystemId();
-               log.entering(mName, uri);
                final Document schema = read(pSource, pReader);
                try {
                        for (int i = 0;  i < bindings.length;  i++) {

Added: 
webservices/jaxme/branches/MAVEN/projects/jm/src/test/java/org/apache/ws/jaxme/junit/BindingsTest.java
URL: 
http://svn.apache.org/viewvc/webservices/jaxme/branches/MAVEN/projects/jm/src/test/java/org/apache/ws/jaxme/junit/BindingsTest.java?rev=434486&view=auto
==============================================================================
--- 
webservices/jaxme/branches/MAVEN/projects/jm/src/test/java/org/apache/ws/jaxme/junit/BindingsTest.java
 (added)
+++ 
webservices/jaxme/branches/MAVEN/projects/jm/src/test/java/org/apache/ws/jaxme/junit/BindingsTest.java
 Thu Aug 24 12:56:34 2006
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2006  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.ws.jaxme.junit;
+
+import junit.framework.TestCase;
+
+import org.apache.ws.jaxme.test.bindings.vo.FooType;
+import org.apache.ws.jaxme.test.bindings.vo.ObjectFactory;
+import org.apache.ws.jaxme.test.bindings.vo.YesNoTypeClass;
+
+
+/**
+ * Tests using external binding files.
+ */
+public class BindingsTest extends TestCase {
+       /**
+        * Tests, whether the binding has moved the schema to the proper
+        * package and whether the string constants have been created.
+        */
+       public void testBindings() throws Exception {
+               FooType foo = new ObjectFactory().createFoo();
+               foo.setBar(YesNoTypeClass.YES);
+       }
+}

Added: 
webservices/jaxme/branches/MAVEN/projects/jm/src/test/resources/bindings/bindings.jxb
URL: 
http://svn.apache.org/viewvc/webservices/jaxme/branches/MAVEN/projects/jm/src/test/resources/bindings/bindings.jxb?rev=434486&view=auto
==============================================================================
--- 
webservices/jaxme/branches/MAVEN/projects/jm/src/test/resources/bindings/bindings.jxb
 (added)
+++ 
webservices/jaxme/branches/MAVEN/projects/jm/src/test/resources/bindings/bindings.jxb
 Thu Aug 24 12:56:34 2006
@@ -0,0 +1,13 @@
+<jxb:bindings
+    version="1.0"
+    xmlns:jxb="http://java.sun.com/xml/ns/jaxb";
+    xmlns:xs="http://www.w3.org/2001/XMLSchema";>
+  <jxb:bindings schemaLocation="bindings.xsd" node="/xs:schema">
+       <jxb:schemaBindings>
+      <jxb:package name="org.apache.ws.jaxme.test.bindings.vo"/>
+       </jxb:schemaBindings>
+    <jxb:bindings node="xs:[EMAIL PROTECTED]'YesNoType']">
+      <jxb:typesafeEnumClass/>
+    </jxb:bindings>
+  </jxb:bindings>
+</jxb:bindings>

Added: 
webservices/jaxme/branches/MAVEN/projects/jm/src/test/resources/bindings/bindings.xsd
URL: 
http://svn.apache.org/viewvc/webservices/jaxme/branches/MAVEN/projects/jm/src/test/resources/bindings/bindings.xsd?rev=434486&view=auto
==============================================================================
--- 
webservices/jaxme/branches/MAVEN/projects/jm/src/test/resources/bindings/bindings.xsd
 (added)
+++ 
webservices/jaxme/branches/MAVEN/projects/jm/src/test/resources/bindings/bindings.xsd
 Thu Aug 24 12:56:34 2006
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2003, 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.
+-->
+ <xs:schema
+    xmlns:xs="http://www.w3.org/2001/XMLSchema";
+    targetNamespace="http://ws.apache.org/jaxme/test/bindings";
+    xmlns:bnd="http://ws.apache.org/jaxme/test/bindings";
+    elementFormDefault="qualified"
+    attributeFormDefault="unqualified">
+  <xs:element name="foo">
+    <xs:complexType>
+      <xs:attribute name="bar" type="bnd:YesNoType"/>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:simpleType name="YesNoType">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="YES"/>
+      <xs:enumeration value="NO"/>
+    </xs:restriction>
+  </xs:simpleType>
+</xs:schema>

Modified: 
webservices/jaxme/branches/MAVEN/projects/jm/src/test/resources/build.xml
URL: 
http://svn.apache.org/viewvc/webservices/jaxme/branches/MAVEN/projects/jm/src/test/resources/build.xml?rev=434486&r1=434485&r2=434486&view=diff
==============================================================================
--- webservices/jaxme/branches/MAVEN/projects/jm/src/test/resources/build.xml 
(original)
+++ webservices/jaxme/branches/MAVEN/projects/jm/src/test/resources/build.xml 
Thu Aug 24 12:56:34 2006
@@ -126,6 +126,11 @@
       <produces dir="${srcdir}" 
includes="org/apache/ws/jaxme/test/misc/enumeration/*"/>
       <produces dir="${srcdir}" 
includes="org/apache/ws/jaxme/test/misc/wildcards/*"/>
     </xjc>
+       <xjc target="${srcdir}">
+         <schema dir="${basedir}/bindings" includes="*.xsd"/>
+      <binding dir="${basedir}/bindings" includes="*.jxb"/>
+      <produces dir="${srcdir}" 
includes="org/apache/ws/jaxme/test/bindings/**/*"/>
+    </xjc>
   </target>
 
   <target name="compile" depends="generate">

Modified: 
webservices/jaxme/branches/MAVEN/projects/xs/src/main/java/org/apache/ws/jaxme/xs/impl/XSLogicalParser.java
URL: 
http://svn.apache.org/viewvc/webservices/jaxme/branches/MAVEN/projects/xs/src/main/java/org/apache/ws/jaxme/xs/impl/XSLogicalParser.java?rev=434486&r1=434485&r2=434486&view=diff
==============================================================================
--- 
webservices/jaxme/branches/MAVEN/projects/xs/src/main/java/org/apache/ws/jaxme/xs/impl/XSLogicalParser.java
 (original)
+++ 
webservices/jaxme/branches/MAVEN/projects/xs/src/main/java/org/apache/ws/jaxme/xs/impl/XSLogicalParser.java
 Thu Aug 24 12:56:34 2006
@@ -659,13 +659,13 @@
                XSContentHandler contentHandler = 
getXSContentHandler(pSource.getSystemId());
                XSContext data = getData();
                XMLReader xr = 
data.getXsObjectFactory().newXMLReader(isValidating());
-               xr.setContentHandler(contentHandler);
                SchemaTransformer transformer = 
data.getXSObjectFactory().getSchemaTransformer();
                if (transformer != null) {
                        transformer.parse(pSource, xr);
                        pSource = transformer.getTransformedInputSource();
                        xr = transformer.getTransformedXMLReader();
                }
+               xr.setContentHandler(contentHandler);
                xr.parse(pSource);
                return getSchema();
        }

Modified: 
webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/impl/Inliner.java
URL: 
http://svn.apache.org/viewvc/webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/impl/Inliner.java?rev=434486&r1=434485&r2=434486&view=diff
==============================================================================
--- 
webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/impl/Inliner.java
 (original)
+++ 
webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/impl/Inliner.java
 Thu Aug 24 12:56:34 2006
@@ -17,31 +17,31 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
 
+import javax.xml.XMLConstants;
+import javax.xml.namespace.NamespaceContext;
 import javax.xml.namespace.QName;
-import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
+import javax.xml.parsers.SAXParserFactory;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
 
-import org.apache.ws.jaxme.logging.Logger;
-import org.apache.ws.jaxme.logging.LoggerAccess;
+import org.apache.ws.jaxme.util.DOMBuilder;
 import org.apache.ws.jaxme.util.DOMSerializer;
 import org.apache.ws.jaxme.xs.SchemaTransformer;
 import org.apache.ws.jaxme.xs.XSParser;
 import org.apache.ws.jaxme.xs.jaxb.impl.JAXBParser;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
-import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
@@ -57,7 +57,6 @@
  * http://wiki.apache.org/ws/JaxMe/ExternalSchemaBindings</a>.
  */
 public class Inliner implements SchemaTransformer {
-       private static final Logger log = LoggerAccess.getLogger(Inliner.class);
        private final Document[] bindings;
        private XMLReader transformedXMLReader;
        private InputSource transformedInputSource;
@@ -68,19 +67,25 @@
                bindings = pBindings;
        }
 
-       private DocumentBuilder newDocumentBuilder() throws 
ParserConfigurationException {
-               final DocumentBuilderFactory dbf = 
DocumentBuilderFactory.newInstance();
-               dbf.setNamespaceAware(true);
-               dbf.setValidating(false);
-               return dbf.newDocumentBuilder();
-       }
-
        private Document read(InputSource pSource, XMLReader pReader)
                        throws SAXException, ParserConfigurationException, 
IOException {
-               DocumentBuilder db = newDocumentBuilder();
-               db.setEntityResolver(pReader.getEntityResolver());
-               db.setErrorHandler(pReader.getErrorHandler());
-               return db.parse(pSource);
+               SAXParserFactory spf = SAXParserFactory.newInstance();
+               spf.setNamespaceAware(true);
+               spf.setValidating(false);
+               XMLReader xr = spf.newSAXParser().getXMLReader();
+               xr.setEntityResolver(pReader.getEntityResolver());
+               xr.setErrorHandler(pReader.getErrorHandler());
+               DOMBuilder db = new DOMBuilder();
+               db.setPrefixMappingIsAttribute(true);
+               DocumentBuilderFactory dbf = 
DocumentBuilderFactory.newInstance();
+               dbf.setValidating(false);
+               dbf.setNamespaceAware(true);
+               Document doc = dbf.newDocumentBuilder().newDocument();
+               db.setDocument(doc);
+               db.setTarget(doc);
+               xr.setContentHandler(db);
+               xr.parse(pSource);
+               return doc;
        }
 
        private boolean isURIMatching(String pURI, Element pBindings) {
@@ -108,44 +113,145 @@
                return false;
        }
 
-       private void apply(Element pSchema, Element pBindings, String pURI) 
throws XPathExpressionException {
+       private void apply(final Node pTarget, Element pBindings, String pURI)
+                       throws XPathExpressionException, SAXException {
                final Attr nodeAttr = pBindings.getAttributeNodeNS(null, 
"node");
                if (!isURIMatching(pURI, pBindings)) {
                        return;
                }
                if (nodeAttr == null) {
-                       importChilds(pSchema, pBindings, pURI);
+                       importChilds(pTarget, pBindings, pURI);
                } else {
                        final XPath xpath = 
XPathFactory.newInstance().newXPath();
-                       final NodeList nodes = (NodeList) 
xpath.evaluate(nodeAttr.getValue(), pSchema, XPathConstants.NODESET);
+                       NamespaceContext ctx = new NamespaceContext(){
+                               public Iterator getPrefixes(String pURI) {
+                                       if (pURI == null) {
+                                               throw new 
IllegalArgumentException("The URI must not be null.");
+                                       }
+                                       if 
(XMLConstants.XML_NS_URI.equals(pURI)) {
+                                               return 
Collections.singletonList(XMLConstants.XML_NS_PREFIX).iterator();
+                                       }
+                                       if 
(XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(pURI)) {
+                                               return 
Collections.singletonList(XMLConstants.XMLNS_ATTRIBUTE).iterator();
+                                       }
+                                       List list = 
getPrefixDeclarations(pTarget);
+                                       List result = new ArrayList();
+                                       for (int i = 0;  i < list.size();  i += 
2) {
+                                               if (pURI.equals(list.get(i+1))) 
{
+                                                       String prefix = 
(String) list.get(i);
+                                                       if 
(!result.contains(prefix)) {
+                                                               
result.add(prefix);
+                                                       }
+                                               }
+                                       }
+                                       return result.iterator();
+                               }
+                               public String getPrefix(String pURI) {
+                                       String result = null;
+                                       Iterator iter = getPrefixes(pURI);
+                                       if (iter.hasNext()) {
+                                               result = (String) iter.next();
+                                       } else {
+                                               if ("".equals(pURI)) {
+                                                       result = 
XMLConstants.DEFAULT_NS_PREFIX;
+                                               }
+                                       }
+                                       return result;
+                               }
+                               public String getNamespaceURI(String pPrefix) {
+                                       if (pPrefix == null) {
+                                               throw new 
IllegalArgumentException("The prefix must not be null.");
+                                       }
+                                       String result = null;
+                                       if 
(XMLConstants.XML_NS_PREFIX.equals(pPrefix)) {
+                                               result = 
XMLConstants.XML_NS_URI;
+                                       } else if 
(XMLConstants.XMLNS_ATTRIBUTE.equals(pPrefix)) {
+                                               result = 
XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
+                                       } else {
+                                               List list = 
getPrefixDeclarations(pTarget);
+                                               for (int i = 0;  i < 
list.size();  i += 2) {
+                                                       if 
(pPrefix.equals(list.get(i))) {
+                                                               result = 
(String) list.get(i+1);
+                                                               break;
+                                                       }
+                                               }
+                                               if (result == null  &&  
pPrefix.equals(XMLConstants.DEFAULT_NS_PREFIX)) {
+                                                       result = "";
+                                               }
+                                       }
+                                       return result;
+                               }
+                               private List getPrefixDeclarations(Node 
pTarget) {
+                                       List list = new ArrayList();
+                                       addPrefixDeclarations(pTarget, list);
+                                       return list;
+                               }
+                               private void addPrefixDeclarations(Node pNode, 
List pList) {
+                                       if (pNode == null) {
+                                               return;
+                                       }
+                                       if (pNode.getNodeType() == 
Node.ELEMENT_NODE) {
+                                               Element e = (Element) pNode;
+                                               if (e.getNamespaceURI() == null 
 ||  "".equals(e.getNamespaceURI())) {
+                                                       
pList.add(XMLConstants.DEFAULT_NS_PREFIX);
+                                                       
pList.add(e.getPrefix());
+                                               } else {
+                                                       
pList.add(e.getPrefix());
+                                                       
pList.add(e.getNamespaceURI());
+                                               }
+                                               NamedNodeMap attrs = 
e.getAttributes();
+                                               for (int i = 0;  i < 
attrs.getLength();  i++) {
+                                                       Attr attr = (Attr) 
attrs.item(i);
+                                                       if 
(XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(attr.getNamespaceURI())) {
+                                                               
pList.add(attr.getPrefix());
+                                                               
pList.add(attr.getValue());
+                                                       } else if (null == 
attr.getNamespaceURI()  &&  
XMLConstants.XMLNS_ATTRIBUTE.equals(attr.getLocalName())) {
+                                                               
pList.add(attr.getLocalName());
+                                                               
pList.add(attr.getValue());
+                                                       }
+                                               }
+                                       }
+                                       
addPrefixDeclarations(pNode.getParentNode(), pList);
+                               }
+                       };
+                       xpath.setNamespaceContext(ctx);
+                       final NodeList nodes = (NodeList) 
xpath.evaluate(nodeAttr.getValue(), pTarget, XPathConstants.NODESET);
                        for (int i = 0;  i < nodes.getLength();  i++) {
                                final Node node = nodes.item(i);
                                if (node.getNodeType() == Node.ELEMENT_NODE
                                        &&  
XSParser.XML_SCHEMA_URI.equals(node.getNamespaceURI())) {
-                                       importChilds((Element) node, pBindings, 
pURI);
+                                       importChilds(node, pBindings, pURI);
                                }
                        }
                }
        }
 
-       private void importChilds(Element pTarget, Node pSource, String pURI) 
throws XPathExpressionException {
+       private void importChilds(Node pTarget, Node pSource, String pURI)
+                       throws XPathExpressionException, SAXException {
                final Document doc = pTarget.getOwnerDocument();
-               DocumentFragment df = doc.createDocumentFragment();
+               Element appInfoElement = null;
                for (Node child = pSource.getFirstChild();  child != null;  
child = child.getNextSibling()) {
-                       if (child.getNodeType() == Node.ELEMENT_NODE
-                               &&  
JAXBParser.JAXB_SCHEMA_URI.equals(child.getNamespaceURI())
-                               &&  "bindings".equals(child.getLocalName())) {
-                               apply(pTarget, (Element) child, pURI);
+                       if (child.getNodeType() != Node.ELEMENT_NODE) {
+                               continue;
+                       }
+                       Element e = (Element) child;
+                       if 
(JAXBParser.JAXB_SCHEMA_URI.equals(e.getNamespaceURI())
+                               &&  "bindings".equals(e.getLocalName())) {
+                               apply(pTarget, e, pURI);
                        } else {
-                               df.appendChild(doc.importNode(child, true));
+                               if (appInfoElement == null) {
+                                       if (pTarget.getNodeType() != 
Node.ELEMENT_NODE) {
+                                               throw new SAXException("Attempt 
to import childs into a node of type " +
+                                                               
pTarget.getNodeType() + ", perhaps invalid XPath expression?");
+                                       }
+                                       Element targetElement = (Element) 
pTarget;
+                                       final String prefix = 
pTarget.getPrefix();
+                                       Element annotationElement = 
getChild(targetElement, prefix, "annotation");
+                                       appInfoElement = 
getChild(annotationElement, prefix, "appinfo");
+                               }
+                               appInfoElement.appendChild(doc.importNode(e, 
true));
                        }
                }
-               if (df.hasChildNodes()) {
-                       String prefix = pTarget.getPrefix();
-                       Element annotationElement = getChild(pTarget, prefix, 
"annotation");
-                       Element appInfoElement = getChild(annotationElement, 
prefix, "appInfo");
-                       appInfoElement.appendChild(df);
-               }
        }
 
        private Element getChild(Element pParent, String pPrefix, String pName) 
{
@@ -164,20 +270,8 @@
                return e;
        }
 
-       private String asString(Document pDocument) throws SAXException {
-               final StringWriter sw = new StringWriter();
-               try {
-                       
TransformerFactory.newInstance().newTransformer().transform(new 
DOMSource(pDocument), new StreamResult(sw));
-               } catch (TransformerException e) {
-                       throw new SAXException(e);
-               }
-               return sw.toString();
-       }
-
        public void parse(InputSource pSource, XMLReader pReader) throws 
ParserConfigurationException, SAXException, IOException {
-               final String mName = "parse";
                final String uri = pSource.getSystemId();
-               log.entering(mName, uri);
                final Document schema = read(pSource, pReader);
                try {
                        for (int i = 0;  i < bindings.length;  i++) {

Added: 
webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/junit/BindingsTest.java
URL: 
http://svn.apache.org/viewvc/webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/junit/BindingsTest.java?rev=434486&view=auto
==============================================================================
--- 
webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/junit/BindingsTest.java
 (added)
+++ 
webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/junit/BindingsTest.java
 Thu Aug 24 12:56:34 2006
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2006  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.ws.jaxme.junit;
+
+import junit.framework.TestCase;
+
+import org.apache.ws.jaxme.test.bindings.vo.FooType;
+import org.apache.ws.jaxme.test.bindings.vo.ObjectFactory;
+import org.apache.ws.jaxme.test.bindings.vo.YesNoTypeClass;
+
+
+/**
+ * Tests using external binding files.
+ */
+public class BindingsTest extends TestCase {
+       /**
+        * Tests, whether the binding has moved the schema to the proper
+        * package and whether the string constants have been created.
+        */
+       public void testBindings() throws Exception {
+               FooType foo = new ObjectFactory().createFoo();
+               foo.setBar(YesNoTypeClass.YES);
+       }
+}

Added: webservices/jaxme/branches/b0_5/src/test/jaxb/bindings/bindings.jxb
URL: 
http://svn.apache.org/viewvc/webservices/jaxme/branches/b0_5/src/test/jaxb/bindings/bindings.jxb?rev=434486&view=auto
==============================================================================
--- webservices/jaxme/branches/b0_5/src/test/jaxb/bindings/bindings.jxb (added)
+++ webservices/jaxme/branches/b0_5/src/test/jaxb/bindings/bindings.jxb Thu Aug 
24 12:56:34 2006
@@ -0,0 +1,13 @@
+<jxb:bindings
+    version="1.0"
+    xmlns:jxb="http://java.sun.com/xml/ns/jaxb";
+    xmlns:xs="http://www.w3.org/2001/XMLSchema";>
+  <jxb:bindings schemaLocation="bindings.xsd" node="/xs:schema">
+       <jxb:schemaBindings>
+      <jxb:package name="org.apache.ws.jaxme.test.bindings.vo"/>
+       </jxb:schemaBindings>
+    <jxb:bindings node="xs:[EMAIL PROTECTED]'YesNoType']">
+      <jxb:typesafeEnumClass/>
+    </jxb:bindings>
+  </jxb:bindings>
+</jxb:bindings>

Added: webservices/jaxme/branches/b0_5/src/test/jaxb/bindings/bindings.xsd
URL: 
http://svn.apache.org/viewvc/webservices/jaxme/branches/b0_5/src/test/jaxb/bindings/bindings.xsd?rev=434486&view=auto
==============================================================================
--- webservices/jaxme/branches/b0_5/src/test/jaxb/bindings/bindings.xsd (added)
+++ webservices/jaxme/branches/b0_5/src/test/jaxb/bindings/bindings.xsd Thu Aug 
24 12:56:34 2006
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2003, 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.
+-->
+ <xs:schema
+    xmlns:xs="http://www.w3.org/2001/XMLSchema";
+    targetNamespace="http://ws.apache.org/jaxme/test/bindings";
+    xmlns:bnd="http://ws.apache.org/jaxme/test/bindings";
+    elementFormDefault="qualified"
+    attributeFormDefault="unqualified">
+  <xs:element name="foo">
+    <xs:complexType>
+      <xs:attribute name="bar" type="bnd:YesNoType"/>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:simpleType name="YesNoType">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="YES"/>
+      <xs:enumeration value="NO"/>
+    </xs:restriction>
+  </xs:simpleType>
+</xs:schema>

Modified: webservices/jaxme/branches/b0_5/src/test/jaxb/build.xml
URL: 
http://svn.apache.org/viewvc/webservices/jaxme/branches/b0_5/src/test/jaxb/build.xml?rev=434486&r1=434485&r2=434486&view=diff
==============================================================================
--- webservices/jaxme/branches/b0_5/src/test/jaxb/build.xml (original)
+++ webservices/jaxme/branches/b0_5/src/test/jaxb/build.xml Thu Aug 24 12:56:34 
2006
@@ -126,6 +126,11 @@
       <produces dir="${srcdir}" 
includes="org/apache/ws/jaxme/test/misc/enumeration/*"/>
       <produces dir="${srcdir}" 
includes="org/apache/ws/jaxme/test/misc/wildcards/*"/>
     </xjc>
+       <xjc target="${srcdir}">
+         <schema dir="${basedir}/bindings" includes="*.xsd"/>
+      <binding dir="${basedir}/bindings" includes="*.jxb"/>
+      <produces dir="${srcdir}" 
includes="org/apache/ws/jaxme/test/bindings/**/*"/>
+    </xjc>
   </target>
 
   <target name="compile" depends="generate">

Modified: 
webservices/jaxme/branches/b0_5/src/xs/org/apache/ws/jaxme/xs/impl/XSLogicalParser.java
URL: 
http://svn.apache.org/viewvc/webservices/jaxme/branches/b0_5/src/xs/org/apache/ws/jaxme/xs/impl/XSLogicalParser.java?rev=434486&r1=434485&r2=434486&view=diff
==============================================================================
--- 
webservices/jaxme/branches/b0_5/src/xs/org/apache/ws/jaxme/xs/impl/XSLogicalParser.java
 (original)
+++ 
webservices/jaxme/branches/b0_5/src/xs/org/apache/ws/jaxme/xs/impl/XSLogicalParser.java
 Thu Aug 24 12:56:34 2006
@@ -659,13 +659,13 @@
                XSContentHandler contentHandler = 
getXSContentHandler(pSource.getSystemId());
                XSContext data = getData();
                XMLReader xr = 
data.getXsObjectFactory().newXMLReader(isValidating());
-               xr.setContentHandler(contentHandler);
                SchemaTransformer transformer = 
data.getXSObjectFactory().getSchemaTransformer();
                if (transformer != null) {
                        transformer.parse(pSource, xr);
                        pSource = transformer.getTransformedInputSource();
                        xr = transformer.getTransformedXMLReader();
                }
+               xr.setContentHandler(contentHandler);
                xr.parse(pSource);
                return getSchema();
        }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to