/* * 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); } } }