You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by ar...@locus.apache.org on 2000/05/20 12:58:18 UTC

cvs commit: jakarta-ant/src/main/org/apache/tools/ant/taskdefs Jar.java Zip.java

arnout      00/05/20 03:58:17

  Modified:    docs     index.html
               src/main/org/apache/tools/ant/taskdefs Jar.java Zip.java
  Log:
  Added a "compress" attribute to the Zip and Jar task.
  
  Submitted by:	Stefan Bodewig (bodewig@bost.de)
  
  Revision  Changes    Path
  1.18      +10 -0     jakarta-ant/docs/index.html
  
  Index: index.html
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/docs/index.html,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- index.html	2000/03/29 17:13:31	1.17
  +++ index.html	2000/05/20 10:58:15	1.18
  @@ -1129,6 +1129,11 @@
       <td valign="top" align="center">Yes</td>
     </tr>
     <tr>
  +    <td valign="top">compress</td>
  +    <td valign="top">Not only store data but also compress them, defaults to true</td>
  +    <td align="center" valign="top">No</td>
  +  </tr>
  +  <tr>
       <td valign="top">items</td>
       <td valign="top">a comma separated list of the files/directories to jar. All
         files are included when omitted. (<b>deprecated</b>, use <i>includes</i>
  @@ -2038,6 +2043,11 @@
       <td valign="top">basedir</td>
       <td valign="top">the directory from which to zip the files.</td>
       <td align="center" valign="top">Yes</td>
  +  </tr>
  +  <tr>
  +    <td valign="top">compress</td>
  +    <td valign="top">Not only store data but also compress them, defaults to true</td>
  +    <td align="center" valign="top">No</td>
     </tr>
     <tr>
       <td valign="top">items</td>
  
  
  
  1.4       +10 -8     jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Jar.java
  
  Index: Jar.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Jar.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Jar.java	2000/02/09 20:51:47	1.3
  +++ Jar.java	2000/05/20 10:58:17	1.4
  @@ -81,16 +81,19 @@
       protected void initZipOutputStream(ZipOutputStream zOut)
   	throws IOException, BuildException
       {
  -	zOut.setMethod(ZipOutputStream.DEFLATED);
  -
   	// add manifest first
   	if (manifest != null) {
  -	    ZipEntry ze = new ZipEntry("META-INF/");
  -	    zOut.putNextEntry(ze);
  +            super.zipDir(new File(manifest.getParent()), zOut, "META-INF/");
   	    super.zipFile(manifest, zOut, "META-INF/MANIFEST.MF");
   	} else {
  -	    ZipEntry ze = new ZipEntry("META-INF/");
  -	    zOut.putNextEntry(ze);
  +            /*
  +             * We don't store directories at all and this one will cause a lot
  +             * of problems with STORED Zip-Mode.
  +             *
  +             * That's why i've removed it -- Stefan Bodewig
  +             */
  +            //            ZipEntry ze = new ZipEntry("META-INF/");
  +            //            zOut.putNextEntry(ze);
   	    String s = "/org/apache/tools/ant/defaultManifest.mf";
   	    InputStream in = this.getClass().getResourceAsStream(s);
               if ( in == null )
  @@ -105,8 +108,7 @@
           // First add directory to zip entry
           if(!vPath.equals("META-INF/")) {
               // we already added a META-INF
  -            ZipEntry ze = new ZipEntry(vPath);
  -            zOut.putNextEntry(ze);
  +            super.zipDir(dir, zOut, vPath);
           }
       }
   
  
  
  
  1.6       +56 -1     jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Zip.java
  
  Index: Zip.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Zip.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Zip.java	2000/02/13 21:43:34	1.5
  +++ Zip.java	2000/05/20 10:58:17	1.6
  @@ -73,6 +73,7 @@
   
       private File zipFile;
       private File baseDir;
  +    private boolean doCompress = true;
       protected String archiveType = "zip";
       
       /**
  @@ -91,6 +92,13 @@
           baseDir = project.resolveFile(baseDirname);
       }
   
  +    /**
  +     * Sets whether we want to compress the files or only store them.
  +     */
  +    public void setCompress(String compress) {
  +        doCompress = Project.toBoolean(compress);
  +    }
  +
       public void execute() throws BuildException {
           if (baseDir == null) {
               throw new BuildException("basedir attribute must be set!");
  @@ -116,6 +124,11 @@
   
           try {
               ZipOutputStream zOut = new ZipOutputStream(new FileOutputStream(zipFile));
  +            if (doCompress) {
  +                zOut.setMethod(ZipOutputStream.DEFLATED);
  +            } else {
  +                zOut.setMethod(ZipOutputStream.STORED);
  +            }
               initZipOutputStream(zOut);
   
               for (int i = 0; i < dirs.length; i++) {
  @@ -141,7 +154,6 @@
       protected void initZipOutputStream(ZipOutputStream zOut)
           throws IOException, BuildException
       {
  -        zOut.setMethod(ZipOutputStream.DEFLATED);
       }
   
       protected void zipDir(File dir, ZipOutputStream zOut, String vPath)
  @@ -153,6 +165,49 @@
           throws IOException
       {
           ZipEntry ze = new ZipEntry(vPath);
  +
  +        /*
  +         * XXX ZipOutputStream.putEntry expects the ZipEntry to know its
  +         * size and the CRC sum before you start writing the data when using 
  +         * STORED mode.
  +         *
  +         * This forces us to process the data twice.
  +         *
  +         * I couldn't find any documentation on this, just found out by try 
  +         * and error.
  +         */
  +        if (!doCompress) {
  +            long size = 0;
  +            CRC32 cal = new CRC32();
  +            if (!in.markSupported()) {
  +                // Store data into a byte[]
  +                ByteArrayOutputStream bos = new ByteArrayOutputStream();
  +
  +                byte[] buffer = new byte[8 * 1024];
  +                int count = 0;
  +                do {
  +                    size += count;
  +                    cal.update(buffer, 0, count);
  +                    bos.write(buffer, 0, count);
  +                    count = in.read(buffer, 0, buffer.length);
  +                } while (count != -1);
  +                in = new ByteArrayInputStream(bos.toByteArray());
  +
  +            } else {
  +                in.mark(Integer.MAX_VALUE);
  +                byte[] buffer = new byte[8 * 1024];
  +                int count = 0;
  +                do {
  +                    size += count;
  +                    cal.update(buffer, 0, count);
  +                    count = in.read(buffer, 0, buffer.length);
  +                } while (count != -1);
  +                in.reset();
  +            }
  +            ze.setSize(size);
  +            ze.setCrc(cal.getValue());
  +        }
  +
           zOut.putNextEntry(ze);
   
           byte[] buffer = new byte[8 * 1024];