You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by ig...@apache.org on 2003/12/04 01:12:30 UTC

cvs commit: xml-xalan/java/xdocs/sources/xalan samples.xml

igorh       2003/12/03 16:12:30

  Modified:    java/xdocs/sources/xalan samples.xml
  Added:       java/samples/TransformThread TransformThread.java foo0.xml
                        foo0.xsl foo1.xml foo1.xsl
  Log:
  Transform Thread sample. Submitted by  Richard Cao.
  
  Revision  Changes    Path
  1.1                  xml-xalan/java/samples/TransformThread/TransformThread.java
  
  Index: TransformThread.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, Lotus
   * Development Corporation., http://www.lotus.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.FileOutputStream;
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.util.Properties;
  
  import javax.xml.parsers.DocumentBuilderFactory;
  import javax.xml.transform.Result;
  import javax.xml.transform.Source;
  import javax.xml.transform.Transformer;
  import javax.xml.transform.TransformerFactory;
  import javax.xml.transform.dom.DOMResult;
  import javax.xml.transform.dom.DOMSource;
  import javax.xml.transform.sax.SAXResult;
  import javax.xml.transform.sax.SAXSource;
  import javax.xml.transform.stream.StreamResult;
  import javax.xml.transform.stream.StreamSource;
  
  import org.xml.sax.InputSource;
  import org.xml.sax.helpers.DefaultHandler;
  
  /**
   * What it does: this sample creates multiple threads 
   * and runs them. Each thread will be assigned a particular
   * stylesheet. Each thread will run multiple transformations on
   * various xml files using its own transformer.
   * 
   * Note: the flavors used by the transformations can be
   * configured below by changing SOURCE_FLAVOR and
   * RESULT_FLAVOR. XSLTC can also be used by changing
   * USE_XSLTC.
   * 
   * Description of files included with the sample:
   * 
   * foo0.xsl and foo1.xsl: foo0.xsl is the stylesheet used 
   * for transformations by thread #0, foo1.xsl is the stylesheet
   * used by thread #1.
   * 
   * foo0.xml and foo1.xml: foo0.xml and foo1.xml are the XML
   * files used for the first and second transformations done
   * by each thread.
   * 
   * Output will go to *.out files in the TransformThread directory.
   * 
   * @author <a href="mailto:richcao@ca.ibm.com">Richard Cao</a>
   */
  public class TransformThread implements Runnable
  {    
    // Flavors
    public final static int STREAM = 0;
    public final static int SAX = 1;
    public final static int DOM = 2;
    public final static String[] flavorNames =
      new String[] { "Stream", "SAX", "DOM" };
  
    // Configurable options
    private static int SOURCE_FLAVOR = STREAM;
      // private static int SOURCE_FLAVOR = SAX;
      // private static int SOURCE_FLAVOR = DOM;
      
    private static int RESULT_FLAVOR = STREAM;
      // private static int RESULT_FLAVOR = SAX;
      // private static int RESULT_FLAVOR = DOM;
    
    private static boolean USE_XSLTC = false;
      // private static boolean useXSLTC = true;
  
  
    // Threads
    private final static int NUM_THREADS = 2;
    private static TransformThread INSTANCES[] = null;
    protected Thread m_thread = null;
    
    // Number of transformations per thread
    private final static int NUM_TRANSFORMATIONS = 2;
  
    // Files names and extensions
    private final static String XML_IN_BASE = "foo";
    private final static String XML_EXT = ".xml";
    private final static String XSL_IN_BASE = "foo";
    private final static String XSL_EXT = ".xsl";
    private final static String FILE_OUT_BASE = "foo_";
    private final static String FILE_OUT_EXT = ".out";
  
    // Thread identifier
    private int m_thrdNum = -1;
  
    private InputStream[] m_inStream = null;
  
    private Source[] m_inSource = null;
    private Result[] m_outResult = null;
  
    // One Transformer per thread since Transformers
    // are _NOT_ thread-safe
    private Transformer m_transformer = null;
  
    /** Constructs the TransformThread object
     * @param thrdNum a unique identifier for this object
     */
    public TransformThread(int thrdNum)
    {
      m_thrdNum = thrdNum;
  
      m_inStream = new InputStream[NUM_TRANSFORMATIONS];
      m_inSource = new Source[NUM_TRANSFORMATIONS];
      m_outResult = new Result[NUM_TRANSFORMATIONS];
  
      try
      {
        initSource();
        initResult();
  
        // ensure xslSourceURI is a valid URI
        final String xslSourceFileName = XSL_IN_BASE + m_thrdNum + XSL_EXT;
        final String xslSourceURI = (new File(xslSourceFileName)).toURL().toString();
        StreamSource xslSource = new StreamSource(xslSourceFileName);
        xslSource.setSystemId(xslSourceURI);
        
        // Initialize the tranformer
        m_transformer =
          TransformerFactory.newInstance().newTransformer(xslSource);
        m_thread = new Thread(this);
      }
      catch (Throwable e)
      {
        e.printStackTrace();
        System.exit(1);
      }
    }
  
    /** Initialize the results (m_outResult) according
     * to RESULT_FLAVOR
     */
    private void initResult()
    {
      try 
      {
        for (int i = 0; i < NUM_TRANSFORMATIONS; i++)
        {
          switch (RESULT_FLAVOR) 
          {
            case STREAM :
                OutputStream outStream =
                  new FileOutputStream(FILE_OUT_BASE + "thread_" 
                    + m_thrdNum + "_transformation_" + i + FILE_OUT_EXT);
                  
                m_outResult[i] = new StreamResult(outStream);
              break;
  
            case SAX :
              DefaultHandler defaultHandler = new DefaultHandler();
              m_outResult[i] = new SAXResult(defaultHandler);
              break;
  
            case DOM :
              m_outResult[i] = new DOMResult();
              break;
          }  
        }
      }
      catch (Exception e)
      { 
        e.printStackTrace();
        System.exit(1);
      }
    }
  
    /** Initialize the sources (m_inSource) according
     * to SOURCE_FLAVOR
     */
    private void initSource()
    {
      try 
      {
        for (int i = 0; i < NUM_TRANSFORMATIONS; i++)
        {
          // Ensure we get a valid URI
          final String sourceXMLURI = (new File(XML_IN_BASE + i + XML_EXT)).toURL().toString();
          
          // Open for input
          m_inStream[i] = new FileInputStream(XML_IN_BASE + i + XML_EXT);
          
          switch (SOURCE_FLAVOR)
          {
            case STREAM :
              m_inSource[i] = new StreamSource(m_inStream[i]);
              break;
    
            case SAX :
              m_inSource[i] = new SAXSource(new InputSource(m_inStream[i]));
              break;
    
            case DOM :
              try
              {
                DocumentBuilderFactory dfactory =
                  DocumentBuilderFactory.newInstance();
    
                // Must always setNamespaceAware when 
                // building xsl stylesheets
                dfactory.setNamespaceAware(true);
                m_inSource[i] =
                  new DOMSource(dfactory.newDocumentBuilder().parse(m_inStream[i]));
              }
              catch (Exception e)
              {
                e.printStackTrace();
              }
              break;
          }
    
          if (m_inSource[i] != null)
          {
            // If we don't do this, the transformer 
            // won't know how to resolve relative URLs 
            // in the stylesheet.
            m_inSource[i].setSystemId(sourceXMLURI);
          }
        }
      }
      catch (Exception e)
      { 
        e.printStackTrace();
        System.exit(1);
      }
    }
  
    /**
     * @see java.lang.Runnable#run()
     */
    public void run()
    {
      try
      {
        // Perform multiple transformations with the same
        // transformer
        for (int i = 0; i < NUM_TRANSFORMATIONS; i++)
        {
          m_transformer.transform(m_inSource[i], m_outResult[i]);
        }
      }
      catch (Exception e)
      {
        e.printStackTrace();
        System.exit(1);
      }
    }
  
    /** Creates thread instances
     */
    private static void initThreads()
    {
      INSTANCES = new TransformThread[NUM_THREADS];
  
      for (int count = 0; count < NUM_THREADS; count++)
      {
        INSTANCES[count] = new TransformThread(count);
      }
    }
    
    /** Sets the appropriate system properties if XSLTC is
     * to be used (according to USE_XSLTC)
     */
    private static void initSystemProperties()
    {
      if (USE_XSLTC) 
      {
        // Set the TransformerFactory system property if XSLTC is required
        // Note: To make this sample more flexible, load properties from a properties file.
        // The setting for the Xalan Transformer is "org.apache.xalan.processor.TransformerFactoryImpl"
        String key = "javax.xml.transform.TransformerFactory";
        String value = "org.apache.xalan.xsltc.trax.TransformerFactoryImpl";
        Properties props = System.getProperties();
        props.put(key, value); 
        System.setProperties(props);
      }
    }
  
    /**
     * Usage:
     * java TransformThread
     */
    public static void main(String argv[])
    {
      try
      { 
        initSystemProperties();
        initThreads();
  
        for (int count = 0; count < NUM_THREADS; count++)
        {
          INSTANCES[count].m_thread.start();
        }
      }
      catch (Throwable e)
      {
        e.printStackTrace();
        System.exit(1);
      }
    }
  }
  
  
  
  1.1                  xml-xalan/java/samples/TransformThread/foo0.xml
  
  Index: foo0.xml
  ===================================================================
  <?xml version="1.0"?>
  <doc>Hello foo0!</doc>
  
  
  
  1.1                  xml-xalan/java/samples/TransformThread/foo0.xsl
  
  Index: foo0.xsl
  ===================================================================
  <?xml version="1.0"?> 
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="doc">
      <out><xsl:value-of select="."/></out>
    </xsl:template>
  </xsl:stylesheet>
  
  
  
  1.1                  xml-xalan/java/samples/TransformThread/foo1.xml
  
  Index: foo1.xml
  ===================================================================
  <?xml version="1.0"?>
  <doc>Hello foo1!</doc>
  
  
  
  1.1                  xml-xalan/java/samples/TransformThread/foo1.xsl
  
  Index: foo1.xsl
  ===================================================================
  <?xml version="1.0"?> 
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="doc">
      <out><xsl:value-of select="."/></out>
    </xsl:template>
  </xsl:stylesheet>
  
  
  
  1.59      +11 -1     xml-xalan/java/xdocs/sources/xalan/samples.xml
  
  Index: samples.xml
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/xdocs/sources/xalan/samples.xml,v
  retrieving revision 1.58
  retrieving revision 1.59
  diff -u -r1.58 -r1.59
  --- samples.xml	11 Sep 2003 16:01:54 -0000	1.58
  +++ samples.xml	4 Dec 2003 00:12:30 -0000	1.59
  @@ -74,6 +74,7 @@
   <li><link anchor="trace">Trace</link></li>
   <li><link anchor="validate">Validate</link></li>
   <li><link anchor="trax">trax</link></li>
  +<li><link anchor="transformthread">TransformThread</link></li>
   </ul>
   <p>&xslt4ji; servlet samples:</p>
   <ul>
  @@ -568,5 +569,14 @@
        <p>Run this sample from the trax subdirectory with</p>
        <p><code>java Examples</code></p>
        <p>and examine the source in Examples.java and ExampleContentHandler.java.</p>
  -     </s2>&xsltcsamples;
  +     </s2>
  +     
  +     <anchor name="transformthread"/>
  +     <s2 title="TransformThread">
  +     <p>What it does: spawns multiple threads, with each thread running two transformations on two different XML files.</p>
  +     <p>Run this sample from the TransformThread subdirectory with</p>
  +     <p><code>java TransformThread</code></p>
  +     <p>and examine the source in TransformThread.java. A more detailed description along with configuration options are listed in the header.</p>
  +     </s2>
  +     &xsltcsamples;
   </s1>
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org