diff options
author | aclement <aclement> | 2004-08-02 15:47:02 +0000 |
---|---|---|
committer | aclement <aclement> | 2004-08-02 15:47:02 +0000 |
commit | 2b8fa314f21eddf8551715fdd571da2b611411d0 (patch) | |
tree | b1d79b311bdd55ff5a6c5fb205c77896dc5222b5 | |
parent | 7f19ab47a3df5327c6246420354089d1db1c765f (diff) | |
download | aspectj-2b8fa314f21eddf8551715fdd571da2b611411d0.tar.gz aspectj-2b8fa314f21eddf8551715fdd571da2b611411d0.zip |
Fix for Bugzilla Bug 57666
duplicate manifests cause resource-copying to gack
(Contributed by Matthew Webster)
-rw-r--r-- | ajde/testdata/DuplicateManifestTest/META-INF/MANIFEST.MF | 3 | ||||
-rw-r--r-- | ajde/testdata/DuplicateManifestTest/META-INF/test.xml | 4 | ||||
-rw-r--r-- | ajde/testdata/DuplicateManifestTest/aspectjar.jar | bin | 0 -> 2544 bytes | |||
-rw-r--r-- | ajde/testdata/DuplicateManifestTest/build.ajsym | bin | 0 -> 1270 bytes | |||
-rw-r--r-- | ajde/testdata/DuplicateManifestTest/build.lst | 0 | ||||
-rw-r--r-- | ajde/testdata/DuplicateManifestTest/injar.jar | bin | 0 -> 927 bytes | |||
-rw-r--r-- | ajde/testdata/DuplicateManifestTest/outjar.jar | bin | 0 -> 1273 bytes | |||
-rw-r--r-- | ajde/testdata/DuplicateManifestTest/update-injar.xml | 33 | ||||
-rw-r--r-- | ajde/testsrc/org/aspectj/ajde/AjdeTests.java | 1 | ||||
-rw-r--r-- | ajde/testsrc/org/aspectj/ajde/DuplicateManifestTest.java | 69 | ||||
-rw-r--r-- | org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java | 4 | ||||
-rw-r--r-- | org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/BcweaverJarMaker.java | 30 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java | 31 |
13 files changed, 163 insertions, 12 deletions
diff --git a/ajde/testdata/DuplicateManifestTest/META-INF/MANIFEST.MF b/ajde/testdata/DuplicateManifestTest/META-INF/MANIFEST.MF new file mode 100644 index 000000000..fde889593 --- /dev/null +++ b/ajde/testdata/DuplicateManifestTest/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0
+Created-By: DuplicateManifestTest
+
diff --git a/ajde/testdata/DuplicateManifestTest/META-INF/test.xml b/ajde/testdata/DuplicateManifestTest/META-INF/test.xml new file mode 100644 index 000000000..f9efa1f1f --- /dev/null +++ b/ajde/testdata/DuplicateManifestTest/META-INF/test.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<jar name="input1.jar"> +</jar> + diff --git a/ajde/testdata/DuplicateManifestTest/aspectjar.jar b/ajde/testdata/DuplicateManifestTest/aspectjar.jar Binary files differnew file mode 100644 index 000000000..6cc196c3e --- /dev/null +++ b/ajde/testdata/DuplicateManifestTest/aspectjar.jar diff --git a/ajde/testdata/DuplicateManifestTest/build.ajsym b/ajde/testdata/DuplicateManifestTest/build.ajsym Binary files differnew file mode 100644 index 000000000..898f8bee0 --- /dev/null +++ b/ajde/testdata/DuplicateManifestTest/build.ajsym diff --git a/ajde/testdata/DuplicateManifestTest/build.lst b/ajde/testdata/DuplicateManifestTest/build.lst new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/ajde/testdata/DuplicateManifestTest/build.lst diff --git a/ajde/testdata/DuplicateManifestTest/injar.jar b/ajde/testdata/DuplicateManifestTest/injar.jar Binary files differnew file mode 100644 index 000000000..8613c3686 --- /dev/null +++ b/ajde/testdata/DuplicateManifestTest/injar.jar diff --git a/ajde/testdata/DuplicateManifestTest/outjar.jar b/ajde/testdata/DuplicateManifestTest/outjar.jar Binary files differnew file mode 100644 index 000000000..ee5000733 --- /dev/null +++ b/ajde/testdata/DuplicateManifestTest/outjar.jar diff --git a/ajde/testdata/DuplicateManifestTest/update-injar.xml b/ajde/testdata/DuplicateManifestTest/update-injar.xml new file mode 100644 index 000000000..7ce4c1452 --- /dev/null +++ b/ajde/testdata/DuplicateManifestTest/update-injar.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" ?> +<project name="DuplicateManifestTest" default="all" basedir="."> + + <property name="injar" value="${basedir}/injar.jar"/> + <property name="tempdir" value="${basedir}/temp"/> + + <target name="update"> + + <delete dir="${tempdir}"/> + + <unzip + dest="${tempdir}" + src="${injar}" + /> + + <copy todir="${tempdir}" overwrite="true"> + <fileset dir="${basedir}"> + <include name="META-INF/*"/> + </fileset> + </copy> + + <zip + destfile="${injar}" + > + <fileset dir="${basedir}/temp"/> + + </zip> + + <delete dir="${tempdir}"/> + </target> + + <target name="all" depends="update"/> +</project> diff --git a/ajde/testsrc/org/aspectj/ajde/AjdeTests.java b/ajde/testsrc/org/aspectj/ajde/AjdeTests.java index b66c019ed..e70619504 100644 --- a/ajde/testsrc/org/aspectj/ajde/AjdeTests.java +++ b/ajde/testsrc/org/aspectj/ajde/AjdeTests.java @@ -37,6 +37,7 @@ public class AjdeTests extends TestCase { suite.addTestSuite(SavedModelConsistencyTest. class); suite.addTestSuite(BuildCancellingTest.class); suite.addTestSuite(JarManifestTest.class); + suite.addTestSuite(DuplicateManifestTest.class); //$JUnit-END$ return suite; diff --git a/ajde/testsrc/org/aspectj/ajde/DuplicateManifestTest.java b/ajde/testsrc/org/aspectj/ajde/DuplicateManifestTest.java new file mode 100644 index 000000000..38c82bb42 --- /dev/null +++ b/ajde/testsrc/org/aspectj/ajde/DuplicateManifestTest.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Matthew Webster - initial implementation + *******************************************************************************/ +package org.aspectj.ajde; + +import java.io.File; +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; +import java.util.jar.JarFile; +import java.util.jar.Manifest; + +public class DuplicateManifestTest extends AjdeTestCase { + + + public static final String PROJECT_DIR = "DuplicateManifestTest"; + + public static final String injarName = "injar.jar"; + public static final String aspectjarName = "aspectjar.jar"; + public static final String outjarName = "outjar.jar"; + + + /* + * Ensure the output directpry in clean + */ + protected void setUp() throws Exception { + super.setUp(PROJECT_DIR); + } + + public void testWeave () { + Set injars = new HashSet(); + injars.add(openFile(injarName)); + ideManager.getProjectProperties().setInJars(injars); + Set aspectpath = new HashSet(); + aspectpath.add(openFile(aspectjarName)); + ideManager.getProjectProperties().setAspectPath(aspectpath); + File outjar = openFile(outjarName); + ideManager.getProjectProperties().setOutJar(outjar.getAbsolutePath()); + assertTrue("Build failed", doSynchronousBuild("build.lst")); + assertTrue( + "Build warnings", + ideManager.getCompilationSourceLineTasks().isEmpty()); + compareManifests(openFile(injarName),openFile(outjarName)); + } + + private void compareManifests (File inFile, File outFile) { + + try { + JarFile inJar = new JarFile(inFile); + Manifest inManifest = inJar.getManifest(); + inJar.close(); + JarFile outJar = new JarFile(outFile); + Manifest outManifest = outJar.getManifest(); + outJar.close(); + assertTrue("The manifests in '" + inFile.getCanonicalPath() + "' and '" + outFile.getCanonicalPath() + "' sould be the same",inManifest.equals(outManifest)); + } + catch (IOException ex) { + fail(ex.toString()); + } + } + +} diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java index 096bb8855..ab428758a 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java @@ -290,6 +290,7 @@ public class AjBuildManager implements IOutputClassFileNameProvider,IBinarySourc if (entry == null) break; String filename = entry.getName(); +// System.out.println("? copyResourcesFromJarFile() filename='" + filename +"'"); if (!entry.isDirectory() && acceptResource(filename)) { byte[] bytes = FileUtil.readAsByteArray(inStream); @@ -380,7 +381,8 @@ public class AjBuildManager implements IOutputClassFileNameProvider,IBinarySourc (resourceName.startsWith("CVS/")) || (resourceName.indexOf("/CVS/") != -1) || (resourceName.endsWith("/CVS")) || - (resourceName.endsWith(".class")) + (resourceName.endsWith(".class")) || + (resourceName.toUpperCase().equals(MANIFEST_NAME)) ) { return false; diff --git a/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/BcweaverJarMaker.java b/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/BcweaverJarMaker.java index 40e81eeda..96a5021ae 100644 --- a/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/BcweaverJarMaker.java +++ b/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/BcweaverJarMaker.java @@ -38,6 +38,8 @@ public class BcweaverJarMaker { makeTestJars(); makeURLWeavingClassLoaderJars(); + + makeDuplicateManifestTestJars(); } public static void makeJar0() throws IOException { @@ -294,5 +296,33 @@ public class BcweaverJarMaker { args.add(AjdtAjcTests.TESTDATA_PATH + "/src1/LTWPerthis.aj"); CommandTestCase.runCompiler(args, CommandTestCase.NO_ERRORS); } + + public static void makeDuplicateManifestTestJars() throws IOException { + List args = new ArrayList(); + + /* + * injar + */ + args.add("-classpath"); + args.add("../lib/test/aspectjrt.jar;../lib/test/testing-client.jar" + + File.pathSeparator + System.getProperty("aspectjrt.path")); + args.add("-outjar"); + args.add("../ajde/testdata/DuplicateManifestTest/injar.jar"); + args.add(AjdtAjcTests.TESTDATA_PATH + "/src1/Hello.java"); + CommandTestCase.runCompiler(args, CommandTestCase.NO_ERRORS); + + /* + * aspectjar + */ + args = new ArrayList(); + args.add("-classpath"); + args.add("../lib/test/aspectjrt.jar;../lib/test/testing-client.jar" + + File.pathSeparator + System.getProperty("aspectjrt.path")); + args.add("-outjar"); + args.add("../ajde/testdata/DuplicateManifestTest/aspectjar.jar"); + args.add(AjdtAjcTests.TESTDATA_PATH + "/src1/Trace.java"); + args.add(AjdtAjcTests.TESTDATA_PATH + "/src1/TraceHello.java"); + CommandTestCase.runCompiler(args, CommandTestCase.NO_ERRORS); + } } diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java b/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java index 6fd891ca6..19beb0f62 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java @@ -20,17 +20,21 @@ import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.Enumeration; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.jar.Attributes; import java.util.jar.Attributes.Name; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; import java.util.jar.JarInputStream; import java.util.jar.Manifest; import java.util.zip.ZipEntry; @@ -181,7 +185,7 @@ public class BcelWeaver implements IWeaver { // System.err.println("? addJarFile(" + inFile + ", " + outDir + ")"); List addedClassFiles = new ArrayList(); needToReweaveWorld = true; - JarInputStream inStream = null; + JarFile inJar = null; try { // Is this a directory we are looking at? @@ -189,15 +193,17 @@ public class BcelWeaver implements IWeaver { addedClassFiles.addAll(addDirectoryContents(inFile,outDir)); } else { - inStream = new JarInputStream(new FileInputStream(inFile)); //??? buffered - addManifest(inStream.getManifest()); + inJar = new JarFile(inFile); + addManifest(inJar.getManifest()); + Enumeration entries = inJar.entries(); - while (true) { - ZipEntry entry = inStream.getNextEntry(); - if (entry == null) break; - + while (entries.hasMoreElements()) { + JarEntry entry = (JarEntry)entries.nextElement(); + InputStream inStream = inJar.getInputStream(entry); + byte[] bytes = FileUtil.readAsByteArray(inStream); String filename = entry.getName(); +// System.out.println("? addJarFile() filename='" + filename + "'"); UnwovenClassFile classFile = new UnwovenClassFile(new File(outDir, filename).getAbsolutePath(), bytes); if (filename.endsWith(".class")) { @@ -210,9 +216,9 @@ public class BcelWeaver implements IWeaver { // addResource(filename,classFile); // } - inStream.closeEntry(); + inStream.close(); } - inStream.close(); + inJar.close(); } } catch (FileNotFoundException ex) { IMessage message = new Message( @@ -227,8 +233,8 @@ public class BcelWeaver implements IWeaver { true); world.getMessageHandler().handleMessage(message); } finally { - if (inStream != null) { - try {inStream.close();} + if (inJar != null) { + try {inJar.close();} catch (IOException ex) { IMessage message = new Message( "Could not close input jar file " + inFile.getPath() + "(" + ex.getMessage() + ")", @@ -391,11 +397,14 @@ public class BcelWeaver implements IWeaver { // } public void addManifest (Manifest newManifest) { +// System.out.println("? addManifest() newManifest=" + newManifest); if (manifest == null) { manifest = newManifest; } } + public static final String MANIFEST_NAME = "META-INF/MANIFEST.MF"; + private static final String WEAVER_MANIFEST_VERSION = "1.0"; private static final Attributes.Name CREATED_BY = new Name("Created-By"); private static final String WEAVER_CREATED_BY = "AspectJ Compiler"; |