cziegeler    2003/02/26 05:58:05

  Modified:    src/java/org/apache/cocoon/xml/dom DocumentWrapper.java
               src/java/org/apache/cocoon/serialization
                        ZipArchiveSerializer.java
               src/java/org/apache/cocoon/components/flow/javascript
                        ListInputStream.java
  Added:       src/scratchpad/src/org/apache/cocoon/components/source/impl
                        SourceFactoryWrapper.java URLFactoryWrapper.java
               src/scratchpad/src/org/apache/cocoon/components/source
                        CocoonSourceFactory.java FileSourceFactory.java
                        FileSource.java
  Removed:     src/java/org/apache/cocoon/components/source
                        CocoonSourceFactory.java FileSourceFactory.java
                        FileSource.java
               src/java/org/apache/cocoon/components/source/impl
                        URLFactoryWrapper.java SourceFactoryWrapper.java
  Log:
  Updating code; removing dependencies on deprecated code
  
  Revision  Changes    Path
  1.1                  
xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/impl/SourceFactoryWrapper.java
  
  Index: SourceFactoryWrapper.java
  ===================================================================
  /*
  
   ============================================================================
                     The Apache Software License, Version 1.1
   ============================================================================
  
   Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
  
   Redistribution and use in source and binary forms, with or without modifica-
   tion, are permitted provided that the following conditions are met:
  
   1. Redistributions of  source code must  retain the above copyright  notice,
      this list of conditions and the following disclaimer.
  
   2. Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
  
   3. The end-user documentation included with the redistribution, if any, must
      include  the following  acknowledgment:  "This product includes  software
      developed  by the  Apache Software Foundation  (http://www.apache.org/)."
      Alternately, this  acknowledgment may  appear in the software itself,  if
      and wherever such third-party acknowledgments normally appear.
  
   4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
      used to  endorse or promote  products derived from  this software without
      prior written permission. For written permission, please contact
      [EMAIL PROTECTED]
  
   5. Products  derived from this software may not  be called "Apache", nor may
      "Apache" appear  in their name,  without prior written permission  of the
      Apache Software Foundation.
  
   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
   This software  consists of voluntary contributions made  by many individuals
   on  behalf of the Apache Software  Foundation and was  originally created by
   Stefano Mazzocchi  <[EMAIL PROTECTED]>. For more  information on the Apache
   Software Foundation, please see <http://www.apache.org/>.
  
  */
  package org.apache.cocoon.components.source.impl;
  
  import org.apache.avalon.excalibur.pool.Recyclable;
  import org.apache.avalon.framework.activity.Disposable;
  import org.apache.avalon.framework.component.ComponentException;
  import org.apache.avalon.framework.component.ComponentManager;
  import org.apache.avalon.framework.component.Composable;
  import org.apache.avalon.framework.configuration.Configurable;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.framework.context.Context;
  import org.apache.avalon.framework.context.ContextException;
  import org.apache.avalon.framework.context.Contextualizable;
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  import org.apache.avalon.framework.logger.LogEnabled;
  import org.apache.avalon.framework.thread.ThreadSafe;
  import org.apache.cocoon.CascadingIOException;
  import org.apache.cocoon.ProcessingException;
  import org.apache.cocoon.components.CocoonComponentManager;
  import org.apache.cocoon.environment.Environment;
  import org.apache.cocoon.util.ClassUtils;
  import org.apache.excalibur.source.Source;
  import org.apache.excalibur.source.SourceFactory;
  
  import java.io.IOException;
  import java.net.MalformedURLException;
  import java.util.Map;
  
  /**
   * This class wraps a Cocoon SourceFactory and makes it
   * usable within the Avalon Excalibur source resolving architecure.
   * The main purpose is to avoid recoding existing factories.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
   * @version CVS $Id: SourceFactoryWrapper.java,v 1.1 2003/02/26 13:58:04 cziegeler 
Exp $
   */
  public final class SourceFactoryWrapper
      extends AbstractLogEnabled
      implements SourceFactory,
                 ThreadSafe,
                 Configurable,
                 Disposable,
                 Composable,
                 Contextualizable
  {
      /** The <code>ComponentManager</code> */
      private ComponentManager manager;
  
      /** The special Source factories */
      private org.apache.cocoon.components.source.SourceFactory sourceFactory;
  
      /** The context */
      private Context context;
  
      /**
       * Configure the SourceFactories
       */
      public void configure(final Configuration conf)
      throws ConfigurationException {
  
          try {
              final Configuration factoryConf = conf.getChild("source-factory");
              final String className = factoryConf.getAttribute("class");
              if (this.getLogger().isDebugEnabled()) {
                  this.getLogger().debug("Getting the SourceFactory " + className);
              }
              this.sourceFactory = (org.apache.cocoon.components.source.SourceFactory)
                           ClassUtils.newInstance(className);
              this.init(this.sourceFactory, factoryConf);
          } catch (ConfigurationException e) {
              throw e;
          } catch (Exception e) {
              throw new ConfigurationException("Could not get parameters because: " +
                                             e.getMessage(), e);
          }
      }
  
      /**
       * Get the context
       */
      public void contextualize(Context context)
      throws ContextException {
          this.context = context;
      }
  
      /**
       * Set the current <code>ComponentManager</code> instance used by this
       * <code>Composable</code>.
       */
      public void compose(ComponentManager manager)
      throws ComponentException {
          this.manager = manager;
      }
  
      /**
       * Dispose
       */
      public void dispose() {
          if (this.sourceFactory != null) {
              this.deinit(this.sourceFactory);
          }
          this.sourceFactory = null;
      }
  
  
      /**
       * Get a <code>Source</code> object.
       * @param parameters This is optional.
       */
      public Source getSource( String location, Map parameters )
          throws MalformedURLException, IOException
      {
          if( getLogger().isDebugEnabled() )
          {
              getLogger().debug( "Creating source object for " + location );
          }
  
          final Environment currentEnv = 
CocoonComponentManager.getCurrentEnvironment();
          org.apache.cocoon.environment.Source source;
          try {
              source = this.sourceFactory.getSource(currentEnv, location);
          } catch (ProcessingException pe) {
              throw new CascadingIOException("ProcessingException: " + 
pe.getMessage(), pe);
          }
          return new CocoonToAvalonSource( location, source );
      }
  
      /**
       * Init a source factory
       */
      private void init(org.apache.cocoon.components.source.SourceFactory factory,
                        Configuration config)
      throws ContextException, ComponentException, ConfigurationException {
          if (factory instanceof LogEnabled) {
              ((LogEnabled) factory).enableLogging(getLogger());
          }
          if (factory instanceof Contextualizable) {
              ((Contextualizable) factory).contextualize (this.context);
          }
          if (factory instanceof Composable) {
              ((Composable) factory).compose(this.manager);
          }
          if (config != null && factory instanceof Configurable) {
              ((Configurable) factory).configure(config);
          }
      }
  
      /**
       * Deinit a source factory
       */
      private void deinit(org.apache.cocoon.components.source.SourceFactory factory) {
          if (factory instanceof Disposable) {
              ((Disposable) factory).dispose();
          }
      }
      
      /**
       * Release a [EMAIL PROTECTED] Source} object.
       */
      public void release( Source source ) {
          if ( null != source ) {
              if ( this.getLogger().isDebugEnabled() ) {
                  this.getLogger().debug("Releasing source " + source.getURI());
              }
              ((Recyclable)source).recycle();
          }
      }
  
  
  }
  
  
  
  1.1                  
xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/impl/URLFactoryWrapper.java
  
  Index: URLFactoryWrapper.java
  ===================================================================
  /*
  
   ============================================================================
                     The Apache Software License, Version 1.1
   ============================================================================
  
   Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
  
   Redistribution and use in source and binary forms, with or without modifica-
   tion, are permitted provided that the following conditions are met:
  
   1. Redistributions of  source code must  retain the above copyright  notice,
      this list of conditions and the following disclaimer.
  
   2. Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
  
   3. The end-user documentation included with the redistribution, if any, must
      include  the following  acknowledgment:  "This product includes  software
      developed  by the  Apache Software Foundation  (http://www.apache.org/)."
      Alternately, this  acknowledgment may  appear in the software itself,  if
      and wherever such third-party acknowledgments normally appear.
  
   4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
      used to  endorse or promote  products derived from  this software without
      prior written permission. For written permission, please contact
      [EMAIL PROTECTED]
  
   5. Products  derived from this software may not  be called "Apache", nor may
      "Apache" appear  in their name,  without prior written permission  of the
      Apache Software Foundation.
  
   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
   This software  consists of voluntary contributions made  by many individuals
   on  behalf of the Apache Software  Foundation and was  originally created by
   Stefano Mazzocchi  <[EMAIL PROTECTED]>. For more  information on the Apache
   Software Foundation, please see <http://www.apache.org/>.
  
  */
  package org.apache.cocoon.components.source.impl;
  
  import org.apache.avalon.framework.activity.Disposable;
  import org.apache.avalon.framework.component.ComponentException;
  import org.apache.avalon.framework.component.ComponentManager;
  import org.apache.avalon.framework.component.Composable;
  import org.apache.avalon.framework.configuration.Configurable;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.framework.context.Context;
  import org.apache.avalon.framework.context.ContextException;
  import org.apache.avalon.framework.context.Contextualizable;
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  import org.apache.avalon.framework.logger.LogEnabled;
  import org.apache.avalon.framework.thread.ThreadSafe;
  import org.apache.cocoon.components.url.URLFactory;
  import org.apache.cocoon.util.ClassUtils;
  import org.apache.excalibur.source.Source;
  import org.apache.excalibur.source.SourceFactory;
  import org.apache.excalibur.source.impl.URLSource;
  
  import java.io.IOException;
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.util.Map;
  
  /**
   * This class wraps a Cocoon URLFactory and makes it
   * usable within the Avalon Excalibur source resolving architecure.
   * The main purpose is to avoid recoding existing factories.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
   * @version CVS $Id: URLFactoryWrapper.java,v 1.1 2003/02/26 13:58:04 cziegeler Exp $
   */
  
  public final class URLFactoryWrapper
      extends AbstractLogEnabled
      implements SourceFactory,
                 ThreadSafe,
                 Configurable,
                 Disposable,
                 Composable,
                 Contextualizable
  {
      /** The <code>ComponentManager</code> */
      private ComponentManager manager;
  
      /** The special Source factories */
      private URLFactory urlFactory;
  
      /** The context */
      private Context context;
  
      /**
       * Configure the SourceFactories
       */
      public void configure(final Configuration conf)
      throws ConfigurationException {
  
          try {
              final Configuration factoryConf = conf.getChild("url-factory");
              final String className = factoryConf.getAttribute("class");
              if (this.getLogger().isDebugEnabled()) {
                  this.getLogger().debug("Getting the URLFactory " + className);
              }
              this.urlFactory = (URLFactory)ClassUtils.newInstance(className);
              this.init(this.urlFactory, factoryConf);
          } catch (ConfigurationException e) {
              throw e;
          } catch (Exception e) {
              throw new ConfigurationException("Could not get parameters because: " +
                                             e.getMessage(), e);
          }
      }
  
      /**
       * Get the context
       */
      public void contextualize(Context context)
      throws ContextException {
          this.context = context;
      }
  
      /**
       * Set the current <code>ComponentManager</code> instance used by this
       * <code>Composable</code>.
       */
      public void compose(ComponentManager manager)
      throws ComponentException {
          this.manager = manager;
      }
  
      /**
       * Dispose
       */
      public void dispose() {
          if (this.urlFactory != null) {
              this.deinit(this.urlFactory);
          }
          this.urlFactory = null;
      }
  
  
      /**
       * Get a <code>Source</code> object.
       * @param parameters This is optional.
       */
      public Source getSource( String location, Map parameters )
          throws MalformedURLException, IOException
      {
          if( this.getLogger().isDebugEnabled() ) {
              this.getLogger().debug( "Creating source object for " + location );
          }
  
          final int protocolPos = location.indexOf("://");
          final URL url = this.urlFactory.getURL(location.substring(protocolPos+3));
          final URLSource source = new org.apache.excalibur.source.impl.URLSource();
          source.init(url, parameters);
          return source;
      }
  
      /**
       * Init a url factory
       */
      private void init(URLFactory factory,
                        Configuration config)
      throws ContextException, ComponentException, ConfigurationException {
          if (factory instanceof LogEnabled) {
              ((LogEnabled) factory).enableLogging(getLogger());
          }
          if (factory instanceof Contextualizable) {
              ((Contextualizable) factory).contextualize (this.context);
          }
          if (factory instanceof Composable) {
              ((Composable) factory).compose(this.manager);
          }
          if (config != null && factory instanceof Configurable) {
              ((Configurable) factory).configure(config);
          }
      }
  
      /**
       * Deinit a url factory
       */
      private void deinit(URLFactory factory) {
          if (factory instanceof Disposable) {
              ((Disposable) factory).dispose();
          }
      }
  
      /**
       * Release a [EMAIL PROTECTED] Source} object.
       */
      public void release( Source source ) {
          if ( null != source ) {
              if ( this.getLogger().isDebugEnabled() ) {
                  this.getLogger().debug("Releasing source " + source.getURI());
              }
              // do simply nothing
          }
      }
  
  }
  
  
  
  1.1                  
xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/CocoonSourceFactory.java
  
  Index: CocoonSourceFactory.java
  ===================================================================
  /*
  
   ============================================================================
                     The Apache Software License, Version 1.1
   ============================================================================
  
   Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
  
   Redistribution and use in source and binary forms, with or without modifica-
   tion, are permitted provided that the following conditions are met:
  
   1. Redistributions of  source code must  retain the above copyright  notice,
      this list of conditions and the following disclaimer.
  
   2. Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
  
   3. The end-user documentation included with the redistribution, if any, must
      include  the following  acknowledgment:  "This product includes  software
      developed  by the  Apache Software Foundation  (http://www.apache.org/)."
      Alternately, this  acknowledgment may  appear in the software itself,  if
      and wherever such third-party acknowledgments normally appear.
  
   4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
      used to  endorse or promote  products derived from  this software without
      prior written permission. For written permission, please contact
      [EMAIL PROTECTED]
  
   5. Products  derived from this software may not  be called "Apache", nor may
      "Apache" appear  in their name,  without prior written permission  of the
      Apache Software Foundation.
  
   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
   This software  consists of voluntary contributions made  by many individuals
   on  behalf of the Apache Software  Foundation and was  originally created by
   Stefano Mazzocchi  <[EMAIL PROTECTED]>. For more  information on the Apache
   Software Foundation, please see <http://www.apache.org/>.
  
  */
  package org.apache.cocoon.components.source;
  
  import org.apache.avalon.framework.component.ComponentManager;
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  import org.apache.cocoon.ProcessingException;
  import org.apache.cocoon.environment.Environment;
  import org.apache.cocoon.environment.Source;
  import org.apache.cocoon.Processor;
  
  import java.io.IOException;
  import java.net.MalformedURLException;
  import java.net.URL;
  
  /**
   * This class implements the cocoon: protocol.
   * It cannot be configured like the other source factories
   * as it needs the current <code>Sitemap</code> as input.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
   * @version CVS $Id: CocoonSourceFactory.java,v 1.1 2003/02/26 13:58:04 cziegeler 
Exp $
   */
  public final class CocoonSourceFactory
  extends AbstractLogEnabled
  implements SourceFactory {
  
      /** The component manager */
      private ComponentManager  manager;
  
      public CocoonSourceFactory(Processor processor,
                                 ComponentManager manager) {
          this.manager = manager;
      }
  
      /**
       * Resolve the source
       */
      public Source getSource(Environment environment, String location)
      throws ProcessingException, IOException, MalformedURLException {
          if (environment == null)
              throw new ProcessingException("CocoonSourceFactory: environment is 
required.");
          return new SitemapSource(this.manager,
                                   location,
                                   this.getLogger());
      }
  
      /**
       * Resolve the source
       */
      public Source getSource(Environment environment, URL base, String location)
      throws ProcessingException, IOException, MalformedURLException {
          if (environment == null)
              throw new ProcessingException("CocoonSourceFactory: environment is 
required.");
          return this.getSource(environment, base.toExternalForm() + location);
      }
  }
  
  
  
  1.1                  
xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/FileSourceFactory.java
  
  Index: FileSourceFactory.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache Cocoon" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.cocoon.components.source;
  
  import org.apache.avalon.framework.component.ComponentException;
  import org.apache.avalon.framework.component.ComponentManager;
  import org.apache.avalon.framework.component.Composable;
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  import org.apache.avalon.framework.thread.ThreadSafe;
  
  import org.apache.cocoon.components.source.SourceFactory;
  import org.apache.cocoon.environment.Environment;
  import org.apache.cocoon.environment.Source;
  import org.apache.cocoon.ProcessingException;
  
  import java.io.IOException;
  import java.net.MalformedURLException;
  import java.net.URL;
  
  /**
   * A factory for 'file:' sources.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a>
   * @version $Id: FileSourceFactory.java,v 1.1 2003/02/26 13:58:04 cziegeler Exp $
   * @deprecated Use the new avalon source resolving instead
   */
  
  public class FileSourceFactory extends AbstractLogEnabled
      implements SourceFactory, Composable, ThreadSafe {
      
      private ComponentManager manager;
  
      public void compose(ComponentManager manager) throws ComponentException {
          this.manager = manager;
      }
      
      public Source getSource(Environment environment, String location)
        throws ProcessingException, MalformedURLException, IOException {
          Source result = new FileSource(location, this.manager);
          setupLogger(result);
          return result;
      }
  
      public Source getSource(Environment environment, URL base, String location)
        throws ProcessingException, MalformedURLException, IOException {
          return getSource(environment, new URL(base, location).toExternalForm());
      }
  }
      
  
  
  
  1.1                  
xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/FileSource.java
  
  Index: FileSource.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache Cocoon" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.cocoon.components.source;
  
  import org.apache.avalon.framework.component.ComponentManager;
  import org.apache.cocoon.ProcessingException;
  import org.apache.cocoon.ResourceNotFoundException;
  
  import java.io.*;
  import java.net.MalformedURLException;
  import java.util.ConcurrentModificationException;
  
  /**
   * A <code>org.apache.cocoon.environment.WriteableSource</code> for 'file:/' system 
IDs.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a>
   * @version $Id: FileSource.java,v 1.1 2003/02/26 13:58:04 cziegeler Exp $
   * @deprecated Use the new avalon source resolving instead
   */
  
  public class FileSource extends AbstractStreamWriteableSource
      implements org.apache.cocoon.environment.WriteableSource {
  
      /** The underlying file. */
      private File file;
  
      /** The system ID for this source (lazily created by getSystemId()) */
      private String systemId = null;
  
      /** Is this an html file ? */
      private boolean isHTMLContent;
  
      /**
       * Create a file source from a 'file:' url and a component manager.
       */
      public FileSource(String url, ComponentManager manager) {
  
          super(manager);
  
          if (!url.startsWith("file:")) {
              throw new IllegalArgumentException("Malformed url for a file source : " 
+ url);
          }
  
          if (url.endsWith(".htm") || url.endsWith(".html")) {
              this.isHTMLContent = true;
          }
  
          this.file = new File(url.substring(5)); // 5 == "file:".length()
      }
  
      public boolean exists() {
          return this.file.exists();
      }
  
      /**
       * Returns <code>true</code> if the file name ends with ".htm" or ".html".
       */
      protected boolean isHTMLContent() {
          return this.isHTMLContent;
      }
  
      /**
       * Return the unique identifer for this source
       */
      public String getSystemId() {
          if (this.systemId == null) {
              try {
                  this.systemId = this.file.toURL().toExternalForm();
              } catch(MalformedURLException mue) {
                  // Can this really happen ?
                  this.systemId = "file:" + this.file.getPath();
              }
          }
          return this.systemId;
      }
  
      /**
       * Get the input stream for this source.
       */
      public InputStream getInputStream() throws IOException, ProcessingException {
          try {
              return new FileInputStream(this.file);
          } catch (FileNotFoundException e) {
              throw new ResourceNotFoundException("Resource not found "
                                                  + getSystemId(), e);
          }
      }
  
      public long getLastModified() {
          return this.file.lastModified();
      }
  
      public long getContentLength() {
          return this.file.length();
      }
  
      /**
       * Get an output stream to write to this source. The output stream returned
       * actually writes to a temp file that replaces the real one on close. This
       * temp file is used as lock to forbid multiple simultaneous writes. The
       * real file is updated atomically when the output stream is closed.
       *
       * @throws ConcurrentModificationException if another thread is currently
       *         writing to this file.
       */
      public OutputStream getOutputStream() throws IOException, ProcessingException {
  
          // Create a temp file. It will replace the right one when writing terminates,
          // and serve as a lock to prevent concurrent writes.
          File tmpFile = new File(this.file.getPath() + ".tmp");
  
          // Ensure the directory exists
          tmpFile.getParentFile().mkdirs();
  
          // Can we write the file ?
          if (this.file.exists() && !this.file.canWrite()) {
              throw new IOException("Cannot write to file " + this.file.getPath());
          }
  
          // Check if it temp file already exists, meaning someone else currently 
writing
          if (!tmpFile.createNewFile()) {
              throw new ConcurrentModificationException("File " + this.file.getPath() +
                " is already being written by another thread");
          }
  
          // Return a stream that will rename the temp file on close.
          return new FileSourceOutputStream(tmpFile);
      }
  
      /**
       * Always return <code>false</code>. To be redefined by implementations that 
support
       * <code>cancel()</code>.
       */
      public boolean canCancel(OutputStream stream) {
          if (stream instanceof FileSourceOutputStream) {
              FileSourceOutputStream fsos = (FileSourceOutputStream)stream;
              if (fsos.getSource() == this) {
                  return fsos.canCancel();
              }
          }
  
          // Not a valid stream for this source
          throw new IllegalArgumentException("The stream is not associated to this 
source");
      }
  
      /**
       * Cancels the output stream.
       */
      public void cancel(OutputStream stream) throws Exception {
          if (stream instanceof FileSourceOutputStream) {
              FileSourceOutputStream fsos = (FileSourceOutputStream)stream;
              if (fsos.getSource() == this) {
                  fsos.cancel();
                  return;
              }
          }
  
          // Not a valid stream for this source
          throw new IllegalArgumentException("The stream is not associated to this 
source");
      }
  
      /**
       * A file outputStream that will rename the temp file to the destination file 
upon close()
       * and discard the temp file upon cancel().
       */
      private class FileSourceOutputStream extends FileOutputStream {
  
          private File tmpFile;
          private boolean isClosed = false;
  
          public FileSourceOutputStream(File tmpFile) throws IOException {
              super(tmpFile);
              this.tmpFile = tmpFile;
          }
  
          public FileSource getSource() {
              return FileSource.this;
          }
  
          public void close() throws IOException {
              super.close();
  
              try {
                  // Delete destination file
                  if (FileSource.this.file.exists()) {
                      FileSource.this.file.delete();
                  }
                  // Rename temp file to destination file
                  tmpFile.renameTo(FileSource.this.file);
  
              } finally {
                  // Ensure temp file is deleted, ie lock is released.
                  // If there was a failure above, written data is lost.
                  if (tmpFile.exists()) {
                      tmpFile.delete();
                  }
                  this.isClosed = true;
              }
          }
  
          public boolean canCancel() {
              return !this.isClosed;
          }
  
          public void cancel() throws Exception {
              if (this.isClosed) {
                  throw new IllegalStateException("Cannot cancel : outputstrem is 
already closed");
              }
  
              this.isClosed = true;
              super.close();
              this.tmpFile.delete();
          }
  
          public void finalize() {
              if (!this.isClosed && tmpFile.exists()) {
                  // Something wrong happened while writing : delete temp file
                  tmpFile.delete();
              }
          }
      }
  }
  
  
  
  1.5       +2 -2      
xml-cocoon2/src/java/org/apache/cocoon/xml/dom/DocumentWrapper.java
  
  Index: DocumentWrapper.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/xml/dom/DocumentWrapper.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- DocumentWrapper.java      31 Jan 2003 22:52:00 -0000      1.4
  +++ DocumentWrapper.java      26 Feb 2003 13:58:04 -0000      1.5
  @@ -77,7 +77,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]">Christian Haul</a>
    * @version CVS $Id$
   */
  -public class DocumentWrapper implements org.w3c.dom.Document, XMLizable, 
org.apache.cocoon.xml.XMLizable {
  +public class DocumentWrapper implements org.w3c.dom.Document, XMLizable {
   
       Document document = null;
       
  
  
  
  1.7       +6 -3      
xml-cocoon2/src/java/org/apache/cocoon/serialization/ZipArchiveSerializer.java
  
  Index: ZipArchiveSerializer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/serialization/ZipArchiveSerializer.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- ZipArchiveSerializer.java 31 Jan 2003 22:51:55 -0000      1.6
  +++ ZipArchiveSerializer.java 26 Feb 2003 13:58:04 -0000      1.7
  @@ -56,8 +56,8 @@
   import org.apache.avalon.framework.component.ComponentSelector;
   import org.apache.avalon.framework.component.Composable;
   import org.apache.cocoon.components.CocoonComponentManager;
  -import org.apache.cocoon.environment.Source;
   import org.apache.cocoon.environment.SourceResolver;
  +import org.apache.excalibur.source.Source;
   import org.xml.sax.Attributes;
   import org.xml.sax.SAXException;
   import org.xml.sax.helpers.NamespaceSupport;
  @@ -264,6 +264,7 @@
                   "Cannot specify both 'src' and 'serializer' on a Zip entry '" + 
name + "'");
           }
   
  +        Source source = null;
           try {
               // Create a new Zip entry
               ZipEntry entry = new ZipEntry(name);
  @@ -271,7 +272,7 @@
   
               if (src != null) {
                   // Get the source and its data
  -                Source source = resolver.resolve(src);
  +                source = resolver.resolveURI(src);
                   InputStream sourceInput = source.getInputStream();
   
                   // Copy the source to the zip
  @@ -324,6 +325,8 @@
               throw se;
           } catch (Exception e) {
               throw new SAXException(e);
  +        } finally {
  +            this.resolver.release( source );
           }
       }
   
  
  
  
  1.8       +149 -172  
xml-cocoon2/src/java/org/apache/cocoon/components/flow/javascript/ListInputStream.java
  
  Index: ListInputStream.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/flow/javascript/ListInputStream.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- ListInputStream.java      26 Feb 2003 13:28:19 -0000      1.7
  +++ ListInputStream.java      26 Feb 2003 13:58:05 -0000      1.8
  @@ -46,15 +46,14 @@
   
   package org.apache.cocoon.components.flow.javascript;
   
  -import org.apache.cocoon.CascadingIOException;
  -import org.apache.cocoon.ProcessingException;
  -import org.apache.excalibur.source.Source;
  -
   import java.io.IOException;
   import java.io.InputStream;
   import java.util.ArrayList;
   import java.util.List;
   
  +import org.apache.cocoon.ProcessingException;
  +import org.apache.excalibur.source.Source;
  +
   /**
    * Maintains a list of [EMAIL PROTECTED] org.apache.cocoon.environment.Source}
    * objects to read the input from. This class keeps track of the
  @@ -64,176 +63,154 @@
    * @author <a href="mailto:[EMAIL PROTECTED]">Ovidiu Predescu</a>
    * @since August 15, 2002
    */
  -public class ListInputStream extends InputStream
  -{
  -  /**
  -   * The <code>List</code> of [EMAIL PROTECTED]
  -   * org.apache.cocoon.environment.Source} objects.
  -   */
  -  List sourcesList;
  -
  -  /**
  -   * Location information on each <code>Source</code> object part of
  -   * <code>sourcesList</code>.
  -   */
  -  List sourcesInfo;
  -
  -  /**
  -   * Indicates whether we read all the streams.
  -   */
  -  boolean eof = false;
  -
  -  /**
  -   * The total number of elements in the <code>sourcesList</code> list.
  -   */
  -  private int size;
  -
  -  /**
  -   * What is the current <code>Source</code> object being read from.
  -   */
  -  private int currentIndex;
  -
  -  /**
  -   * The current <code>Source</code> object being read from.
  -   */
  -  protected SourceInfo currentSourceInfo;
  -
  -  /**
  -   * The current <code>InputStream</code> object being read from.
  -   */
  -  private InputStream currentStream;
  -
  -  /**
  -   * Given a <code>List</code> of [EMAIL PROTECTED]
  -   * org.apache.cocoon.environment.Source} objects, creates a new
  -   * <code>ListInputStream</code> instance.
  -   *
  -   * @param sources a <code>List</code> of [EMAIL PROTECTED]
  -   * org.apache.cocoon.environment.Source}
  -   */
  -  public ListInputStream(List sources)
  -    throws ProcessingException, IOException
  -  {
  -    sourcesList = sources;
  -    currentIndex = 0;
  -    size = sources.size();
  -
  -    sourcesInfo = new ArrayList(size);
  -    for (int i = 0; i < size; i++)
  -      sourcesInfo.add(new SourceInfo((Source)sources.get(i)));
  -
  -    currentSourceInfo = (SourceInfo)sourcesInfo.get(0);
  -    currentStream = ((Source)sources.get(0)).getInputStream();
  -  }
  -
  -  /**
  -   * Simplistic implementation: return the number of number of bytes
  -   * that can be read only from the current stream, without bothering
  -   * to check the remaining streams.
  -   *
  -   * @return an <code>int</code> value
  -   */
  -  public int available()
  -    throws IOException
  -  {
  -    return currentStream.available();
  -  }
  -
  -  public void close()
  -    throws IOException
  -  {
  -    try {
  -      for (int i = 0; i < size; i++)
  -        ((Source)sourcesList.get(i)).getInputStream().close();
  -    }
  -    catch (ProcessingException ex) {
  -      throw new CascadingIOException(ex);
  -    }
  -    finally {
  -      currentStream = null;
  -      eof = true;
  -    }
  -  }
  -
  -  public int read()
  -    throws IOException
  -  {
  -    if (eof)
  -      return -1;
  -
  -    // Read a character from the current stream
  -    int ch = currentStream.read();
  -
  -    // If we reached the end of the stream, try moving to the next one
  -    if (ch == -1) {
  -      currentIndex++;
  -
  -      // If there are no more streams to read, indicate that to our caller
  -      if (currentIndex == size) {
  -        eof = true;
  -        return -1;
  -      }
  -
  -      currentSourceInfo = (SourceInfo)sourcesInfo.get(currentIndex);
  -      try {
  -        currentStream
  -          = ((Source)sourcesList.get(currentIndex)).getInputStream();
  -      }
  -      catch (ProcessingException ex) {
  -        throw new CascadingIOException(ex.toString(), ex);
  -      }
  -    }
  -
  -    // FIXME: I18N
  -    if (ch == '\n')
  -      currentSourceInfo.lineNumbers++;
  -
  -    return ch;
  -  }
  -
  -  public int read(byte[] array)
  -    throws IOException
  -  {
  -    return read(array, 0, array.length);
  -  }
  -
  -  public int read(byte[] array, int offset, int len)
  -    throws IOException
  -  {
  -    if (eof)
  -      return -1;
  -
  -    if (len == 0)
  -      return 0;
  -
  -    int numberOfCharsRead = 0;
  -
  -    for (int i = offset; numberOfCharsRead < len; numberOfCharsRead++, i++) {
  -      int ch = read();
  -      if (ch == -1)
  -        return numberOfCharsRead;
  +public class ListInputStream extends InputStream {
  +    /**
  +     * The <code>List</code> of [EMAIL PROTECTED]
  +     * org.apache.cocoon.environment.Source} objects.
  +     */
  +    List sourcesList;
  +
  +    /**
  +     * Location information on each <code>Source</code> object part of
  +     * <code>sourcesList</code>.
  +     */
  +    List sourcesInfo;
  +
  +    /**
  +     * Indicates whether we read all the streams.
  +     */
  +    boolean eof = false;
  +
  +    /**
  +     * The total number of elements in the <code>sourcesList</code> list.
  +     */
  +    private int size;
  +
  +    /**
  +     * What is the current <code>Source</code> object being read from.
  +     */
  +    private int currentIndex;
  +
  +    /**
  +     * The current <code>Source</code> object being read from.
  +     */
  +    protected SourceInfo currentSourceInfo;
  +
  +    /**
  +     * The current <code>InputStream</code> object being read from.
  +     */
  +    private InputStream currentStream;
  +
  +    /**
  +     * Given a <code>List</code> of [EMAIL PROTECTED]
  +     * org.apache.cocoon.environment.Source} objects, creates a new
  +     * <code>ListInputStream</code> instance.
  +     *
  +     * @param sources a <code>List</code> of [EMAIL PROTECTED]
  +     * org.apache.cocoon.environment.Source}
  +     */
  +    public ListInputStream(List sources)
  +        throws ProcessingException, IOException {
  +        sourcesList = sources;
  +        currentIndex = 0;
  +        size = sources.size();
  +
  +        sourcesInfo = new ArrayList(size);
  +        for (int i = 0; i < size; i++)
  +            sourcesInfo.add(new SourceInfo((Source) sources.get(i)));
   
  -      array[i] = (byte)ch;
  +        currentSourceInfo = (SourceInfo) sourcesInfo.get(0);
  +        currentStream = ((Source) sources.get(0)).getInputStream();
       }
   
  -    return numberOfCharsRead;
  -  }
  +    /**
  +     * Simplistic implementation: return the number of number of bytes
  +     * that can be read only from the current stream, without bothering
  +     * to check the remaining streams.
  +     *
  +     * @return an <code>int</code> value
  +     */
  +    public int available() throws IOException {
  +        return currentStream.available();
  +    }
   
  -  public boolean markSupported()
  -  {
  -    return false;
  -  }
  -
  -  /**
  -   * Return a <code>List</code> of [EMAIL PROTECTED] SourceInfo} objects which
  -   * maintains the line number information of a [EMAIL PROTECTED]
  -   * org.apache.cocoon.environment.Source} object.
  -   *
  -   * @return a <code>List</code> value
  -   */
  -  public List getSourceInfo()
  -  {
  -    return sourcesInfo;
  -  }
  -}
  +    public void close() throws IOException {
  +        try {
  +            for (int i = 0; i < size; i++)
  +                 ((Source) sourcesList.get(i)).getInputStream().close();
  +        } finally {
  +            currentStream = null;
  +            eof = true;
  +        }
  +    }
  +
  +    public int read() throws IOException {
  +        if (eof)
  +            return -1;
  +
  +        // Read a character from the current stream
  +        int ch = currentStream.read();
  +
  +        // If we reached the end of the stream, try moving to the next one
  +        if (ch == -1) {
  +            currentIndex++;
  +
  +            // If there are no more streams to read, indicate that to our caller
  +            if (currentIndex == size) {
  +                eof = true;
  +                return -1;
  +            }
  +
  +            currentSourceInfo = (SourceInfo) sourcesInfo.get(currentIndex);
  +            currentStream =
  +                ((Source) sourcesList.get(currentIndex)).getInputStream();
  +        }
  +
  +        // FIXME: I18N
  +        if (ch == '\n')
  +            currentSourceInfo.lineNumbers++;
  +
  +        return ch;
  +    }
  +
  +    public int read(byte[] array) throws IOException {
  +        return read(array, 0, array.length);
  +    }
  +
  +    public int read(byte[] array, int offset, int len) throws IOException {
  +        if (eof)
  +            return -1;
  +
  +        if (len == 0)
  +            return 0;
  +
  +        int numberOfCharsRead = 0;
  +
  +        for (int i = offset;
  +            numberOfCharsRead < len;
  +            numberOfCharsRead++, i++) {
  +            int ch = read();
  +            if (ch == -1)
  +                return numberOfCharsRead;
  +
  +            array[i] = (byte) ch;
  +        }
  +
  +        return numberOfCharsRead;
  +    }
  +
  +    public boolean markSupported() {
  +        return false;
  +    }
   
  +    /**
  +     * Return a <code>List</code> of [EMAIL PROTECTED] SourceInfo} objects which
  +     * maintains the line number information of a [EMAIL PROTECTED]
  +     * org.apache.cocoon.environment.Source} object.
  +     *
  +     * @return a <code>List</code> value
  +     */
  +    public List getSourceInfo() {
  +        return sourcesInfo;
  +    }
  +}
  
  
  

Reply via email to