added XMLDocument, XMLSchema, and XSLTransformation classes.
[utils] / support / general / src / main / java / org / wamblee / xml / XSLTransformation.java
diff --git a/support/general/src/main/java/org/wamblee/xml/XSLTransformation.java b/support/general/src/main/java/org/wamblee/xml/XSLTransformation.java
new file mode 100644 (file)
index 0000000..26a515e
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2005-2011 the original author or authors.
+ * 
+ * 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.wamblee.xml;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.URI;
+
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+import javax.xml.transform.URIResolver;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.w3c.dom.Document;
+
+/**
+ * Represents an XSL Transformation.
+ * @author Erik Brakkee
+ *
+ */
+public class XSLTransformation implements XMLProcessor, XMLTextProcessor {
+
+    private TransformerFactory factory;
+    private Transformer transformer;
+    private String systemId; 
+
+    /**
+     * Identity transform.
+     */
+    public XSLTransformation() throws XMLException {
+        factory = TransformerFactory.newInstance();
+        try {
+            transformer = factory.newTransformer();
+            systemId = "identityTransform";
+        } catch (TransformerConfigurationException e) {
+            throw new XMLException(e.getMessage(), e);
+        }
+    }
+
+    public XSLTransformation(URI aUri) throws XMLException {
+        try {
+            factory = TransformerFactory.newInstance();
+            Source source = new StreamSource(aUri.toURL().openStream());
+            source.setSystemId(aUri.toString());
+            systemId = aUri.toString();
+            transformer = factory.newTransformer(source);
+        } catch (MalformedURLException e) {
+            throw new XMLException(e.getMessage(), e);
+        } catch (TransformerConfigurationException e) {
+            throw new XMLException(e.getMessage(), e);
+        } catch (TransformerFactoryConfigurationError e) {
+            throw new XMLException(e.getMessage(), e);
+        } catch (IOException e) {
+            throw new XMLException(e.getMessage(), e);
+        }
+
+    }
+
+    public XSLTransformation(String aSystemId, URIResolver aResolver)
+        throws XMLException {
+        try {
+            factory = TransformerFactory.newInstance();
+            factory.setURIResolver(aResolver);
+            Source source = aResolver.resolve(aSystemId, null);
+            source.setSystemId(aSystemId);
+            systemId = aSystemId;
+            transformer = factory.newTransformer(source);
+        } catch (TransformerConfigurationException e) {
+            throw new XMLException(e.getMessage(), e);
+        } catch (TransformerFactoryConfigurationError e) {
+            throw new XMLException(e.getMessage(), e);
+        } catch (TransformerException e) { 
+            throw new XMLException(e.getMessage(), e);
+        }
+    }
+    
+    /**
+     * Configure the transformation to do pretty-printing. 
+     */
+    public XSLTransformation setPrettyPrint(boolean aPrettyPrint) { 
+        transformer.setOutputProperty(OutputKeys.INDENT, aPrettyPrint ? "yes": "no");
+        return this; 
+    }
+    
+  
+    public XSLTransformation transformation(URI aUri) throws XMLException {
+        return new XSLTransformation(aUri);
+    }
+
+    public XSLTransformation transformation(String aSystemId, URIResolver aResolver)
+        throws XMLException {
+        return new XSLTransformation(aSystemId, aResolver);
+    }
+
+    @Override
+    public DOMSource process(DOMSource aDocument) throws XMLException {
+        DOMResult result = new DOMResult();
+        try {
+            transform(aDocument, result);
+        } catch (IOException e) {
+            throw new XMLException(e.getMessage(), e);
+        } catch (TransformerException e) {
+            throw new XMLException(e.getMessage(), e);
+        }
+        Document docraw = (Document)result.getNode();
+        DOMSource resultSource = new DOMSource(docraw); 
+        resultSource.setSystemId(aDocument.getSystemId() + "/transformed(" + systemId + ")");
+        return resultSource;
+    }
+
+    @Override
+    public void write(DOMSource aDocument, OutputStream aStream) throws XMLException {
+        StreamResult result = new StreamResult(aStream);
+        try {
+            transform(aDocument, result);
+        } catch (IOException e) {
+            throw new XMLException(e.getMessage(), e);
+        } catch (TransformerException e) {
+            throw new XMLException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * Transforms a document using XSLT.
+     * 
+     * @param aSource
+     *            Document to transform.
+     * @param aResult
+     *            Result of the transformation.
+     * 
+     * @throws IOException
+     *             In case of problems reading resources.
+     * @throws TransformerException
+     *             In case transformation fails.
+     */
+    private void transform(Source aSource, Result aResult) throws IOException,
+        TransformerException {
+        try {
+            transformer.transform(aSource, aResult);
+        } catch (TransformerConfigurationException e) {
+            throw new TransformerException(
+                "Configuration problem of XSLT transformation", e);
+        }
+    }
+}