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]