View Javadoc

1   /*
2    * Copyright (C) 2000 - 2008 Grid Systems, S.A.
3    *
4    * This program is free software; you can redistribute it and/or modify
5    * it under the terms of the GNU General Public License, version 2, as
6    * published by the Free Software Foundation.
7    *
8    * This program is distributed in the hope that it will be useful,
9    * but WITHOUT ANY WARRANTY; without even the implied warranty of
10   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11   * GNU General Public License for more details.
12   *
13   * You should have received a copy of the GNU General Public License
14   * along with this program; if not, write to the Free Software
15   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16   */
17  package com.gridsystems.maven.furabuild;
18  
19  import java.io.File;
20  import java.util.Collection;
21  
22  /**
23   * <p>Checks the given resource tree (File), checks that it is valid, and
24   * removes it if it is not.</p>
25   *
26   * <p>The resource tree is considered valid if it is older than a given
27   * source file set.</p>
28   *
29   * @author Rodrigo Ruiz
30   */
31  public class ResourceValidator {
32  
33    /**
34     * Checks that a resource is older than a set of sources.
35     *
36     * @param resources File to check
37     * @param sources   Collection of files to compare with
38     * @param purge     Whether to remove invalid resources or not
39     * @return <tt>true</tt> if the resource is still valid; <tt>false</tt> otherwise
40     */
41    public boolean isValid(Collection<File> resources, Collection<File> sources,
42      boolean purge) {
43      if (resources == null) {
44        return true;
45      } else if (purge) {
46        // If purge is active, all resources must be iterated
47        boolean valid = true;
48        for (File f : resources) {
49          boolean result = isValid(f, sources, purge);
50          valid &= result;
51        }
52        return valid;
53      } else {
54        // If purge is not active, it is enough to stop on first "false"
55        for (File f : resources) {
56          if (!isValid(f, sources, purge)) {
57            return false;
58          }
59        }
60        return true;
61      }
62    }
63  
64    /**
65     * Checks that a resource is older than a set of sources.
66     *
67     * @param resource File to check
68     * @param sources  Collection of files to compare with
69     * @param purge    Whether to remove invalid resources or not
70     * @return <tt>true</tt> if the resource is still valid; <tt>false</tt> otherwise
71     */
72    public boolean isValid(File resource, Collection<File> sources, boolean purge) {
73      if (resource == null) {
74        return true;
75      } else if (!resource.exists()) {
76        return false;
77      } else {
78        long time = getLastModified(resource);
79        if (sources != null) {
80          for (File src : sources) {
81            long tsrc = getLastModified(src);
82            if (tsrc > time) {
83              if (purge) {
84                purge(resource);
85              }
86              return false;
87            }
88          }
89        }
90  
91        return true;
92      }
93    }
94  
95    /**
96     * Gets the last modified timestamp of a file. If a directory is specified,
97     * it recursively iterates over the directory contents and returns the
98     * earliest timestamp found.
99     *
100    * @param f The file or directory to process
101    * @return The earliest "last-modified" timestamp in <tt>f</tt>
102    */
103   protected long getLastModified(File f) {
104     assert f != null;
105 
106     long t = f.lastModified();
107     if (f.isDirectory()) {
108       File[] files = f.listFiles();
109       if (files != null) {
110         for (File ff : files) {
111           t = Math.max(t, getLastModified(ff));
112         }
113       }
114     }
115     return t;
116   }
117 
118   /**
119    * Recursively deletes a resource.
120    *
121    * @param resource The resource (file) to delete
122    */
123   private void purge(File resource) {
124     if (resource.isDirectory()) {
125       File[] files = resource.listFiles();
126       if (files != null) {
127         for (File f : files) {
128           if (f.isFile()) {
129             f.delete();
130           } else {
131             purge(f);
132           }
133         }
134       }
135     }
136     resource.delete();
137   }
138 }