bodewig     2003/01/17 04:30:44

  Modified:    .        WHATSNEW
               src/main/org/apache/tools/ant/taskdefs Jar.java
               src/testcases/org/apache/tools/ant/taskdefs JarTest.java
  Log:
  Take care of the original manifest when updating a jar.
  
  PR: 12651
  Based on code submitted by:   Ben Jenkins <bjenkins at dynamicsoft dot com>
  
  Revision  Changes    Path
  1.343     +2 -0      jakarta-ant/WHATSNEW
  
  Index: WHATSNEW
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/WHATSNEW,v
  retrieving revision 1.342
  retrieving revision 1.343
  diff -u -r1.342 -r1.343
  --- WHATSNEW  16 Jan 2003 12:08:25 -0000      1.342
  +++ WHATSNEW  17 Jan 2003 12:30:43 -0000      1.343
  @@ -94,6 +94,8 @@
   
   * build.sysclasspath will now be honored by more tasks.
   
  +* <jar update="true"> would remove the original manifest.
  +
   Other changes:
   --------------
   * The filesetmanifest attribute of <jar> has been reenabled.
  
  
  
  1.59      +69 -30    
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.58
  retrieving revision 1.59
  diff -u -r1.58 -r1.59
  --- Jar.java  9 Dec 2002 12:40:38 -0000       1.58
  +++ Jar.java  17 Jan 2003 12:30:44 -0000      1.59
  @@ -1,7 +1,7 @@
   /*
    * The Apache Software License, Version 1.1
    *
  - * Copyright (c) 2000-2002 The Apache Software Foundation.  All rights
  + * Copyright (c) 2000-2003 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -65,6 +65,8 @@
   import java.io.PrintWriter;
   import java.io.Reader;
   import java.util.Enumeration;
  +import java.util.zip.ZipEntry;
  +import java.util.zip.ZipFile;
   import org.apache.tools.ant.BuildException;
   import org.apache.tools.ant.FileScanner;
   import org.apache.tools.ant.Project;
  @@ -96,6 +98,12 @@
       /**  merged manifests added through filesets */
       private Manifest filesetManifest;
   
  +    /** 
  +     * Manifest of original archive, will be set to null if not in
  +     * update mode.
  +     */
  +    private Manifest originalManifest;
  +
       /**
        *  whether to merge fileset manifests;
        *  value is true if filesetmanifest is 'merge' or 'mergewithoutmain'
  @@ -146,6 +154,36 @@
       }
   
       /**
  +     * Override to get hold of the original Manifest (if present and
  +     * only if updating ...
  +     *
  +     * @since Ant 1.5.2
  +     */
  +    public void setDestFile(File jarFile) {
  +        super.setDestFile(jarFile);
  +        if (jarFile.exists()) {
  +            try {
  +                ZipFile zf = new ZipFile(jarFile);
  +
  +                // must not use getEntry as "well behaving" applications
  +                // must accept the manifest in any capitalization
  +                Enumeration enum = zf.entries();
  +                while (enum.hasMoreElements()) {
  +                    ZipEntry ze = (ZipEntry) enum.nextElement();
  +                    if 
(ze.getName().equalsIgnoreCase("META-INF/MANIFEST.MF")) {
  +                        originalManifest = 
  +                            getManifest(new InputStreamReader(zf
  +                                                         
.getInputStream(ze)));
  +                    }
  +                }
  +            } catch (Throwable t) {
  +                log("error while reading original manifest: " + 
t.getMessage(),
  +                    Project.MSG_WARN);
  +            }
  +        }
  +    }
  +
  +    /**
        * Set whether or not to create an index list for classes.
        * This may speed up classloading in some cases.
        */
  @@ -272,6 +310,10 @@
       private Manifest createManifest()
           throws BuildException {
           try {
  +            if (!isInUpdateMode()) {
  +                originalManifest = null;
  +            }
  +
               Manifest finalManifest = Manifest.getDefaultManifest();
   
               if (manifest == null) {
  @@ -279,25 +321,22 @@
                       // if we haven't got the manifest yet, attempt to
                       // get it now and have manifest be the final merge
                       manifest = getManifest(manifestFile);
  -                    finalManifest.merge(filesetManifest);
  -                    finalManifest.merge(configuredManifest);
  -                    finalManifest.merge(manifest, !mergeManifestsMain);
  -                } else if (configuredManifest != null) {
  -                    // configuredManifest is the final merge
  -                    finalManifest.merge(filesetManifest);
  -                    finalManifest.merge(configuredManifest,
  -                                        !mergeManifestsMain);
  -                } else if (filesetManifest != null) {
  -                    // filesetManifest is the final (and only) merge
  -                    finalManifest.merge(filesetManifest, 
!mergeManifestsMain);
                   }
  -            } else {
  -                // manifest is the final merge
  -                finalManifest.merge(filesetManifest);
  -                finalManifest.merge(configuredManifest);
  -                finalManifest.merge(manifest, !mergeManifestsMain);
               }
   
  +            /*
  +             * Precedence: manifestFile wins over inline manifest,
  +             * over manifests read from the filesets over the original
  +             * manifest.
  +             *
  +             * merge with null argument is a no-op
  +             */
  +
  +            finalManifest.merge(originalManifest);
  +            finalManifest.merge(filesetManifest);
  +            finalManifest.merge(configuredManifest);
  +            finalManifest.merge(manifest, !mergeManifestsMain);
  +
               return finalManifest;
   
           } catch (ManifestException e) {
  @@ -307,7 +346,7 @@
       }
   
       private void writeManifest(ZipOutputStream zOut, Manifest manifest)
  -         throws IOException {
  +        throws IOException {
           for (Enumeration e = manifest.getWarnings();
                e.hasMoreElements();) {
               log("Manifest warning: " + (String) e.nextElement(),
  @@ -330,7 +369,7 @@
       }
   
       protected void finalizeZipOutputStream(ZipOutputStream zOut)
  -            throws IOException, BuildException {
  +        throws IOException, BuildException {
   
           if (index) {
               createIndexList(zOut);
  @@ -399,9 +438,9 @@
                              int mode)
           throws IOException {
           if ("META-INF/MANIFEST.MF".equalsIgnoreCase(vPath))  {
  -           if (! doubleFilePass || (doubleFilePass && skipWriting)) {
  -               filesetManifest(file, null);
  -           }
  +            if (! doubleFilePass || (doubleFilePass && skipWriting)) {
  +                filesetManifest(file, null);
  +            }
           } else {
               super.zipFile(file, zOut, vPath, mode);
           }
  @@ -414,9 +453,9 @@
                              long lastModified, File file, int mode)
           throws IOException {
           if ("META-INF/MANIFEST.MF".equalsIgnoreCase(vPath))  {
  -           if (! doubleFilePass || (doubleFilePass && skipWriting)) {
  -               filesetManifest(file, is);
  -           }
  +            if (! doubleFilePass || (doubleFilePass && skipWriting)) {
  +                filesetManifest(file, is);
  +            }
           } else {
               super.zipFile(is, zOut, vPath, lastModified, null, mode);
           }
  @@ -542,11 +581,11 @@
   
           // we want to save this info if we are going to make another pass
           if (! doubleFilePass || (doubleFilePass && ! skipWriting))
  -        {
  -            manifest = null;
  -            configuredManifest = savedConfiguredManifest;
  -            filesetManifest = null;
  -        }
  +            {
  +                manifest = null;
  +                configuredManifest = savedConfiguredManifest;
  +                filesetManifest = null;
  +            }
       }
   
       /**
  
  
  
  1.11      +1 -1      
jakarta-ant/src/testcases/org/apache/tools/ant/taskdefs/JarTest.java
  
  Index: JarTest.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/testcases/org/apache/tools/ant/taskdefs/JarTest.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- JarTest.java      17 Jan 2003 10:50:57 -0000      1.10
  +++ JarTest.java      17 Jan 2003 12:30:44 -0000      1.11
  @@ -152,7 +152,7 @@
                      jarModifiedDate < jarFile.lastModified());
       }
   
  -    public void XtestManifestStaysIntact() 
  +    public void testManifestStaysIntact() 
           throws IOException, ManifestException {
           executeTarget("testManifestStaysIntact");
           Manifest mf1 = 
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to