FileDocCategorySizeDatePackage
XSLTProcessorApplet.javaAPI DocJava SE 5 API21945Fri Aug 26 14:55:30 BST 2005com.sun.org.apache.xalan.internal.client

XSLTProcessorApplet

public class XSLTProcessorApplet extends Applet
Provides applet host for the XSLT processor. To perform transformations on an HTML client:
  1. Use an <applet> tag to embed this applet in the HTML client.
  2. Use the DocumentURL and StyleURL PARAM tags or the {@link #setDocumentURL} and {@link #setStyleURL} methods to specify the XML source document and XSL stylesheet.
  3. Call the {@link #getHtmlText} method (or one of the transformToHtml() methods) to perform the transformation and return the result as a String.
xsl.usage
general

Fields Summary
TransformerFactory
m_tfactory
The stylesheet processor.
private String
m_styleURL
private String
m_documentURL
private final String
PARAM_styleURL
private final String
PARAM_documentURL
private String
m_styleURLOfCached
private String
m_documentURLOfCached
private URL
m_codeBase
Save this for use on the worker thread; may not be necessary.
private String
m_treeURL
private URL
m_documentBase
DocumentBase URL
private transient Thread
m_callThread
Thread stuff for the trusted worker thread.
private transient TrustedAgent
m_trustedAgent
private transient Thread
m_trustedWorker
Thread for running TrustedAgent.
private transient String
m_htmlText
Where the worker thread puts the HTML text.
private transient String
m_sourceText
Where the worker thread puts the document/stylesheet text.
private transient String
m_nameOfIDAttrOfElemToModify
Stylesheet attribute name and value that the caller can set.
private transient String
m_elemIdToModify
private transient String
m_attrNameToSet
private transient String
m_attrValueToSet
private Enumeration
m_keys
Stylesheet parameter keys
transient Hashtable
m_parameters
Stylesheet parameter key/value pair stored in a hashtable
Constructors Summary
public XSLTProcessorApplet()
The XSLTProcessorApplet constructor takes no arguments.


           
   
Methods Summary
public voiddestroy()
Cleanup; called when applet is terminated and unloaded.

    if (null != m_trustedWorker)
    {
      m_trustedWorker.stop();

      // m_trustedWorker.destroy();
      m_trustedWorker = null;
    }
    m_styleURLOfCached = null;
    m_documentURLOfCached = null;
  
public java.lang.StringescapeString(java.lang.String s)
Given a String containing markup, escape the markup so it can be displayed in the browser.

param
s String to escape The escaped string.

    StringBuffer sb = new StringBuffer();
    int length = s.length();

    for (int i = 0; i < length; i++)
    {
      char ch = s.charAt(i);

      if ('<" == ch)
      {
        sb.append("<");
      }
      else if ('>" == ch)
      {
        sb.append(">");
      }
      else if ('&" == ch)
      {
        sb.append("&");
      }
      else if (0xd800 <= ch && ch < 0xdc00)
      {
        // UTF-16 surrogate
        int next;

        if (i + 1 >= length)
        {
          throw new RuntimeException(
            XSLMessages.createMessage(
              XSLTErrorResources.ER_INVALID_UTF16_SURROGATE,
              new Object[]{ Integer.toHexString(ch) }));  //"Invalid UTF-16 surrogate detected: "

          //+Integer.toHexString(ch)+ " ?");
        }
        else
        {
          next = s.charAt(++i);

          if (!(0xdc00 <= next && next < 0xe000))
            throw new RuntimeException(
              XSLMessages.createMessage(
                XSLTErrorResources.ER_INVALID_UTF16_SURROGATE,
                new Object[]{
                  Integer.toHexString(ch) + " "
                  + Integer.toHexString(next) }));  //"Invalid UTF-16 surrogate detected: "

          //+Integer.toHexString(ch)+" "+Integer.toHexString(next));
          next = ((ch - 0xd800) << 10) + next - 0xdc00 + 0x00010000;
        }
        sb.append("&#x");
        sb.append(Integer.toHexString(next));
        sb.append(";");
      }
      else
      {
        sb.append(ch);
      }
    }
    return sb.toString();
  
public voidfreeCache()
The processor keeps a cache of the source and style trees, so call this method if they have changed or you want to do garbage collection.

    m_styleURLOfCached = null;
    m_documentURLOfCached = null;
  
public java.lang.StringgetAppletInfo()
Get basic information about the applet

return
A String with the applet name and author.

    return "Name: XSLTProcessorApplet\r\n" + "Author: Scott Boag";
  
public java.lang.StringgetHtmlText()
Assuming the stylesheet URL and the input XML URL have been set, perform the transformation and return the result as a String.

return
A string that contains the contents pointed to by the URL.

    m_trustedAgent.m_getData = true;
    m_callThread = Thread.currentThread();
    try
    {
      synchronized (m_callThread)
      {
        m_callThread.wait();
      }
    }
    catch (InterruptedException ie)
    {
      System.out.println(ie.getMessage());
    }
    return m_htmlText;
  
public java.lang.String[][]getParameterInfo()
Get descriptions of the applet parameters.

return
A two-dimensional array of Strings with Name, Type, and Description for each parameter.


    String[][] info =
    {
      { PARAM_styleURL, "String", "URL to an XSL stylesheet" },
      { PARAM_documentURL, "String", "URL to an XML document" },
    };

    return info;
  
public java.lang.StringgetResultTreeAsText()
Get the HTML result Tree as a text string suitable for display in a browser. Note that this is for display of the XML itself, not for rendering of HTML by the browser.

return
Transformation result as unmarked text.
throws
Exception thrown if tree can not be converted.

    return escapeString(getHtmlText());
  
private java.lang.StringgetSource()
Use a Transformer to copy the source document to a StreamResult.

return
the document as a string

    StringWriter osw = new StringWriter();
    PrintWriter pw = new PrintWriter(osw, false);
    String text = "";
    try
    {
      URL docURL = new URL(m_documentBase, m_treeURL);
      synchronized (m_tfactory)
      {
        Transformer transformer = m_tfactory.newTransformer();
        StreamSource source = new StreamSource(docURL.toString());    
        StreamResult result = new StreamResult(pw);
        transformer.transform(source, result);
        text = osw.toString();
      }
    }
    catch (MalformedURLException e)
    {
      e.printStackTrace();
      System.exit(-1);
    }      
    catch (Exception any_error)
    {
      any_error.printStackTrace();
    }
    return text;
  
public java.lang.StringgetSourceTreeAsText()
Get the XML source Tree as a text string suitable for display in a browser. Note that this is for display of the XML itself, not for rendering of HTML by the browser.

return
XML source document as a string.
throws
Exception thrown if tree can not be converted.

    return getTreeAsText(m_documentURL);
  
public java.lang.StringgetStyleTreeAsText()
Get the XSL style Tree as a text string suitable for display in a browser. Note that this is for display of the XML itself, not for rendering of HTML by the browser.

return
The XSL stylesheet as a string.
throws
Exception thrown if tree can not be converted.

    return getTreeAsText(m_styleURL);
  
public java.lang.StringgetTreeAsText(java.lang.String treeURL)
Get an XML document (or stylesheet)

param
treeURL valid URL string for the document.
return
document
throws
IOException

    m_treeURL = treeURL;
    m_trustedAgent.m_getData = true;
    m_trustedAgent.m_getSource = true;
    m_callThread = Thread.currentThread();
    try
    {
      synchronized (m_callThread)
      {
        m_callThread.wait();
      }
    }
    catch (InterruptedException ie)
    {
      System.out.println(ie.getMessage());
    }
    return m_sourceText;
  
public voidinit()
Standard applet initialization.


    // PARAMETER SUPPORT
    //          The following code retrieves the value of each parameter
    // specified with the <PARAM> tag and stores it in a member
    // variable.
    //----------------------------------------------------------------------
    String param;

    // styleURL: Parameter description
    //----------------------------------------------------------------------
    param = getParameter(PARAM_styleURL);
    
    // stylesheet parameters
    m_parameters = new Hashtable();

    if (param != null)
      setStyleURL(param);

    // documentURL: Parameter description
    //----------------------------------------------------------------------
    param = getParameter(PARAM_documentURL);

    if (param != null)
      setDocumentURL(param);

    m_codeBase = this.getCodeBase();
    m_documentBase = this.getDocumentBase();

    // If you use a ResourceWizard-generated "control creator" class to
    // arrange controls in your applet, you may want to call its
    // CreateControls() method from within this method. Remove the following
    // call to resize() before adding the call to CreateControls();
    // CreateControls() does its own resizing.
    //----------------------------------------------------------------------
    resize(320, 240);
  
public voidpaint(java.awt.Graphics g)
Do not call; this applet contains no UI or visual components.

private java.lang.StringprocessTransformation()
Process the transformation.

return
The transformation result as a string.
throws
TransformerException

    String htmlData = null;
    this.showStatus("Waiting for Transformer and Parser to finish loading and JITing...");
    
    synchronized (m_tfactory)
    {
     URL documentURL = null;
      URL styleURL = null;
      StringWriter osw = new StringWriter();
      PrintWriter pw = new PrintWriter(osw, false);
      StreamResult result = new StreamResult(pw);
    
      this.showStatus("Begin Transformation...");
      try
      {
        documentURL = new URL(m_codeBase, m_documentURL);
        StreamSource xmlSource = new StreamSource(documentURL.toString());

        styleURL = new URL(m_codeBase, m_styleURL);
        StreamSource xslSource = new StreamSource(styleURL.toString());

        Transformer transformer = m_tfactory.newTransformer(xslSource);

        m_keys = m_parameters.keys();
        while (m_keys.hasMoreElements()){
          Object key = m_keys.nextElement();
          Object expression = m_parameters.get(key);
          transformer.setParameter((String) key, expression);
        }
        transformer.transform(xmlSource, result);
      }
      catch (TransformerConfigurationException tfe)
      {
        tfe.printStackTrace();
        System.exit(-1);
      }
      catch (MalformedURLException e)
      {
        e.printStackTrace();
        System.exit(-1);
      }
	  
      this.showStatus("Transformation Done!");
      htmlData = osw.toString();
    }
    return htmlData;
  
public voidsetDocumentURL(java.lang.String urlString)
Set the URL to the XML document that will be transformed with the XSL stylesheet. No processing is done yet.

param
urlString valid URL string for XML document.

    m_documentURL = urlString;
  
public voidsetStyleSheetAttribute(java.lang.String nameOfIDAttrOfElemToModify, java.lang.String elemId, java.lang.String attrName, java.lang.String value)
Set an attribute in the stylesheet, which gives the ability to have some dynamic selection control.

param
nameOfIDAttrOfElemToModify The name of an attribute to search for a unique id.
param
elemId The unique ID to look for.
param
attrName Once the element is found, the name of the attribute to set.
param
value The value to set the attribute to.

    m_nameOfIDAttrOfElemToModify = nameOfIDAttrOfElemToModify;
    m_elemIdToModify = elemId;
    m_attrNameToSet = attrName;
    m_attrValueToSet = value;
  
public voidsetStyleURL(java.lang.String urlString)
Set the URL to the XSL stylesheet that will be used to transform the input XML. No processing is done yet.

param
urlString valid URL string for XSL stylesheet.

    m_styleURL = urlString;
  
public voidsetStylesheetParam(java.lang.String key, java.lang.String expr)
Submit a stylesheet parameter.

param
key stylesheet parameter key
param
expr the parameter expression to be submitted.
see
javax.xml.transform.Transformer#setParameter(String,Object)

    m_parameters.put(key, expr);
  
public voidstart()
Automatically called when the HTML client containing the applet loads. This method starts execution of the applet thread.


    m_trustedAgent = new TrustedAgent();
    Thread currentThread = Thread.currentThread();
    m_trustedWorker = new Thread(currentThread.getThreadGroup(),
                                 m_trustedAgent);
    m_trustedWorker.start();
    try
    {
      m_tfactory = TransformerFactory.newInstance();
      this.showStatus("Causing Transformer and Parser to Load and JIT...");

      // Prime the pump so that subsequent transforms are faster.
      StringReader xmlbuf = new StringReader("<?xml version='1.0'?><foo/>");
      StringReader xslbuf = new StringReader(
        "<?xml version='1.0'?><xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'><xsl:template match='foo'><out/></xsl:template></xsl:stylesheet>");
      PrintWriter pw = new PrintWriter(new StringWriter());

      synchronized (m_tfactory)
      {
        Templates templates = m_tfactory.newTemplates(new StreamSource(xslbuf));
        Transformer transformer = templates.newTransformer();
        transformer.transform(new StreamSource(xmlbuf), new StreamResult(pw));
      }
      System.out.println("Primed the pump!");
      this.showStatus("Ready to go!");
    }
    catch (Exception e)
    {
      this.showStatus("Could not prime the pump!");
      System.out.println("Could not prime the pump!");
      e.printStackTrace();
    }
  
public voidstop()
Automatically called when the HTML page containing the applet is no longer on the screen. Stops execution of the applet thread.

    if (null != m_trustedWorker)
    {
      m_trustedWorker.stop();

      // m_trustedWorker.destroy();
      m_trustedWorker = null;
    }

    m_styleURLOfCached = null;
    m_documentURLOfCached = null;
  
public java.lang.StringtransformToHtml(java.lang.String doc, java.lang.String style)
Process a document and a stylesheet and return the transformation result. If one of these is null, the existing value (of a previous transformation) is not affected.

param
doc URL string to XML document
param
style URL string to XSL stylesheet
return
HTML transformation result


    if (null != doc)
    {
      m_documentURL = doc;
    }

    if (null != style)
    {
      m_styleURL = style;
    }

    return getHtmlText();
  
public java.lang.StringtransformToHtml(java.lang.String doc)
Process a document and a stylesheet and return the transformation result. Use the xsl:stylesheet PI to find the document, if one exists.

param
doc URL string to XML document containing an xsl:stylesheet PI.
return
HTML transformation result


    if (null != doc)
    {
      m_documentURL = doc;
    }

    m_styleURL = null;

    return getHtmlText();