You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by zo...@apache.org on 2002/08/01 21:55:31 UTC

cvs commit: xml-xalan/java/src/org/apache/xml/utils SystemIDResolver.java TreeWalker.java

zongaro     2002/08/01 12:55:31

  Modified:    java/src/org/apache/xalan/extensions Tag: XSLTC_DTM
                        ExtensionHandlerJavaClass.java
               java/src/org/apache/xalan/lib Tag: XSLTC_DTM
                        ExsltCommon.java ExsltMath.java ExsltSets.java
                        Extensions.java
               java/src/org/apache/xalan/processor Tag: XSLTC_DTM
                        ProcessorInclude.java
               java/src/org/apache/xalan/xsltc/compiler Tag: XSLTC_DTM
                        CastExpr.java Expression.java FlowList.java
                        FunctionCall.java Mode.java StepPattern.java
                        TestSeq.java
               java/src/org/apache/xalan/xsltc/compiler/util Tag: XSLTC_DTM
                        MultiHashtable.java ReferenceType.java
                        ResultTreeType.java
               java/src/org/apache/xml/utils Tag: XSLTC_DTM
                        SystemIDResolver.java TreeWalker.java
  Log:
  Bringing branch back up-to-date with respect to changes in MAIN branch.
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.10.12.1 +9 -0      xml-xalan/java/src/org/apache/xalan/extensions/ExtensionHandlerJavaClass.java
  
  Index: ExtensionHandlerJavaClass.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/extensions/ExtensionHandlerJavaClass.java,v
  retrieving revision 1.10
  retrieving revision 1.10.12.1
  diff -u -r1.10 -r1.10.12.1
  --- ExtensionHandlerJavaClass.java	12 Jun 2001 19:14:33 -0000	1.10
  +++ ExtensionHandlerJavaClass.java	1 Aug 2002 19:55:30 -0000	1.10.12.1
  @@ -412,6 +412,15 @@
       {
         result = m.invoke(m_defaultInstance, new Object[] {xpc, element});
       }
  +    catch (InvocationTargetException e)
  +    {
  +      Throwable targetException = e.getTargetException();
  +      
  +      if (targetException != null)
  +        throw new TransformerException (targetException.getMessage (), targetException);
  +      else
  +        throw new TransformerException (e.getMessage (), e);
  +    }
       catch (Exception e)
       {
         // e.printStackTrace ();
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.2.2.2   +1 -1      xml-xalan/java/src/org/apache/xalan/lib/ExsltCommon.java
  
  Index: ExsltCommon.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/lib/ExsltCommon.java,v
  retrieving revision 1.2.2.1
  retrieving revision 1.2.2.2
  diff -u -r1.2.2.1 -r1.2.2.2
  --- ExsltCommon.java	29 Jul 2002 00:01:17 -0000	1.2.2.1
  +++ ExsltCommon.java	1 Aug 2002 19:55:30 -0000	1.2.2.2
  @@ -94,7 +94,7 @@
    * This class contains EXSLT common extension functions.
    * It is accessed by specifying a namespace URI as follows:
    * <pre>
  - *    xmlns:exslt="http://exslt.org/xalan/common"
  + *    xmlns:exslt="http://exslt.org/common"
    * </pre>
    * 
    * The documentation for each function has been copied from the relevant
  
  
  
  1.2.2.1   +2 -2      xml-xalan/java/src/org/apache/xalan/lib/ExsltMath.java
  
  Index: ExsltMath.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/lib/ExsltMath.java,v
  retrieving revision 1.2
  retrieving revision 1.2.2.1
  diff -u -r1.2 -r1.2.2.1
  --- ExsltMath.java	22 Mar 2002 18:54:57 -0000	1.2
  +++ ExsltMath.java	1 Aug 2002 19:55:30 -0000	1.2.2.1
  @@ -195,7 +195,7 @@
      * @param expCon is passed in by the Xalan extension processor
      * @param ni The NodeIterator for the node-set to be evaluated.
      * 
  -   * @return node-set with nodes containing the minimum value found, an empty node-set
  +   * @return node-set with nodes containing the maximum value found, an empty node-set
      * if any node cannot be converted to a number.
      */
     public static NodeSet highest (ExpressionContext expCon, NodeIterator ni)
  @@ -234,7 +234,7 @@
      * @param expCon is passed in by the Xalan extension processor
      * @param ni The NodeIterator for the node-set to be evaluated.
      * 
  -   * @return node-set with nodes containing the maximum value found, an empty node-set
  +   * @return node-set with nodes containing the minimum value found, an empty node-set
      * if any node cannot be converted to a number.
      * 
      */
  
  
  
  1.2.2.1   +3 -3      xml-xalan/java/src/org/apache/xalan/lib/ExsltSets.java
  
  Index: ExsltSets.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/lib/ExsltSets.java,v
  retrieving revision 1.2
  retrieving revision 1.2.2.1
  diff -u -r1.2 -r1.2.2.1
  --- ExsltSets.java	22 Mar 2002 18:54:57 -0000	1.2
  +++ ExsltSets.java	1 Aug 2002 19:55:30 -0000	1.2.2.1
  @@ -93,7 +93,7 @@
    * This class contains EXSLT set extension functions.
    * It is accessed by specifying a namespace URI as follows:
    * <pre>
  - *    xmlns:set="http://exslt.org/xalan/sets"
  + *    xmlns:set="http://exslt.org/sets"
    * </pre>
    * 
    * The documentation for each function has been copied from the relevant
  @@ -145,8 +145,8 @@
      * 
      * @param ni1 NodeIterator for first node-set.
      * @param ni2 NodeIterator for second node-set.
  -   * @return a node-set containing the nodes in ni1 that precede in document order the first
  -   * node in ni2; an empty node-set if the first noe in ni2 is not in ni1; all of ni1 if ni2
  +   * @return a node-set containing the nodes in ni1 that follow in document order the first
  +   * node in ni2; an empty node-set if the first node in ni2 is not in ni1; all of ni1 if ni2
      * is empty.
      * 
      * @see <a href="http://www.exslt.org/">EXSLT</a>
  
  
  
  1.17.2.2  +1 -1      xml-xalan/java/src/org/apache/xalan/lib/Extensions.java
  
  Index: Extensions.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/lib/Extensions.java,v
  retrieving revision 1.17.2.1
  retrieving revision 1.17.2.2
  diff -u -r1.17.2.1 -r1.17.2.2
  --- Extensions.java	29 Jul 2002 00:01:17 -0000	1.17.2.1
  +++ Extensions.java	1 Aug 2002 19:55:30 -0000	1.17.2.2
  @@ -280,7 +280,7 @@
     }
   
     /**
  -   * Returns true of both node-sets contain the same set of nodes.
  +   * Returns true if both node-sets contain the same set of nodes.
      * @param n1 NodeIterator for first node-set
      *
      * NEEDSDOC @param ni1
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.20.10.1 +10 -1     xml-xalan/java/src/org/apache/xalan/processor/ProcessorInclude.java
  
  Index: ProcessorInclude.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/processor/ProcessorInclude.java,v
  retrieving revision 1.20
  retrieving revision 1.20.10.1
  diff -u -r1.20 -r1.20.10.1
  --- ProcessorInclude.java	8 Nov 2001 20:15:48 -0000	1.20
  +++ ProcessorInclude.java	1 Aug 2002 19:55:30 -0000	1.20.10.1
  @@ -238,7 +238,16 @@
           if (null != source && source instanceof DOMSource)
           {
             Node node = ((DOMSource)source).getNode();
  -          TreeWalker walker = new TreeWalker(handler, new org.apache.xpath.DOM2Helper(), source.getSystemId());
  +          
  +          String systemId = source.getSystemId();
  +          if (systemId == null)
  +          {
  +            systemId = SystemIDResolver.getAbsoluteURI(getHref(),
  +                         handler.getBaseIdentifier());
  +            
  +          }
  +          
  +          TreeWalker walker = new TreeWalker(handler, new org.apache.xpath.DOM2Helper(), systemId);
   
             try
             {
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.10.6.2  +2 -2      xml-xalan/java/src/org/apache/xalan/xsltc/compiler/CastExpr.java
  
  Index: CastExpr.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/CastExpr.java,v
  retrieving revision 1.10.6.1
  retrieving revision 1.10.6.2
  diff -u -r1.10.6.1 -r1.10.6.2
  --- CastExpr.java	29 Jul 2002 00:01:22 -0000	1.10.6.1
  +++ CastExpr.java	1 Aug 2002 19:55:30 -0000	1.10.6.2
  @@ -202,7 +202,7 @@
   	else if (tleft instanceof ResultTreeType) {
   	    tleft = Type.ResultTree; // multiple instances
   	}
  -	if (InternalTypeMap.maps(tleft, _type)) {
  +	if (InternalTypeMap.maps(tleft, _type) != null) {
   	    return _type;
   	}
   	throw new TypeCheckError(this);	
  
  
  
  1.11.2.2  +9 -1      xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Expression.java
  
  Index: Expression.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Expression.java,v
  retrieving revision 1.11.2.1
  retrieving revision 1.11.2.2
  diff -u -r1.11.2.1 -r1.11.2.2
  --- Expression.java	29 Jul 2002 00:01:22 -0000	1.11.2.1
  +++ Expression.java	1 Aug 2002 19:55:30 -0000	1.11.2.2
  @@ -214,6 +214,14 @@
   	_falseList.add(il.append(new IFEQ(null)));
       }
   
  +    public FlowList getFalseList() {
  +	return _falseList;
  +    }
  +
  +    public FlowList getTrueList() {
  +	return _trueList;
  +    }
  +
       public void backPatchFalseList(InstructionHandle ih) {
   	_falseList.backPatch(ih);
       }
  
  
  
  1.2.6.1   +31 -1     xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FlowList.java
  
  Index: FlowList.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FlowList.java,v
  retrieving revision 1.2
  retrieving revision 1.2.6.1
  diff -u -r1.2 -r1.2.6.1
  --- FlowList.java	1 Feb 2002 20:07:08 -0000	1.2
  +++ FlowList.java	1 Aug 2002 19:55:30 -0000	1.2.6.1
  @@ -64,6 +64,7 @@
   package org.apache.xalan.xsltc.compiler;
   
   import java.util.Vector;
  +import java.util.Iterator;
   import org.apache.bcel.generic.*;
   
   public final class FlowList {
  @@ -118,5 +119,34 @@
   	    }
   	    _elements.clear();		// avoid backpatching more than once
   	}
  +    }
  +
  +    /**
  +     * Redirect the handles from oldList to newList. "This" flow list
  +     * is assumed to be relative to oldList.
  +     */
  +    public FlowList copyAndRedirect(InstructionList oldList, 
  +	InstructionList newList) 
  +    {
  +	final FlowList result = new FlowList();
  +	if (_elements == null) {
  +	    return result;
  +	}
  +
  +	final int n = _elements.size();
  +	final Iterator oldIter = oldList.iterator();
  +	final Iterator newIter = newList.iterator();
  +	
  +	while (oldIter.hasNext()) {
  +	    final InstructionHandle oldIh = (InstructionHandle) oldIter.next();
  +	    final InstructionHandle newIh = (InstructionHandle) newIter.next();
  +
  +	    for (int i = 0; i < n; i++) {
  +		if (_elements.elementAt(i) == oldIh) {
  +		    result.add(newIh);
  +		}
  +	    }
  +	}
  +	return result;
       }
   }
  
  
  
  1.14.2.2  +95 -43    xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FunctionCall.java
  
  Index: FunctionCall.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FunctionCall.java,v
  retrieving revision 1.14.2.1
  retrieving revision 1.14.2.2
  diff -u -r1.14.2.1 -r1.14.2.2
  --- FunctionCall.java	29 Jul 2002 00:01:22 -0000	1.14.2.1
  +++ FunctionCall.java	1 Aug 2002 19:55:30 -0000	1.14.2.2
  @@ -133,12 +133,31 @@
       private static final Hashtable _java2Internal = new Hashtable();
   
       /**
  +     * inner class to used in internal2Java mappings, contains
  +     * the Java type and the distance between the internal type and
  +     * the Java type. 
  +     */
  +    static class JavaType {
  +	public Class  type;
  +	public int distance;
  +	
  +	public JavaType(Class type, int distance){
  +	    this.type = type;
  +	    this.distance = distance;
  +	}
  +	public boolean equals(Object query){
  +	    return query.equals(type);
  +	}
  +    } 
  +
  +    /**
        * Defines 2 conversion tables:
        * 1. From internal types to Java types and
        * 2. From Java types to internal types.
        * These two tables are used when calling external (Java) functions.
        */
       static {
  +
   	try {
   	    final Class objectClass   = Class.forName("java.lang.Object");
   	    final Class stringClass   = Class.forName("java.lang.String");
  @@ -146,42 +165,43 @@
   	    final Class nodeListClass = Class.forName("org.w3c.dom.NodeList");
   
   	    // Possible conversions between internal and Java types
  -	    _internal2Java.put(Type.Boolean, Boolean.TYPE);
  -
  -	    _internal2Java.put(Type.Int, Character.TYPE);
  -	    _internal2Java.put(Type.Int, Byte.TYPE);
  -	    _internal2Java.put(Type.Int, Short.TYPE);
  -	    _internal2Java.put(Type.Int, Integer.TYPE);
  -	    _internal2Java.put(Type.Int, Long.TYPE);
  -	    _internal2Java.put(Type.Int, Float.TYPE);
  -	    _internal2Java.put(Type.Int, Double.TYPE);
  -
  -	    _internal2Java.put(Type.Real, Character.TYPE);
  -	    _internal2Java.put(Type.Real, Byte.TYPE);
  -	    _internal2Java.put(Type.Real, Short.TYPE);
  -	    _internal2Java.put(Type.Real, Integer.TYPE);
  -	    _internal2Java.put(Type.Real, Long.TYPE);
  -	    _internal2Java.put(Type.Real, Float.TYPE);
  -	    _internal2Java.put(Type.Real, Double.TYPE);
  -
  -	    _internal2Java.put(Type.String, stringClass);
  -
  -	    _internal2Java.put(Type.Node, nodeClass);
  -	    _internal2Java.put(Type.Node, nodeListClass);
  -
  -	    _internal2Java.put(Type.NodeSet, Integer.TYPE);
  -	    _internal2Java.put(Type.NodeSet, nodeClass);
  -	    _internal2Java.put(Type.NodeSet, nodeListClass);
  +	    _internal2Java.put(Type.Boolean, new JavaType(Boolean.TYPE,0));
   
  -	    _internal2Java.put(Type.ResultTree, nodeClass);
  -	    _internal2Java.put(Type.ResultTree, nodeListClass);
  +	    _internal2Java.put(Type.Int, new JavaType(Character.TYPE, 6)); 
  +	    _internal2Java.put(Type.Int, new JavaType(Byte.TYPE, 5));
  +	    _internal2Java.put(Type.Int, new JavaType(Short.TYPE, 4));
  +	    _internal2Java.put(Type.Int, new JavaType(Integer.TYPE, 0));
  +	    _internal2Java.put(Type.Int, new JavaType(Long.TYPE, 1));
  +	    _internal2Java.put(Type.Int, new JavaType(Float.TYPE, 2));
  +	    _internal2Java.put(Type.Int, new JavaType(Double.TYPE, 3));
  +
  +	    _internal2Java.put(Type.Real, new JavaType(Character.TYPE, 6)); 
  +	    _internal2Java.put(Type.Real, new JavaType(Byte.TYPE, 5));
  +	    _internal2Java.put(Type.Real, new JavaType(Short.TYPE, 4));
  +	    _internal2Java.put(Type.Real, new JavaType(Integer.TYPE, 3));
  +	    _internal2Java.put(Type.Real, new JavaType(Long.TYPE, 2));
  +	    _internal2Java.put(Type.Real, new JavaType(Float.TYPE, 1));
  +	    _internal2Java.put(Type.Real, new JavaType(Double.TYPE, 0));
  +
  +	    _internal2Java.put(Type.String, new JavaType(stringClass, 0)); 
  +
  +	    _internal2Java.put(Type.Node, new JavaType(nodeClass, 0));  
  +	    _internal2Java.put(Type.Node, new JavaType(nodeListClass, 1));
  +
  +	    _internal2Java.put(Type.NodeSet, new JavaType(Integer.TYPE, 10)); 
  +	    _internal2Java.put(Type.NodeSet, new JavaType(nodeClass, 1)); 
  +	    _internal2Java.put(Type.NodeSet, new JavaType(nodeListClass,0)); 
  +
  +	    _internal2Java.put(Type.ResultTree, new JavaType(nodeClass, 1)); 
  +	    _internal2Java.put(Type.ResultTree, new JavaType(nodeListClass,0));
  +	    _internal2Java.put(Type.ResultTree, new JavaType(objectClass,2));
   
  -	    _internal2Java.put(Type.Reference, objectClass);
  +	    _internal2Java.put(Type.Reference, new JavaType(objectClass,0));
   
   	    // Possible conversions between Java and internal types
  -	    _java2Internal.put(Boolean.TYPE, Type.Boolean);
  +	    _java2Internal.put(Boolean.TYPE, Type.Boolean); 
   
  -	    _java2Internal.put(Character.TYPE, Type.Real);
  +	    _java2Internal.put(Character.TYPE, Type.Real); 
   	    _java2Internal.put(Byte.TYPE, Type.Real);
   	    _java2Internal.put(Short.TYPE, Type.Real);
   	    _java2Internal.put(Integer.TYPE, Type.Real);
  @@ -338,6 +358,8 @@
   	final Vector argsType = typeCheckArgs(stable);
   
   	// Try all constructors 
  +	int bestConstrDistance = Integer.MAX_VALUE;
  +	_type = null;			// reset
   	for (int j, i = 0; i < nConstructors; i++) {
   	    // Check if all parameters to this constructor can be converted
   	    final Constructor constructor = 
  @@ -345,20 +367,34 @@
   	    final Class[] paramTypes = constructor.getParameterTypes();
   
   	    Class extType = null;
  +	    int currConstrDistance = 0;
   	    for (j = 0; j < nArgs; j++) {
   		// Convert from internal (translet) type to external (Java) type
   		extType = paramTypes[j];
   		final Type intType = (Type)argsType.elementAt(j);
  -		if (!_internal2Java.maps(intType, extType)) break;
  +		Object match = _internal2Java.maps(intType, extType);
  +		if (match != null) {
  +		    currConstrDistance += ((JavaType)match).distance;
  +		}
  +		else {
  +		    // no mapping available
  +		    currConstrDistance = Integer.MAX_VALUE;
  +		    break;
  +		} 
   	    }
   
  -	    if (j == nArgs) {
  +	    if (j == nArgs && currConstrDistance < bestConstrDistance ) {
   	        _chosenConstructor = constructor;
   	        _isExtConstructor = true;
  -		return _type = new ObjectType(_className);
  +		bestConstrDistance = currConstrDistance;
  +		_type = new ObjectType(_className);
   	    }
   	}
   
  +	if (_type != null) {
  +	    return _type;
  +	}
  +
   	final StringBuffer buf = new StringBuffer(_className);
   	buf.append('.').append(_fname.getLocalPart()).append('(');
   	for (int i = 0; i < nArgs; i++) {
  @@ -430,18 +466,30 @@
   	final int nMethods = methods.size();
   	final Vector argsType = typeCheckArgs(stable);
   
  -	// Try all methods with the same name as this function
  +	// Try all methods to identify the best fit 
  +	int bestMethodDistance  = Integer.MAX_VALUE;
  +	_type = null;                       // reset internal type 
   	for (int j, i = 0; i < nMethods; i++) {
   
   	    // Check if all paramteters to this method can be converted
   	    final Method method = (Method)methods.elementAt(i);
   	    final Class[] paramTypes = method.getParameterTypes();
  -
  +	    
  +	    int currMethodDistance = 0;
   	    for (j = 0; j < nArgs; j++) {
   		// Convert from internal (translet) type to external (Java) type
   		extType = paramTypes[j];
   		final Type intType = (Type)argsType.elementAt(j);
  -		if (!_internal2Java.maps(intType, extType)) break;
  +		Object match = _internal2Java.maps(intType, extType);
  +		if (match != null) {
  +		   currMethodDistance += 
  +			((JavaType)match).distance; 
  +		}
  +		else {
  +		    // no mapping available
  +		    currMethodDistance = Integer.MAX_VALUE;
  +		    break;
  +		}
   	    }
   
   	    if (j == nArgs) {
  @@ -451,14 +499,18 @@
   		    : (Type) _java2Internal.get(extType);
   
   		// Use this method if all parameters & return type match
  -		if (_type != null) {
  +		if (_type != null && currMethodDistance < bestMethodDistance) {
   		    _chosenMethod = method;
  -		    if (_type == Type.NodeSet){
  -		        getXSLTC().setMultiDocument(true);
  -		    }
  -		    return _type;
  +		    bestMethodDistance = currMethodDistance;
   		}
   	    }
  +	}
  +
  +	if (_type != null) {
  +	    if (_type == Type.NodeSet){
  +                getXSLTC().setMultiDocument(true);
  +            }
  +	    return _type;
   	}
   
   	final StringBuffer buf = new StringBuffer(_className);
  
  
  
  1.19.6.4  +162 -61   xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Mode.java
  
  Index: Mode.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Mode.java,v
  retrieving revision 1.19.6.3
  retrieving revision 1.19.6.4
  diff -u -r1.19.6.3 -r1.19.6.4
  --- Mode.java	29 Jul 2002 00:01:22 -0000	1.19.6.3
  +++ Mode.java	1 Aug 2002 19:55:30 -0000	1.19.6.4
  @@ -79,8 +79,9 @@
   import org.apache.xml.dtm.DTM;
   
   /**
  - * Mode gathers all the templates belonging to a given mode; it is responsible
  - * for generating an appropriate applyTemplates + (mode name) function
  + * Mode gathers all the templates belonging to a given mode; 
  + * it is responsible for generating an appropriate 
  + * applyTemplates + (mode name) method in the translet.
    */
   final class Mode implements Constants {
   
  @@ -122,32 +123,67 @@
       /**
        * Test sequence for patterns with id() or key()-type kernel.
        */
  -    private TestSeq  _idxTestSeq = null;
  +    private TestSeq _idxTestSeq = null;
   
       /**
        * Group for patterns with any other kernel type.
        */
  -    private Vector[]  _patternGroups;
  +    private Vector[] _patternGroups;
   
       /**
        * Test sequence for patterns with any other kernel type.
        */
       private TestSeq[] _testSeq;
   
  +    /**
  +     * A mapping between patterns and instruction lists used by 
  +     * test sequences to avoid compiling the same pattern multiple 
  +     * times. Note that patterns whose kernels are "*", "node()" 
  +     * and "@*" can between shared by test sequences.
  +     */
  +    private Hashtable _preCompiled = new Hashtable();
  +
  +    /**
  +     * A mapping between templates and test sequences.
  +     */
       private Hashtable _neededTemplates = new Hashtable();
  +
  +    /**
  +     * A mapping between named templates and Mode objects.
  +     */
       private Hashtable _namedTemplates = new Hashtable();
  +
  +    /**
  +     * A mapping between templates and instruction handles.
  +     */
       private Hashtable _templateIHs = new Hashtable();
  +
  +    /**
  +     * A mapping between templates and instruction lists.
  +     */
       private Hashtable _templateILs = new Hashtable();
  +
  +    /**
  +     * A reference to the pattern matching the root node.
  +     */
       private LocationPathPattern _rootPattern = null;
   
  +    /**
  +     * Stores ranges of template precendences for the compilation 
  +     * of apply-imports (a Hashtable for historical reasons).
  +     */
       private Hashtable _importLevels = null;
   
  +    /**
  +     * A mapping between key names and keys.
  +     */
       private Hashtable _keys = null;
   
  -    // Variable index for the current node - used in code generation
  +    /**
  +     * Variable index for the current node used in code generation.
  +     */
       private int _currentIndex;
   
  -
       /**
        * Creates a new Mode.
        *
  @@ -157,19 +193,18 @@
        *               (normally a sequence number - still in a String).
        */
       public Mode(QName name, Stylesheet stylesheet, String suffix) {
  -	// Save global info
   	_name = name;
   	_stylesheet = stylesheet;
   	_methodName = APPLY_TEMPLATES + suffix;
  -	// Initialise some data structures
   	_templates = new Vector();
   	_patternGroups = new Vector[32];
       }
   
       /**
  -     * Returns the name of the method (_not_ function) that will be compiled
  -     * for this mode. Normally takes the form 'applyTemplates()' or
  -     * 'applyTemplates2()'.
  +     * Returns the name of the method (_not_ function) that will be 
  +     * compiled for this mode. Normally takes the form 'applyTemplates()' 
  +     * or * 'applyTemplates2()'.
  +     *
        * @return Method name for this mode
        */
       public String functionName() {
  @@ -177,9 +212,28 @@
       }
   
       public String functionName(int min, int max) {
  -	if (_importLevels == null) _importLevels = new Hashtable();
  +	if (_importLevels == null) {
  +	    _importLevels = new Hashtable();
  +	}
   	_importLevels.put(new Integer(max), new Integer(min));
  -	return _methodName+'_'+max;
  +	return _methodName + '_' + max;
  +    }
  +
  +    /**
  +     * Add a pre-compiled pattern to this mode. 
  +     */
  +    public void addInstructionList(Pattern pattern, 
  +	InstructionList ilist) 
  +    {
  +	_preCompiled.put(pattern, ilist);
  +    }
  +
  +    /**
  +     * Get the instruction list for a pre-compiled pattern. Used by 
  +     * test sequences to avoid compiling patterns more than once.
  +     */
  +    public InstructionList getInstructionList(Pattern pattern) {
  +	return (InstructionList) _preCompiled.get(pattern);
       }
   
       /**
  @@ -189,10 +243,10 @@
   	return _stylesheet.getClassName();
       }
   
  -    /**
  -     * Add a template to this mode
  -     * @param template The template to add
  -     */
  +    public Stylesheet getStylesheet() {
  +	return _stylesheet;
  +    }
  +
       public void addTemplate(Template template) {
   	_templates.addElement(template);
       }
  @@ -306,10 +360,32 @@
       }
   
       /**
  +     * Group patterns by NodeTests of their last Step
  +     * Keep them sorted by priority within group
  +     */
  +    private void addPatternToGroup(final LocationPathPattern lpp) {
  +	// id() and key()-type patterns do not have a kernel type
  +	if (lpp instanceof IdKeyPattern) {
  +	    addPattern(-1, lpp);
  +	}
  +	// Otherwise get the kernel pattern from the LPP
  +	else {
  +	    // kernel pattern is the last (maybe only) Step
  +	    final StepPattern kernel = lpp.getKernelPattern();
  +	    if (kernel != null) {
  +		addPattern(kernel.getNodeType(), lpp);
  +	    }
  +	    else if (_rootPattern == null ||
  +		     lpp.noSmallerThan(_rootPattern)) {
  +		_rootPattern = lpp;
  +	    }
  +	}
  +    }
  +
  +    /**
        * Adds a pattern to a pattern group
        */
       private void addPattern(int kernelType, LocationPathPattern pattern) {
  -
   	// Make sure the array of pattern groups is long enough
   	final int oldLength = _patternGroups.length;
   	if (kernelType >= oldLength) {
  @@ -328,10 +404,13 @@
   	if (patterns == null) {
   	    patterns = new Vector(2);
   	    patterns.addElement(pattern);
  -	    if (kernelType == -1)
  +
  +	    if (kernelType == -1) {
   		_nodeGroup = patterns;
  -	    else
  +	    }
  +	    else {
   		_patternGroups[kernelType] = patterns;
  +	    }
   	}
   	// Otherwise make sure patterns are ordered by precedence/priorities
   	else {
  @@ -352,40 +431,58 @@
       }
       
       /**
  -     * Group patterns by NodeTests of their last Step
  -     * Keep them sorted by priority within group
  +     * Build test sequences. The first step is to complete the test sequences 
  +     * by including patterns of "*" and "node()" kernel to all element test 
  +     * sequences, and of "@*" to all attribute test sequences.
        */
  -    private void addPatternToGroup(final LocationPathPattern lpp) {
  -	// id() and key()-type patterns do not have a kernel type
  -	if (lpp instanceof IdKeyPattern) {
  -	    addPattern(-1, lpp);
  -	}
  -	// Otherwise get the kernel pattern from the LPP
  -	else {
  -	    // kernel pattern is the last (maybe only) Step
  -	    final StepPattern kernel = lpp.getKernelPattern();
  -	    if (kernel != null) {
  -		addPattern(kernel.getNodeType(), lpp);
  -	    }
  -	    else if (_rootPattern == null ||
  -		     lpp.noSmallerThan(_rootPattern)) {
  -		_rootPattern = lpp;
  +    private void prepareTestSequences() {
  +	final Vector names = _stylesheet.getXSLTC().getNamesIndex();
  +
  +	final Vector starGroup = _patternGroups[DTM.ELEMENT_NODE];
  +	final Vector atStarGroup = _patternGroups[DTM.ATTRIBUTE_NODE];
  +
  +	// Complete test sequences with "*", "@*" and "node()"
  +	if (starGroup != null || atStarGroup != null || _nodeGroup != null) {
  +	    final int n = _patternGroups.length;
  +
  +	    for (int m, i = DTM.NTYPES; i < n; i++) {
  +		if (_patternGroups[i] == null) continue;
  +
  +		final String name = (String) names.elementAt(i - DTM.NTYPES);
  +
  +		if (isAttributeName(name)) {
  +		    // If an attribute then copy "@*" to its test sequence
  +		    m = (atStarGroup != null) ? atStarGroup.size() : 0;
  +		    for (int j = 0; j < m; j++) {
  +			addPattern(i, 
  +			    (LocationPathPattern) atStarGroup.elementAt(j));
  +		    }
  +		}
  +		else {
  +		    // If an element then copy "*" to its test sequence
  +		    m = (starGroup != null) ? starGroup.size() : 0;
  +		    for (int j = 0; j < m; j++) {
  +			addPattern(i, 
  +			    (LocationPathPattern) starGroup.elementAt(j));
  +		    }
  +
  +		    // And also copy "node()" to its test sequence
  +		    m = (_nodeGroup != null) ? _nodeGroup.size() : 0;
  +		    for (int j = 0; j < m; j++) {
  +			addPattern(i, 
  +			    (LocationPathPattern) _nodeGroup.elementAt(j));
  +		    }
  +		}
   	    }
   	}
  -    }
   
  -    /**
  -     * Build test sequences
  -     */
  -    private void prepareTestSequences() {
  -	final Vector names = _stylesheet.getXSLTC().getNamesIndex();
   	_testSeq = new TestSeq[DTM.NTYPES + names.size()];
   	
   	final int n = _patternGroups.length;
   	for (int i = 0; i < n; i++) {
   	    final Vector patterns = _patternGroups[i];
   	    if (patterns != null) {
  -		final TestSeq testSeq = new TestSeq(patterns, this);
  +		final TestSeq testSeq = new TestSeq(patterns, i, this);
   		testSeq.reduce();
   		_testSeq[i] = testSeq;
   		testSeq.findTemplates(_neededTemplates);
  @@ -393,7 +490,7 @@
   	}
   
   	if ((_nodeGroup != null) && (_nodeGroup.size() > 0)) {
  -	    _nodeTestSeq = new TestSeq(_nodeGroup, this);
  +	    _nodeTestSeq = new TestSeq(_nodeGroup, -1, this);
   	    _nodeTestSeq.reduce();
   	    _nodeTestSeq.findTemplates(_neededTemplates);
   	}
  @@ -621,20 +718,7 @@
   	}
       }
   
  -    /**
  -     * Auxiliary method to determine if a qname describes an attribute/element
  -     */
  -    private static boolean isAttributeName(String qname) {
  -	final int col = qname.lastIndexOf(':') + 1;
  -	return (qname.charAt(col) == '@');
  -    }
  -
  -    private static boolean isNamespaceName(String qname) {
  -	final int col = qname.lastIndexOf(':');
  -	return (col > -1 && qname.charAt(qname.length()-1) == '*');
  -    }
  -
  -    /**
  +   /**
        * Compiles the applyTemplates() method and adds it to the translet.
        * This is the main dispatch method.
        */
  @@ -744,7 +828,6 @@
   	// If there is a match on node() we need to replace ihElem
   	// and ihText if the priority of node() is higher
   	if (_nodeTestSeq != null) {
  -
   	    // Compare priorities of node() and "*"
   	    double nodePrio = _nodeTestSeq.getPriority();
   	    int    nodePos  = _nodeTestSeq.getPosition();
  @@ -817,6 +900,7 @@
   	    }
   	}
   
  +
   	// Handle pattern with match on root node - default: traverse children
   	targets[DTM.ROOT_NODE] = _rootPattern != null
   	    ? getTemplateInstructionHandle(_rootPattern.getTemplate())
  @@ -1370,5 +1454,22 @@
   
       public InstructionHandle getTemplateInstructionHandle(Template template) {
   	return (InstructionHandle)_templateIHs.get(template);
  +    }
  +
  +    /**
  +     * Auxiliary method to determine if a qname is an attribute.
  +     */
  +    private static boolean isAttributeName(String qname) {
  +	final int col = qname.lastIndexOf(':') + 1;
  +	return (qname.charAt(col) == '@');
  +    }
  +
  +    /**
  +     * Auxiliary method to determine if a qname is a namespace 
  +     * qualified "*".
  +     */
  +    private static boolean isNamespaceName(String qname) {
  +	final int col = qname.lastIndexOf(':');
  +	return (col > -1 && qname.charAt(qname.length()-1) == '*');
       }
   }
  
  
  
  1.14.2.3  +4 -2      xml-xalan/java/src/org/apache/xalan/xsltc/compiler/StepPattern.java
  
  Index: StepPattern.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/StepPattern.java,v
  retrieving revision 1.14.2.2
  retrieving revision 1.14.2.3
  diff -u -r1.14.2.2 -r1.14.2.3
  --- StepPattern.java	29 Jul 2002 00:01:23 -0000	1.14.2.2
  +++ StepPattern.java	1 Aug 2002 19:55:30 -0000	1.14.2.3
  @@ -152,7 +152,9 @@
   	final StringBuffer buffer = new StringBuffer("stepPattern(\"");
   	buffer.append(Axis.names[_axis])
   	    .append("\", ")
  -	    .append(_isEpsilon ? "epsilon" : Integer.toString(_nodeType));
  +	    .append(_isEpsilon ? 
  +			("epsilon{" + Integer.toString(_nodeType) + "}") :
  +			 Integer.toString(_nodeType));
   	if (_predicates != null)
   	    buffer.append(", ").append(_predicates.toString());
   	return buffer.append(')').toString();
  
  
  
  1.6.6.2   +154 -101  xml-xalan/java/src/org/apache/xalan/xsltc/compiler/TestSeq.java
  
  Index: TestSeq.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/TestSeq.java,v
  retrieving revision 1.6.6.1
  retrieving revision 1.6.6.2
  diff -u -r1.6.6.1 -r1.6.6.2
  --- TestSeq.java	29 Jul 2002 00:01:23 -0000	1.6.6.1
  +++ TestSeq.java	1 Aug 2002 19:55:30 -0000	1.6.6.2
  @@ -69,6 +69,7 @@
   import java.util.Hashtable;
   import java.util.Dictionary;
   import java.util.Enumeration;
  +import java.util.Iterator;
   
   import org.apache.bcel.generic.*;
   import org.apache.xalan.xsltc.compiler.util.*;
  @@ -77,110 +78,149 @@
    * A test sequence is a sequence of patterns that
    *
    *  (1) occured in templates in the same mode
  - *  (2) share the same kernel node type (such as A/B and C/C/B).
  + *  (2) share the same kernel node type (e.g. A/B and C/C/B)
  + *  (3) may also contain patterns matching "*" and "node()"
  + *      (element sequence only) or matching "@*" (attribute
  + *      sequence only).
    *
  - * A test sequence may have a default template, which will be run if
  - * none of the patterns do not match. This template is always a template
  - * that matches solely on the shared kernel node type.
  + * A test sequence may have a default template, which will be 
  + * instantiated if none of the other patterns match. 
    */
   final class TestSeq {
   
  -    private Vector   _patterns = null; // all patterns
  -    private Mode     _mode     = null; // the shared mode
  -    private Template _default  = null; // the default template
  +    /**
  +     * Integer code for the kernel type of this test sequence
  +     */
  +    private int _kernelType;
  +
  +    /**
  +     * Vector of all patterns in the test sequence. May include
  +     * patterns with "*", "@*" or "node()" kernel.
  +     */
  +    private Vector _patterns = null;
  +
  +    /**
  +     * A reference to the Mode object.
  +     */
  +    private Mode _mode = null;
  +
  +    /**
  +     * Default template for this test sequence
  +     */
  +    private Template _default = null;
   
  +    /**
  +     * Instruction list representing this test sequence.
  +     */
       private InstructionList _instructionList;
   
       /**
  -     * Creates a new test sequence, given a set of patterns and a mode.
  +     * Cached handle to avoid compiling more than once.
  +     */
  +    private InstructionHandle _start = null;
  +
  +    /**
  +     * Creates a new test sequence given a set of patterns and a mode.
        */
       public TestSeq(Vector patterns, Mode mode) {
  +	this(patterns, -2, mode);
  +    }
  +
  +    public TestSeq(Vector patterns, int kernelType, Mode mode) {
   	_patterns = patterns;
  +	_kernelType = kernelType;
   	_mode = mode;
       }
   
       /**
  -     * The priority is only calculated if the test sequence has a default
  -     * template. This is bad, bad, bad. We should get the priority from the
  -     * other templates that make up the test sequence.
  +     * Returns a string representation of this test sequence. Notice
  +     * that test sequences are mutable, so the value returned by this
  +     * method is different before and after calling reduce().
        */
  -    public double getPriority() {
  -	double prio = (0 - Double.MAX_VALUE);
  +    public String toString() {
   	final int count = _patterns.size();
  +	final StringBuffer result = new StringBuffer();
   
   	for (int i = 0; i < count; i++) {
  -	    final Pattern pattern = (Pattern)_patterns.elementAt(i);
  -	    final Template template = pattern.getTemplate();
  -	    final double tp = template.getPriority();
  -	    if (tp > prio) prio = tp;
  -	}
  -	if (_default != null) {
  -	    final double tp = _default.getPriority();
  -	    if (tp > prio) prio = tp;
  +	    final LocationPathPattern pattern =
  +		(LocationPathPattern) _patterns.elementAt(i);
  +
  +	    if (i == 0) {
  +		result.append("Testseq for kernel " + _kernelType)
  +		      .append('\n');
  +	    }
  +	    result.append("   pattern " + i + ": ")
  +	          .append(pattern.toString())
  +		  .append('\n');
   	}
  -	return prio;
  +	return result.toString();
       }
   
       /**
  -     * This method should return the last position of any template included
  -     * in this test sequence.
  +     * Returns the instruction list for this test sequence
        */
  -    public int getPosition() {
  -	int pos = Integer.MIN_VALUE;
  -	final int count = _patterns.size();
  +    public InstructionList getInstructionList() {
  +	return _instructionList;
  +    }
   
  -	for (int i = 0; i < count; i++) {
  -	    final Pattern pattern = (Pattern)_patterns.elementAt(i);
  -	    final Template template = pattern.getTemplate();
  -	    final int tp = template.getPosition();
  -	    if (tp > pos) pos = tp;
  -	}
  -	if (_default != null) {
  -	    final int tp = _default.getPosition();
  -	    if (tp > pos) pos = tp;
  -	}
  -	return pos;
  +    /**
  +     * Return the highest priority for a pattern in this test
  +     * sequence. This is either the priority of the first or
  +     * of the default pattern.
  +     */
  +    public double getPriority() {
  +	final Template template = (_patterns.size() == 0) ? _default 
  +	    : ((Pattern) _patterns.elementAt(0)).getTemplate();
  +	return template.getPriority();
       }
  -	
  +
  +    /**
  +     * Returns the position of the highest priority pattern in 
  +     * this test sequence.
  +     */
  +    public int getPosition() {
  +	final Template template = (_patterns.size() == 0) ? _default 
  +	    : ((Pattern) _patterns.elementAt(0)).getTemplate();
  +	return template.getPosition();
  +    }
  +
       /**
  -     * Reduce the patterns in this test sequence to exclude the shared
  -     * kernel node type. After the switch() in the translet's applyTemplates()
  -     * we already know that we have a hit for the kernel node type, we only
  -     * have the check the rest of the pattern.
  +     * Reduce the patterns in this test sequence. Creates a new
  +     * vector of patterns and sets the default pattern if it
  +     * finds a patterns that is fully reduced.
        */
       public void reduce() {
   	final Vector newPatterns = new Vector();
  -	final int count = _patterns.size();
   
  -	// Traverse the existing set of patterns (they are in prioritised order)
  +	final int count = _patterns.size();
   	for (int i = 0; i < count; i++) {
   	    final LocationPathPattern pattern =
   		(LocationPathPattern)_patterns.elementAt(i);
  -	    // Reduce this pattern (get rid of kernel node type)
  +		
  +	    // Reduce this pattern
   	    pattern.reduceKernelPattern();
   			
  -	    // Add this pattern to the new vector of patterns.
  -	    if (!pattern.isWildcard()) {
  -		newPatterns.addElement(pattern);
  +	    // Is this pattern fully reduced?
  +	    if (pattern.isWildcard()) {
  +		_default = pattern.getTemplate();
  +		break; 		// Ignore following patterns 
   	    }
  -	    // Set template as default if its pattern matches purely on kernel
   	    else {
  -		_default = pattern.getTemplate();
  -		// Following patterns can be ignored since default has priority
  -		break;
  +		newPatterns.addElement(pattern);
   	    }
   	}
   	_patterns = newPatterns;
       }
   
       /**
  -     * Returns, by reference, the templates that are included in this test
  -     * sequence. Remember that a single template can occur in several test
  -     * sequences if its pattern is a union (ex. match="A/B | A/C").
  +     * Returns, by reference, the templates that are included in 
  +     * this test sequence. Note that a single template can occur 
  +     * in several test sequences if its pattern is a union.
        */
       public void findTemplates(Dictionary templates) {
  -	if (_default != null)
  +	if (_default != null) {
   	    templates.put(_default, this);
  +	}
   	for (int i = 0; i < _patterns.size(); i++) {
   	    final LocationPathPattern pattern =
   		(LocationPathPattern)_patterns.elementAt(i);
  @@ -189,9 +229,10 @@
       }
   
       /**
  -     * Get the instruction handle to a template's code. This is used when
  -     * a single template occurs in several test sequences; that is, if its
  -     * pattern is a union of patterns (ex. match="A/B | A/C").
  +     * Get the instruction handle to a template's code. This is 
  +     * used when a single template occurs in several test 
  +     * sequences; that is, if its pattern is a union of patterns 
  +     * (e.g. match="A/B | A/C").
        */
       private InstructionHandle getTemplateHandle(Template template) {
   	return (InstructionHandle)_mode.getTemplateInstructionHandle(template);
  @@ -204,71 +245,83 @@
   	return (LocationPathPattern)_patterns.elementAt(n);
       }
   
  -
  -    private InstructionHandle _start = null;
  -
       /**
  -     * Copile the code for this test sequence. The code will first test for
  -     * the pattern with the highest priority, then go on to the next ones,
  -     * until it hits or finds the default template.
  +     * Compile the code for this test sequence. Compile patterns 
  +     * from highest to lowest priority. Note that since patterns 
  +     * can be share by multiple test sequences, instruction lists 
  +     * must be copied before backpatching.
        */
       public InstructionHandle compile(ClassGenerator classGen,
   				     MethodGenerator methodGen,
  -				     InstructionHandle continuation) {
  +				     InstructionHandle continuation) 
  +    {
  +	// Returned cached value if already compiled
  +	if (_start != null) {
  +	    return _start;
  +	}
   
  +	// If not patterns, then return handle for default template
   	final int count = _patterns.size();
  -	
  -	if (_start != null) return(_start);
  -
  -	// EZ DC if there is only one (default) pattern
  -	if (count == 0) getTemplateHandle(_default);
  +	if (count == 0) {
  +	    return (_start = getTemplateHandle(_default));
  +	}
   
  -	// The 'fail' instruction handle represents a branch to go to when
  -	// test fails. It is updated in each iteration, so that the tests
  -	// are linked together in the  if-elseif-elseif-else fashion.
  -	InstructionHandle fail;
  +	// Init handle to jump when all patterns failed
  +	InstructionHandle fail = (_default == null) ? continuation
  +	    : getTemplateHandle(_default);
   	
  -	// Initialize 'fail' to either the code for the default template
  -	if (_default != null)
  -	    fail = getTemplateHandle(_default);
  -	// ..or if that does not exist, to a location set by the caller.
  -	else
  -	    fail = continuation;
  -
  -	for (int n = (count - 1); n >= 0; n--) {
  +	// Compile all patterns in reverse order
  +	for (int n = count - 1; n >= 0; n--) {
   	    final LocationPathPattern pattern = getPattern(n);
   	    final Template template = pattern.getTemplate();
   	    final InstructionList il = new InstructionList();
   
   	    // Patterns expect current node on top of stack
   	    il.append(methodGen.loadCurrentNode());
  +
   	    // Apply the test-code compiled for the pattern
  -	    il.append(pattern.compile(classGen, methodGen));
  +	    InstructionList ilist = _mode.getInstructionList(pattern);
  +	    if (ilist == null) {
  +		ilist = pattern.compile(classGen, methodGen);
  +		_mode.addInstructionList(pattern, ilist);
  +	    }
  +
  +	    // Make a copy of the instruction list for backpatching
  +	    InstructionList copyOfilist = ilist.copy();
  +
  +	    FlowList trueList = pattern.getTrueList();
  +	    if (trueList != null) {
  +		trueList = trueList.copyAndRedirect(ilist, copyOfilist);
  +	    }
  +	    FlowList falseList = pattern.getFalseList();
  +	    if (falseList != null) {
  +		falseList = falseList.copyAndRedirect(ilist, copyOfilist);
  +	    }
  +
  +	    il.append(copyOfilist);
   
   	    // On success branch to the template code
   	    final InstructionHandle gtmpl = getTemplateHandle(template);
   	    final InstructionHandle success = il.append(new GOTO_W(gtmpl));
  -	    pattern.backPatchTrueList(success);
  -	    pattern.backPatchFalseList(fail);
   
  -	    // We're working backwards here. The next pattern's 'fail' target
  -	    // is this pattern's first instruction
  +	    if (trueList != null) {
  +		trueList.backPatch(success);
  +	    }
  +	    if (falseList != null) {
  +		falseList.backPatch(fail);
  +	    } 
  +
  +	    // Next pattern's 'fail' target is this pattern's first instruction
   	    fail = il.getStart();
   
   	    // Append existing instruction list to the end of this one
  -	    if (_instructionList != null) il.append(_instructionList);
  +	    if (_instructionList != null) {
  +		il.append(_instructionList);
  +	    }
   
  -	    // Set current instruction list to be this one.
  +	    // Set current instruction list to be this one
   	    _instructionList = il;
   	}
  -	return(_start = fail);
  -    }
  -
  -    /**
  -     * Returns the instruction list for this test sequence
  -     */
  -    public InstructionList getInstructionList() {
  -	return _instructionList;
  +	return (_start = fail);
       }
  -
   }
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.2.10.1  +7 -6      xml-xalan/java/src/org/apache/xalan/xsltc/compiler/util/MultiHashtable.java
  
  Index: MultiHashtable.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/util/MultiHashtable.java,v
  retrieving revision 1.2
  retrieving revision 1.2.10.1
  diff -u -r1.2 -r1.2.10.1
  --- MultiHashtable.java	20 Aug 2001 14:50:32 -0000	1.2
  +++ MultiHashtable.java	1 Aug 2002 19:55:31 -0000	1.2.10.1
  @@ -75,17 +75,18 @@
   	return vector;
       }
   	
  -    public boolean maps(Object from, Object to) {
  -	if (from == null) return false;
  +    public Object maps(Object from, Object to) {
  +	if (from == null) return null;
   	final Vector vector = (Vector) get(from);
   	if (vector != null) {
   	    final int n = vector.size();
   	    for (int i = 0; i < n; i++) {
  -		if (vector.elementAt(i).equals(to)) {
  -		    return true;
  +                final Object item = vector.elementAt(i);
  +		if (item.equals(to)) {
  +		    return item;
   		}
   	    }
   	}
  -	return false;
  +	return null;
       }
   }
  
  
  
  1.7.6.2   +2 -3      xml-xalan/java/src/org/apache/xalan/xsltc/compiler/util/ReferenceType.java
  
  Index: ReferenceType.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/util/ReferenceType.java,v
  retrieving revision 1.7.6.1
  retrieving revision 1.7.6.2
  diff -u -r1.7.6.1 -r1.7.6.2
  --- ReferenceType.java	29 Jul 2002 00:01:26 -0000	1.7.6.1
  +++ ReferenceType.java	1 Aug 2002 19:55:31 -0000	1.7.6.2
  @@ -230,7 +230,6 @@
   	il.append(new INVOKESTATIC(index));
       }
   
  -
       /**
        * Subsume reference into ObjectType.
        *
  @@ -238,7 +237,7 @@
        */
       public void translateTo(ClassGenerator classGen, MethodGenerator methodGen, 
   			    ObjectType type) {
  -	    methodGen.getInstructionList().append(NOP);	
  +	methodGen.getInstructionList().append(NOP);	
       }
   
       /**
  
  
  
  1.10.6.2  +18 -1     xml-xalan/java/src/org/apache/xalan/xsltc/compiler/util/ResultTreeType.java
  
  Index: ResultTreeType.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/util/ResultTreeType.java,v
  retrieving revision 1.10.6.1
  retrieving revision 1.10.6.2
  diff -u -r1.10.6.1 -r1.10.6.2
  --- ResultTreeType.java	17 Apr 2002 18:13:43 -0000	1.10.6.1
  +++ ResultTreeType.java	1 Aug 2002 19:55:31 -0000	1.10.6.2
  @@ -136,6 +136,9 @@
   	else if (type == Type.Reference) {
   	    translateTo(classGen, methodGen, (ReferenceType)type);
   	}
  +	else if (type == Type.Object) {
  +	    translateTo(classGen, methodGen, (ObjectType) type);
  +	}
   	else {
   	    ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR,
   					toString(), type.toString());
  @@ -380,6 +383,16 @@
       }
   
       /**
  +     * Subsume result tree into ObjectType.
  +     *
  +     * @see	org.apache.xalan.xsltc.compiler.util.Type#translateTo
  +     */
  +    public void translateTo(ClassGenerator classGen, MethodGenerator methodGen, 
  +			    ObjectType type) {
  +	methodGen.getInstructionList().append(NOP);	
  +    }
  +
  +    /**
        * Translates a result tree into a non-synthesized boolean.
        * It does not push a 0 or a 1 but instead returns branchhandle list
        * to be appended to the false list.
  @@ -429,7 +442,11 @@
   						  MAKE_NODE_LIST_SIG2);
   	    il.append(new INVOKEINTERFACE(index, 2));
   	}
  +	else if (className.equals("java.lang.Object")) {
  +	    il.append(NOP);
  +	}
   	else {
  +System.out.println("ResultTreeType.translateTo()");
   	    ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR,
   					toString(), className);
   	    classGen.getParser().reportError(Constants.FATAL, err);
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.15.2.1  +2 -2      xml-xalan/java/src/org/apache/xml/utils/SystemIDResolver.java
  
  Index: SystemIDResolver.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xml/utils/SystemIDResolver.java,v
  retrieving revision 1.15
  retrieving revision 1.15.2.1
  diff -u -r1.15 -r1.15.2.1
  --- SystemIDResolver.java	22 Mar 2002 00:43:41 -0000	1.15
  +++ SystemIDResolver.java	1 Aug 2002 19:55:31 -0000	1.15.2.1
  @@ -263,8 +263,8 @@
       // Not so sure if this is good.  But, for now, I'll try it. We really must 
       // make sure the return from this function is a URL!
       if((Character.isLetter(uriStr.charAt(0)) && (uriStr.charAt(1) == ':') 
  -     && (uriStr.charAt(2) == '/') && (uriStr.charAt(3) != '/'))
  -       || ((uriStr.charAt(0) == '/') && (uriStr.charAt(1) != '/')))
  +     && (uriStr.charAt(2) == '/') && (uriStr.length() == 3 || uriStr.charAt(3) != '/'))
  +       || ((uriStr.charAt(0) == '/') && (uriStr.length() == 1 || uriStr.charAt(1) != '/')))
       {
       	uriStr = "file:///"+uriStr;
       }
  
  
  
  1.14.10.1 +20 -3     xml-xalan/java/src/org/apache/xml/utils/TreeWalker.java
  
  Index: TreeWalker.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xml/utils/TreeWalker.java,v
  retrieving revision 1.14
  retrieving revision 1.14.10.1
  diff -u -r1.14 -r1.14.10.1
  --- TreeWalker.java	11 Oct 2001 15:01:35 -0000	1.14
  +++ TreeWalker.java	1 Aug 2002 19:55:31 -0000	1.14.10.1
  @@ -71,6 +71,7 @@
    * This class does a pre-order walk of the DOM tree, calling a ContentHandler
    * interface as it goes.
    */
  +
   public class TreeWalker
   {
   
  @@ -167,8 +168,13 @@
     }
   
     /**
  -   * Perform a pre-order traversal non-recursive style.
  +   * Perform a pre-order traversal non-recursive style.  
      *
  +   * Note that TreeWalker assumes that the subtree is intended to represent 
  +   * a complete (though not necessarily well-formed) document and, during a 
  +   * traversal, startDocument and endDocument will always be issued to the 
  +   * SAX listener.
  +   *  
      * @param pos Node in the tree where to start traversal
      *
      * @throws TransformerException
  @@ -176,6 +182,8 @@
     public void traverse(Node pos) throws org.xml.sax.SAXException
     {
   
  +   	this.m_contentHandler.startDocument();
  +
       Node top = pos;
   
       while (null != pos)
  @@ -211,10 +219,16 @@
   
         pos = nextNode;
       }
  +    this.m_contentHandler.endDocument();
     }
   
     /**
      * Perform a pre-order traversal non-recursive style.
  +
  +   * Note that TreeWalker assumes that the subtree is intended to represent 
  +   * a complete (though not necessarily well-formed) document and, during a 
  +   * traversal, startDocument and endDocument will always be issued to the 
  +   * SAX listener.
      *
      * @param pos Node in the tree where to start traversal
      * @param top Node in the tree where to end traversal
  @@ -224,6 +238,8 @@
     public void traverse(Node pos, Node top) throws org.xml.sax.SAXException
     {
   
  +	this.m_contentHandler.startDocument();
  +	
       while (null != pos)
       {
         startNode(pos);
  @@ -254,6 +270,7 @@
   
         pos = nextNode;
       }
  +    this.m_contentHandler.endDocument();
     }
   
     /** Flag indicating whether following text to be processed is raw text          */
  @@ -325,7 +342,7 @@
         // ??;
         break;
       case Node.DOCUMENT_NODE :
  -      this.m_contentHandler.startDocument();
  +    
         break;
       case Node.ELEMENT_NODE :
         NamedNodeMap atts = ((Element) node).getAttributes();
  @@ -454,8 +471,8 @@
       switch (node.getNodeType())
       {
       case Node.DOCUMENT_NODE :
  -      this.m_contentHandler.endDocument();
         break;
  +      
       case Node.ELEMENT_NODE :
         String ns = m_dh.getNamespaceOfNode(node);
         if(null == ns)
  
  
  

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