vgritsenko    02/01/25 18:12:34

  Modified:    src/java/org/apache/cocoon/components/language/markup
                        AbstractMarkupLanguage.java Logicsheet.java
                        LogicsheetCodeGenerator.java NamedLogicsheet.java
               src/java/org/apache/cocoon/components/language/markup/sitemap
                        SitemapMarkupLanguage.java
               src/java/org/apache/cocoon/components/language/markup/xsp
                        XSPMarkupLanguage.java
  Log:
  Fixing XSP Engine:
   - languages are recycleable, to recycle logicSheetList
   - do not use temporary resolver (HttpEnvironment) to resolve inclusions
  in logicsheets, as logicsheet is cached
   - instead, url source factory resolver is used
  
  Revision  Changes    Path
  1.3       +164 -141  
xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/AbstractMarkupLanguage.java
  
  Index: AbstractMarkupLanguage.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/AbstractMarkupLanguage.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- AbstractMarkupLanguage.java       25 Jan 2002 03:38:36 -0000      1.2
  +++ AbstractMarkupLanguage.java       26 Jan 2002 02:12:33 -0000      1.3
  @@ -5,7 +5,6 @@
    * version 1.1, a copy of which has been included  with this distribution in *
    * the LICENSE file.                                                         *
    *****************************************************************************/
  -
   package org.apache.cocoon.components.language.markup;
   
   import org.apache.avalon.framework.component.ComponentException;
  @@ -16,19 +15,33 @@
   import org.apache.avalon.framework.configuration.ConfigurationException;
   import org.apache.avalon.framework.logger.AbstractLoggable;
   import org.apache.avalon.framework.parameters.Parameters;
  +import org.apache.avalon.excalibur.pool.Recyclable;
  +
   import org.apache.cocoon.ProcessingException;
   import org.apache.cocoon.components.language.programming.ProgrammingLanguage;
   import org.apache.cocoon.components.store.Store;
   import org.apache.cocoon.components.url.URLFactory;
   import org.apache.cocoon.environment.Source;
   import org.apache.cocoon.environment.SourceResolver;
  -import org.xml.sax.*;
  +import org.apache.cocoon.environment.URLFactorySourceResolver;
  +
   import org.xml.sax.helpers.XMLFilterImpl;
   import org.xml.sax.helpers.XMLReaderFactory;
  +import org.xml.sax.SAXException;
  +import org.xml.sax.XMLFilter;
  +import org.xml.sax.InputSource;
  +import org.xml.sax.XMLReader;
  +import org.xml.sax.Attributes;
   
   import java.io.IOException;
   import java.net.MalformedURLException;
  -import java.util.*;
  +import java.util.Hashtable;
  +import java.util.LinkedList;
  +import java.util.ListIterator;
  +import java.util.Iterator;
  +import java.util.Map;
  +import java.util.List;
  +import java.util.ArrayList;
   
   /**
    * Base implementation of <code>MarkupLanguage</code>. This class uses
  @@ -38,18 +51,21 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Ricardo Rocha</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Davanum Srinivas</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Ovidiu Predescu</a>
  - * @version CVS $Revision: 1.2 $ $Date: 2002/01/25 03:38:36 $
  + * @version CVS $Revision: 1.3 $ $Date: 2002/01/26 02:12:33 $
    */
   public abstract class AbstractMarkupLanguage extends AbstractLoggable
  -  implements MarkupLanguage, Composable, Configurable
  +    implements MarkupLanguage, Composable, Configurable, Recyclable
   {
       /** The 'file' URL protocol. */
       private static final String FILE = "file:";
     
  +    /** Prefix for cache keys to avoid name clash with the XSLTProcessor */
  +    private static final String CACHE_PREFIX = "logicsheet:";
  +
       /** The supported language table */
       protected Hashtable languages;
   
  -    /** The in-memory code-generation logicsheet cache */
  +    /** The code-generation logicsheet cache */
       protected Store logicsheetCache;
   
       /** The markup language's namespace uri */
  @@ -61,13 +77,18 @@
       /** The component manager */
       protected ComponentManager manager;
       
  -    /** Prefix for cache keys to avoid name clash with the XSLTProcessor */
  -    private static final String CACHE_PREFIX = "logicsheet:";
  -
       /**
        * The URL factory used to resolve URIs.
        */
  -    URLFactory urlFactory;
  +    private URLFactorySourceResolver urlResolver;
  +
  +    private final LinkedList logicSheetList = new LinkedList();
  +
  +
  +    public void recycle()
  +    {
  +        this.logicSheetList.clear();
  +    }
   
       /**
        * Set the global component manager.
  @@ -79,8 +100,9 @@
           // Initialize logicsheet cache
           this.logicsheetCache = (Store) manager.lookup(Store.ROLE);
   
  -        // Initialize the URL factory
  -        urlFactory = (URLFactory)this.manager.lookup(URLFactory.ROLE);
  +        // Initialize the URL factory source resolver
  +        URLFactory urlFactory = (URLFactory)this.manager.lookup(URLFactory.ROLE);
  +        this.urlResolver = new URLFactorySourceResolver(urlFactory, manager);
       }
   
       /** The default constructor. */
  @@ -99,84 +121,83 @@
           this.prefix = params.getParameter("prefix", null);
       }
   
  -  /**
  -   * Process additional configuration. Load supported programming
  -   * language definitions
  -   *
  -   * @param conf The language configuration
  -   * @exception ConfigurationException If an error occurs loading logichseets
  -   */
  -  public void configure(Configuration conf) throws ConfigurationException {
  -    try {
  -      // Set up each target-language
  -      Configuration[] l = conf.getChildren("target-language");
  -      for (int i = 0; i < l.length; i++) {
  -        LanguageDescriptor language = new LanguageDescriptor();
  -        language.setName(l[i].getAttribute("name"));
  -        Parameters lcp = Parameters.fromConfiguration(l[i]);
  +    /**
  +     * Process additional configuration. Load supported programming
  +     * language definitions
  +     *
  +     * @param conf The language configuration
  +     * @exception ConfigurationException If an error occurs loading logichseets
  +     */
  +    public void configure(Configuration conf) throws ConfigurationException {
  +        try {
  +            // Set up each target-language
  +            Configuration[] l = conf.getChildren("target-language");
  +            for (int i = 0; i < l.length; i++) {
  +                LanguageDescriptor language = new LanguageDescriptor();
  +                language.setName(l[i].getAttribute("name"));
  +
  +                // Create & Store the core logicsheet
  +                Logicsheet logicsheet = createLogicsheet(l[i], false);
  +                language.setLogicsheet(logicsheet.getSystemId());
  +
  +                // Set up each built-in logicsheet
  +                Configuration[] n = l[i].getChildren("builtin-logicsheet");
  +                for (int j = 0; j < n.length; j++) {
  +                    // Create & Store the named logicsheets
  +                    NamedLogicsheet namedLogicsheet =
  +                        (NamedLogicsheet) createLogicsheet(n[j], true);
  +
  +                    // FIXME: Logicsheets should be found by uri--not prefix.
  +                    language.addNamedLogicsheet(
  +                        namedLogicsheet.getPrefix(),
  +                        namedLogicsheet.getSystemId());
  +                }
  +
  +                this.languages.put(language.getName(), language);
  +            }
  +        } catch (Exception e) {
  +          getLogger().warn("Configuration Error: " + e.getMessage(), e);
  +          throw new ConfigurationException("AbstractMarkupLanguage: "
  +                                           + e.getMessage(), e);
  +        }
  +    }
  +
  +    /**
  +    * Abstract out the Logicsheet creation.  Handles both Named and regular 
logicsheets.
  +    */
  +    private Logicsheet createLogicsheet(Configuration configuration, boolean named)
  +            throws Exception
  +    {
  +        Parameters params = Parameters.fromConfiguration(configuration);
  +
  +        Logicsheet logicsheet;
  +        if (named) {
  +            String location = params.getParameter("href", null);
  +            String prefix = params.getParameter("prefix", null);
  +
  +            NamedLogicsheet namedLogicsheet =
  +                new NamedLogicsheet(location, manager, urlResolver);
  +            namedLogicsheet.setLogger(getLogger());
  +            namedLogicsheet.setPrefix(prefix);
  +            logicsheet = namedLogicsheet;
  +        } else {
  +            String location = params.getParameter("core-logicsheet", null);
  +            logicsheet = new Logicsheet(location, manager, urlResolver);
  +            logicsheet.setLogger(getLogger());
  +        }
   
  -        // Create & Store the core logicsheet
  -        Logicsheet logicsheet = createLogicsheet(lcp, false);
           String logicsheetName = logicsheet.getSystemId();
           logicsheetCache.store(CACHE_PREFIX + logicsheetName, logicsheet);
  -        language.setLogicsheet(logicsheetName);
   
  -        // Set up each built-in logicsheet
  -        Configuration[] n = l[i].getChildren("builtin-logicsheet");
  -        for (int j = 0; j < n.length; j++) {
  -          Parameters ncp = Parameters.fromConfiguration(n[j]);
  -
  -          // Create & Store the named logicsheets
  -          NamedLogicsheet namedLogicsheet
  -            = (NamedLogicsheet)createLogicsheet(ncp, true);
  -          logicsheetName = namedLogicsheet.getSystemId();
  -          String logicsheetPrefix = namedLogicsheet.getPrefix();
  -          logicsheetCache.store(CACHE_PREFIX + logicsheetName, namedLogicsheet);
  -                    
  -          // FIXME: Logicsheets should be found by uri--not prefix.
  -          language.addNamedLogicsheet(logicsheetPrefix, logicsheetName);
  -        }
  -        this.languages.put(language.getName(), language);
  -      }
  -    } catch (Exception e) {
  -      getLogger().warn("Configuration Error: " + e.getMessage(), e);
  -      throw new ConfigurationException("AbstractMarkupLanguage: "
  -                                       + e.getMessage(), e);
  -    }
  -  }
  -
  -  /**
  -   * Abstract out the Logicsheet creation.  Handles both Named and regular 
logicsheets.
  -   */
  -  private Logicsheet createLogicsheet(Parameters params, boolean named)
  -    throws Exception
  -  {
  -    String logicsheetLocation;
  -    Logicsheet logicsheet;
  -
  -    if (named) {
  -      logicsheetLocation = params.getParameter("href", null);
  -
  -      NamedLogicsheet namedLogicsheet = new NamedLogicsheet(logicsheetLocation,
  -                                                            urlFactory,
  -                                                            manager);
  -      namedLogicsheet.setLogger(getLogger());
  -      namedLogicsheet.setPrefix(params.getParameter("prefix", null));
  -      logicsheet = namedLogicsheet;
  -    } else {
  -      logicsheetLocation = params.getParameter("core-logicsheet", null);
  -      logicsheet = new Logicsheet(logicsheetLocation, urlFactory, manager);
  -      logicsheet.setLogger(getLogger());
  +        return logicsheet;
       }
   
  -    return logicsheet;
  -  }
  -
       /**
        * Return the source document's encoding. This can be <code>null</code> for
        * the platform's default encoding. The default implementation returns
  -     * <code>null, but derived classes may override it if encoding applies to
  -     * their concrete languages. FIXME: There should be a way to get the
  +     * <code>null</code>, but derived classes may override it if encoding applies to
  +     * their concrete languages.
  +     * FIXME: There should be a way to get the
        * XML document's encoding as seen by the parser; unfortunately, this
        * information is not returned by current DOM or SAX parsers...
        * @return The document-specified encoding
  @@ -201,8 +222,8 @@
           (LogicsheetCodeGenerator logicsheetMarkupGenerator,
            SourceResolver resolver)
       {
  -      return new TransformerChainBuilderFilter(logicsheetMarkupGenerator,
  -                                               resolver);
  +        return new TransformerChainBuilderFilter(logicsheetMarkupGenerator,
  +                                                 resolver);
       }
   
       /**
  @@ -274,14 +295,12 @@
           return codeGenerator.generateCode(tranBuilder, input, filename);
       }
   
  -    LinkedList logicSheetList = new LinkedList();
  -
       /**
        * Add logicsheet list to the code generator.
        * @param codeGenerator The code generator
        */
       protected void addLogicsheetsToGenerator(LogicsheetCodeGenerator codeGenerator)
  -        throws MalformedURLException, IOException, SAXException {
  +        throws MalformedURLException, IOException, SAXException, 
ProcessingException {
   
           if (codeGenerator == null) {
               getLogger().debug("This should never happen: codeGenerator is null");
  @@ -290,14 +309,14 @@
   
           // Walk backwards and remove duplicates.
           LinkedList newLogicSheetList = new LinkedList();
  -        for(int i = logicSheetList.size()-1;i>=0;i--) {
  +        for(int i = logicSheetList.size()-1; i>=0; i--) {
               Logicsheet logicsheet = (Logicsheet) logicSheetList.get(i);
               if(newLogicSheetList.indexOf(logicsheet) == -1)
                   newLogicSheetList.addFirst(logicsheet);
           }
   
           // Add the list of logicsheets now.
  -        ListIterator iterator = newLogicSheetList.listIterator();
  +        Iterator iterator = newLogicSheetList.iterator();
           while(iterator.hasNext()) {
               Logicsheet logicsheet = (Logicsheet) iterator.next();
               codeGenerator.addLogicsheet(logicsheet);
  @@ -312,56 +331,58 @@
        * @exception IOException IO Error
        * @exception SAXException Logicsheet parse error
        */
  -  protected void addLogicsheetToList(LanguageDescriptor language,
  -                                     String logicsheetLocation,
  -                                     SourceResolver resolver)
  -    throws MalformedURLException, IOException, SAXException, ProcessingException
  -  {
  -    Logicsheet logicsheet = (Logicsheet)logicsheetCache.get(CACHE_PREFIX + 
logicsheetLocation);
  -
  -    String logicsheetName;
  -    if (logicsheet == null) {
  -      Source inputSource = resolver.resolve(logicsheetLocation);
  -      logicsheet = new Logicsheet(inputSource, manager, resolver);
  -      logicsheetName = logicsheet.getSystemId();
  -      logicsheetCache.store(CACHE_PREFIX + logicsheetName, logicsheet);
  -      // FIXME(VG): inputSource.recylce() !!!
  -    } else {
  -      logicsheetName = logicsheet.getSystemId();
  -    }
  -
  -    getLogger().debug("AbstractMarkupLanguage addLogicsheetToList: "
  -                      + "name: " + logicsheetName
  -                      + ", location: " + logicsheetLocation
  -                      + ", instance: " + logicsheet);
  -    
  -    if (logicsheetName.startsWith(FILE)) {
  -      String filename = logicsheetName.substring(FILE.length());
  -      addDependency(filename);
  -      getLogger().debug("AbstractMarkupLanguage addLogicsheetToList: "
  -                        + "adding dependency on file " + filename);
  -    }
  -
  -    logicSheetList.add(logicsheet);
  -
  -    Map namespaces = logicsheet.getNamespaces();
  -    if(!logicsheetLocation.equals(language.getLogicsheet())) {
  -      if(namespaces != null && namespaces.size()>0) {
  -        Iterator iter = namespaces.keySet().iterator();
  -        while(iter.hasNext()) {
  -          String namespace = (String) iter.next();
  -          String namedLogicsheetName = language.getNamedLogicsheet(namespace);
  -          if(namedLogicsheetName!= null
  -             && !logicsheetLocation.equals(namedLogicsheetName)) {
  -            getLogger().debug("Adding embedded logic sheet for "
  -                              + namespace + ":" + namedLogicsheetName);
  -            // Add embedded logic sheets too.
  -            addLogicsheetToList(language, namedLogicsheetName, resolver);
  -          }
  +    protected void addLogicsheetToList(LanguageDescriptor language,
  +                                       String logicsheetLocation,
  +                                       SourceResolver resolver)
  +        throws MalformedURLException, IOException, SAXException, ProcessingException
  +    {
  +        Logicsheet logicsheet = (Logicsheet)logicsheetCache.get(CACHE_PREFIX + 
logicsheetLocation);
  +        if (logicsheet == null) {
  +            Source inputSource = resolver.resolve(logicsheetLocation);
  +            // FIXME(VG): resolver (local) could not be used as it is temporary
  +            // (per-request) object, yet Logicsheet is being cached and reused
  +            // across multiple requests. "Global" url-factory-based resolver
  +            // passed to the Logicsheet.
  +            logicsheet = new Logicsheet(inputSource, manager, this.urlResolver);
  +            logicsheetCache.store(CACHE_PREFIX + logicsheet.getSystemId(), 
logicsheet);
  +        }
  +        String logicsheetName = logicsheet.getSystemId();
  +
  +        if (getLogger().isDebugEnabled()) {
  +            getLogger().debug("addLogicsheetToList: "
  +                + "name: " + logicsheetName
  +                + ", location: " + logicsheetLocation
  +                + ", instance: " + logicsheet);
  +        }
  +
  +        if (logicsheetName.startsWith(FILE)) {
  +            String filename = logicsheetName.substring(FILE.length());
  +            addDependency(filename);
  +            getLogger().debug("addLogicsheetToList: "
  +                + "adding dependency on file " + filename);
  +        }
  +
  +        logicSheetList.add(logicsheet);
  +
  +        Map namespaces = logicsheet.getNamespaces();
  +        if(!logicsheetLocation.equals(language.getLogicsheet())) {
  +            if(namespaces != null && namespaces.size() > 0) {
  +                Iterator iter = namespaces.keySet().iterator();
  +                while(iter.hasNext()) {
  +                    String namespace = (String) iter.next();
  +                    String namedLogicsheetName = 
language.getNamedLogicsheet(namespace);
  +                    if(namedLogicsheetName!= null
  +                        && !logicsheetLocation.equals(namedLogicsheetName)) {
  +                        getLogger().debug("Adding embedded logic sheet for "
  +                            + namespace + ":" + namedLogicsheetName);
  +                        // Add embedded logic sheets too.
  +                        addLogicsheetToList(language, namedLogicsheetName, 
resolver);
  +                    }
  +                }
  +            }
           }
  -      }
       }
  -  }
  +
       //
       // Inner classes
       //
  @@ -481,11 +502,11 @@
               if (!isRootElem) {
                   super.startPrefixMapping(prefix, uri);
               } else {
  -                // cache the prefix mapping
  -                String[] prefixArray = new String[2];
  -                prefixArray[0] = prefix;
  -                prefixArray[1] = uri;
  -                this.startPrefixes.add(prefixArray);
  +                // Cache the prefix mapping
  +                String[] prefixNamingArray = new String[2];
  +                prefixNamingArray[0] = prefix;
  +                prefixNamingArray[1] = uri;
  +                this.startPrefixes.add(prefixNamingArray);
               }
           }
   
  @@ -503,6 +524,7 @@
                               
AbstractMarkupLanguage.this.addLogicsheetToList(language, namedLogicsheetName, 
resolver);
                           }
                       }
  +
                       // Add the language stylesheet (Always the last one)
                       AbstractMarkupLanguage.this.addLogicsheetToList(language, 
this.language.getLogicsheet(), resolver);
                       
AbstractMarkupLanguage.this.addLogicsheetsToGenerator(this.logicsheetMarkupGenerator);
  @@ -511,6 +533,7 @@
                   } catch (IOException ioe) {
                       throw new SAXException(ioe);
                   }
  +
                   // All stylesheet have been configured and correctly setup.
                   // Starts firing SAX events, especially the startDocument event,
                   // and the cached prefixNaming.
  
  
  
  1.3       +104 -144  
xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/Logicsheet.java
  
  Index: Logicsheet.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/Logicsheet.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Logicsheet.java   25 Jan 2002 03:38:36 -0000      1.2
  +++ Logicsheet.java   26 Jan 2002 02:12:33 -0000      1.3
  @@ -5,18 +5,17 @@
    * version 1.1, a copy of which has been included  with this distribution in *
    * the LICENSE file.                                                         *
    *****************************************************************************/
  -
   package org.apache.cocoon.components.language.markup;
   
   import org.apache.avalon.framework.component.ComponentException;
   import org.apache.avalon.framework.component.ComponentManager;
   import org.apache.avalon.framework.logger.AbstractLoggable;
  -import org.apache.cocoon.components.source.URLSource;
  -import org.apache.cocoon.components.url.URLFactory;
  +
   import org.apache.cocoon.components.xslt.XSLTProcessor;
   import org.apache.cocoon.environment.Source;
   import org.apache.cocoon.environment.SourceResolver;
  -import org.apache.cocoon.environment.URLFactorySourceResolver;
  +import org.apache.cocoon.ProcessingException;
  +
   import org.xml.sax.Attributes;
   import org.xml.sax.SAXException;
   import org.xml.sax.XMLFilter;
  @@ -41,166 +40,127 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Ricardo Rocha</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Davanum Srinivas</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Ovidiu Predescu</a>
  - * @version CVS $Revision: 1.2 $ $Date: 2002/01/25 03:38:36 $
  + * @version CVS $Revision: 1.3 $ $Date: 2002/01/26 02:12:33 $
    */
   public class Logicsheet extends AbstractLoggable
   {
  -  /**
  -   * The Source object for this logicsheet.
  -   */
  -  Source source;
  -
  -  /**
  -   * the template namespace's list
  -   */
  -  protected Map namespaces = new HashMap();
  -
  -  /**
  -   * The {@link org.apache.cocoon.components.xslt.XSLTProcessor} component.
  -   */
  -  XSLTProcessor xsltProcessor;
  -
  -  /**
  -   * The ComponentManager of this instance.
  -   */
  -  ComponentManager manager;
  -
  -  public Logicsheet(Source source, ComponentManager manager, SourceResolver 
resolver)
  -  {
  -    this.source = source;
  -    this.manager = manager;
  -    try {
  -      xsltProcessor = (XSLTProcessor)manager.lookup(XSLTProcessor.ROLE);
  -      xsltProcessor.setSourceResolver(resolver);
  -    }
  -    catch (ComponentException e) {
  -      getLogger().error("Cannot obtain XSLTProcessor component: " + e);
  -    }
  -  }
  -
  -  /**
  -   * Creates a new <code>Logicsheet</code> instance given an URL to
  -   * containing the logicsheet, the {@link
  -   * org.apache.cocoon.components.url.URLFactory}, and a
  -   * <code>ComponentManager</code>.
  -   *
  -   * @param url an <code>URL</code> value
  -   * @param urlFactory an <code>URLFactory</code> value
  -   * @exception MalformedURLException if an error occurs
  -   * @exception IOException if an error occurs
  -   */
  -  public Logicsheet(URL url, URLFactory urlFactory, ComponentManager manager)
  -    throws MalformedURLException, IOException
  -  {
  -    this(url.toString(), urlFactory, manager);
  -  }
  -
  -  public Logicsheet(String systemId, URLFactory urlFactory,
  -                    ComponentManager manager)
  -    throws MalformedURLException, IOException
  -  {
  -    this.manager = manager;
  -    URL url = urlFactory.getURL(systemId);
  -    this.source = new URLSource(url, manager);
  -    try {
  -      xsltProcessor = (XSLTProcessor)manager.lookup(XSLTProcessor.ROLE);
  -      xsltProcessor.setSourceResolver(new URLFactorySourceResolver(urlFactory, 
manager));
  -    }
  -    catch (ComponentException e) {
  -      getLogger().error("Cannot obtain XSLTProcessor component: " + e);
  -    }
  -  }
  -
  -  public String getSystemId()
  -  {
  -    return source.getSystemId();
  -  }
  -
  -  /**
  -   * This will return the list of namespaces in this logicsheet.
  -   */
  -  public Map getNamespaces()
  -  {
  -    // Force the parsing of the Source or, if nothing changed,
  -    // return the old content of namespaces.
  -    getTransformerHandler();
  -    return namespaces;
  -  }
  -
  -  /**
  -   * Obtain the TransformerHandler object that will perform the
  -   * transformation associated with this logicsheet.
  -   *
  -   * @return a <code>TransformerHandler</code> value
  -   */
  -  public TransformerHandler getTransformerHandler()
  -  {
  -    try {
  -      // If the Source object is not changed, the
  -      // getTransformerHandler() of XSLTProcessor will simply return
  -      // the old template object. If the Source is unchanged, the
  -      // namespaces are not modified either.
  -      XMLFilter saveNSFilter = new SaveNamespaceFilter(namespaces);
  -      return xsltProcessor.getTransformerHandler(source, saveNSFilter);
  -    } catch (Exception e) {
  -      getLogger().error("Logicsheet.getTransformerHandler: Exception ", e);
  -    }
  -    return null;
  -  }
  -
  -  /**
  -   * This filter listen for source SAX events, and register the declared
  -   * namespaces into a <code>Map</code> object.
  -   *
  -   */
  -  protected class SaveNamespaceFilter extends XMLFilterImpl
  -  {
  -    private Map originalNamepaces;
  -
  -    /**
  -     * The contructor needs an initialized <code>Map</code> object where it
  -     * can store the found namespace declarations.
  -     * @param originalNamepaces a initialized <code>Map</code> instance.
  +    /**
  +     * The Source object for this logicsheet.
  +     */
  +    private Source source;
  +
  +    /**
  +     * the template namespace's list
  +     */
  +    protected Map namespaces = new HashMap();
  +
  +    /**
  +     * The {@link org.apache.cocoon.components.xslt.XSLTProcessor} component.
  +     */
  +    private XSLTProcessor xsltProcessor;
  +
  +    /**
  +     * The ComponentManager of this instance.
        */
  -    public SaveNamespaceFilter(Map originalNamepaces)
  +    private ComponentManager manager;
  +
  +
  +    public Logicsheet(Source source, ComponentManager manager, SourceResolver 
resolver)
  +        throws ProcessingException
  +    {
  +        this.source = source;
  +        this.manager = manager;
  +        try {
  +            this.xsltProcessor = (XSLTProcessor)manager.lookup(XSLTProcessor.ROLE);
  +            this.xsltProcessor.setSourceResolver(resolver);
  +        } catch (ComponentException e) {
  +            throw new ProcessingException("Could not obtain XSLT processor", e);
  +        }
  +    }
  +
  +    public Logicsheet(String systemId, ComponentManager manager, SourceResolver 
resolver)
  +        throws SAXException, IOException, ProcessingException
  +    {
  +        this(resolver.resolve(systemId), manager, resolver);
  +    }
  +
  +    public String getSystemId()
       {
  -      this.originalNamepaces = originalNamepaces;
  +        return source.getSystemId();
       }
   
       /**
  -     * @param reader the parent reader
  -     * @see XMLFilter
  +     * This will return the list of namespaces in this logicsheet.
        */
  -    public void setParent(XMLReader reader)
  +    public Map getNamespaces() throws ProcessingException
       {
  -      super.setParent(reader);
  -      reader.setContentHandler(this);
  +        // Force the parsing of the Source or, if nothing changed,
  +        // return the old content of namespaces.
  +        getTransformerHandler();
  +        return namespaces;
       }
   
       /**
  -     * @see org.xml.sax.ContentHandler
  +     * Obtain the TransformerHandler object that will perform the
  +     * transformation associated with this logicsheet.
  +     *
  +     * @return a <code>TransformerHandler</code> value
        */
  -    public void startDocument ()
  -      throws SAXException
  +    public TransformerHandler getTransformerHandler() throws ProcessingException
       {
  -      super.startDocument();
  +        try {
  +            // If the Source object is not changed, the
  +            // getTransformerHandler() of XSLTProcessor will simply return
  +            // the old template object. If the Source is unchanged, the
  +            // namespaces are not modified either.
  +            XMLFilter saveNSFilter = new SaveNamespaceFilter(namespaces);
  +            return xsltProcessor.getTransformerHandler(source, saveNSFilter);
  +        } finally {
  +            // Release used resources
  +            source.recycle();
  +        }
       }
   
       /**
  +     * This filter listen for source SAX events, and register the declared
  +     * namespaces into a <code>Map</code> object.
  +     *
  +     * @see org.xml.sax.XMLFilter
        * @see org.xml.sax.ContentHandler
        */
  -    public void startPrefixMapping(String prefix, String uri)
  -      throws SAXException
  -    {
  -      originalNamepaces.put(prefix,uri);
  -      super.startPrefixMapping(prefix, uri);
  -    }
  +    protected class SaveNamespaceFilter extends XMLFilterImpl {
  +        private Map originalNamepaces;
   
  -    public void startElement (String namespaceURI, String localName,
  -                              String qName, Attributes atts)
  -      throws SAXException
  -    {
  -      super.startElement(namespaceURI, localName, qName, atts);
  +        /**
  +         * The contructor needs an initialized <code>Map</code> object where it
  +         * can store the found namespace declarations.
  +         * @param originalNamepaces a initialized <code>Map</code> instance.
  +         */
  +        public SaveNamespaceFilter(Map originalNamepaces) {
  +            this.originalNamepaces = originalNamepaces;
  +        }
  +
  +        public void setParent(XMLReader reader) {
  +            super.setParent(reader);
  +            reader.setContentHandler(this);
  +        }
  +
  +        public void startDocument() throws SAXException {
  +            super.startDocument();
  +        }
  +
  +        public void startPrefixMapping(String prefix, String uri)
  +            throws SAXException
  +        {
  +            originalNamepaces.put(prefix,uri);
  +            super.startPrefixMapping(prefix, uri);
  +        }
  +
  +        public void startElement (String namespaceURI, String localName,
  +                                  String qName, Attributes atts)
  +            throws SAXException
  +        {
  +            super.startElement(namespaceURI, localName, qName, atts);
  +        }
       }
  -  }
   }
  
  
  
  1.3       +18 -13    
xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/LogicsheetCodeGenerator.java
  
  Index: LogicsheetCodeGenerator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/LogicsheetCodeGenerator.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- LogicsheetCodeGenerator.java      25 Jan 2002 03:38:36 -0000      1.2
  +++ LogicsheetCodeGenerator.java      26 Jan 2002 02:12:33 -0000      1.3
  @@ -9,6 +9,8 @@
   
   import org.apache.avalon.framework.logger.AbstractLoggable;
   import org.apache.cocoon.util.TraxErrorHandler;
  +import org.apache.cocoon.xml.LoggingContentHandler;
  +import org.apache.cocoon.ProcessingException;
   import org.xml.sax.ContentHandler;
   import org.xml.sax.InputSource;
   import org.xml.sax.XMLReader;
  @@ -24,6 +26,7 @@
   import javax.xml.transform.sax.TransformerHandler;
   import javax.xml.transform.stream.StreamResult;
   import java.io.StringWriter;
  +import java.io.IOException;
   import java.util.Properties;
   
   /**
  @@ -31,7 +34,7 @@
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Ricardo Rocha</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Davanum Srinivas</a>
  - * @version CVS $Revision: 1.2 $ $Date: 2002/01/25 03:38:36 $
  + * @version CVS $Revision: 1.3 $ $Date: 2002/01/26 02:12:33 $
    */
   public class LogicsheetCodeGenerator extends AbstractLoggable implements 
MarkupCodeGenerator {
   
  @@ -52,11 +55,9 @@
        * Initialize the LogicsheetCodeGenerator.
        */
       public void initialize() {
  -
           Properties format = new Properties();
  -
           try {
  -            // set the serializer which would act as ContentHandler for the last 
transformer
  +            // Set the serializer which would act as ContentHandler for the last 
transformer
               // FIXME (SSA) change a home made content handler, that extract the 
PCDATA
               // from the last remaining element
               TransformerHandler handler = 
getTransformerFactory().newTransformerHandler();
  @@ -92,20 +93,19 @@
       *
       * @param logicsheet The logicsheet to be added
       */
  -    public void addLogicsheet(Logicsheet logicsheet) {
  +    public void addLogicsheet(Logicsheet logicsheet) throws ProcessingException {
           if (this.currentParent == null) {
               // Setup the first transformer of the chain.
               this.currentParent = logicsheet.getTransformerHandler();
   
               // the parent is the rootReader
  -            this.rootReader.setContentHandler(this.currentParent);;
  +            this.rootReader.setContentHandler(this.currentParent);
   
               // Set content handler for the end of the chain : serializer
               this.currentParent.setResult(new 
SAXResult(this.serializerContentHandler));
  -
           } else {
               // Build the transformer chain on the fly
  -            TransformerHandler newParent=logicsheet.getTransformerHandler();
  +            TransformerHandler newParent = logicsheet.getTransformerHandler();
   
               // the currentParent is the parent of the new logicsheet filter
               this.currentParent.setResult(new SAXResult(newParent));
  @@ -127,10 +127,15 @@
       * @exception Exception If an error occurs during code generation
       */
       public String generateCode(XMLReader reader, InputSource input, String 
filename) throws Exception {
  -        // set the root XMLReader of the transformer chain
  -        this.rootReader = reader;
  -        // start the parsing
  -        this.rootReader.parse(input);
  -        return this.writer.toString();
  +        try {
  +            // set the root XMLReader of the transformer chain
  +            this.rootReader = reader;
  +            // start the parsing
  +            this.rootReader.parse(input);
  +            return this.writer.toString();
  +        } catch (SAXException e) {
  +            getLogger().debug("Got SAXException, rethrowing cause exception", e);
  +            throw e.getException();
  +        }
       }
   }
  
  
  
  1.2       +10 -9     
xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/NamedLogicsheet.java
  
  Index: NamedLogicsheet.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/NamedLogicsheet.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- NamedLogicsheet.java      3 Jan 2002 12:31:09 -0000       1.1
  +++ NamedLogicsheet.java      26 Jan 2002 02:12:33 -0000      1.2
  @@ -9,6 +9,8 @@
   
   import org.apache.avalon.framework.component.ComponentManager;
   import org.apache.cocoon.components.url.URLFactory;
  +import org.apache.cocoon.ProcessingException;
  +import org.apache.cocoon.environment.SourceResolver;
   
   import java.io.IOException;
   import java.net.MalformedURLException;
  @@ -21,25 +23,24 @@
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Ricardo Rocha</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Ovidiu Predescu</a>
  - * @version CVS $Revision: 1.1 $ $Date: 2002/01/03 12:31:09 $
  + * @version CVS $Revision: 1.2 $ $Date: 2002/01/26 02:12:33 $
    */
   public class NamedLogicsheet extends Logicsheet {
       /**
       * The namespace uri
       */
  -    protected String uri;
  +    // FIXME: NOT USED: protected String uri;
   
       /**
       * The namespace prefix
       */
  -    protected String prefix;
  +    private String prefix;
   
  -  public NamedLogicsheet(String systemId, URLFactory urlFactory,
  -                         ComponentManager manager)
  -    throws MalformedURLException, IOException
  -  {
  -    super(systemId, urlFactory, manager);
  -  }
  +    public NamedLogicsheet(String systemId, ComponentManager manager, 
SourceResolver resolver)
  +        throws MalformedURLException, IOException, ProcessingException
  +    {
  +        super(systemId, manager, resolver);
  +    }
     
       /**
       * Set the logichseet's namespace prefix
  
  
  
  1.2       +11 -4     
xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/sitemap/SitemapMarkupLanguage.java
  
  Index: SitemapMarkupLanguage.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/sitemap/SitemapMarkupLanguage.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SitemapMarkupLanguage.java        3 Jan 2002 12:31:10 -0000       1.1
  +++ SitemapMarkupLanguage.java        26 Jan 2002 02:12:34 -0000      1.2
  @@ -9,6 +9,7 @@
   
   import org.apache.avalon.framework.logger.Loggable;
   import org.apache.avalon.framework.thread.ThreadSafe;
  +import org.apache.avalon.excalibur.pool.Recyclable;
   import org.apache.cocoon.ProcessingException;
   import org.apache.cocoon.components.language.markup.AbstractMarkupLanguage;
   import org.apache.cocoon.components.language.markup.LogicsheetCodeGenerator;
  @@ -31,14 +32,20 @@
    * <a 
href="http://xml.apache.org/cocoon2/userdocs/concepts/sitemap.html";>Sitemap</a>.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Giacomo Pati</a>
  - * @version CVS $Revision: 1.1 $ $Date: 2002/01/03 12:31:10 $
  + * @version CVS $Revision: 1.2 $ $Date: 2002/01/26 02:12:34 $
    */
  -public class SitemapMarkupLanguage extends AbstractMarkupLanguage implements 
ThreadSafe {
  +public class SitemapMarkupLanguage extends AbstractMarkupLanguage {
   
       /**
  -    * the dependencies' list
  -    */
  +     * The dependencies' list
  +     */
       private Set dependencies;
  +
  +    public void recycle()
  +    {
  +        super.recycle();
  +        this.dependencies.clear();
  +    }
   
       /**
       * The default constructor.
  
  
  
  1.2       +107 -172  
xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/xsp/XSPMarkupLanguage.java
  
  Index: XSPMarkupLanguage.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/xsp/XSPMarkupLanguage.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XSPMarkupLanguage.java    3 Jan 2002 12:31:10 -0000       1.1
  +++ XSPMarkupLanguage.java    26 Jan 2002 02:12:34 -0000      1.2
  @@ -9,6 +9,7 @@
   
   import org.apache.avalon.framework.logger.Loggable;
   import org.apache.avalon.excalibur.pool.Recyclable;
  +
   import org.apache.cocoon.Constants;
   import org.apache.cocoon.ProcessingException;
   import org.apache.cocoon.components.language.markup.AbstractMarkupLanguage;
  @@ -16,6 +17,7 @@
   import org.apache.cocoon.components.language.programming.ProgrammingLanguage;
   import org.apache.cocoon.environment.SourceResolver;
   import org.apache.log.Logger;
  +
   import org.xml.sax.Attributes;
   import org.xml.sax.SAXException;
   import org.xml.sax.XMLFilter;
  @@ -32,101 +34,102 @@
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Ricardo Rocha</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Sebastien Sahuc</a>
  - * @version CVS $Revision: 1.1 $ $Date: 2002/01/03 12:31:10 $
  + * @version CVS $Revision: 1.2 $ $Date: 2002/01/26 02:12:34 $
    */
  -public class XSPMarkupLanguage extends AbstractMarkupLanguage implements Recyclable 
{
  +public class XSPMarkupLanguage extends AbstractMarkupLanguage {
   
       /**
  -    * store the dependencies.
  -    *
  -    * FIXME (SSA) Should not be shared between different calls.
  -    * Should be passed as argument of method getPreprocessFilter ?
  -    */
  +     * store the dependencies.
  +     *
  +     * FIXME (SSA) Should not be shared between different calls.
  +     * Should be passed as argument of method getPreprocessFilter ?
  +     */
       private Set dependencies;
   
       public void recycle()
       {
  -        dependencies.clear();
  +        super.recycle();
  +        this.dependencies.clear();
       }
   
       /**
  -    * The default constructor.
  -    */
  +     * The default constructor.
  +     */
       public XSPMarkupLanguage() throws SAXException, IOException {
           super();
           dependencies = new HashSet();
       }
   
       /**
  -    * Return the XSP language name: <i>xsp</i> :-)
  -    *
  -    * @return The <i>xsp</i> constant
  -    */
  +     * Return the XSP language name: <i>xsp</i> :-)
  +     *
  +     * @return The <i>xsp</i> constant
  +     */
       public String getName() {
           return "xsp";
       }
   
       /**
  -    * FIXME (SSA) : See interface. For now returns null.
  -    *
  -    * Return the document-declared encoding or <code>null</code> if it's the
  -    * platform's default encoding
  -    *
  -    * @return The document-declared encoding
  -    */
  +     * FIXME (SSA) : See interface. For now returns null.
  +     *
  +     * Return the document-declared encoding or <code>null</code> if it's the
  +     * platform's default encoding
  +     *
  +     * @return The document-declared encoding
  +     */
       public String getEncoding() {
           return null;
       }
   
       /**
  -    * Prepare the input source for logicsheet processing and code generation
  -    * with a preprocess filter.
  -    * The return <code>XMLFilter</code> object is the first filter on the
  -    * transformer chain.
  -    *
  -    * The XSP preprocess filter adds information on the root element such as
  -    * creation-date, file-name and file-path, plus it use the the passed
  -    * programming language to quote <code>Strings</code> on PCDATA node.
  -    *
  -    * @param filename The source filename
  -    * @param language The target programming language
  -    * @return The preprocess filter
  -    *
  -    * @see XSPMarkupLanguage.PreProcessFilter
  -    */
  +     * Prepare the input source for logicsheet processing and code generation
  +     * with a preprocess filter.
  +     * The return <code>XMLFilter</code> object is the first filter on the
  +     * transformer chain.
  +     *
  +     * The XSP preprocess filter adds information on the root element such as
  +     * creation-date, file-name and file-path, plus it use the the passed
  +     * programming language to quote <code>Strings</code> on PCDATA node.
  +     *
  +     * @param filename The source filename
  +     * @param language The target programming language
  +     * @return The preprocess filter
  +     *
  +     * @see XSPMarkupLanguage.PreProcessFilter
  +     */
       protected XMLFilter getPreprocessFilter( String filename, ProgrammingLanguage 
language  )
       {
           return new PreProcessFilter(filename, language);
       }
   
       /**
  -    * Add a dependency on an external file to the document for inclusion in
  -    * generated code. This is used to populate a list of <code>File</code>'s
  -    * tested for change on each invocation; this information is used to assert
  -    * whether regeneration is necessary. XSP uses &lt;xsp:dependency&gt;
  -    * elements for this purpose.
  -    *
  -    * @param location The file path of the dependent file
  -    * @see <code>AbstractMarkupLanguage</code>, <code>ServerPagesGenerator</code>
  -    *      and <code>AbstractServerPage</code>
  -    */
  +     * Add a dependency on an external file to the document for inclusion in
  +     * generated code. This is used to populate a list of <code>File</code>'s
  +     * tested for change on each invocation; this information is used to assert
  +     * whether regeneration is necessary. XSP uses &lt;xsp:dependency&gt;
  +     * elements for this purpose.
  +     *
  +     * @param location The file path of the dependent file
  +     * @see <code>AbstractMarkupLanguage</code>, <code>ServerPagesGenerator</code>
  +     *      and <code>AbstractServerPage</code>
  +     */
       protected void addDependency(String location) {
           dependencies.add(location);
       }
   
   
       /**
  -    * Returns a filter that chain on the fly the requested transformers for source
  -    * code generation. This method scans the input SAX events for
  -    * &lt;?xml-logicsheet?&gt; processing instructions and top-level
  -    * &lt;xsp:logicsheet&gt; elements. Logicsheet declarations are removed from
  -    * the input document.
  -    *
  -    * @param logicsheetMarkupGenerator the logicsheet markup generator
  -    * @param language the language descriptor
  -    * @param resolver the entity resolver
  -    * @return XMLFilter the filter that build on the fly the transformer chain
  -    */
  +     * Returns a filter that chain on the fly the requested transformers for source
  +     * code generation. This method scans the input SAX events for
  +     * &lt;?xml-logicsheet?&gt; processing instructions and top-level
  +     * &lt;xsp:logicsheet&gt; elements. Logicsheet declarations are removed from
  +     * the input document.
  +     *
  +     * @param logicsheetMarkupGenerator the logicsheet markup generator
  +     * @param language the language descriptor
  +     * @param resolver the entity resolver
  +     * @return XMLFilter the filter that build on the fly the transformer chain
  +     */
       protected TransformerChainBuilderFilter getTranformerChainBuilder (
           LogicsheetCodeGenerator logicsheetMarkupGenerator,
           SourceResolver resolver
  @@ -137,49 +140,21 @@
           );
       }
   
  -  /**
  -   * FIXME (SSA) What do we do with that method ?
  -   * + Should we stay with the Text serializer that returns the wanted String,
  -   * + Or should we go along with another contentHandler that retrieve the PCDATA
  -   * from <xsp: element. The last option is way faster because it would avoid the
  -   * String construction, and would allow working on array of char[] instead.
  -   *
  -   * Scan top-level document elements for non-xsp tag names returning the first
  -   * (and hopefully <i>only</i>) user-defined element
  -   *
  -   * @param document The input document
  -   * @return The first non-xsp element
  -   */
  -   /*
  -  protected Element getUserRoot(Document document) {
  -    Element root = document.getDocumentElement();
  -    NodeList elements = root.getElementsByTagName("*");
  -    int elementCount = elements.getLength();
  -    for (int i = 0; i < elementCount; i++) {
  -      Element userRoot = (Element) elements.item(i);
  -      if (!userRoot.getTagName().startsWith("xsp:")) {
  -        return userRoot;
  -      }
  -    }
  -
  -    return null;
  -  }
  -  */
  -
   //
   //  Inner classes
   //
   
       /**
  -    * Preprocess filter for XSP Markup language.
  -    * It looks for PI event other that &lt;?xml-logisheet href=&quot;...&quot;&gt;
  -    * for quoting them;
  -    * It adds creation-date, file-name and file-path attributes to the root
  -    * Element;
  -    * And it quotes the PCDATA based by calling the quote method of the
  -    * programming language.
  -    *
  -    */
  +     * Preprocess filter for XSP Markup language.
  +     * It looks for PI event other that &lt;?xml-logisheet href=&quot;...&quot;&gt;
  +     * for quoting them;
  +     * It adds creation-date, file-name and file-path attributes to the root
  +     * Element;
  +     * And it quotes the PCDATA based by calling the quote method of the
  +     * programming language.
  +     *
  +     * @see org.xml.sax.ContentHandler
  +     */
       protected class PreProcessFilter extends XMLFilterImpl implements Loggable {
           protected Logger log;
   
  @@ -192,8 +167,6 @@
           private ProgrammingLanguage language;
   
           /**
  -         * default constructor
  -         *
            * @param filename the filename
            * @param the programming language
            */
  @@ -209,18 +182,12 @@
               }
           }
   
  -        /**
  -         * @see org.xml.sax.ContentHandler
  -         */
           public void startDocument() throws SAXException {
               super.startDocument();
               isRootElem = true;
               stack = new Stack();
           }
   
  -        /**
  -         * @see org.xml.sax.ContentHandler
  -         */
           public void processingInstruction(String target, String data) throws 
SAXException {
               if (!"xml-logicsheet".equals(target)) {
                 data = this.language.quoteString(data);
  @@ -228,9 +195,6 @@
               super.processingInstruction(target, data);
           }
   
  -        /**
  -         * @see org.xml.sax.ContentHandler
  -         */
           public void startElement (String namespaceURI, String localName,
                             String qName, Attributes atts) throws SAXException {
                if (isRootElem) {
  @@ -255,18 +219,12 @@
               }
           }
   
  -        /**
  -         * @see org.xml.sax.ContentHandler
  -         */
           public void endElement (String namespaceURI, String localName,
                                 String qName) throws SAXException {
               stack.pop();
               super.endElement(namespaceURI, localName, qName);
           }
   
  -        /**
  -         * @see org.xml.sax.ContentHandler
  -         */
           public void characters(char[] ch, int start, int length) throws 
SAXException {
               String[] tag = (String[]) stack.peek();
               String tagName = tag[2];
  @@ -285,25 +243,24 @@
                   super.characters(value.toCharArray(), 0, value.length());
                   super.endElement(Constants.XSP_URI, "text", "xsp:text");
               }
  -
           }
  -
  -
  -
       }
   
   
       /**
  -    * This filter builds on the fly a chain of transformers. It extends the
  -    * <code>AbstractMArkupLanguage.TransformerChainBuilderFilter</code> so
  -    * it can adds XSP specific feature such as :
  -    * looking for &lt;?xml-logisheet href=&quot;...&quot?;&gt; PI and
  -    * &lt;xsp:xml-logisheet location=&quot;...&quot;&gt; elements to register
  -    * user defined logicsheets ;
  -    * adding all the dependencies related to the XSP pages as
  -    * &lt;xsp:dependency;&gt;...&lt;/xsp:dependency;&gt;
  -    *
  -    */
  +     * This filter builds on the fly a chain of transformers. It extends the
  +     * <code>AbstractMarkupLanguage.TransformerChainBuilderFilter</code> so
  +     * it can add XSP specific features such as:
  +     * <ul>
  +     * <li>Looking for &lt;?xml-logisheet href=&quot;...&quot?;&gt; PI and
  +     *     &lt;xsp:xml-logisheet location=&quot;...&quot;&gt; elements to register
  +     *     user defined logicsheets;</li>
  +     * <li>Adding all the dependencies related to the XSP pages as
  +     *     &lt;xsp:dependency;&gt;...&lt;/xsp:dependency;&gt;</li>
  +     * </ul>
  +     *
  +     * @see org.xml.sax.ContentHandler
  +     */
       protected  class XSPTransformerChainBuilderFilter extends 
TransformerChainBuilderFilter implements Loggable {
   
           protected Logger log;
  @@ -321,15 +278,13 @@
           private boolean finished;
   
           /**
  -         * default constructor
  -         *
            * @param logicsheetMarkupGenerator the code generator
            * @param resolver the entity resolver
            */
  -        protected XSPTransformerChainBuilderFilter (
  +        protected XSPTransformerChainBuilderFilter(
               LogicsheetCodeGenerator logicsheetMarkupGenerator,
  -            SourceResolver resolver
  -        ) {
  +            SourceResolver resolver)
  +        {
               super(logicsheetMarkupGenerator, resolver);
           }
   
  @@ -339,21 +294,17 @@
               }
           }
   
  -        /**
  -         * @see org.xml.sax.ContentHandler
  -         */
           public void processingInstruction(String target, String data) throws 
SAXException {
               // Retrieve logicsheets declared by processing-instruction
               if ("xml-logicsheet".equals(target)) {
                   int start = data.indexOf("href");
  -                if (start >=0) {
  +                if (start >= 0) {
                       // add 6, for lenght of 'href', plus '=' char, plus '"' char
                       start += 6;
                       // get the quote char. Can be " or '
                       char quote = data.charAt(start-1);
  -                    String href = data.substring(start);
  -                    int end = href.indexOf(quote);
  -                    href = href.substring(0, end);
  +                    int end = data.indexOf(quote, start);
  +                    String href = data.substring(start, end);
                       try {
                           XSPMarkupLanguage.this.addLogicsheetToList(
                               language, href, this.resolver
  @@ -369,13 +320,11 @@
                   // Do not forward the PI event.
                   return;
               }
  +
               // Call super when this is not a logicsheet related PI
               super.processingInstruction(target,data);
           }
   
  -        /**
  -         * @see org.xml.sax.ContentHandler
  -         */
           public void startDocument () throws SAXException {
               isRootElem=true;
               insideRootElement=false;
  @@ -384,19 +333,16 @@
               rootChars = new StringBuffer();
           }
   
  -        /**
  -         * @see org.xml.sax.ContentHandler
  -         */
           public void startElement (String namespaceURI, String localName,
  -            String qName, Attributes atts ) throws SAXException {
  +                String qName, Attributes atts) throws SAXException {
               if (finished) {
  -            // Call super method
  -            super.startElement(namespaceURI, localName, qName, atts);
  +                // Call super method
  +                super.startElement(namespaceURI, localName, qName, atts);
               } else {
                   // Need more work
                   if(isRootElem) {
                       isRootElem = false;
  -                    // cache the root element and resend the SAX event when
  +                    // Cache the root element and resend the SAX event when
                       // we've finished dealing with <xsp:logicsheet > elements
                       rootElement = new Object[4];
                       rootElement[0]=namespaceURI;
  @@ -421,24 +367,24 @@
                               throw new SAXException (ioe);
                           }
                       } else {
  -                        // This element is not a <xsp:logicsheet element, so finish
  -                        // by :
  +                        // This element is not a <xsp:logicsheet> element, so finish
  +                        // by:
                           // * setting the 'fisnished' flag to true ;
                           // * refiring all the cached events ;
                           // * firing all the necessary event dealing with file 
dependencies
  -                        finished=true;
  +                        finished = true;
   
  -                        // send SAX events 'startDocument'
  +                        // Send SAX events 'startDocument'
                           super.startDocument();
   
  -                        // send all prefix namespace
  +                        // Send all prefix namespace
                           String [] prefixArray;
                           for (int i=0; i<startPrefix.size(); i++) {
                               prefixArray = (String []) startPrefix.get(i);
                               super.startPrefixMapping(prefixArray[0], 
prefixArray[1]);
                           }
   
  -                        // send cached RootElement event
  +                        // Send cached RootElement event
                           super.startElement(
                               (String) rootElement[0],
                               (String) rootElement[1],
  @@ -446,13 +392,13 @@
                               (Attributes) rootElement[3]
                           );
   
  -                        // send cached characters
  +                        // Send cached characters
                           char[] ch = rootChars.toString().toCharArray();
                           super.characters( ch, 0, ch.length);
   
  -                        // send the events dealing with dependencies.
  +                        // Send the events dealing with dependencies.
                           // If some dependencies exist, then creates
  -                        // <xsp:dependency elements
  +                        // <xsp:dependency> elements
                           char[] locationChars;
                           Iterator iter = 
XSPMarkupLanguage.this.dependencies.iterator();
                           while(iter.hasNext()) {
  @@ -472,34 +418,23 @@
               }
           }
   
  -        /**
  -         * @see org.xml.sax.ContentHandler
  -         */
           public void endElement (String namespaceURI, String localName,
  -            String qName) throws SAXException {
  +                String qName) throws SAXException {
               if (finished) {
                   // Forward the events
                   super.endElement(namespaceURI, localName, qName);
               }
           }
   
  -        /**
  -         * @see org.xml.sax.ContentHandler
  -         */
           public void characters(char[] ch, int start, int length) throws 
SAXException {
               if (finished) {
                   super.characters(ch, start, length);
  -            } else {
  -                if(!insideRootElement) {
  -                    // caching the PCDATA for the root element
  -                    rootChars.append(ch, start, length);
  -                }
  +            } else if(!insideRootElement) {
  +                // Caching the PCDATA for the root element
  +                rootChars.append(ch, start, length);
               }
           }
   
  -        /**
  -         * @see org.xml.sax.ContentHandler
  -         */
           public void startPrefixMapping(String prefix, String uri) throws 
SAXException {
               if(finished) {
                   super.startPrefixMapping(prefix, uri);
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     [EMAIL PROTECTED]
To unsubscribe, e-mail:          [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to