You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jaxme-dev@ws.apache.org by jo...@apache.org on 2005/12/25 01:49:58 UTC

svn commit: r358959 - in /webservices/jaxme/branches/MAVEN/projects: jm/src/main/java/org/apache/ws/jaxme/generator/impl/ jm/src/main/java/org/apache/ws/jaxme/generator/sg/impl/ xs/src/main/java/org/apache/ws/jaxme/xs/

Author: jochen
Date: Sat Dec 24 16:49:45 2005
New Revision: 358959

URL: http://svn.apache.org/viewcvs?rev=358959&view=rev
Log:
Added support for external binding files, based on a suggestion from
Ortwin Glueck.

Added:
    webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/impl/Inliner.java
    webservices/jaxme/branches/MAVEN/projects/xs/src/main/java/org/apache/ws/jaxme/xs/SchemaTransformer.java
Modified:
    webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/impl/JAXBSGFactory.java

Added: webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/impl/Inliner.java
URL: http://svn.apache.org/viewcvs/webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/impl/Inliner.java?rev=358959&view=auto
==============================================================================
--- webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/impl/Inliner.java (added)
+++ webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/impl/Inliner.java Sat Dec 24 16:49:45 2005
@@ -0,0 +1,165 @@
+/*
+ * 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.
+ */
+package org.apache.ws.jaxme.generator.impl;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+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.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.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLFilterImpl;
+
+
+/** Performs the modifications on an XML schema file, as
+ * specified by an external binding file. This is based
+ * on a suggestion from Ortwin Glück, see
+ * <a href="http://wiki.apache.org/ws/JaxMe/ExternalSchemaBindings">
+ * http://wiki.apache.org/ws/JaxMe/ExternalSchemaBindings</a>.
+ */
+public class Inliner implements SchemaTransformer {
+	private static final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+	static {
+		dbf.setNamespaceAware(true);
+		dbf.setValidating(false);
+	}
+
+	private final Document[] bindings;
+	private XMLReader transformedXMLReader;
+	private InputSource transformedInputSource;
+
+	/** Creates a new instance with the given bindings.
+	 */
+	public Inliner(Document[] pBindings) {
+		bindings = pBindings;
+	}
+
+	private Document read(InputSource pSource, XMLReader pReader)
+			throws SAXException, ParserConfigurationException, IOException {
+		DocumentBuilder db = dbf.newDocumentBuilder();
+		db.setEntityResolver(pReader.getEntityResolver());
+		db.setErrorHandler(pReader.getErrorHandler());
+		return db.parse(pSource);
+	}
+
+	private void apply(Document pSchema, Document pBindings, String pURI) throws XPathExpressionException {
+		for (Iterator iter = getBindingElements(pBindings, pURI);  iter.hasNext();  ) {
+			Element e = (Element) iter.next();
+			String xpathQuery = e.getAttribute("node");
+			XPathFactory xpathFactory = XPathFactory.newInstance();
+			XPath xpath = xpathFactory.newXPath();
+			NodeList nodes = (NodeList) xpath.evaluate(xpathQuery, e, XPathConstants.NODESET);
+			for (int i = 0;  i < nodes.getLength();  i++) {
+				Node node = nodes.item(i);
+				if (node.getNodeType() != Node.ELEMENT_NODE) {
+					continue;
+				}
+				Element match = (Element) node;
+				if (!XSParser.XML_SCHEMA_URI.equals(match.getNamespaceURI())) {
+					continue;
+				}
+				String prefix = match.getPrefix();
+				Element annotationElement = getChild(match, prefix, "annotation");
+				Element appInfoElement = getChild(annotationElement, prefix, "appInfo");
+				for (Node child = e.getFirstChild();  child != null;  child = child.getNextSibling()) {
+					appInfoElement.appendChild(pSchema.importNode(child, true));
+				}
+			}
+		}
+	}
+
+	private Iterator getBindingElements(Document pBindings, String pURI) {
+		Element root = pBindings.getDocumentElement();
+		List result = new ArrayList();
+		for (Node child = root.getFirstChild();  child != null;  child = child.getNextSibling()) {
+			if (child.getNodeType() == Node.ELEMENT_NODE) {
+				Element e = (Element) child;
+				if (JAXBParser.JAXB_SCHEMA_URI.equals(e.getNamespaceURI())  &&
+					"bindings".equals(e.getLocalName())  &&
+					pURI.equals(e.getAttribute("schemaLocation"))) {
+					result.add(e);
+				}
+			}
+		}
+		return result.iterator();
+	}
+
+	private Element getChild(Element pParent, String pPrefix, String pName) {
+		for (Node child = pParent.getFirstChild();  child != null;  child = child.getNextSibling()) {
+			if (child.getNodeType() == Node.ELEMENT_NODE) {
+				Element e = (Element) child;
+				if (pName.equals(e.getLocalName())  &&  XSParser.XML_SCHEMA_URI.equals(e.getNamespaceURI())) {
+					return e;
+				}
+			}
+		}
+
+		String qName = (pPrefix == null || pPrefix.length() == 0) ? pName : pPrefix + ":" + pName;
+		Element e = pParent.getOwnerDocument().createElementNS(XSParser.XML_SCHEMA_URI, qName);
+		pParent.insertBefore(e, pParent.getFirstChild());
+		return e;
+	}
+
+	public void parse(InputSource pSource, XMLReader pReader) throws ParserConfigurationException, SAXException, IOException {
+		final Document schema = read(pSource, pReader);
+		String uri = pSource.getSystemId();
+		if (uri != null) {
+			try {
+				for (int i = 0;  i < bindings.length;  i++) {
+					apply(schema, bindings[i], uri);
+				}
+			} catch (XPathExpressionException e) {
+				throw new SAXException(e);
+			}
+		}
+		transformedInputSource = new InputSource();
+		transformedXMLReader = new XMLFilterImpl(){
+			public void parse(InputSource pInput) throws SAXException, IOException {
+				new DOMSerializer().serialize(schema, this);
+			}
+
+			public void parse(String pSystemId) throws SAXException, IOException {
+				throw new IllegalStateException("Not implemented");
+			}
+		};
+	}
+
+	public InputSource getTransformedInputSource() {
+		return transformedInputSource;
+	}
+
+	public XMLReader getTransformedXMLReader() {
+		return transformedXMLReader;
+	}
+}

Modified: webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/impl/JAXBSGFactory.java
URL: http://svn.apache.org/viewcvs/webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/impl/JAXBSGFactory.java?rev=358959&r1=358958&r2=358959&view=diff
==============================================================================
--- webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/impl/JAXBSGFactory.java (original)
+++ webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/impl/JAXBSGFactory.java Sat Dec 24 16:49:45 2005
@@ -24,7 +24,7 @@
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.ws.jaxme.generator.Generator;
-import org.apache.ws.jaxme.generator.Inliner;
+import org.apache.ws.jaxme.generator.impl.Inliner;
 import org.apache.ws.jaxme.generator.sg.Context;
 import org.apache.ws.jaxme.generator.sg.Facet;
 import org.apache.ws.jaxme.generator.sg.GroupSG;

Added: webservices/jaxme/branches/MAVEN/projects/xs/src/main/java/org/apache/ws/jaxme/xs/SchemaTransformer.java
URL: http://svn.apache.org/viewcvs/webservices/jaxme/branches/MAVEN/projects/xs/src/main/java/org/apache/ws/jaxme/xs/SchemaTransformer.java?rev=358959&view=auto
==============================================================================
--- webservices/jaxme/branches/MAVEN/projects/xs/src/main/java/org/apache/ws/jaxme/xs/SchemaTransformer.java (added)
+++ webservices/jaxme/branches/MAVEN/projects/xs/src/main/java/org/apache/ws/jaxme/xs/SchemaTransformer.java Sat Dec 24 16:49:45 2005
@@ -0,0 +1,31 @@
+package org.apache.ws.jaxme.xs;
+
+import java.io.IOException;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+
+/** A schema transformer is able to modify a schema, which
+ * is being read. This is used, for example, to implement
+ * the external JAXB binding files.
+ */
+public interface SchemaTransformer {
+	/** Reads the given input source.
+	 */
+	public void parse(InputSource pSource, XMLReader pReader)
+			throws ParserConfigurationException, SAXException, IOException;
+
+	/** Returns the new input source. Called after
+	 * {@link #parse(InputSource, XMLReader)}.
+	 */
+	public InputSource getTransformedInputSource();
+
+	/** Returns the new XML reader. Called after
+	 * {@link #parse(InputSource, XMLReader)}.
+	 */
+	public XMLReader getTransformedXMLReader();
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: jaxme-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: jaxme-dev-help@ws.apache.org