You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by sb...@apache.org on 2001/05/27 05:05:17 UTC

cvs commit: xml-xalan/java/src/org/apache/xpath/objects XObject.java XString.java

sboag       01/05/26 20:05:17

  Modified:    java/src/org/apache/xalan/extensions Tag: DTM_EXP
                        ExtensionHandler.java ExtensionHandlerGeneral.java
                        MethodResolver.java
               java/src/org/apache/xalan/processor Tag: DTM_EXP
                        ProcessorInclude.java TransformerFactoryImpl.java
                        XSLTElementProcessor.java XSLTSchema.java
               java/src/org/apache/xalan/res Tag: DTM_EXP
                        XSLTErrorResources.java
               java/src/org/apache/xalan/serialize Tag: DTM_EXP
                        CharInfo.java
               java/src/org/apache/xalan/templates Tag: DTM_EXP
                        ElemChoose.java ElemCopy.java ElemValueOf.java
                        OutputProperties.java
               java/src/org/apache/xalan/transformer Tag: DTM_EXP
                        ResultTreeHandler.java TransformSnapshotImpl.java
                        TransformerIdentityImpl.java TransformerImpl.java
                        TreeWalker2Result.java
               java/src/org/apache/xalan/xslt Tag: DTM_EXP Process.java
               java/src/org/apache/xml/utils Tag: DTM_EXP TreeWalker.java
               java/src/org/apache/xpath Tag: DTM_EXP XPath.java
                        XPathAPI.java
               java/src/org/apache/xpath/axes Tag: DTM_EXP
                        DescendantIterator.java
               java/src/org/apache/xpath/functions Tag: DTM_EXP
                        FuncCurrent.java FuncExtFunction.java
                        FuncSystemProperty.java
               java/src/org/apache/xpath/objects Tag: DTM_EXP XObject.java
                        XString.java
  Log:
  Myriam's merges from the main branch.
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.12.2.2  +1 -1      xml-xalan/java/src/org/apache/xalan/extensions/ExtensionHandler.java
  
  Index: ExtensionHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/extensions/ExtensionHandler.java,v
  retrieving revision 1.12.2.1
  retrieving revision 1.12.2.2
  diff -u -r1.12.2.1 -r1.12.2.2
  --- ExtensionHandler.java	2001/04/10 18:44:36	1.12.2.1
  +++ ExtensionHandler.java	2001/05/27 03:05:12	1.12.2.2
  @@ -116,7 +116,7 @@
      * 
      * @param className Name of the class to load
      */
  -  static Class getClassForName(String className)
  +  public static Class getClassForName(String className)
         throws ClassNotFoundException
     {
       Class result = null;
  
  
  
  1.10.2.3  +4 -2      xml-xalan/java/src/org/apache/xalan/extensions/ExtensionHandlerGeneral.java
  
  Index: ExtensionHandlerGeneral.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/extensions/ExtensionHandlerGeneral.java,v
  retrieving revision 1.10.2.2
  retrieving revision 1.10.2.3
  diff -u -r1.10.2.2 -r1.10.2.3
  --- ExtensionHandlerGeneral.java	2001/05/06 02:09:22	1.10.2.2
  +++ ExtensionHandlerGeneral.java	2001/05/27 03:05:12	1.10.2.3
  @@ -138,11 +138,13 @@
     {
       try
       {
  -      managerClass = Class.forName(BSF_MANAGER);
  +      //managerClass = Class.forName(BSF_MANAGER);
  +			managerClass = ExtensionHandler.getClassForName(BSF_MANAGER);
         mgrLoadScriptingEngine = managerClass.getMethod("loadScriptingEngine",
                 new Class[]{ String.class });
   
  -      Class engineClass = Class.forName(BSF_ENGINE);
  +      //Class engineClass = Class.forName(BSF_ENGINE);
  +			Class engineClass = ExtensionHandler.getClassForName(BSF_ENGINE);
   
         engineExec = engineClass.getMethod("exec", new Class[]{ String.class,
                                                                 Integer.TYPE,
  
  
  
  1.19.2.3  +71 -46    xml-xalan/java/src/org/apache/xalan/extensions/MethodResolver.java
  
  Index: MethodResolver.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/extensions/MethodResolver.java,v
  retrieving revision 1.19.2.2
  retrieving revision 1.19.2.3
  diff -u -r1.19.2.2 -r1.19.2.3
  --- MethodResolver.java	2001/05/06 02:09:22	1.19.2.2
  +++ MethodResolver.java	2001/05/27 03:05:12	1.19.2.3
  @@ -338,7 +338,6 @@
       Method bestMethod = null;
       Method[] methods = classObj.getMethods();
       int nMethods = methods.length;
  -    int bestScore = Integer.MAX_VALUE;
       int bestScoreCount = 0;
       for(int i = 0; i < nMethods; i++)
       {
  @@ -348,33 +347,13 @@
         {
           Class[] paramTypes = method.getParameterTypes();
           if ( (paramTypes.length == 2)
  -           && paramTypes[1].isAssignableFrom(org.apache.xalan.templates.ElemExtensionCall.class) )
  +           && paramTypes[1].isAssignableFrom(org.apache.xalan.templates.ElemExtensionCall.class)
  +					 && paramTypes[0].isAssignableFrom(org.apache.xalan.extensions.XSLProcessorContext.class) )
           {
  -          int score = -1;
  -          if (paramTypes[0].isAssignableFrom(
  -                                      org.apache.xalan.extensions.XSLProcessorContext.class))
  -          {
  -            score = 10;
  -          }
  -          /*******
  -          else if (paramTypes[0].isAssignableFrom(
  -                                      org.apace.xalan.xslt.XSLProcessorContext.class))
  -          {
  -            score = 5;
  -          }
  -          ********/
  -          else 
  -            continue;
  -
  -          if (score < bestScore)
  -          {
  -            // System.out.println("Assigning best method: "+method);
  +          if ( ++bestScoreCount == 1 )
               bestMethod = method;
  -            bestScore = score;
  -            bestScoreCount = 1;
  -          }
  -          else if (score == bestScore)
  -            bestScoreCount++;
  +          else
  +            break;
           }
         }
       }
  @@ -630,15 +609,53 @@
         {
           // If we get here, we haven't made a match on this parameter using 
           // the ConversionInfo array.  We now try to handle the object -> object
  -        // mapping which we can't handle through the array mechanism.
  +        // mapping which we can't handle through the array mechanism.  To do this,
  +        // we must determine the class of the argument passed from the stylesheet.
  +
  +        // If we were passed a subclass of XObject, representing one of the actual
  +        // XSLT types, and we are here, we reject this extension method as a candidate
  +        // because a match should have been made using the ConversionInfo array.  If we 
  +        // were passed an XObject that encapsulates a non-XSLT type or we
  +        // were passed a non-XSLT type directly, we continue.
  +
  +        // The current implementation (contributed by Kelly Campbell <ca...@channelpoint.com>)
  +        // checks to see if we were passed an XObject from the XSLT stylesheet.  If not,
  +        // we use the class of the object that was passed and make sure that it will
  +        // map to the class type of the parameter in the extension function.
  +        // If we were passed an XObject, we attempt to get the class of the actual
  +        // object encapsulated inside the XObject.  If the encapsulated object is null,
  +        // we judge this method as a match but give it a low score.  
  +        // If the encapsulated object is not null, we use its type to determine
  +        // whether this java method is a valid match for this extension function call.
  +        // This approach eliminates the NullPointerException in the earlier implementation
  +        // that resulted from passing an XObject encapsulating the null java object.
  +				
           // TODO:  This needs to be improved to assign relative scores to subclasses,
  -        // etc.  I plan to do this very soon.  Gary Peskin 29-Oct-2000.
  +        // etc. 
   
           if (XObject.CLASS_UNKNOWN == xsltClassType)
           {
  -          Class realClass = (xsltObj instanceof XObject)
  -                              ? ((XObject) xsltObj).object().getClass()
  -                              : xsltObj.getClass();
  +          Class realClass = null;
  +
  +          if (xsltObj instanceof XObject)
  +          {
  +            Object realObj = ((XObject) xsltObj).object();
  +            if (null != realObj)
  +            {
  +              realClass = realObj.getClass();
  +            }
  +            else
  +            {
  +              // do the same as if we were passed XObject.CLASS_NULL
  +              score += 10;
  +              continue;
  +            }
  +          }
  +          else
  +          {
  +            realClass = xsltObj.getClass();
  +          }
  +
             if (javaClass.isAssignableFrom(realClass))
             {
               score += 0;         // TODO: To be assigned based on subclass "distance"
  @@ -827,22 +844,30 @@
         
       } // end if if(xsltObj instanceof XObject)
       
  -    // At this point, we have a raw java object.
  -    if(javaClass == java.lang.String.class)
  -    {
  -      return xsltObj.toString();
  -    }
  -    else if(javaClass.isPrimitive())
  -    {
  -      // Assume a number conversion
  -      XString xstr = new XString(xsltObj.toString());
  -      double num = xstr.num();
  -      return convertDoubleToNumber(num, javaClass);
  -    }
  -    else if(javaClass == java.lang.Class.class)
  +    // At this point, we have a raw java object, not an XObject.
  +    if (null != xsltObj)
       {
  -      return xsltObj.getClass();
  -    }
  +      if(javaClass == java.lang.String.class)
  +      {
  +        return xsltObj.toString();
  +      }
  +      else if(javaClass.isPrimitive())
  +      {
  +        // Assume a number conversion
  +        XString xstr = new XString(xsltObj.toString());
  +        double num = xstr.num();
  +        return convertDoubleToNumber(num, javaClass);
  +      }
  +      else if(javaClass == java.lang.Class.class)
  +      {
  +        return xsltObj.getClass();
  +      }
  +      else
  +      {
  +        // Just pass the object directly, and hope for the best.
  +        return xsltObj;
  +      }
  +		}
       else
       {
         // Just pass the object directly, and hope for the best.
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.17.2.1  +1 -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.17
  retrieving revision 1.17.2.1
  diff -u -r1.17 -r1.17.2.1
  --- ProcessorInclude.java	2001/03/12 02:12:43	1.17
  +++ ProcessorInclude.java	2001/05/27 03:05:12	1.17.2.1
  @@ -230,7 +230,7 @@
           if (null != source && source instanceof DOMSource)
           {
             Node node = ((DOMSource)source).getNode();
  -          TreeWalker walker = new TreeWalker(handler, new org.apache.xpath.DOM2Helper());
  +          TreeWalker walker = new TreeWalker(handler, new org.apache.xpath.DOM2Helper(), source.getSystemId());
   
             try
             {
  
  
  
  1.28.2.2  +27 -7     xml-xalan/java/src/org/apache/xalan/processor/TransformerFactoryImpl.java
  
  Index: TransformerFactoryImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/processor/TransformerFactoryImpl.java,v
  retrieving revision 1.28.2.1
  retrieving revision 1.28.2.2
  diff -u -r1.28.2.1 -r1.28.2.2
  --- TransformerFactoryImpl.java	2001/05/06 02:09:23	1.28.2.1
  +++ TransformerFactoryImpl.java	2001/05/27 03:05:12	1.28.2.2
  @@ -128,6 +128,12 @@
       loadPropertyFileToSystem(XSLT_PROPERTIES);
     }
   
  +  /** a zero length Class array used in loadPropertyFileToSystem() */
  +  private static final Class[] NO_CLASSES = new Class[0];
  +
  +  /** a zero length Object array used in loadPropertyFileToSystem() */
  +  private static final Object[] NO_OBJS = new Object[0];
  +
     /**
      * Retrieve a propery bundle from a specified file and load it
      * int the System properties.
  @@ -141,13 +147,24 @@
       {
         try
         {
  -        InputStream is;
  +        InputStream is = null;
   
           try
           {
             Properties props = new Properties();
  +
  +          try {
  +            java.lang.reflect.Method getCCL = Thread.class.getMethod("getContextClassLoader", NO_CLASSES);
  +            if (getCCL != null) {
  +              ClassLoader contextClassLoader = (ClassLoader) getCCL.invoke(Thread.currentThread(), NO_OBJS);
  +              is = contextClassLoader.getResourceAsStream("org/apache/xalan/processor/" + file);
  +            }
  +          }
  +          catch (Exception e) {}
   
  -          is = TransformerFactoryImpl.class.getResourceAsStream(file);
  +          if (is == null) {
  +            is = TransformerFactoryImpl.class.getResourceAsStream(file);
  +          }
   
             // get a buffered version
             BufferedInputStream bis = new BufferedInputStream(is);
  @@ -190,7 +207,7 @@
       try
       {
         TemplatesHandler builder = newTemplatesHandler();
  -      TreeWalker walker = new TreeWalker(builder, new org.apache.xpath.DOM2Helper());
  +      TreeWalker walker = new TreeWalker(builder, new org.apache.xpath.DOM2Helper(), builder.getSystemId());
   
         walker.traverse(node);
   
  @@ -224,11 +241,11 @@
         // Assume it's already been reported to the error listener.
         throw tce;
       }
  -    catch (TransformerException tce)
  +   /* catch (TransformerException tce)
       {
         // Assume it's already been reported to the error listener.
         throw new TransformerConfigurationException(tce.getMessage(), tce);
  -    }
  +    }*/
       catch (Exception e)
       {
         if (m_errorListener != null)
  @@ -356,7 +373,7 @@
       {
         if (null != node)
         {
  -        TreeWalker walker = new TreeWalker(handler, new org.apache.xpath.DOM2Helper());
  +        TreeWalker walker = new TreeWalker(handler, new org.apache.xpath.DOM2Helper(), baseID);
   
           walker.traverse(node);
         }
  @@ -589,6 +606,7 @@
       try {
         TransformerImpl transformer =
           (TransformerImpl) templates.newTransformer();
  +      transformer.setURIResolver(m_uriResolver);
         TransformerHandler th =
           (TransformerHandler) transformer.getInputContentHandler(true);
   
  @@ -674,7 +692,9 @@
            that, and returns null.
         */
         if( tmpl==null ) return null;
  -      return tmpl.newTransformer();
  +      Transformer transformer = tmpl.newTransformer();
  +      transformer.setURIResolver(m_uriResolver);
  +      return transformer;
       } catch( TransformerConfigurationException ex ) {
         if( m_errorListener != null ) {
           try {
  
  
  
  1.10.2.1  +3 -0      xml-xalan/java/src/org/apache/xalan/processor/XSLTElementProcessor.java
  
  Index: XSLTElementProcessor.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/processor/XSLTElementProcessor.java,v
  retrieving revision 1.10
  retrieving revision 1.10.2.1
  diff -u -r1.10 -r1.10.2.1
  --- XSLTElementProcessor.java	2001/03/29 22:39:33	1.10
  +++ XSLTElementProcessor.java	2001/05/27 03:05:13	1.10.2.1
  @@ -223,6 +223,9 @@
     {
   		if (m_savedLastOrder != null && !m_savedLastOrder.empty())
   			getElemDef().setLastOrder(m_savedLastOrder.pop());
  +		
  +		if (!getElemDef().getRequiredFound())
  +			handler.error(XSLTErrorResources.ER_REQUIRED_ELEM_NOT_FOUND, new Object[]{getElemDef().getRequiredElem()}, null);
     }
   
     /**
  
  
  
  1.19.2.1  +1 -1      xml-xalan/java/src/org/apache/xalan/processor/XSLTSchema.java
  
  Index: XSLTSchema.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/processor/XSLTSchema.java,v
  retrieving revision 1.19
  retrieving revision 1.19.2.1
  diff -u -r1.19 -r1.19.2.1
  --- XSLTSchema.java	2001/03/29 22:39:33	1.19
  +++ XSLTSchema.java	2001/05/27 03:05:13	1.19.2.1
  @@ -560,7 +560,7 @@
                                     new XSLTAttributeDef[]{ hrefAttr },
                                     new ProcessorInclude(),
                                     null /* class object */,
  -																	2, true);
  +																	20, true);
       XSLTElementDef[] topLevelElements = new XSLTElementDef[]{ includeDef,
                                                                 importDef,
                                                                 // resultElement,
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.17.2.1  +10 -1     xml-xalan/java/src/org/apache/xalan/res/XSLTErrorResources.java
  
  Index: XSLTErrorResources.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/res/XSLTErrorResources.java,v
  retrieving revision 1.17
  retrieving revision 1.17.2.1
  diff -u -r1.17 -r1.17.2.1
  --- XSLTErrorResources.java	2001/03/13 19:54:58	1.17
  +++ XSLTErrorResources.java	2001/05/27 03:05:13	1.17.2.1
  @@ -86,7 +86,7 @@
     public static final String WARNING_SUFFIX = "WR";
   
     /** Maximum error messages, this is needed to keep track of the number of messages.    */
  -  public static final int MAX_CODE = 109;          
  +  public static final int MAX_CODE = 110;          
   
     /** Maximum warnings, this is needed to keep track of the number of warnings.          */
     public static final int MAX_WARNING = 26;
  @@ -1091,6 +1091,15 @@
     {
       contents[ER_CLASS_NOT_FOUND_FOR_OPTION][1] =
   			"Class file not found for option {0}";
  +  }
  +	
  +	/** Required Element not found         */
  +  public static final int ER_REQUIRED_ELEM_NOT_FOUND = 110;
  +
  +  static
  +  {
  +    contents[ER_REQUIRED_ELEM_NOT_FOUND][1] =
  +			"Required Element not found: {0}";
     }
     
   
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.4.2.1   +19 -1     xml-xalan/java/src/org/apache/xalan/serialize/CharInfo.java
  
  Index: CharInfo.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/serialize/CharInfo.java,v
  retrieving revision 1.4
  retrieving revision 1.4.2.1
  diff -u -r1.4 -r1.4.2.1
  --- CharInfo.java	2001/01/07 03:39:19	1.4
  +++ CharInfo.java	2001/05/27 03:05:13	1.4.2.1
  @@ -101,6 +101,13 @@
     /** The carriage return character, which the parser should always normalize. */
     public static char S_CARRIAGERETURN = 0x0D;
   
  +  /** a zero length Class array used in the constructor */
  +  private static final Class[] NO_CLASSES = new Class[0];
  +
  +  /** a zero length Object array used in the constructor */
  +  private static final Object[] NO_OBJS = new Object[0];
  +
  +
     /**
      * Constructor that reads in a resource file that describes the mapping of
      * characters to entity references.
  @@ -121,7 +128,18 @@
   
       try
       {
  -      is = CharInfo.class.getResourceAsStream(entitiesResource);
  +
  +      try {
  +        java.lang.reflect.Method getCCL = Thread.class.getMethod("getContextClassLoader", NO_CLASSES);
  +        if (getCCL != null) {
  +          ClassLoader contextClassLoader = (ClassLoader) getCCL.invoke(Thread.currentThread(), NO_OBJS);
  +          is = contextClassLoader.getResourceAsStream("org/apache/xalan/serialize/" + entitiesResource);
  +        }
  +      }
  +      catch (Exception e) {}
  +
  +      if (is == null)
  +        is = CharInfo.class.getResourceAsStream(entitiesResource);
   
         if (is == null)
         {
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.9.2.2   +1 -1      xml-xalan/java/src/org/apache/xalan/templates/ElemChoose.java
  
  Index: ElemChoose.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/templates/ElemChoose.java,v
  retrieving revision 1.9.2.1
  retrieving revision 1.9.2.2
  diff -u -r1.9.2.1 -r1.9.2.2
  --- ElemChoose.java	2001/04/10 18:44:46	1.9.2.1
  +++ ElemChoose.java	2001/05/27 03:05:13	1.9.2.2
  @@ -144,7 +144,7 @@
           XPathContext xctxt = transformer.getXPathContext();
           int sourceNode = xctxt.getCurrentNode();
           XObject test = when.getTest().execute(transformer.getXPathContext(),
  -                                              sourceNode, this);
  +                                              sourceNode, when);
   
           if (TransformerImpl.S_DEBUG)
             transformer.getTraceManager().fireSelectedEvent(sourceNode, when,
  
  
  
  1.12.2.2  +7 -1      xml-xalan/java/src/org/apache/xalan/templates/ElemCopy.java
  
  Index: ElemCopy.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/templates/ElemCopy.java,v
  retrieving revision 1.12.2.1
  retrieving revision 1.12.2.2
  diff -u -r1.12.2.1 -r1.12.2.2
  --- ElemCopy.java	2001/04/10 18:44:46	1.12.2.1
  +++ ElemCopy.java	2001/05/27 03:05:13	1.12.2.2
  @@ -134,10 +134,12 @@
             TransformerImpl transformer)
               throws TransformerException
     {
  +		XPathContext xctxt = transformer.getXPathContext();
  +      
       try
       {
  -      XPathContext xctxt = transformer.getXPathContext();
         int sourceNode = xctxt.getCurrentNode();
  +			xctxt.pushCurrentNode(sourceNode);
         DTM dtm = xctxt.getDTM(sourceNode);
         short nodeType = dtm.getNodeType(sourceNode);
   
  @@ -177,6 +179,10 @@
       catch(org.xml.sax.SAXException se)
       {
         throw new TransformerException(se);
  +    }
  +		finally
  +    {
  +      xctxt.popCurrentNode();
       }
     }
   }
  
  
  
  1.13.2.4  +11 -2     xml-xalan/java/src/org/apache/xalan/templates/ElemValueOf.java
  
  Index: ElemValueOf.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/templates/ElemValueOf.java,v
  retrieving revision 1.13.2.3
  retrieving revision 1.13.2.4
  diff -u -r1.13.2.3 -r1.13.2.4
  --- ElemValueOf.java	2001/05/19 07:05:43	1.13.2.3
  +++ ElemValueOf.java	2001/05/27 03:05:14	1.13.2.4
  @@ -234,13 +234,15 @@
               throws TransformerException
     {
   
  +		XPathContext xctxt = transformer.getXPathContext();
  +		boolean didPushCurrent = false;
       try
       {
         if (TransformerImpl.S_DEBUG)
           transformer.getTraceManager().fireTraceEvent(this);
   
  -      XPathContext xctxt = transformer.getXPathContext();
  -      int sourceNode = xctxt.getCurrentNode();
  +      
  +      int sourceNode = xctxt.getCurrentNode();			
         int child;
         XObject value;
         
  @@ -271,6 +273,8 @@
         XMLString s;                                                                                             
         if(DTM.NULL != child)
         {
  +				xctxt.pushCurrentNode(child);
  +				didPushCurrent = true;
           DTM dtm = xctxt.getDTM(child);
           ResultTreeHandler rth = transformer.getResultTreeHandler();
           if (m_disableOutputEscaping)
  @@ -306,6 +310,11 @@
       catch(SAXException se)
       {
         throw new TransformerException(se);
  +    }
  +		finally
  +    {
  +			if (didPushCurrent) 
  +				xctxt.popCurrentNode();
       }
     }
   
  
  
  
  1.13.2.1  +59 -11    xml-xalan/java/src/org/apache/xalan/templates/OutputProperties.java
  
  Index: OutputProperties.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/templates/OutputProperties.java,v
  retrieving revision 1.13
  retrieving revision 1.13.2.1
  diff -u -r1.13 -r1.13.2.1
  --- OutputProperties.java	2001/03/26 21:35:46	1.13
  +++ OutputProperties.java	2001/05/27 03:05:14	1.13.2.1
  @@ -73,6 +73,7 @@
   import org.apache.xml.utils.FastStringBuffer;
   import org.apache.xml.utils.WrappedRuntimeException;
   import org.apache.xalan.serialize.Method;
  +import org.apache.xalan.extensions.ExtensionHandler;
   
   import javax.xml.transform.TransformerException;
   import javax.xml.transform.OutputKeys;
  @@ -180,23 +181,51 @@
     static private Properties loadPropertiesFile(String resourceName, Properties defaults)
       throws IOException
     {
  +
  +    // This static method should eventually be moved to a thread-specific class
  +    // so that we can cache the ContextClassLoader and bottleneck all properties file
  +    // loading throughout Xalan.
  +
       Properties props = new Properties(defaults);
   
       InputStream is = null;
       BufferedInputStream bis = null;
  +
       try {
  -      is = OutputProperties.class.getResourceAsStream(resourceName);
  +      try {
  +        java.lang.reflect.Method getCCL = Thread.class.getMethod("getContextClassLoader", NO_CLASSES);
  +        if (getCCL != null) {
  +          ClassLoader contextClassLoader = (ClassLoader) getCCL.invoke(Thread.currentThread(), NO_OBJS);
  +          is = contextClassLoader.getResourceAsStream("org/apache/xalan/templates/" + resourceName);
  +        }
  +      }
  +      catch (Exception e) {}
  +
  +      if ( is == null ) {
  +        is = OutputProperties.class.getResourceAsStream(resourceName);
  +      }
  +      
         bis = new BufferedInputStream(is);
  -    props.load(bis);
  -    } catch (IOException ioe) {
  +      props.load(bis);
  +    } 
  +    catch (IOException ioe) {
         if ( defaults == null ) {
           throw ioe;
         }
  -      else
  -      {
  -        throw new WrappedRuntimeException("Could not load '"+resourceName+"' (check CLASSPATH) using just the defaults ", ioe);
  +      else {
  +        throw new WrappedRuntimeException("Could not load '"+resourceName+"' (check CLASSPATH), now using just the defaults ", ioe);
         }
  -    } finally {
  +    }
  +    catch (SecurityException se) {
  +      // Repeat IOException handling for sandbox/applet case -sc
  +      if ( defaults == null ) {
  +        throw se;
  +      }
  +      else {
  +        throw new WrappedRuntimeException("Could not load '"+resourceName+"' (check CLASSPATH, applet security), now using just the defaults ", se);
  +      }
  +    } 
  +    finally {
         if ( bis != null ) {
           bis.close();
         }
  @@ -215,13 +244,25 @@
         // Now check if the given key was specified as a 
         // System property. If so, the system property 
         // overides the default value in the propery file.
  -      String value;
  -      if ((value = System.getProperty(key)) == null)      
  +      String value = null;
  +      try {
  +        value = System.getProperty(key);
  +      }
  +      catch (SecurityException se) {
  +        // No-op for sandbox/applet case, leave null -sc
  +      }
  +      if (value == null)      
           value = (String)props.get(key);                       
         
         String newKey = fixupPropertyString(key, true);
  -      String newValue;
  -      if ((newValue = System.getProperty(newKey)) == null)
  +      String newValue = null;
  +      try {
  +        newValue = System.getProperty(newKey);
  +      }
  +      catch (SecurityException se) {
  +        // No-op for sandbox/applet case, leave null -sc
  +      }
  +      if (newValue == null)
           newValue = fixupPropertyString(value, false);
         else
           newValue = fixupPropertyString(newValue, false);
  @@ -1011,4 +1052,11 @@
   
     /** Synchronization object for lazy initialization of the above tables. */
     private static Integer m_synch_object = new Integer(1);
  +
  +  /** a zero length Class array used in loadPropertiesFile() */
  +  private static final Class[] NO_CLASSES = new Class[0];
  +
  +  /** a zero length Object array used in loadPropertiesFile() */
  +  private static final Object[] NO_OBJS = new Object[0];
  +
   }
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.37.2.8  +5 -0      xml-xalan/java/src/org/apache/xalan/transformer/ResultTreeHandler.java
  
  Index: ResultTreeHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/transformer/ResultTreeHandler.java,v
  retrieving revision 1.37.2.7
  retrieving revision 1.37.2.8
  diff -u -r1.37.2.7 -r1.37.2.8
  --- ResultTreeHandler.java	2001/05/22 05:48:44	1.37.2.7
  +++ ResultTreeHandler.java	2001/05/27 03:05:14	1.37.2.8
  @@ -1146,6 +1146,11 @@
       m_startElement.setIsTransformClient(m_contentHandler instanceof TransformerClient);
       m_startElement.setContentHandler(m_contentHandler);
       m_startDoc.setContentHandler(m_contentHandler);
  +		
  +		if (m_contentHandler instanceof LexicalHandler)
  +      m_lexicalHandler = (LexicalHandler) m_contentHandler;
  +    else
  +      m_lexicalHandler = null;
   
       reInitEvents();
     }
  
  
  
  1.1.2.2   +35 -20    xml-xalan/java/src/org/apache/xalan/transformer/TransformSnapshotImpl.java
  
  Index: TransformSnapshotImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/transformer/TransformSnapshotImpl.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- TransformSnapshotImpl.java	2001/05/06 02:09:35	1.1.2.1
  +++ TransformSnapshotImpl.java	2001/05/27 03:05:14	1.1.2.2
  @@ -2,8 +2,10 @@
   
   import org.apache.xpath.XPathContext;
   import org.apache.xpath.VariableStack;
  +import org.apache.xpath.axes.ContextNodeList;
   import org.apache.xml.utils.NodeVector;
   import org.apache.xml.utils.BoolStack;
  +import org.apache.xml.dtm.DTMIterator;
   import java.util.Stack;
   import org.xml.sax.helpers.NamespaceSupport;
   import java.util.Enumeration;
  @@ -30,9 +32,14 @@
     private NodeVector m_currentExpressionNodes;
   
     /**
  -   * The current context node list.
  +   * The current context node lists stack.
      */
     private Stack m_contextNodeLists;
  +	
  +	/**
  +   * The current context node list.
  +   */
  +  private ContextNodeList m_contextNodeList;
   
     /**
      * Stack of AxesIterators.
  @@ -125,14 +132,17 @@
         m_currentNodes = (NodeVector)xpc.getCurrentNodeStack().clone();
         m_currentExpressionNodes = (NodeVector)xpc.getCurrentExpressionNodeStack().clone();
         m_contextNodeLists = (Stack)xpc.getContextNodeListsStack().clone();
  +			if (!m_contextNodeLists.empty())
  +				m_contextNodeList = (ContextNodeList)xpc.getContextNodeList().clone();
         m_axesIteratorStack = (Stack)xpc.getAxesIteratorStackStacks().clone();
     
         m_currentTemplateRuleIsNull = (BoolStack)transformer.m_currentTemplateRuleIsNull.clone();
         m_currentTemplateElements = (NodeVector)transformer.m_currentTemplateElements.clone();
         m_currentMatchTemplates = (Stack)transformer.m_currentMatchTemplates.clone();
         m_currentMatchNodes = (NodeVector)transformer.m_currentMatchedNodes.clone();
  -      m_countersTable = (CountersTable)transformer.m_countersTable.clone();
  -      m_attrSetStack = (Stack)transformer.m_attrSetStack.clone();
  +      m_countersTable = (CountersTable)transformer.getCountersTable().clone();
  +			if (transformer.m_attrSetStack  != null)
  +				m_attrSetStack = (Stack)transformer.m_attrSetStack.clone();
       }
       catch(CloneNotSupportedException cnse)
       {
  @@ -147,29 +157,33 @@
         // Are all these clones deep enough?
   
         ResultTreeHandler rtf = transformer.getResultTreeHandler();
  -      
  -      rtf.m_startElement = (QueuedStartElement)m_startElement.clone();
  -      rtf.m_startDoc = (QueuedStartDocument)m_startDoc.clone();
  -      rtf.m_eventCount = m_eventCount;
  -      
  -      // yuck.  No clone. Hope this is good enough.
  -      rtf.m_nsSupport = new NamespaceSupport();
  -      Enumeration prefixes = m_nsSupport.getPrefixes();
  -      while(prefixes.hasMoreElements())
  -      {
  -        String prefix = (String)prefixes.nextElement();
  -        String uri = m_nsSupport.getURI(prefix);
  -        rtf.m_nsSupport.declarePrefix(prefix, uri);
  -      }
  -      
  -      rtf.m_nsContextPushed = m_nsContextPushed;
         
  +      if (rtf != null)
  +			{
  +				rtf.m_startElement = (QueuedStartElement)m_startElement.clone();
  +				rtf.m_startDoc = (QueuedStartDocument)m_startDoc.clone();
  +				rtf.m_eventCount = 1; //1 for start document event! m_eventCount;
  +				
  +				// yuck.  No clone. Hope this is good enough.
  +				rtf.m_nsSupport = new NamespaceSupport();
  +				Enumeration prefixes = m_nsSupport.getPrefixes();
  +				while(prefixes.hasMoreElements())
  +				{
  +					String prefix = (String)prefixes.nextElement();
  +					String uri = m_nsSupport.getURI(prefix);
  +					rtf.m_nsSupport.declarePrefix(prefix, uri);
  +				}
  +				
  +				rtf.m_nsContextPushed = m_nsContextPushed;
  +			}
         XPathContext xpc = transformer.getXPathContext();
         
         xpc.setVarStack((VariableStack)m_variableStacks.clone());
         xpc.setCurrentNodeStack((NodeVector)m_currentNodes.clone());
         xpc.setCurrentExpressionNodeStack((NodeVector)m_currentExpressionNodes.clone());
         xpc.setContextNodeListsStack((Stack)m_contextNodeLists.clone());
  +			if (m_contextNodeList != null)
  +				xpc.pushContextNodeList((DTMIterator)m_contextNodeList.clone());
         xpc.setAxesIteratorStackStacks((Stack)m_axesIteratorStack.clone());
     
         transformer.m_currentTemplateRuleIsNull = (BoolStack)m_currentTemplateRuleIsNull.clone();
  @@ -177,7 +191,8 @@
         transformer.m_currentMatchTemplates = (Stack)m_currentMatchTemplates.clone();
         transformer.m_currentMatchedNodes = (NodeVector)m_currentMatchNodes.clone();
         transformer.m_countersTable = (CountersTable)m_countersTable.clone();
  -      transformer.m_attrSetStack = (Stack)m_attrSetStack.clone();
  +      if (m_attrSetStack  != null)
  +				transformer.m_attrSetStack = (Stack)m_attrSetStack.clone();
       }
       catch(CloneNotSupportedException cnse)
       {
  
  
  
  1.10.2.1  +2 -3      xml-xalan/java/src/org/apache/xalan/transformer/TransformerIdentityImpl.java
  
  Index: TransformerIdentityImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/transformer/TransformerIdentityImpl.java,v
  retrieving revision 1.10
  retrieving revision 1.10.2.1
  diff -u -r1.10 -r1.10.2.1
  --- TransformerIdentityImpl.java	2001/03/12 02:12:52	1.10
  +++ TransformerIdentityImpl.java	2001/05/27 03:05:14	1.10.2.1
  @@ -273,8 +273,7 @@
       if (m_resultContentHandler instanceof DeclHandler)
         m_resultDeclHandler = (DeclHandler) m_resultContentHandler;
   
  -    if (null == m_resultLexicalHandler
  -            && m_resultContentHandler instanceof LexicalHandler)
  +    if (m_resultContentHandler instanceof LexicalHandler)
         m_resultLexicalHandler = (LexicalHandler) m_resultContentHandler;
     }
   
  @@ -319,7 +318,7 @@
                 }
                 else
                 {
  -                TreeWalker walker = new TreeWalker(this, new org.apache.xpath.DOM2Helper());
  +                TreeWalker walker = new TreeWalker(this, new org.apache.xpath.DOM2Helper(), m_systemID);
                   walker.traverse(dNode);
                 }
               }
  
  
  
  1.90.2.13 +159 -35   xml-xalan/java/src/org/apache/xalan/transformer/TransformerImpl.java
  
  Index: TransformerImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/transformer/TransformerImpl.java,v
  retrieving revision 1.90.2.12
  retrieving revision 1.90.2.13
  diff -u -r1.90.2.12 -r1.90.2.13
  --- TransformerImpl.java	2001/05/22 05:48:44	1.90.2.12
  +++ TransformerImpl.java	2001/05/27 03:05:14	1.90.2.13
  @@ -125,6 +125,7 @@
   import org.xml.sax.InputSource;
   import javax.xml.transform.TransformerException;
   import org.xml.sax.XMLReader;
  +import org.xml.sax.SAXException;
   import org.xml.sax.XMLFilter;
   import org.xml.sax.Locator;
   import org.xml.sax.helpers.XMLReaderFactory;
  @@ -134,6 +135,7 @@
   import org.xml.sax.SAXNotSupportedException;
   import javax.xml.transform.ErrorListener;
   
  +
   // TRaX Imports
   import javax.xml.transform.Source;
   import javax.xml.transform.Result;
  @@ -357,6 +359,13 @@
     
     /** Flag to to tell if the tranformer needs to be reset. */
     private boolean m_hasBeenReset = false;
  +	
  +	private boolean m_shouldReset = true;
  +
  +	public void setShouldReset(boolean shouldReset)
  +	{
  +		m_shouldReset = shouldReset;
  +	}
     
     /**
      * A stack of current template modes.
  @@ -386,7 +395,7 @@
      */
     public void reset()
     {
  -    if(!m_hasBeenReset)
  +    if(!m_hasBeenReset && m_shouldReset)
       {
         m_hasBeenReset = true;
         
  @@ -547,7 +556,8 @@
         String msg = spe.getMessage();
         SAXSourceLocator loc = new SAXSourceLocator(spe);
         
  -      m_errorHandler.fatalError(new TransformerException( msg, loc ));
  +      //m_errorHandler.fatalError(new TransformerException( msg, loc ));
  +			m_errorHandler.fatalError(new TransformerException( spe ));
       }
       catch(org.xml.sax.SAXException se)
       {
  @@ -1523,6 +1533,7 @@
       // in scope, when really only the current stylesheet's 
       // global variables should be in scope.  Have to think on 
       // this more...
  +		XObject xobj;
       XPathContext xctxt = getXPathContext();
       VariableStack vs = xctxt.getVarStack();
       StylesheetRoot sr = getStylesheet();
  @@ -1541,11 +1552,17 @@
           {
             previouslyDeclared.setIsVisible(true);
           }
  +				else
  +        {
  +          xobj = new XUnresolvedVariable(v, contextNode, 
  +                             this, vs.getSearchStartOrTop(), 0, true);
  +          previouslyDeclared.setVal(xobj);
  +        }
           continue;
         }
   
         // XObject xobj = v.getValue(this, contextNode);
  -      XObject xobj = new XUnresolvedVariable(v, contextNode, 
  +      xobj = new XUnresolvedVariable(v, contextNode, 
                                this, vs.getSearchStartOrTop(), 0, true);
   
         vs.pushVariable(v.getName(), xobj);
  @@ -1836,24 +1853,38 @@
         {
           maxImportLevel = -1;
         }
  -
  -      // Find the XSL template that is the best match for the 
  -      // element.        
  -      XPathContext xctxt = getXPathContext();
  -      PrefixResolver savedPrefixResolver = xctxt.getNamespaceContext();
  -
  -      try
  -      {
  -        xctxt.setNamespaceContext(xslInstruction);
   
  -        QName mode = this.getMode();
  -        template = m_stylesheetRoot.getTemplateComposed(xctxt, child, mode, maxImportLevel,
  -                                  m_quietConflictWarnings);
  -      }
  -      finally
  -      {
  -        xctxt.setNamespaceContext(savedPrefixResolver);
  -      }
  +      // If we're trying an xsl:apply-imports at the top level (ie there are no
  +      // imported stylesheets), we need to indicate that there is no matching template.
  +      // The above logic will calculate a maxImportLevel of -1 which indicates
  +      // that we should find any template.  This is because a value of -1 for
  +      // maxImportLevel has a special meaning.  But we don't want that.
  +      // We want to match -no- templates. See bugzilla bug 1170.
  +
  +      if (isApplyImports && (maxImportLevel == -1))
  +      {
  +        template = null;
  +      }
  +			else
  +			{
  +				// Find the XSL template that is the best match for the 
  +				// element.        
  +				XPathContext xctxt = getXPathContext();
  +				PrefixResolver savedPrefixResolver = xctxt.getNamespaceContext();
  +
  +				try
  +				{
  +					xctxt.setNamespaceContext(xslInstruction);
  +
  +					QName mode = this.getMode();
  +					template = m_stylesheetRoot.getTemplateComposed(xctxt, child, mode, maxImportLevel,
  +																													m_quietConflictWarnings);
  +				}
  +				finally
  +				{
  +					xctxt.setNamespaceContext(savedPrefixResolver);
  +				}
  +			}
   
         // If that didn't locate a node, fall back to a default template rule.
         // See http://www.w3.org/TR/xslt#built-in-rule.
  @@ -2329,7 +2360,8 @@
   
       try
       {
  -      return getXPathContext().getContextNodeList().cloneWithReset();
  +			DTMIterator cnl = getXPathContext().getContextNodeList();
  +			return (cnl == null)? null : (DTMIterator)cnl.cloneWithReset();      
       }
       catch (CloneNotSupportedException cnse)
       {
  @@ -2712,19 +2744,97 @@
     ////////////////////////
     // Implement Runnable //  
     ////////////////////////
  -  
  -  /**
  -   * Create a thread for the transform.  This can be overridden by derived 
  -   * implementations to provide their own thread, for thread pooling and the 
  -   * like.
  -   * 
  -   * @return thread suitable to use for the transformation.
  -   */
  -  public Thread createTransformThread()
  -  {
  -    Thread t = new Thread(this);
  -    // System.out.println("created thread: "+t.getName());
  -    return t;
  +	
  +	/** Base thread controler for xalan. Must be overriden with
  +      a derived class to support thread pooling.
  +
  +      All thread-related stuff is in this class.
  +  */
  +  public static class ThreadControler {
  +    
  +    /** Will get a thread from the pool, execute the task
  +     *  and return the thread to the pool.
  +     *
  +     *  The return value is used only to wait for completion
  +     *
  +     * @param priority if >0 the task will run with the given priority
  +     *  ( doesn't seem to be used in xalan, since it's allways the default )
  +     * @returns The thread that is running the task, can be used
  +     *          to wait for completion
  +     */
  +    public Thread run( Runnable task, int priority ) {
  +      Thread t=new Thread(task);
  +      t.start();
  +//       if( priority > 0 )
  +// 	t.setPriority( priority );
  +      return t;
  +    }
  +
  +
  +    /**
  +     *  Wait until the task is completed on the worker
  +     *  thread. 
  +     */
  +    public void waitThread( Thread worker, Runnable task )
  +      throws InterruptedException
  +    {
  +      // This should wait until the transformThread is considered not alive.
  +      worker.join();
  +    }
  +  }
  +
  +  static ThreadControler tpool=new ThreadControler();
  +
  +  /** Change the ThreadControler that will be used to
  +   *  manage the transform threads.
  +   */
  +  public static void setThreadControler( ThreadControler tp ) {
  +    tpool=tp;
  +  }
  +  
  +  /** Called by SourceTreeHandler to start the transformation
  +   *  in a separate thread
  +   */
  +  public void runTransformThread( int priority ) {
  +    // used in SourceTreeHandler
  +    Thread t=tpool.run( this, priority );
  +    this.setTransformThread( t );
  +  }
  +
  +  /** Called by this.transform() if isParserEventsOnMain()==false.
  +   *  Similar with runTransformThread(), but no priority is set
  +   *  and setTransformThread is not set.
  +   */
  +  public void runTransformThread( ) {
  +    tpool.run( this, -1);
  +  }
  +	
  +	/** Used by SourceTreeHandler to wait until the transform
  +   *   completes
  +   */
  +  public void waitTransformThread() throws SAXException {
  +    // This is called to make sure the task is done.
  +    // It is possible that the thread has been reused -
  +    // but for a different transformation. ( what if we 
  +    // recycle the transformer ? Not a problem since this is
  +    // still in use. )
  +    Thread transformThread = this.getTransformThread();
  +    if (null != transformThread)
  +      {
  +        try
  +	  {
  +	    tpool.waitThread( transformThread, this );
  +	    
  +	    if(!this.hasTransformThreadErrorCatcher())
  +	      {
  +		Exception e = this.getExceptionThrown();
  +		if(null != e)
  +		  throw new org.xml.sax.SAXException(e);
  +	      }
  +	    this.setTransformThread(null);
  +	  }
  +        catch (InterruptedException ie){}
  +      }
     }
   
     /**
  @@ -2913,8 +3023,22 @@
      * from the snapshot point.
      */
     public void executeFromSnapshot(TransformSnapshot ts)
  +		throws TransformerException
  +  {
  +    ElemTemplateElement template = getMatchedTemplate();
  +		int child = getMatchedNode();
  +		pushElemTemplateElement(template); //needed??
  +    m_xcontext.pushCurrentNode(child); //needed??
  +		this.executeChildTemplates(template, true); // getResultTreeHandler());
  +  }
  +	
  +	/**
  +   * This will execute the following XSLT instructions
  +   * from the snapshot point.
  +   */
  +  public void resetToStylesheet(TransformSnapshot ts)		
     {
  -    ((TransformSnapshotImpl)ts).apply(this);
  +    ((TransformSnapshotImpl)ts).apply(this);		
     }
     
     public void stopTransformation()
  
  
  
  1.9.2.5   +68 -37    xml-xalan/java/src/org/apache/xalan/transformer/TreeWalker2Result.java
  
  Index: TreeWalker2Result.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/transformer/TreeWalker2Result.java,v
  retrieving revision 1.9.2.4
  retrieving revision 1.9.2.5
  diff -u -r1.9.2.4 -r1.9.2.5
  --- TreeWalker2Result.java	2001/05/23 02:55:37	1.9.2.4
  +++ TreeWalker2Result.java	2001/05/27 03:05:15	1.9.2.5
  @@ -56,7 +56,7 @@
    */
   package org.apache.xalan.transformer;
   
  -//import org.w3c.dom.*;
  +import org.w3c.dom.Node;
   import org.apache.xml.dtm.DTM;
   
   import org.xml.sax.*;
  @@ -65,6 +65,7 @@
   import org.apache.xml.utils.MutableAttrListImpl;
   import org.apache.xalan.templates.ElemTemplateElement;
   import org.apache.xpath.DOMHelper;
  +import org.apache.xpath.XPathContext;
   
   /**
    * <meta name="usage" content="internal"/>
  @@ -113,6 +114,23 @@
   
       super.traverse(pos);
     }
  +	
  +	/**
  +   * End processing of given node 
  +   *
  +   *
  +   * @param node Node we just finished processing
  +   *
  +   * @throws org.xml.sax.SAXException
  +   */
  +  protected void endNode(int node) throws org.xml.sax.SAXException
  +  {
  +    super.endNode(node);
  +    if(DTM.ELEMENT_NODE == m_dtm.getNodeType(node))
  +    {
  +      m_transformer.getXPathContext().popCurrentNode();
  +    }
  +  }
   
     /**
      * Start traversal of the tree at the given node
  @@ -125,45 +143,58 @@
     protected void startNode(int node) throws org.xml.sax.SAXException
     {
   
  +		XPathContext xcntxt = m_transformer.getXPathContext();
       try
       {
         
  -      if (DTM.ELEMENT_NODE == m_dtm.getNodeType(node))
  -      {
  -        String elemName = m_dtm.getNodeName(node);
  -        String localName = m_dtm.getLocalName(node);
  -        String namespace = m_dtm.getNamespaceURI(node);
  -        
  -        m_handler.startElement(namespace, localName, elemName, null);
  -
  -        if (DTM.ELEMENT_NODE == m_dtm.getNodeType(node))
  -        {
  -          boolean hasNSDecls = false;
  -          DTM dtm = m_dtm;
  -          for (int ns = dtm.getFirstNamespaceNode(node, true); 
  -               DTM.NULL != ns; ns = dtm.getNextNamespaceNode(node, ns, true))
  -          {
  -            m_handler.ensureNamespaceDeclDeclared(dtm, ns);
  -          }
  -          
  -          if(hasNSDecls)
  -          {
  -            m_handler.addNSDeclsToAttrs();
  -          }
  -          
  -          for (int attr = dtm.getFirstAttribute(node); 
  -               DTM.NULL != attr; attr = dtm.getNextAttribute(attr))
  -          {
  -            m_handler.addAttribute(attr);
  -          }
  -          
  -        }
  -      }
  -      else
  -      {
  -        super.startNode(node);
  -      }
  -    }
  +			if (DTM.ELEMENT_NODE == m_dtm.getNodeType(node))
  +			{
  +				xcntxt.pushCurrentNode(node);			
  +					
  +				if(m_startNode != node)
  +				{
  +					super.startNode(node);
  +				}
  +				else
  +				{
  +					String elemName = m_dtm.getNodeName(node);
  +					String localName = m_dtm.getLocalName(node);
  +					String namespace = m_dtm.getNamespaceURI(node);
  +					
  +					//xcntxt.pushCurrentNode(node);	
  +					m_handler.startElement(namespace, localName, elemName, null);
  +
  +					if (DTM.ELEMENT_NODE == m_dtm.getNodeType(node))
  +					{
  +						boolean hasNSDecls = false;
  +						DTM dtm = m_dtm;
  +						for (int ns = dtm.getFirstNamespaceNode(node, true); 
  +								 DTM.NULL != ns; ns = dtm.getNextNamespaceNode(node, ns, true))
  +						{
  +							m_handler.ensureNamespaceDeclDeclared(dtm, ns);
  +						}
  +						
  +						if(hasNSDecls)
  +						{
  +							m_handler.addNSDeclsToAttrs();
  +						}
  +						
  +						for (int attr = dtm.getFirstAttribute(node); 
  +								 DTM.NULL != attr; attr = dtm.getNextAttribute(attr))
  +						{
  +							m_handler.addAttribute(attr);
  +						}
  +					}
  +				}
  +				
  +			}
  +			else
  +			{
  +				xcntxt.pushCurrentNode(node);
  +				super.startNode(node);
  +				xcntxt.popCurrentNode();
  +			}
  +		}
       catch(javax.xml.transform.TransformerException te)
       {
         throw new org.xml.sax.SAXException(te);
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.32.2.3  +13 -10    xml-xalan/java/src/org/apache/xalan/xslt/Process.java
  
  Index: Process.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xslt/Process.java,v
  retrieving revision 1.32.2.2
  retrieving revision 1.32.2.3
  diff -u -r1.32.2.2 -r1.32.2.3
  --- Process.java	2001/05/19 07:05:45	1.32.2.2
  +++ Process.java	2001/05/27 03:05:15	1.32.2.3
  @@ -171,15 +171,19 @@
       System.out.println(resbundle.getString("optionENTITYRESOLVER"));  //"   [-ENTITYRESOLVER full class name (EntityResolver to be used to resolve entities)]");
       System.out.println(resbundle.getString("optionCONTENTHANDLER"));  //"   [-CONTENTHANDLER full class name (ContentHandler to be used to serialize output)]");
     }
  -
  -  /** Default properties file */
  -  static String XSLT_PROPERTIES = "/org/apache/xalan/res/XSLTInfo.properties";
  -
  +  
     /**
  -   * Command line interfact to transform the XML according to
  -   * the instructions found in the XSL stylesheet.
  -   *  <p>To set stylesheet parameters from the command line, use -PARAM name expression. If
  -   *  you want to set the parameter to a string value, enclose the string in single quotes (') to
  +   * Command line interface to transform an XML document according to
  +   * the instructions found in an XSL stylesheet.  
  +   * <p>The Process class provides basic functionality for 
  +   * performing transformations from the command line.  To see a 
  +   * list of arguments supported, call with zero arguments.</p>
  +   * <p>To set stylesheet parameters from the command line, use 
  +   * <code>-PARAM name expression</code>. If you want to set the 
  +   * parameter to a string value, simply pass the string value 
  +   * as-is, and it will be interpreted as a string.  (Note: if 
  +   * the value has spaces in it, you may need to quote it depending 
  +   * on your shell environment).</p>
      *
      * @param argv Input parameters from command line
      */
  @@ -204,7 +208,6 @@
           org.apache.xml.utils.res.XResourceBundle.ERROR_RESOURCES));
       String flavor = "s2s";
   
  -    // loadPropertyFileToSystem(XSLT_PROPERTIES);
       if (argv.length < 1)
       {
         printArgOptions(resbundle);
  @@ -578,7 +581,7 @@
   
           if (null != outFileName)
           {
  -          strResult = new StreamResult(new File(outFileName));
  +          strResult = new StreamResult(new FileOutputStream(outFileName));
           }
           else
           {
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.7.2.3   +41 -1     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.7.2.2
  retrieving revision 1.7.2.3
  diff -u -r1.7.2.2 -r1.7.2.3
  --- TreeWalker.java	2001/05/16 05:33:22	1.7.2.2
  +++ TreeWalker.java	2001/05/27 03:05:15	1.7.2.3
  @@ -60,6 +60,7 @@
   
   import org.xml.sax.*;
   import org.xml.sax.ext.LexicalHandler;
  +import org.xml.sax.helpers.LocatorImpl;
   
   import org.apache.xpath.DOM2Helper;
   import org.apache.xpath.DOMHelper;
  @@ -81,6 +82,9 @@
   
     /** DomHelper for this TreeWalker          */
     protected DOMHelper m_dh;
  +	
  +	/** Locator object for this TreeWalker          */
  +	private LocatorImpl m_locator = new LocatorImpl();
   
     /**
      * Get the ContentHandler used for the tree walk.
  @@ -101,6 +105,23 @@
     {
       m_contentHandler = ch;
     }
  +	
  +	/**
  +   * Constructor.
  +   * @param   contentHandler The implemention of the
  +   * @param   systemId System identifier for the document.
  +   * contentHandler operation (toXMLString, digest, ...)
  +   */
  +  public TreeWalker(ContentHandler contentHandler, DOMHelper dh, String systemId)
  +  {
  +    this.m_contentHandler = contentHandler;
  +		m_contentHandler.setDocumentLocator(m_locator);
  +		if (systemId != null)
  +			m_locator.setSystemId(systemId);
  +		else
  +			m_locator.setSystemId(System.getProperty("user.dir"));
  +    m_dh = dh;
  +  }
   
     /**
      * Constructor.
  @@ -110,6 +131,8 @@
     public TreeWalker(ContentHandler contentHandler, DOMHelper dh)
     {
       this.m_contentHandler = contentHandler;
  +		m_contentHandler.setDocumentLocator(m_locator);
  +		m_locator.setSystemId(System.getProperty("user.dir"));
       m_dh = dh;
     }
     
  @@ -121,6 +144,9 @@
     public TreeWalker(ContentHandler contentHandler)
     {
       this.m_contentHandler = contentHandler;
  +		if (m_contentHandler != null)
  +			m_contentHandler.setDocumentLocator(m_locator);
  +		m_locator.setSystemId(System.getProperty("user.dir"));
       m_dh = new org.apache.xpath.DOM2Helper();
     }
   
  @@ -242,6 +268,20 @@
       {
         ((NodeConsumer) m_contentHandler).setOriginatingNode(node);
       }
  +		
  +		if (node instanceof Locator)
  +		{
  +			Locator loc = (Locator)node;
  +			m_locator.setColumnNumber(loc.getColumnNumber());
  +			m_locator.setLineNumber(loc.getLineNumber());
  +			m_locator.setPublicId(loc.getPublicId());
  +			m_locator.setSystemId(loc.getSystemId());
  +		}
  +		else
  +		{
  +			m_locator.setColumnNumber(0);
  +      m_locator.setLineNumber(0);
  +		}
   
       switch (node.getNodeType())
       {
  @@ -341,7 +381,7 @@
       break;
       case Node.TEXT_NODE :
       {
  -      String data = ((Text) node).getData();
  +      //String data = ((Text) node).getData();
   
         if (nextIsRaw)
         {
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.18.2.4  +1 -1      xml-xalan/java/src/org/apache/xpath/XPath.java
  
  Index: XPath.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/XPath.java,v
  retrieving revision 1.18.2.3
  retrieving revision 1.18.2.4
  diff -u -r1.18.2.3 -r1.18.2.4
  --- XPath.java	2001/05/19 07:05:49	1.18.2.3
  +++ XPath.java	2001/05/27 03:05:15	1.18.2.4
  @@ -243,7 +243,7 @@
      * @param contextNode The node that "." expresses.
      * @param namespaceContext The context in which namespaces in the
      * XPath are supposed to be expanded.
  -
  +   *
      * @return The result of the XPath or null if callbacks are used.
      * @throws TransformerException thrown if
      * the error condition is severe enough to halt processing.
  
  
  
  1.9.2.2   +15 -4     xml-xalan/java/src/org/apache/xpath/XPathAPI.java
  
  Index: XPathAPI.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/XPathAPI.java,v
  retrieving revision 1.9.2.1
  retrieving revision 1.9.2.2
  diff -u -r1.9.2.1 -r1.9.2.2
  --- XPathAPI.java	2001/04/10 18:45:11	1.9.2.1
  +++ XPathAPI.java	2001/05/27 03:05:15	1.9.2.2
  @@ -71,6 +71,11 @@
   import org.apache.xml.utils.PrefixResolver;
   import org.apache.xpath.objects.XObject;
   
  +import org.apache.xml.dtm.DTM;
  +import org.apache.xml.dtm.ref.DTMNodeIterator;
  +import org.apache.xml.dtm.ref.DTMManagerDefault;
  +
  +
   /**
    * The methods in this class are convenience methods into the
    * low-level XPath API.
  @@ -160,8 +165,9 @@
   
       // Have the XObject return its result as a NodeSet.
       // %TBD% Convert to DOM nodeset
  -//    return list.nodeset();
  -    return null;
  +		
  +    return new DTMNodeIterator(list.nodeset());
  +    
     }
   
     /**
  @@ -276,7 +282,9 @@
       // Execute the XPath, and have it return the result
       // %TBD% Need to convert contextNode to a DTM node
   //    return xpath.execute(xpathSupport, contextNode, prefixResolver);
  -    return null;
  +    int ctxtNode;
  +		ctxtNode = xpathSupport.getDTMHandleFromNode(contextNode);
  +    return xpath.execute(xpathSupport, ctxtNode, prefixResolver);
     }
   
     /**
  @@ -317,6 +325,9 @@
       // Execute the XPath, and have it return the result
       // %TBD% Need to convert contextNode to a DTM node
       // return xpath.execute(new XPathContext(), contextNode, prefixResolver);
  -    return null;
  +		int ctxtNode;
  +		XPathContext xpathSupport = new XPathContext();
  +		ctxtNode = xpathSupport.getDTMHandleFromNode(contextNode);
  +    return xpath.execute(xpathSupport, ctxtNode, prefixResolver);
     }
   }
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.8.2.6   +9 -4      xml-xalan/java/src/org/apache/xpath/axes/DescendantIterator.java
  
  Index: DescendantIterator.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/axes/DescendantIterator.java,v
  retrieving revision 1.8.2.5
  retrieving revision 1.8.2.6
  diff -u -r1.8.2.5 -r1.8.2.6
  --- DescendantIterator.java	2001/05/27 02:28:49	1.8.2.5
  +++ DescendantIterator.java	2001/05/27 03:05:16	1.8.2.6
  @@ -99,19 +99,24 @@
       int ops[] = compiler.getOpMap();
       int firstStepPos = compiler.getFirstChildPos(opPos);
       int stepType = ops[firstStepPos];
  +		/** Bit is on if any of the walkers contain a child step. */
  +    final int BIT_CHILD = (0x00001000 << 4); 
   
  -    m_orSelf = (OpCodes.FROM_DESCENDANTS_OR_SELF == stepType);
  +    if (OpCodes.FROM_DESCENDANTS_OR_SELF == stepType)
  +      m_orSelf = (BIT_CHILD == (analysis & BIT_CHILD)) ? false : true;
       if (OpCodes.FROM_SELF == stepType)
       {
  -      m_orSelf = true;
  +      m_orSelf = (BIT_CHILD == (analysis & BIT_CHILD)) ? false : true;
         firstStepPos += 8;
       }
       else if(OpCodes.FROM_ROOT == stepType)
       {
         m_fromRoot = true;
  -      m_orSelf = true;
  +      m_orSelf = (BIT_CHILD == (analysis & BIT_CHILD)) ? false : true;
         firstStepPos += 8;
       }
  +    else
  +      m_orSelf = false;
   
       int whatToShow = compiler.getWhatToShow(firstStepPos);
   
  @@ -210,7 +215,7 @@
         
         // The start context can either be the location path context node, 
         // or the root node.
  -      if (getSelf && m_fromRoot)
  +      if (m_fromRoot)
         {
           if(m_cdtm.getNodeType(m_context) == DTM.DOCUMENT_NODE)
             pos = m_context;
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.5.2.5   +5 -9      xml-xalan/java/src/org/apache/xpath/functions/FuncCurrent.java
  
  Index: FuncCurrent.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/functions/FuncCurrent.java,v
  retrieving revision 1.5.2.4
  retrieving revision 1.5.2.5
  diff -u -r1.5.2.4 -r1.5.2.5
  --- FuncCurrent.java	2001/05/25 17:36:56	1.5.2.4
  +++ FuncCurrent.java	2001/05/27 03:05:16	1.5.2.5
  @@ -72,6 +72,7 @@
   import org.apache.xpath.axes.PredicatedNodeTest;
   import org.apache.xpath.axes.LocPathIterator;
   import org.apache.xpath.axes.ContextNodeList;
  +import org.apache.xpath.axes.SubContextList;
   
   /**
    * <meta name="usage" content="advanced"/>
  @@ -92,20 +93,15 @@
     {
   
       // If we're in a predicate, then this will return non-null.
  -    Object subContextList = xctxt.getSubContextList();
  +    //PredicatedNodeTest iter = (PredicatedNodeTest) xctxt.getSubContextList();
  +		SubContextList iter = xctxt.getSubContextList();
       int currentNode;
   
  -    // %TBD% Hack city...
  -    if (null != subContextList && subContextList instanceof PredicatedNodeTest)
  +    if (null != iter && iter instanceof PredicatedNodeTest)
       {
  -      PredicatedNodeTest iter = (PredicatedNodeTest) xctxt.getSubContextList();
  -      LocPathIterator lpi = iter.getLocPathIterator();
  +      LocPathIterator lpi = ((PredicatedNodeTest)iter).getLocPathIterator();
   
         currentNode = lpi.getCurrentContextNode();
  -    }
  -    else if(xctxt.getIteratorRoot() != DTM.NULL)
  -    {
  -      currentNode = xctxt.getIteratorRoot();
       }
       else
       {
  
  
  
  1.7.2.3   +12 -10    xml-xalan/java/src/org/apache/xpath/functions/FuncExtFunction.java
  
  Index: FuncExtFunction.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/functions/FuncExtFunction.java,v
  retrieving revision 1.7.2.2
  retrieving revision 1.7.2.3
  diff -u -r1.7.2.2 -r1.7.2.3
  --- FuncExtFunction.java	2001/05/17 05:38:50	1.7.2.2
  +++ FuncExtFunction.java	2001/05/27 03:05:16	1.7.2.3
  @@ -63,6 +63,8 @@
   import org.apache.xpath.objects.*;
   import org.apache.xalan.extensions.ExtensionsTable;
   
  +import org.apache.xml.dtm.DTMIterator;
  +
   //import org.w3c.dom.Node;
   import org.w3c.dom.DocumentFragment;
   import org.w3c.dom.traversal.NodeIterator;
  @@ -164,19 +166,19 @@
           result = ((Boolean) val).booleanValue()
                    ? XBoolean.S_TRUE : XBoolean.S_FALSE;
         }
  -      else if (val instanceof Double)
  +      else if (val instanceof Number)
         {
  -        result = new XNumber(((Double) val).doubleValue());
  +        result = new XNumber(((Number) val).doubleValue());
         }
         // %TBD%
  -//      else if (val instanceof DocumentFragment)
  -//      {
  -//        result = new XRTreeFrag((DocumentFragment) val);
  -//      }
  -//      else if (val instanceof NodeIterator)
  -//      {
  -//        result = new XNodeSet((NodeIterator) val);
  -//      }
  +     // else if (val instanceof DocumentFragment)
  +     // {
  +     //   result = new XRTreeFrag(val, xctxt);
  +     // }
  +      else if (val instanceof DTMIterator)
  +      {
  +        result = new XNodeSet((DTMIterator) val);
  +      }
         else if (val instanceof org.w3c.dom.Node)
         {
           result = new XNodeSet(xctxt.getDTMHandleFromNode((org.w3c.dom.Node)val), 
  
  
  
  1.8.2.2   +19 -2     xml-xalan/java/src/org/apache/xpath/functions/FuncSystemProperty.java
  
  Index: FuncSystemProperty.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/functions/FuncSystemProperty.java,v
  retrieving revision 1.8.2.1
  retrieving revision 1.8.2.2
  diff -u -r1.8.2.1 -r1.8.2.2
  --- FuncSystemProperty.java	2001/04/10 18:45:33	1.8.2.1
  +++ FuncSystemProperty.java	2001/05/27 03:05:16	1.8.2.2
  @@ -85,7 +85,14 @@
   
     /** The name of the property file where the name will be stored.  */
     static String XSLT_PROPERTIES = "/org/apache/xalan/res/XSLTInfo.properties";
  +	
  +	/** a zero length Class array used in loadPropertyFile() */
  +  private static final Class[] NO_CLASSES = new Class[0];
   
  +  /** a zero length Object array used in loadPropertyFile() */
  +  private static final Object[] NO_OBJS = new Object[0];
  +
  +
     /**
      * Execute the function.  The function must return
      * a valid object.
  @@ -205,11 +212,21 @@
     public void loadPropertyFile(String file, Properties target)
     {
   
  -    InputStream is;
  +    InputStream is = null;
   
       try
       {
  -      is = getClass().getResourceAsStream(file);
  +      try {
  +        java.lang.reflect.Method getCCL = Thread.class.getMethod("getContextClassLoader", NO_CLASSES);
  +        if (getCCL != null) {
  +          ClassLoader contextClassLoader = (ClassLoader) getCCL.invoke(Thread.currentThread(), NO_OBJS);
  +          is = contextClassLoader.getResourceAsStream("org/apache/xpath/functions/" + file);
  +        }
  +      }
  +      catch (Exception e) {}
  +
  +      if (is == null);
  +        is = FuncSystemProperty.class.getResourceAsStream(file);
   
         // get a buffered version
         BufferedInputStream bis = new BufferedInputStream(is);
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.8.2.6   +9 -2      xml-xalan/java/src/org/apache/xpath/objects/XObject.java
  
  Index: XObject.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/objects/XObject.java,v
  retrieving revision 1.8.2.5
  retrieving revision 1.8.2.6
  diff -u -r1.8.2.5 -r1.8.2.6
  --- XObject.java	2001/05/19 07:05:57	1.8.2.5
  +++ XObject.java	2001/05/27 03:05:16	1.8.2.6
  @@ -268,7 +268,7 @@
      */
     public String str()
     {
  -    return m_obj.toString();
  +		return (m_obj != null) ? m_obj.toString() : "null";    
     }
   
     /**
  @@ -518,7 +518,14 @@
       if (obj2.getType() == XObject.CLASS_NODESET)
         return obj2.equals(this);
   
  -    return m_obj.equals(obj2.m_obj);
  +    if (null != m_obj)
  +    {
  +      return m_obj.equals(obj2.m_obj);
  +    }
  +    else
  +    {
  +      return obj2.m_obj == null;
  +    }
     }
   
     /**
  
  
  
  1.6.2.5   +1 -1      xml-xalan/java/src/org/apache/xpath/objects/XString.java
  
  Index: XString.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/objects/XString.java,v
  retrieving revision 1.6.2.4
  retrieving revision 1.6.2.5
  diff -u -r1.6.2.4 -r1.6.2.5
  --- XString.java	2001/05/19 07:05:58	1.6.2.4
  +++ XString.java	2001/05/27 03:05:16	1.6.2.5
  @@ -537,7 +537,7 @@
      */
     public int compareToIgnoreCase(XMLString str)
     {
  -    return str().compareToIgnoreCase(str.toString());
  +    return xstr().compareToIgnoreCase(str);
     }
   
     /**
  
  
  

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