001    /*
002     * Copyright 1999-2004 The Apache Software Foundation.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.kew.transformation;
017    
018    import java.io.IOException;
019    
020    import javax.xml.transform.TransformerConfigurationException;
021    import javax.xml.transform.TransformerException;
022    import javax.xml.transform.TransformerFactory;
023    import javax.xml.transform.sax.SAXResult;
024    import javax.xml.transform.sax.SAXSource;
025    import javax.xml.transform.sax.SAXTransformerFactory;
026    import javax.xml.transform.sax.TransformerHandler;
027    import javax.xml.transform.stream.StreamSource;
028    
029    import org.apache.xml.serializer.OutputPropertiesFactory;
030    import org.apache.xml.serializer.Serializer;
031    import org.apache.xml.serializer.SerializerFactory;
032    import org.junit.Test;
033    import org.kuali.rice.kew.test.KEWTestCase;
034    import org.xml.sax.InputSource;
035    import org.xml.sax.SAXException;
036    import org.xml.sax.XMLReader;
037    import org.xml.sax.helpers.XMLReaderFactory;
038    
039      /**
040       * This example shows how to chain a series of transformations by
041       * piping SAX events from one Transformer to another. Each Transformer
042       * operates as a SAX2 XMLFilter/XMLReader.
043       */
044    public class Pipe extends KEWTestCase
045    {
046            @Test
047            public void testPipe()
048            throws TransformerException, TransformerConfigurationException, 
049             SAXException, IOException         
050            {
051        // Instantiate  a TransformerFactory.
052            TransformerFactory tFactory = TransformerFactory.newInstance();
053        // Determine whether the TransformerFactory supports The use uf SAXSource 
054        // and SAXResult
055        if (tFactory.getFeature(SAXSource.FEATURE) && tFactory.getFeature(SAXResult.FEATURE))
056        { 
057          // Cast the TransformerFactory to SAXTransformerFactory.
058          SAXTransformerFactory saxTFactory = ((SAXTransformerFactory) tFactory);     
059          // Create a TransformerHandler for each stylesheet.
060          TransformerHandler tHandler1 = saxTFactory.newTransformerHandler(new StreamSource(Pipe.class.getResourceAsStream("foo1.xsl")));
061          TransformerHandler tHandler2 = saxTFactory.newTransformerHandler(new StreamSource(Pipe.class.getResourceAsStream("foo2.xsl")));
062          TransformerHandler tHandler3 = saxTFactory.newTransformerHandler(new StreamSource(Pipe.class.getResourceAsStream("foo3.xsl")));
063        
064          // Create an XMLReader.
065                XMLReader reader = XMLReaderFactory.createXMLReader();
066          reader.setContentHandler(tHandler1);
067          reader.setProperty("http://xml.org/sax/properties/lexical-handler", tHandler1);
068    
069          tHandler1.setResult(new SAXResult(tHandler2));
070          tHandler2.setResult(new SAXResult(tHandler3));
071    
072          // transformer3 outputs SAX events to the serializer.
073          java.util.Properties xmlProps = OutputPropertiesFactory.getDefaultMethodProperties("xml");
074          xmlProps.setProperty("indent", "yes");
075          xmlProps.setProperty("standalone", "no");
076          Serializer serializer = SerializerFactory.getSerializer(xmlProps);
077          serializer.setOutputStream(System.out);
078          tHandler3.setResult(new SAXResult(serializer.asContentHandler()));
079    
080                // Parse the XML input document. The input ContentHandler and output ContentHandler
081          // work in separate threads to optimize performance.   
082          reader.parse(new InputSource(Pipe.class.getResourceAsStream("foo.xml")));
083        }
084      }
085    }