Author: bodewig
Date: Tue Aug 25 03:48:01 2009
New Revision: 807466

URL: http://svn.apache.org/viewvc?rev=807466&view=rev
Log:
port roundup from core <zip>

Modified:
    
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Ar.java
    
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
    
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Cpio.java
    
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Tar.java
    
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Zip.java
    ant/sandbox/antlibs/compress/trunk/src/tests/antunit/conditions-test.xml
    ant/sandbox/antlibs/compress/trunk/src/tests/antunit/zip-test.xml

Modified: 
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Ar.java
URL: 
http://svn.apache.org/viewvc/ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Ar.java?rev=807466&r1=807465&r2=807466&view=diff
==============================================================================
--- 
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Ar.java
 (original)
+++ 
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Ar.java
 Tue Aug 25 03:48:01 2009
@@ -33,7 +33,8 @@
         + " directory entries";
 
     public Ar() {
-        super(new ArStreamFactory(),
+        super(new ArStreamFactory());
+        setBuilder(
               new ArchiveBase.EntryBuilder() {
                 public ArchiveEntry buildEntry(ArchiveBase.ResourceWithFlags 
r) {
                     boolean isDir = r.getResource().isDirectory();
@@ -69,7 +70,8 @@
                     return new ArArchiveEntry(r.getName(),
                                               r.getResource().getSize(),
                                               uid, gid, mode,
-                                              r.getResource().getLastModified()
+                                              round(r.getResource()
+                                                    .getLastModified(), 1000)
                                               / 1000);
                 }
             });

Modified: 
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
URL: 
http://svn.apache.org/viewvc/ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java?rev=807466&r1=807465&r2=807466&view=diff
==============================================================================
--- 
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
 (original)
+++ 
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
 Tue Aug 25 03:48:01 2009
@@ -66,7 +66,7 @@
  */
 public abstract class ArchiveBase extends Task {
     private final StreamFactory factory;
-    private final EntryBuilder builder;
+    private EntryBuilder builder;
 
     private Resource dest;
     private List/*<ResourceCollection>*/ sources = new ArrayList();
@@ -74,9 +74,13 @@
     private String encoding;
     private boolean filesOnly = true;
     private boolean preserve0permissions = false;
+    private boolean roundUp = true;
 
-    protected ArchiveBase(StreamFactory factory, EntryBuilder builder) {
+    protected ArchiveBase(StreamFactory factory) {
         this.factory = factory;
+    }
+
+    protected final void setBuilder(EntryBuilder builder) {
         this.builder = builder;
     }
 
@@ -135,6 +139,25 @@
         preserve0permissions = b;
     }
 
+    /**
+     * Whether the file modification times will be rounded up to the
+     * next timestamp (second or even second depending on the archive
+     * format).
+     *
+     * <p>Zip archives store file modification times with a
+     * granularity of two seconds, ar, tar and cpio use a granularity
+     * of one second.  Times will either be rounded up or down.  If
+     * you round down, the archive will always seem out-of-date when
+     * you rerun the task, so the default is to round up.  Rounding up
+     * may lead to a different type of problems like JSPs inside a web
+     * archive that seem to be slightly more recent than precompiled
+     * pages, rendering precompilation useless.</p>
+     * @param r a <code>boolean</code> value
+     */
+    public void setRoundUp(boolean r) {
+        roundUp = r;
+    }
+
     public void execute() {
         validate();
         if (!dest.isExists()) {
@@ -162,6 +185,10 @@
      * Argument validation.
      */
     protected void validate() throws BuildException {
+        if (builder == null) {
+            throw new BuildException("subclass didn't provide a builder"
+                                     + " instance");
+        }
         if (dest == null) {
             throw new BuildException("must provide a destination resource");
         }
@@ -450,6 +477,17 @@
     }
 
     /**
+     * Modify last modified timestamp based on the roundup attribute.
+     *
+     * @param millis the timestamp
+     * @param granularity the granularity of timestamps in the archive
+     * format in millis
+     */
+    protected long round(long millis, long granularity) {
+        return roundUp ? millis + granularity - 1 : millis;
+    }
+
+    /**
      * Valid Modes for create/update/replace.
      */
     public static final class Mode extends EnumeratedAttribute {

Modified: 
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Cpio.java
URL: 
http://svn.apache.org/viewvc/ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Cpio.java?rev=807466&r1=807465&r2=807466&view=diff
==============================================================================
--- 
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Cpio.java
 (original)
+++ 
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Cpio.java
 Tue Aug 25 03:48:01 2009
@@ -28,7 +28,8 @@
  */
 public class Cpio extends ArchiveBase {
     public Cpio() {
-        super(new CpioStreamFactory(),
+        super(new CpioStreamFactory());
+        setBuilder(
               new ArchiveBase.EntryBuilder() {
                 public ArchiveEntry buildEntry(ArchiveBase.ResourceWithFlags 
r) {
                     boolean isDir = r.getResource().isDirectory();
@@ -36,7 +37,8 @@
                         new CpioArchiveEntry(r.getName(),
                                              isDir
                                              ? 0 : r.getResource().getSize());
-                    ent.setTime(r.getResource().getLastModified() / 1000);
+                    ent.setTime(round(r.getResource().getLastModified(), 1000)
+                                / 1000);
 
                     int mode = isDir
                         ? ArchiveFileSet.DEFAULT_DIR_MODE

Modified: 
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Tar.java
URL: 
http://svn.apache.org/viewvc/ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Tar.java?rev=807466&r1=807465&r2=807466&view=diff
==============================================================================
--- 
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Tar.java
 (original)
+++ 
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Tar.java
 Tue Aug 25 03:48:01 2009
@@ -29,7 +29,8 @@
  */
 public class Tar extends ArchiveBase {
     public Tar() {
-        super(new TarStreamFactory(),
+        super(new TarStreamFactory());
+        setBuilder(
               new ArchiveBase.EntryBuilder() {
                 public ArchiveEntry buildEntry(ArchiveBase.ResourceWithFlags 
r) {
                     boolean isDir = r.getResource().isDirectory();
@@ -37,7 +38,8 @@
                         new TarArchiveEntry(r.getName(),
                                             isDir ? TarConstants.LF_DIR
                                             : TarConstants.LF_NORMAL);
-                    ent.setModTime(r.getResource().getLastModified());
+                    ent.setModTime(round(r.getResource().getLastModified(),
+                                         1000));
                     ent.setSize(isDir ? 0 : r.getResource().getSize());
 
                     if (!isDir && r.getCollectionFlags().hasModeBeenSet()) {

Modified: 
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Zip.java
URL: 
http://svn.apache.org/viewvc/ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Zip.java?rev=807466&r1=807465&r2=807466&view=diff
==============================================================================
--- 
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Zip.java
 (original)
+++ 
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/Zip.java
 Tue Aug 25 03:48:01 2009
@@ -28,12 +28,13 @@
  */
 public class Zip extends ArchiveBase {
     public Zip() {
-        super(new ZipStreamFactory(),
+        super(new ZipStreamFactory());
+        setBuilder(
               new ArchiveBase.EntryBuilder() {
                 public ArchiveEntry buildEntry(ArchiveBase.ResourceWithFlags 
r) {
                     boolean isDir = r.getResource().isDirectory();
                     ZipArchiveEntry ent = new ZipArchiveEntry(r.getName());
-                    ent.setTime(r.getResource().getLastModified());
+                    ent.setTime(round(r.getResource().getLastModified(), 
2000));
                     ent.setSize(isDir ? 0 : r.getResource().getSize());
 
                     if (!isDir && r.getCollectionFlags().hasModeBeenSet()) {

Modified: 
ant/sandbox/antlibs/compress/trunk/src/tests/antunit/conditions-test.xml
URL: 
http://svn.apache.org/viewvc/ant/sandbox/antlibs/compress/trunk/src/tests/antunit/conditions-test.xml?rev=807466&r1=807465&r2=807466&view=diff
==============================================================================
--- ant/sandbox/antlibs/compress/trunk/src/tests/antunit/conditions-test.xml 
(original)
+++ ant/sandbox/antlibs/compress/trunk/src/tests/antunit/conditions-test.xml 
Tue Aug 25 03:48:01 2009
@@ -270,7 +270,7 @@
 
   <target name="testCoreZipIsLastModified" depends="setUp">
     <au:assertTrue>
-      <cond:islastmodified datetime="2009-08-19-05:49:20"
+      <cond:islastmodified datetime="2009-08-19-05:49:22"
                            pattern="yyyy-MM-dd-HH:mm:ss">
         <zipentry name="asf-logo.gif">
           <file file="${input}/test.zip"/>
@@ -291,7 +291,7 @@
 
   <target name="testAntlibZipIsLastModified" depends="setUp">
     <au:assertTrue>
-      <cond:islastmodified datetime="2009-08-19-05:49:20"
+      <cond:islastmodified datetime="2009-08-19-05:49:22"
                            pattern="yyyy-MM-dd-HH:mm:ss">
         <cmp:zipentry name="asf-logo.gif">
           <file file="${input}/test.zip"/>

Modified: ant/sandbox/antlibs/compress/trunk/src/tests/antunit/zip-test.xml
URL: 
http://svn.apache.org/viewvc/ant/sandbox/antlibs/compress/trunk/src/tests/antunit/zip-test.xml?rev=807466&r1=807465&r2=807466&view=diff
==============================================================================
--- ant/sandbox/antlibs/compress/trunk/src/tests/antunit/zip-test.xml (original)
+++ ant/sandbox/antlibs/compress/trunk/src/tests/antunit/zip-test.xml Tue Aug 
25 03:48:01 2009
@@ -60,7 +60,7 @@
     <cmp:zip destfile="${dest}">
       <fileset dir="${input}" includes="asf-logo.gif"/>
     </cmp:zip>
-    <checkProperties dateTime="2009-08-19-05:49:20 +0200"/>
+    <checkProperties dateTime="2009-08-19-05:49:22 +0200"/>
   </target>
 
   <target name="testCoreZipFileSet" depends="setUp">
@@ -106,7 +106,7 @@
       <cmp:arfileset src="../resources/asf-logo.gif.ar"
                      includes="asf-logo.gif"/>
     </cmp:zip>
-    <checkProperties dateTime="2009-07-31-20:11:12 +0200" mode="644"
+    <checkProperties dateTime="2009-07-31-20:11:14 +0200" mode="644"
                      />
   </target>
 
@@ -115,7 +115,7 @@
       <cmp:cpiofileset src="../resources/asf-logo.gif.cpio"
                        includes="asf-logo.gif"/>
     </cmp:zip>
-    <checkProperties dateTime="2009-07-31-20:11:12 +0200" mode="644"
+    <checkProperties dateTime="2009-07-31-20:11:14 +0200" mode="644"
                      />
   </target>
 
@@ -201,7 +201,7 @@
                      filemode="600"
                      includes="asf-logo.gif"/>
     </cmp:zip>
-    <checkProperties dateTime="2009-07-31-20:11:12 +0200" mode="600"/>
+    <checkProperties dateTime="2009-07-31-20:11:14 +0200" mode="600"/>
   </target>
 
   <target name="testFullpath" depends="setUp">
@@ -298,7 +298,7 @@
       <cmp:arfileset src="${src}"
                      includes="asf-logo.gif"/>
     </cmp:zip>
-    <checkProperties dateTime="2009-07-31-20:11:12 +0200" mode="644"/>
+    <checkProperties dateTime="2009-07-31-20:11:14 +0200" mode="644"/>
   </target>
 
   <target name="testPreserve0Permissions"
@@ -307,6 +307,16 @@
       <cmp:arfileset src="${src}"
                      includes="asf-logo.gif"/>
     </cmp:zip>
-    <checkProperties dateTime="2009-07-31-20:11:12 +0200" mode="0"/>
+    <checkProperties dateTime="2009-07-31-20:11:14 +0200" mode="0"/>
+  </target>
+
+  <target name="testRoundDown" depends="setUp">
+    <cmp:zip destfile="${dest}" roundup="false">
+      <cmp:arfileset src="../resources/asf-logo.gif.ar"
+                     includes="asf-logo.gif"/>
+    </cmp:zip>
+    <checkProperties dateTime="2009-07-31-20:11:12 +0200" mode="644"
+                     />
   </target>
+
 </project>


Reply via email to