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

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

joerg       2003/06/21 06:34:04

  Modified:    src/java/org/apache/cocoon/generation
                        DirectoryGenerator.java
  Log:
  fixed cache key generation (missing rootRE + dateFormatter),
  fixed the root pattern handling (if not matching directory found leave out the ancestors),
  fixed empty src attribute handling,
  fixed logging (rePattern in setup(),
  javadoc updates
  
  Revision  Changes    Path
  1.4       +249 -276  cocoon-2.1/src/java/org/apache/cocoon/generation/DirectoryGenerator.java
  
  Index: DirectoryGenerator.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/generation/DirectoryGenerator.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DirectoryGenerator.java	13 May 2003 22:14:51 -0000	1.3
  +++ DirectoryGenerator.java	21 Jun 2003 13:34:03 -0000	1.4
  @@ -125,66 +125,79 @@
    *         (SMB GmbH) for Virbus AG
    * @version CVS $Id$
    */
  -public class DirectoryGenerator extends ComposerGenerator implements CacheableProcessingComponent  {
  -  private static final String FILE = "file:";
  +public class DirectoryGenerator extends ComposerGenerator implements CacheableProcessingComponent {
  +
  +    /** Constant for the file protocol. */
  +    private static final String FILE = "file:";
   
       /** The URI of the namespace of this generator. */
  -    protected static final String URI =
  -    "http://apache.org/cocoon/directory/2.0";
  +    protected static final String URI = "http://apache.org/cocoon/directory/2.0";
   
       /** The namespace prefix for this namespace. */
       protected static final String PREFIX = "dir";
   
       /* Node and attribute names */
  -    protected static final String DIR_NODE_NAME         = "directory";
  -    protected static final String FILE_NODE_NAME        = "file";
  +    protected static final String DIR_NODE_NAME = "directory";
  +    protected static final String FILE_NODE_NAME = "file";
   
  -    protected static final String FILENAME_ATTR_NAME    = "name";
  -    protected static final String LASTMOD_ATTR_NAME     = "lastModified";
  -    protected static final String DATE_ATTR_NAME        = "date";
  -    protected static final String SIZE_ATTR_NAME        = "size";
  +    protected static final String FILENAME_ATTR_NAME = "name";
  +    protected static final String LASTMOD_ATTR_NAME = "lastModified";
  +    protected static final String DATE_ATTR_NAME = "date";
  +    protected static final String SIZE_ATTR_NAME = "size";
   
  -    /*
  -     * Variables set per-request
  -     *
  +    /** The validity that is being built */
  +    protected DirValidity validity;
  +    /** Convenience object, so we don't need to create an AttributesImpl for every element. */
  +    protected AttributesImpl attributes;
  +
  +    /** The depth parameter determines how deep the DirectoryGenerator should delve. */
  +    protected int depth;
  +    /**
  +     * The dateFormatter determines into which date format the lastModified
  +     * time should be converted.
        * FIXME: SimpleDateFormat is not supported by all locales!
        */
  -    protected int depth;
  -    protected AttributesImpl attributes = new AttributesImpl();
       protected SimpleDateFormat dateFormatter;
  +    /** The delay between checks on updates to the filesystem. */
  +    protected long refreshDelay;
  +    /**
  +     * The sort parameter determines by which attribute the content of one
  +     * directory should be sorted. Possible values are "name", "size", "time"
  +     * and "directory", where "directory" is the same as "name", except that
  +     * directory entries are listed first.
  +     */
       protected String sort;
  +    /** The reverse parameter reverses the sort order. <code>false</code> is default. */
       protected boolean reverse;
  -
  +    /** The regular expression for the root pattern. */
       protected RE rootRE;
  +    /** The regular expression for the include pattern. */
       protected RE includeRE;
  +    /** The regular expression for the exclude pattern. */
       protected RE excludeRE;
  -
  +    /**
  +     * This is only set to true for the requested directory specified by the
  +     * <code>src</code> attribute on the generator's configuration.
  +     */
       protected boolean isRequestedDirectory;
  -    
  -    /** The validity that is being built */
  -    protected DirValidity validity;
  -    
  -    /** The delay between checks to the filesystem */
  -    protected long refreshDelay;
  -
   
       /**
  -     * Set the request parameters. Must be called before the generate
  -     * method.
  +     * Set the request parameters. Must be called before the generate method.
        *
  -     * @param   resolver
  -     *      the SourceResolver object
  -     * @param   objectModel
  -     *      a <code>Map</code> containing model object
  -     * @param   src
  -     *      the URI for this request (?)
  -     * @param   par
  -     *      configuration parameters
  +     * @param resolver     the SourceResolver object
  +     * @param objectModel  a <code>Map</code> containing model object
  +     * @param src          the directory to be XMLized specified as src attribute on &lt;map:generate/>
  +     * @param par          configuration parameters
        */
       public void setup(SourceResolver resolver, Map objectModel, String src, Parameters par)
  -        throws ProcessingException, SAXException, IOException {
  +            throws ProcessingException, SAXException, IOException {
  +        if (src == null) {
  +            throw new ProcessingException("No src attribute pointing to a directory to be XMLized specified.");
  +        }
           super.setup(resolver, objectModel, src, par);
   
  +        this.depth = par.getParameterAsInteger("depth", 1);
  +
           String dateFormatString = par.getParameter("dateFormat", null);
           if (dateFormatString != null) {
               this.dateFormatter = new SimpleDateFormat(dateFormatString);
  @@ -192,67 +205,70 @@
               this.dateFormatter = new SimpleDateFormat();
           }
   
  -        this.depth = par.getParameterAsInteger("depth", 1);
  -
           this.sort = par.getParameter("sort", "name");
   
           this.reverse = par.getParameterAsBoolean("reverse", false);
   
  -        String rePattern = par.getParameter("root", null);
  -        
           this.refreshDelay = par.getParameterAsLong("refreshDelay", 1L) * 1000L;
  -        
  +
           if (this.getLogger().isDebugEnabled()) {
               this.getLogger().debug("depth: " + this.depth);
  +            this.getLogger().debug("dateFormat: " + this.dateFormatter.toPattern());
               this.getLogger().debug("sort: " + this.sort);
               this.getLogger().debug("reverse: " + this.reverse);
               this.getLogger().debug("refreshDelay: " + this.refreshDelay);
           }
  +
  +        String rePattern = null;
           try {
  -            this.rootRE = (rePattern == null)?null:new RE(rePattern);
  +            rePattern = par.getParameter("root", null);
  +            this.rootRE = (rePattern == null) ? null : new RE(rePattern);
  +            if (this.getLogger().isDebugEnabled()) {
  +                this.getLogger().debug("root pattern: " + rePattern);
  +            }
   
               rePattern = par.getParameter("include", null);
  -            this.includeRE = (rePattern == null)?null:new RE(rePattern);
  +            this.includeRE = (rePattern == null) ? null : new RE(rePattern);
  +            if (this.getLogger().isDebugEnabled()) {
  +                this.getLogger().debug("include pattern: " + rePattern);
  +            }
   
               rePattern = par.getParameter("exclude", null);
  -            this.excludeRE = (rePattern == null)?null:new RE(rePattern);
  +            this.excludeRE = (rePattern == null) ? null : new RE(rePattern);
   
               if (this.getLogger().isDebugEnabled()) {
  -                this.getLogger().debug("root pattern: " + rePattern);
  -                this.getLogger().debug("include pattern: " + rePattern);
                   this.getLogger().debug("exclude pattern: " + rePattern);
               }
           } catch (RESyntaxException rese) {
               throw new ProcessingException("Syntax error in regexp pattern '"
  -                + rePattern + "'", rese);
  +                                          + rePattern + "'", rese);
           }
   
           this.isRequestedDirectory = false;
  -
  -        /* Create a reusable attributes for creating nodes */
           this.attributes = new AttributesImpl();
       }
   
  -	/* (non-Javadoc)
  -	 * @see org.apache.cocoon.caching.CacheableProcessingComponent#getKey()
  -	 */
  -	public Serializable getKey()
  -	{
  -		return super.source + this.sort + this.depth + this.excludeRE + this.includeRE + this.reverse;
  -	}
  -
  -
  -	/**
  -	 * Gets the source validity, using a deferred validity object. The validity is initially empty since
  -	 * the files that define it are not known before generation has occured. So the returned object is
  -	 * kept by the generator and filled with each of the files that are traversed.
  -	 * @see DirectoryGenerator.DirValidity
  -	 */
  -	public SourceValidity getValidity()
  -	{
  -		this.validity = new DirValidity(this.refreshDelay);
  -		return this.validity;
  -	}
  +    /* (non-Javadoc)
  +     * @see org.apache.cocoon.caching.CacheableProcessingComponent#getKey()
  +     * FIXME: SimpleDateFormat and RE don't have a toString() implemented, so
  +     *        the key generation is buggy!!
  +     */
  +    public Serializable getKey() {
  +        return super.source + this.depth + this.dateFormatter + this.sort
  +               + this.reverse + this.rootRE + this.excludeRE + this.includeRE;
  +    }
  +
  +    /**
  +     * Gets the source validity, using a deferred validity object. The validity
  +     * is initially empty since the files that define it are not known before
  +     * generation has occured. So the returned object is kept by the generator
  +     * and filled with each of the files that are traversed.
  +     * @see DirectoryGenerator.DirValidity
  +     */
  +    public SourceValidity getValidity() {
  +        this.validity = new DirValidity(this.refreshDelay);
  +        return this.validity;
  +    }
   
       /**
        * Generate XML data.
  @@ -260,18 +276,16 @@
        * @throws  SAXException
        *      if an error occurs while outputting the document
        * @throws  ProcessingException
  -     *      if the requsted URI isn't a directory on the local
  -     *      filesystem
  +     *      if the requsted URI isn't a directory on the local filesystem
        */
  -    public void generate()
  -    throws SAXException, ProcessingException {
  +    public void generate() throws SAXException, ProcessingException {
           String directory = super.source;
           Source inputSource = null;
           try {
               inputSource = this.resolver.resolveURI(directory);
               String systemId = inputSource.getURI();
               if (!systemId.startsWith(FILE)) {
  -              throw new ResourceNotFoundException(systemId + " does not denote a directory");
  +                throw new ResourceNotFoundException(systemId + " does not denote a directory");
               }
               // This relies on systemId being of the form "file://..."
               File directoryFile = new File(new URL(systemId).getFile());
  @@ -280,28 +294,23 @@
               }
   
               this.contentHandler.startDocument();
  -            this.contentHandler.startPrefixMapping(PREFIX,URI);
   
               Stack ancestors = getAncestors(directoryFile);
  -            addPathWithAncestors(directoryFile, ancestors);
  +            addAncestorPath(directoryFile, ancestors);
   
  -            this.contentHandler.endPrefixMapping(PREFIX);
               this.contentHandler.endDocument();
           } catch (SourceException se) {
               throw SourceUtil.handle(se);
           } catch (IOException ioe) {
  -            throw new ResourceNotFoundException("Could not read directory "
  -                + directory, ioe);
  +            throw new ResourceNotFoundException("Could not read directory " + directory, ioe);
           } finally {
  -            this.resolver.release( inputSource );
  +            this.resolver.release(inputSource);
           }
       }
   
       /**
  -     * Creates a stack containing the ancestors of File up to specified
  -     * directory.
  +     * Creates a stack containing the ancestors of File up to specified directory.
        * @param path the File whose ancestors shall be retrieved
  -     *
        * @return a Stack containing the ancestors.
        */
       protected Stack getAncestors(File path) {
  @@ -312,109 +321,105 @@
               parent = parent.getParentFile();
               if (parent != null) {
                   ancestors.push(parent);
  +            } else {
  +                // no ancestor matched the root pattern
  +                ancestors.clear();
               }
           }
   
           return ancestors;
       }
   
  -
  -    protected void addPathWithAncestors(File path, Stack ancestors)
  -            throws SAXException {
  -
  +    /**
  +     * Adds recursively the path from the directory matched by the root pattern
  +     * down to the requested directory.
  +     * @param path       the requested directory.
  +     * @param ancestors  the stack of the ancestors.
  +     * @throws SAXException
  +     */
  +    protected void addAncestorPath(File path, Stack ancestors) throws SAXException {
           if (ancestors.empty()) {
               this.isRequestedDirectory = true;
               addPath(path, depth);
           } else {
               startNode(DIR_NODE_NAME, (File)ancestors.pop());
  -            addPathWithAncestors(path, ancestors);
  +            addAncestorPath(path, ancestors);
               endNode(DIR_NODE_NAME);
           }
       }
   
  -
       /**
        * Adds a single node to the generated document. If the path is a
        * directory, and depth is greater than zero, then recursive calls
        * are made to add nodes for the directory's children.
        *
  -     * @param   path
  -     *      the file/directory to process
  -     * @param   depth
  -     *      how deep to scan the directory
  +     * @param path   the file/directory to process
  +     * @param depth  how deep to scan the directory
        *
  -     * @throws  SAXException
  -     *      if an error occurs while constructing nodes
  +     * @throws SAXException  if an error occurs while constructing nodes
        */
  -    protected void addPath(File path, int depth)
  -    throws SAXException {
  +    protected void addPath(File path, int depth) throws SAXException {
           if (path.isDirectory()) {
               startNode(DIR_NODE_NAME, path);
  -            if (depth>0) {
  +            if (depth > 0) {
                   File contents[] = path.listFiles();
   
  -                if(sort.equals("name")) {
  -                    Arrays.sort(contents,
  -                        new Comparator() {
  -                            public int compare(Object o1, Object o2) {
  -                                if(reverse) {
  -                                    return ((File) o2).getName()
  -                                        .compareTo(((File) o1).getName());
  -                                }
  -                                return ((File) o1).getName()
  -                                    .compareTo(((File) o2).getName());
  +                if (sort.equals("name")) {
  +                    Arrays.sort(contents, new Comparator() {
  +                        public int compare(Object o1, Object o2) {
  +                            if (reverse) {
  +                                return ((File)o2).getName().compareTo(((File)o1).getName());
                               }
  -                        });
  -                } else if(sort.equals("size")) {
  -                    Arrays.sort(contents,
  -                        new Comparator() {
  -                            public int compare(Object o1, Object o2) {
  -                                if(reverse) {
  -                                    return new Long(((File) o2).length())
  -                                        .compareTo(new Long(((File) o1).length()));
  -                                }
  -                                return new Long(((File) o1).length())
  -                                    .compareTo(new Long(((File) o2).length()));
  +                            return ((File)o1).getName().compareTo(((File)o2).getName());
  +                        }
  +                    });
  +                } else if (sort.equals("size")) {
  +                    Arrays.sort(contents, new Comparator() {
  +                        public int compare(Object o1, Object o2) {
  +                            if (reverse) {
  +                                return new Long(((File)o2).length()).compareTo(
  +                                    new Long(((File)o1).length()));
                               }
  -                        });
  -                } else if(sort.equals("lastmodified")) {
  -                    Arrays.sort(contents,
  -                        new Comparator() {
  -                            public int compare(Object o1, Object o2) {
  -                                if(reverse) {
  -                                    return new Long(((File) o2).lastModified())
  -                                        .compareTo(new Long(((File) o1).lastModified()));
  -                                }
  -                                return new Long(((File) o1).lastModified())
  -                                    .compareTo(new Long(((File) o2).lastModified()));
  +                            return new Long(((File)o1).length()).compareTo(
  +                                new Long(((File)o2).length()));
  +                        }
  +                    });
  +                } else if (sort.equals("lastmodified")) {
  +                    Arrays.sort(contents, new Comparator() {
  +                        public int compare(Object o1, Object o2) {
  +                            if (reverse) {
  +                                return new Long(((File)o2).lastModified()).compareTo(
  +                                    new Long(((File)o1).lastModified()));
                               }
  -                        });
  -                } else if(sort.equals("directory")) {
  -                    Arrays.sort(contents,
  -                        new Comparator() {
  -                            public int compare(Object o1, Object o2) {
  -                                File f1 = (File) o1;
  -                                File f2 = (File) o2;
  -
  -                                if(reverse) {
  -                                    if(f2.isDirectory() && f1.isFile())
  -                                        return -1;
  -                                    if(f2.isFile() && f1.isDirectory())
  -                                        return 1;
  -                                    return f2.getName().compareTo(f1.getName());
  -                                }
  -                                if(f2.isDirectory() && f1.isFile())
  -                                    return 1;
  -                                if(f2.isFile() && f1.isDirectory())
  +                            return new Long(((File)o1).lastModified()).compareTo(
  +                                new Long(((File)o2).lastModified()));
  +                        }
  +                    });
  +                } else if (sort.equals("directory")) {
  +                    Arrays.sort(contents, new Comparator() {
  +                        public int compare(Object o1, Object o2) {
  +                            File f1 = (File)o1;
  +                            File f2 = (File)o2;
  +
  +                            if (reverse) {
  +                                if (f2.isDirectory() && f1.isFile())
                                       return -1;
  -                                return f1.getName().compareTo(f2.getName());
  +                                if (f2.isFile() && f1.isDirectory())
  +                                    return 1;
  +                                return f2.getName().compareTo(f1.getName());
                               }
  -                        });
  +                            if (f2.isDirectory() && f1.isFile())
  +                                return 1;
  +                            if (f2.isFile() && f1.isDirectory())
  +                                return -1;
  +                            return f1.getName().compareTo(f2.getName());
  +                        }
  +                    });
                   }
   
  -                for (int i=0; i<contents.length; i++) {
  +                for (int i = 0; i < contents.length; i++) {
                       if (isIncluded(contents[i]) && !isExcluded(contents[i])) {
  -                        addPath(contents[i], depth-1);
  +                        addPath(contents[i], depth - 1);
                       }
                   }
               }
  @@ -427,189 +432,157 @@
           }
       }
   
  -
       /**
  -     * Begins a named node, and calls setNodeAttributes to set its
  -     * attributes.
  -     *
  -     * @param   nodeName
  -     *      the name of the new node
  -     * @param   path
  -     *      the file/directory to use when setting attributes
  +     * Begins a named node and calls setNodeAttributes to set its attributes.
        *
  -     * @throws  SAXException
  -     *      if an error occurs while creating the node
  -     */
  -    protected void startNode(String nodeName, File path)
  -    throws SAXException {
  -		if (this.validity != null) {
  -			this.validity.addFile(path);
  -		}
  -
  +     * @param nodeName  the name of the new node
  +     * @param path      the file/directory to use when setting attributes
  +     * 
  +     * @throws SAXException  if an error occurs while creating the node
  +     */
  +    protected void startNode(String nodeName, File path) throws SAXException {
  +        if (this.validity != null) {
  +            this.validity.addFile(path);
  +        }
           setNodeAttributes(path);
  -        super.contentHandler.startElement(URI, nodeName, PREFIX+':'+nodeName, attributes);
  +        super.contentHandler.startElement(URI, nodeName, PREFIX + ':' + nodeName, attributes);
       }
   
  -
       /**
        * Sets the attributes for a given path. The default method sets attributes
        * for the name of thefile/directory and for the last modification time
        * of the path.
        *
  -     * @param path
  -     *        the file/directory to use when setting attributes
  +     * @param path  the file/directory to use when setting attributes
        *
  -     * @throws SAXException
  -     *         if an error occurs while setting the attributes
  +     * @throws SAXException  if an error occurs while setting the attributes
        */
       protected void setNodeAttributes(File path) throws SAXException {
           long lastModified = path.lastModified();
           attributes.clear();
  -        attributes.addAttribute("", FILENAME_ATTR_NAME,
  -                    FILENAME_ATTR_NAME, "CDATA",
  -                    path.getName());
  -        attributes.addAttribute("", LASTMOD_ATTR_NAME,
  -                    LASTMOD_ATTR_NAME, "CDATA",
  -                    Long.toString(path.lastModified()));
  -        attributes.addAttribute("", DATE_ATTR_NAME,
  -                    DATE_ATTR_NAME, "CDATA",
  -                    dateFormatter.format(new Date(lastModified)));
  -        attributes.addAttribute("", SIZE_ATTR_NAME,
  -                    SIZE_ATTR_NAME, "CDATA",
  -                    Long.toString(path.length()));
  -
  +        attributes.addAttribute("", FILENAME_ATTR_NAME, FILENAME_ATTR_NAME,
  +                                "CDATA", path.getName());
  +        attributes.addAttribute("", LASTMOD_ATTR_NAME, LASTMOD_ATTR_NAME,
  +                                "CDATA", Long.toString(path.lastModified()));
  +        attributes.addAttribute("", DATE_ATTR_NAME, DATE_ATTR_NAME,
  +                                "CDATA", dateFormatter.format(new Date(lastModified)));
  +        attributes.addAttribute("", SIZE_ATTR_NAME, SIZE_ATTR_NAME,
  +                                "CDATA", Long.toString(path.length()));
           if (this.isRequestedDirectory) {
               attributes.addAttribute("", "sort", "sort", "CDATA", this.sort);
               attributes.addAttribute("", "reverse", "reverse", "CDATA",
  -                String.valueOf(this.reverse));
  -            attributes.addAttribute("", "requested", "requested", "CDATA",
  -                "true");
  +                                    String.valueOf(this.reverse));
  +            attributes.addAttribute("", "requested", "requested", "CDATA", "true");
               this.isRequestedDirectory = false;
           }
       }
   
  -
       /**
        * Ends the named node.
        *
  -     * @param   nodeName
  -     *      the name of the new node
  +     * @param nodeName  the name of the new node
        *
  -     * @throws  SAXException
  -     *      if an error occurs while closing the node
  +     * @throws SAXException  if an error occurs while closing the node
        */
  -    protected void endNode(String nodeName)
  -    throws SAXException {
  -        super.contentHandler.endElement(URI, nodeName, PREFIX+':'+nodeName);
  +    protected void endNode(String nodeName) throws SAXException {
  +        super.contentHandler.endElement(URI, nodeName, PREFIX + ':' + nodeName);
       }
   
  -
       /**
        * Determines if a given File is the defined root.
        *
  -     * @param path the File to check
  +     * @param path  the File to check
        *
        * @return true if the File is the root or the root pattern is not set,
  -     *      false otherwise.
  +     *         false otherwise.
        */
       protected boolean isRoot(File path) {
  -
  -        return (this.rootRE == null)
  -                ? true
  -                : this.rootRE.match(path.getName());
  +        return (this.rootRE == null) ? true : this.rootRE.match(path.getName());
       }
   
  -
       /**
        * Determines if a given File shall be visible.
        *
  -     * @param path the File to check
  +     * @param path  the File to check
        *
  -     * @return true if the File shall be visible or the include Pattern is
  -            <code>null</code>, false otherwise.
  +     * @return true if the File shall be visible or the include Pattern is <code>null</code>,
  +     *         false otherwise.
        */
       protected boolean isIncluded(File path) {
  -
  -        return (this.includeRE == null)
  -                ? true
  -                : this.includeRE.match(path.getName());
  +        return (this.includeRE == null) ? true : this.includeRE.match(path.getName());
       }
   
  -
       /**
        * Determines if a given File shall be excluded from viewing.
        *
  -     * @param path the File to check
  +     * @param path  the File to check
        *
  -     * @return false if the given File shall not be excluded or the
  -     * exclude Pattern is <code>null</code>, true otherwise.
  +     * @return false if the given File shall not be excluded or the exclude Pattern is <code>null</code>,
  +     *         true otherwise.
        */
       protected boolean isExcluded(File path) {
  -
  -        return (this.excludeRE == null)
  -                ? false
  -                : this.excludeRE.match(path.getName());
  +        return (this.excludeRE == null) ? false : this.excludeRE.match(path.getName());
       }
   
       /**
        * Recycle resources
  -     *
        */
  -
       public void recycle() {
  -       super.recycle();
  -       this.attributes = null;
  -         this.dateFormatter = null;
  -       this.rootRE = null;
  -       this.includeRE = null;
  -       this.excludeRE = null;
  -       this.validity = null;
  -
  +        super.recycle();
  +        this.attributes = null;
  +        this.dateFormatter = null;
  +        this.rootRE = null;
  +        this.includeRE = null;
  +        this.excludeRE = null;
  +        this.validity = null;
       }
   
       /** Specific validity class, that holds all files that have been generated */
  -	public static class DirValidity implements SourceValidity {
  -		private long expiry;
  -		private long delay;
  -		List files = new ArrayList();
  -		List fileDates = new ArrayList();
  -
  -		public DirValidity(long delay) {
  -			expiry = System.currentTimeMillis() + delay;
  -			this.delay = delay;
  -		}
  -
  -		public int isValid() {
  -			if (System.currentTimeMillis() <= expiry)
  -				return 1;
  -
  -			//            System.out.println("Regenerating cache validity");
  -			expiry = System.currentTimeMillis() + delay;
  -			int len = files.size();
  -			for (int i = 0; i < len; i++) {
  -				File f = (File) files.get(i);
  -				if (!f.exists())
  -					return -1; // File was removed
  -
  -				long oldDate = ((Long) fileDates.get(i)).longValue();
  -				long newDate = f.lastModified();
  -
  -				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 addFile(File f) {
  -			files.add(f);
  -			fileDates.add(new Long(f.lastModified()));
  -		}
  -	}
  +    public static class DirValidity implements SourceValidity {
  +
  +        private long expiry;
  +        private long delay;
  +        List files = new ArrayList();
  +        List fileDates = new ArrayList();
  +
  +        public DirValidity(long delay) {
  +            expiry = System.currentTimeMillis() + delay;
  +            this.delay = delay;
  +        }
  +
  +        public int isValid() {
  +            if (System.currentTimeMillis() <= expiry) {
  +                return 1;
  +            }
  +
  +            expiry = System.currentTimeMillis() + delay;
  +            int len = files.size();
  +            for (int i = 0; i < len; i++) {
  +                File f = (File)files.get(i);
  +                if (!f.exists()) {
  +                    return -1; // File was removed
  +                }
  +
  +                long oldDate = ((Long)fileDates.get(i)).longValue();
  +                long newDate = f.lastModified();
  +
  +                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 addFile(File f) {
  +            files.add(f);
  +            fileDates.add(new Long(f.lastModified()));
  +        }
  +    }
   }
  
  
  

Re: cvs commit: cocoon-2.1/src/java/org/apache/cocoon/generation DirectoryGenerator.java

Posted by Joerg Heinicke <jo...@gmx.de>.
Hello Sylvain,

you implemented the caching for the DirectoryGenerator in Cocoon 2.1. 
For the key generation you simply concatenated the string 
representations of all parameters. But SimpleDateFormat and RE don't 
have implemented the toString() method and so strings like 
"org.apache.regexp.RE@15d925b" are returned. But you will get a new key 
for almost every request, so it's not the way to go I guess.

For the DirectoryGenerator in Cocoon 2.0 I have taken to original passed 
parameters (not the objects created from them) to generate the key. Can 
you (or somebody else) have on it there and tell me, if this is the best 
approach or if it is possible to improve it?

Joerg

joerg@apache.org wrote:
> joerg       2003/06/21 06:34:04
> 
>   Modified:    src/java/org/apache/cocoon/generation
>                         DirectoryGenerator.java

...

>   +    /* (non-Javadoc)
>   +     * @see org.apache.cocoon.caching.CacheableProcessingComponent#getKey()
>   +     * FIXME: SimpleDateFormat and RE don't have a toString() implemented, so
>   +     *        the key generation is buggy!!
>   +     */
>   +    public Serializable getKey() {
>   +        return super.source + this.depth + this.dateFormatter + this.sort
>   +               + this.reverse + this.rootRE + this.excludeRE + this.includeRE;
>   +    }