You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by sy...@apache.org on 2003/08/01 19:21:15 UTC

cvs commit: cocoon-2.1/src/scratchpad/src/org/apache/cocoon/generation TraversableGenerator.java

sylvain     2003/08/01 10:21:15

  Modified:    src/scratchpad/src/org/apache/cocoon/generation
                        TraversableGenerator.java
  Added:       src/scratchpad/src/org/apache/cocoon/components/source/impl
                        MultiSourceValidity.java
  Log:
  Smarter validity for TraversalGenerator : takes into account the validity of each individual source instead of just lastModified
  
  Revision  Changes    Path
  1.1                  cocoon-2.1/src/scratchpad/src/org/apache/cocoon/components/source/impl/MultiSourceValidity.java
  
  Index: MultiSourceValidity.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2003 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 apache@apache.org.
   *
   * 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.impl;
  
  import java.io.IOException;
  import java.util.ArrayList;
  import java.util.List;
  
  import org.apache.excalibur.source.Source;
  import org.apache.excalibur.source.SourceResolver;
  import org.apache.excalibur.source.SourceValidity;
  
  /**
   * An aggregated validity for multiple sources.
   * 
   * @author <a href="http://www.apache.org/~sylvain">Sylvain Wallez</a>
   * @version CVS $Id: MultiSourceValidity.java,v 1.1 2003/08/01 17:21:15 sylvain Exp $
   */
  public class MultiSourceValidity implements SourceValidity{
  
      private long expiry;
      private long delay;
      private List data = new ArrayList();
      private boolean isClosed = false;
      
      /** SourceResolver. Transient in order not to be serialized */
      private transient SourceResolver resolver;
      
      public MultiSourceValidity(SourceResolver resolver, long delay) {
          this.resolver = resolver;
          this.expiry = System.currentTimeMillis() + delay;
          this.delay = delay;
      }
      
      public void addSource(Source src) {
          if (this.data != null) {
              SourceValidity validity = src.getValidity();
              if (validity == null) {
                  // one of the sources has no validity : this object will always be invalid
                  this.data = null;
              } else {
                  // Add the validity and URI to the list
                  this.data.add(validity);
                  this.data.add(src.getURI());
              }
          }
      }
      
      public void close() {
          this.isClosed = true;
          this.resolver = null;
      }
      
      public int isValid() {
          if (System.currentTimeMillis() <= expiry) {
              return 1;
          }
          expiry = System.currentTimeMillis() + delay;
          
          if (data == null || !isClosed) {
              return -1;
          } else {
              return computeStatus(null);
          }
      }
  
      public int isValid(SourceValidity newValidity) {
          if (System.currentTimeMillis() <= expiry) {
              return 1;
          }
          expiry = System.currentTimeMillis() + delay;
  
          if (data == null || !isClosed) {
              return -1;
          }
          
          if (newValidity instanceof MultiSourceValidity) {
              return computeStatus(((MultiSourceValidity)newValidity).resolver);
          } else {
              // Don't know
              return -1;
          }
      }
      
      private int computeStatus(SourceResolver resolver) {
          for (int i = 0; i < data.size(); i+=2) {
              SourceValidity validity = (SourceValidity)data.get(i);
              switch(validity.isValid()) {
                  case -1:
                      // invalid : stop examining
                      return -1;
                  case 1:
                      // valid : just continue to next source
                      break;
                  case 0:
                      // don't know : check with the new source
                      if (resolver == null) {
                          // we have no resolver : definitely don't know (need to have one)
                          return 0;
                      }
                      try {
                          Source newSrc = resolver.resolveURI((String)data.get(i+1));
                          int value = validity.isValid(newSrc.getValidity());
                          resolver.release(newSrc);
                          if (value != 1) {
                              return -1;
                          }
                      } catch(IOException ioe) {
                          return -1;
                      }
              }
          }
          
          // All items checked successfully
          return 1;
      }
  }
  
  
  
  1.6       +7 -52     cocoon-2.1/src/scratchpad/src/org/apache/cocoon/generation/TraversableGenerator.java
  
  Index: TraversableGenerator.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/scratchpad/src/org/apache/cocoon/generation/TraversableGenerator.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- TraversableGenerator.java	10 Jul 2003 20:05:37 -0000	1.5
  +++ TraversableGenerator.java	1 Aug 2003 17:21:15 -0000	1.6
  @@ -55,6 +55,7 @@
   import org.apache.cocoon.ResourceNotFoundException;
   import org.apache.cocoon.caching.CacheableProcessingComponent;
   import org.apache.cocoon.components.source.SourceUtil;
  +import org.apache.cocoon.components.source.impl.MultiSourceValidity;
   import org.apache.cocoon.environment.SourceResolver;
   import org.apache.excalibur.source.SourceException;
   import org.apache.excalibur.source.SourceValidity;
  @@ -146,7 +147,7 @@
       protected static final String SIZE_ATTR_NAME = "size";
   
       /** The validity that is being built */
  -    protected CollectionValidity validity;
  +    protected MultiSourceValidity validity;
       /** Convenience object, so we don't need to create an AttributesImpl for every element. */
       protected AttributesImpl attributes;
   
  @@ -290,7 +291,7 @@
        */
       public SourceValidity getValidity() {
           if (this.validity == null) {
  -            this.validity = new CollectionValidity(this.refreshDelay);
  +            this.validity = new MultiSourceValidity(this.resolver, this.refreshDelay);
           }
           return this.validity;
       }
  @@ -317,6 +318,9 @@
               addAncestorPath(inputSource, ancestors);
   
               this.contentHandler.endDocument();
  +            if (this.validity != null) {
  +                this.validity.close();
  +            }
           } catch (SourceException se) {
               throw SourceUtil.handle(se);
           } catch (IOException ioe) {
  @@ -565,54 +569,5 @@
           this.excludeRE = null;
           this.validity = null;
           super.recycle();
  -    }
  -
  -    /** Specific validity class, that holds all resources that have been generated */
  -    public static class CollectionValidity implements SourceValidity {
  -
  -        private long expiry;
  -        private long delay;
  -        List sources = new ArrayList();
  -        List sourcesDates = new ArrayList();
  -
  -        public CollectionValidity(long delay) {
  -            expiry = System.currentTimeMillis() + delay;
  -            this.delay = delay;
  -        }
  -
  -        public int isValid() {
  -            if (System.currentTimeMillis() <= expiry) {
  -                return 1;
  -            }
  -
  -            expiry = System.currentTimeMillis() + delay;
  -            int len = sources.size();
  -            for (int i = 0; i < len; i++) {
  -                TraversableSource ts =  (TraversableSource) sources.get(i);
  -                if (!ts.exists()) {
  -                    return -1; // Source was removed
  -                }
  -
  -                long oldDate = ((Long) sourcesDates.get(i)).longValue();
  -                long newDate = ts.getLastModified();
  -
  -                if (oldDate != newDate) {
  -                    return -1;
  -                }
  -            }
  -
  -            // all content is up to date: update the expiry date
  -            expiry = System.currentTimeMillis() + delay;
  -            return 1;
  -        }
  -
  -        public int isValid(SourceValidity newValidity) {
  -            return isValid();
  -        }
  -
  -        public void addSource(TraversableSource f) {
  -            sources.add(f);
  -            sourcesDates.add(new Long(f.getLastModified()));
  -        }
       }
   }