--- /dev/null
+Manifest-Version: 1.0\r
+Created-By: DuplicateManifestTest\r
+\r
--- /dev/null
+<?xml version="1.0" ?>
+<jar name="input1.jar">
+</jar>
+
--- /dev/null
+<?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>
suite.addTestSuite(SavedModelConsistencyTest. class);
suite.addTestSuite(BuildCancellingTest.class);
suite.addTestSuite(JarManifestTest.class);
+ suite.addTestSuite(DuplicateManifestTest.class);
//$JUnit-END$
return suite;
--- /dev/null
+/*******************************************************************************
+ * 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());
+ }
+ }
+
+}
if (entry == null) break;
String filename = entry.getName();
+// System.out.println("? copyResourcesFromJarFile() filename='" + filename +"'");
if (!entry.isDirectory() && acceptResource(filename)) {
byte[] bytes = FileUtil.readAsByteArray(inStream);
(resourceName.startsWith("CVS/")) ||
(resourceName.indexOf("/CVS/") != -1) ||
(resourceName.endsWith("/CVS")) ||
- (resourceName.endsWith(".class"))
+ (resourceName.endsWith(".class")) ||
+ (resourceName.toUpperCase().equals(MANIFEST_NAME))
)
{
return false;
makeTestJars();
makeURLWeavingClassLoaderJars();
+
+ makeDuplicateManifestTestJars();
}
public static void makeJar0() throws IOException {
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);
+ }
}
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;
// 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?
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")) {
// addResource(filename,classFile);
// }
- inStream.closeEntry();
+ inStream.close();
}
- inStream.close();
+ inJar.close();
}
} catch (FileNotFoundException ex) {
IMessage message = new Message(
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() + ")",
// }
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";