jkesselm    00/10/05 09:21:23

  Modified:    java/src/org/apache/xalan/processor CompiledTemplate.java
                        CompilingStylesheetHandler.java
  Log:
  Factoring out boilerplate
  
  Revision  Changes    Path
  1.2       +101 -3    
xml-xalan/java/src/org/apache/xalan/processor/CompiledTemplate.java
  
  Index: CompiledTemplate.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/processor/CompiledTemplate.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- CompiledTemplate.java     2000/09/20 23:33:09     1.1
  +++ CompiledTemplate.java     2000/10/05 16:21:16     1.2
  @@ -1,6 +1,104 @@
  -/** Interface for generated template classes */
  +/** Abstract superclass for generated template classes
  +  (It had been a template, but I want to factor out some "boilerplate" code)
  + */
   package org.apache.xalan.processor;
  -public interface CompiledTemplate
  +import org.apache.xalan.templates.ElemTemplate;
  +
  +public abstract class CompiledTemplate
  +extends ElemTemplate 
   {
  -    public void execute(org.apache.xalan.transformer.TransformerImpl 
transformer,org.w3c.dom.Node sourceNode,org.apache.xalan.utils.QName mode) 
throws org.xml.sax.SAXException;
  +  // Object[] m_interpretArray is used to
  +  // bind to nodes we don't yet know how to compile.
  +  // Set at construction. ElemTemplateElements and AVTs...
  +  protected java.lang.Object[] m_interpretArray;
  +
  +  // Namespace context tracking. Note that this is dynamic state
  +  // during execution, _NOT_ the static state tied to a single 
  +  // ElemTemplateElement during parsing. Also note that it needs to
  +  // be set in execute() but testable in getNamespaceForPrefix --
  +  // and the latter, most unfortunately, is not passed the xctxt so
  +  // making that threadsafe is a bit ugly. 
  +  protected java.util.Hashtable m_nsThreadContexts=new java.util.Hashtable();
  +
  +
  +  /** Accessor to let interpretive children query current namespace state.
  +   * Note that unlike the interpreted version, the namespace state of this
  +   * code changes over time... and that we need to maintain a unique state
  +   * for each thread if we're to support multitasking.
  +   */
  +  public String getNamespaceForPrefix(String nsPrefix)
  +  {
  +    String nsuri="";
  +    org.xml.sax.helpers.NamespaceSupport nsSupport=
  +      (org.xml.sax.helpers.NamespaceSupport)
  +      m_nsThreadContexts.get(Thread.currentThread());
  +    if(null!=nsSupport)
  +      nsuri=nsSupport.getURI(nsPrefix);
  +    if(null==nsuri || nsuri.length()==0)
  +      nsuri=m_parentNode.getNamespaceForPrefix(nsPrefix);
  +    return nsuri;
  +  }
  +
  +
  +  /** public constructor: Copy values from original
  +   * template object, pick up "uncompiled children"
  +   * array from compilation/instantiation process,
  +   * and set the Locator information explicitly.
  +   * (I want the locator to be visible as literals
  +   * in the generated code, for debugging purposes.)
  +   */
  +  public CompiledTemplate(ElemTemplate original,
  +                       int lineNumber, int columnNumber,
  +                       String publicId,String systemId,
  +                       java.lang.Object[] interpretArray)
  +  {
  +    org.xml.sax.helpers.LocatorImpl locator=
  +      new org.xml.sax.helpers.LocatorImpl();
  +    locator.setLineNumber(lineNumber);
  +    locator.setColumnNumber(columnNumber);
  +    locator.setPublicId(publicId);
  +    locator.setSystemId(systemId);
  +    setLocaterInfo(locator); // yes, there's an or/er clash
  +    
  +    // uncompiled descendents/children
  +    this.m_interpretArray=interpretArray;
  +
  +    // other context values which seem to be needed
  +    setMatch(original.getMatch());
  +    setMode(original.getMode());
  +    setName(original.getName());
  +    setPriority(original.getPriority());
  +    setStylesheet(original.getStylesheet());
  +
  +    // Reparent the interpreted ElemTemplateElements,
  +    // to break their dependency on interpretive code.
  +    // AVTs in this array don't need proceessing, as they are
  +    // apparently not directly aware of their Elements.
  +
  +    for(int i=0;i<m_interpretArray.length;++i)
  +      {
  +     if(m_interpretArray[i] instanceof 
org.apache.xalan.templates.ElemTemplateElement)
  +       {
  +            org.apache.xalan.templates.ElemTemplateElement ete=
  +           (org.apache.xalan.templates.ElemTemplateElement)
  +           m_interpretArray[i];
  +         
  +            // Append alone is not enough; it's lightweight, and assumes
  +            // the child had no previous parent. Need to remove first.
  +            // (We know that there _was_ a previous parent, of course!)
  +            appendChild(ete.getParentElem().removeChild(ete));
  +       }
  +      }
  +  } // Constructor initialization ends
  +
  +
  +  /** Main entry point for the Template transformation.
  +   * It's abstract in CompiledTemplate, but is filled in
  +   * when the actual template code is synthesized.
  +   */
  +  public abstract void execute(
  +                       org.apache.xalan.transformer.TransformerImpl 
transformer,
  +                   org.w3c.dom.Node sourceNode,
  +                   org.apache.xalan.utils.QName mode)
  +       throws org.xml.sax.SAXException;
   }
  
  
  
  1.5       +27 -47    
xml-xalan/java/src/org/apache/xalan/processor/CompilingStylesheetHandler.java
  
  Index: CompilingStylesheetHandler.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/processor/CompilingStylesheetHandler.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- CompilingStylesheetHandler.java   2000/09/28 15:56:38     1.4
  +++ CompilingStylesheetHandler.java   2000/10/05 16:21:17     1.5
  @@ -94,6 +94,9 @@
   import org.xml.sax.SAXException;
   import org.xml.sax.SAXParseException;
   
  +// Java Compiler support, being swiped from BSF
  +// TODO: ADOPT OR ADAPT THIS LOGIC *****
  +import com.ibm.cs.util.JavaUtils;
   
   /**
    * <meta name="usage" content="advanced"/>
  @@ -227,23 +230,23 @@
       
       try
       {
  -        // public class ACompiledTemplate000... extends ElemTemplate
  -             // implements CompiledTemplate
  +        // public class ACompiledTemplate000... 
  +             // extends CompiledTemplate (partly abstract superclass)
           synthetic.Class tClass=
               synthetic.Class.declareClass(className);
           tClass.setModifiers(java.lang.reflect.Modifier.PUBLIC);
  -        tClass.setSuperClass(ElemTemplate.class);
  -        
tClass.addImplements(tClass.forName("org.apache.xalan.processor.CompiledTemplate"));
  +        
tClass.setSuperClass(tClass.forName("org.apache.xalan.processor.CompiledTemplate"));
   
  -        // Object[] interpretArray is used to
  +/*****
  +        // Object[] m_interpretArray is used to
           // bind to nodes we don't yet know how to compile.
           // Set at construction. ElemTemplateElements and AVTs...
           // Synthesis needs a more elegant way to declare array classes
           // given a base class... 
  -        synthetic.reflection.Field interpretArray=
  -            tClass.declareField("interpretArray");
  +        synthetic.reflection.Field m_interpretArray=
  +            tClass.declareField("m_interpretArray");
           // org.apache.xalan.templates.ElemTemplateElement
  -        interpretArray.setType(tClass.forName("java.lang.Object[]"));
  +        m_interpretArray.setType(tClass.forName("java.lang.Object[]"));
   
           // Namespace context tracking. Note that this is dynamic state
           // during execution, _NOT_ the static state tied to a single 
  @@ -270,6 +273,7 @@
                        +"nsuri=m_parentNode.getNamespaceForPrefix(nsprefix);\n"
                        +"return nsuri;\n"
                        );
  +*****/               
   
           // public constructor: Copy values from original
           // template object, pick up "uncompiled children"
  @@ -277,45 +281,21 @@
           synthetic.reflection.Constructor ctor=
               tClass.declareConstructor();
           ctor.setModifiers(java.lang.reflect.Modifier.PUBLIC);
  -        ctor.addParameter(tClass.getSuperclass(),"original");
  -        ctor.addParameter(interpretArray.getType(),"interpretArray");
  +        ctor.addParameter(tClass.forClass(ElemTemplate.class),"original");
  +        
ctor.addParameter(tClass.forName("java.lang.Object[]"),"interpretArray");
                
  -             // It'd be easiest in most cases to copy values direct from the
  +             // It'd be easiest to let the c'tor copy values direct from the
                // "original" template during instantiation. However, I want to 
make
  -             // as many as possible into literals, for efficiency and 
debugability.
  +             // some into literals, for the sake of debugability.
           ctor.getBody().append(
  -                     "org.xml.sax.helpers.LocatorImpl locator=new 
org.xml.sax.helpers.LocatorImpl();\n"
  -                     +"locator.setLineNumber("+source.getLineNumber()+");\n"
  -                     
+"locator.setColumnNumber("+source.getColumnNumber()+");\n"
  -                     
+"locator.setPublicId("+makeQuotedString(source.getPublicId())+");\n"
  -                     
+"locator.setSystemId("+makeQuotedString(source.getSystemId())+");\n"
  -            +"setLocaterInfo(locator); // yes, or/er clash\n"
  -            +"// uncompiled descendents/children\n"
  -            +"this.interpretArray=interpretArray;\n"
  -            +"// other context values which seem to be needed\n"
  -            +"setMatch(original.getMatch());\n"
  -            +"setMode(original.getMode());\n"
  -            +"setName(original.getName());\n"
  -            +"setPriority(original.getPriority());\n"
  -            +"setStylesheet(original.getStylesheet());\n\n"
  -            //+"setLocatorInfo(new 
Locator(original.getPublicID(),original.getSystemID()));\n"
  -            
  -            // Reparent the interpreted ElemTemplateElements,
  -            // to break their dependency on interpretive code.
  -            // AVTs in this array don't need proceessing, as they are
  -            // apparently not directly aware of their Elements.
  -            +"for(int i=0;i<interpretArray.length;++i)\n{\n"
  -            +"\tif(interpretArray[i] instanceof 
org.apache.xalan.templates.ElemTemplateElement)\n"
  -            +"\t{\n"
  -            +"\torg.apache.xalan.templates.ElemTemplateElement 
ete=(org.apache.xalan.templates.ElemTemplateElement)interpretArray[i];\n"
  -            // Append alone is not enough; it's lightweight, and assumes
  -            // the child had no previous parent. Need to remove first.
  -            // (We know that there _was_ a previous parent, of course!)
  -            +"\tappendChild(ete.getParentElem().removeChild(ete));\n"
  -            +"\t}\n}\n"
  -            );
  +                     "super(original,\n"
  +                     
+'\t'+source.getLineNumber()+','+source.getColumnNumber()+",\n"
  +                     +'\t'+makeQuotedString(source.getPublicId())+",\n"
  +                     +'\t'+makeQuotedString(source.getSystemId())+",\n"
  +                     +"\tinterpretArray);\n"
  +               );
   
  -        // Corresponding vector built during compilation
  +        // m_interpretArray's vector built during compilation
           Vector interpretVector=new Vector();
   
           // Now for the big guns: the execute() method is where all the
  @@ -464,7 +444,7 @@
           int offset=interpretVector.size();
           interpretVector.addElement(kid);
           body.append(
  -            
"((org.apache.xalan.templates.ElemTemplateElement)interpretArray["+offset+"]).execute(transformer,sourceNode,mode);\n"
  +            
"((org.apache.xalan.templates.ElemTemplateElement)m_interpretArray["+offset+"]).execute(transformer,sourceNode,mode);\n"
               );
                break;
        }
  @@ -547,7 +527,7 @@
                   interpretVector.addElement(avt);
                   body.append(
                       "avtStringedValue=((org.apache.xalan.templates.AVT)"
  -                    +"(interpretArray["+offset+"])"
  +                    +"(m_interpretArray["+offset+"])"
                       +").evaluate(xctxt,sourceNode,this,new 
StringBuffer());\n"
                       +"if(null!=avtStringedValue)\n{\n"
                       );
  @@ -664,7 +644,7 @@
         // TODO: ***** I'm assuming I can get away with "this" as the 
prefixResolver
         // even in the compiled code. I'm not really convinced that's true...
         return 
  -            "( 
((org.apache.xalan.templates.AVT)interpretArray["+offset+"]).evaluate(transformer.getXPathContext(),sourceNode,this,new
 StringBuffer()) )"
  +            "( 
((org.apache.xalan.templates.AVT)m_interpretArray["+offset+"]).evaluate(transformer.getXPathContext(),sourceNode,this,new
 StringBuffer()) )"
               ;
     }
     
  @@ -984,7 +964,7 @@
           // 1.1 calls), then fall back on command line if necessary.
           // But I'm having some odd problems with it right now under
           // both VisualCafe and VisualJ++.
  -        compileOK=com.ibm.bsf.util.JavaUtils.JDKcompile(filename,classpath);
  +        compileOK = JavaUtils.JDKcompile(filename,classpath);
       }
       else
       {
  
  
  

Reply via email to