duplicate manifests cause resource-copying to gack (Contributed by Matthew Webster)tags/for_ajdt1_1_12
Manifest-Version: 1.0 | |||||
Created-By: DuplicateManifestTest | |||||
<?xml version="1.0" ?> | |||||
<jar name="input1.jar"> | |||||
</jar> | |||||
<?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(SavedModelConsistencyTest. class); | ||||
suite.addTestSuite(BuildCancellingTest.class); | suite.addTestSuite(BuildCancellingTest.class); | ||||
suite.addTestSuite(JarManifestTest.class); | suite.addTestSuite(JarManifestTest.class); | ||||
suite.addTestSuite(DuplicateManifestTest.class); | |||||
//$JUnit-END$ | //$JUnit-END$ | ||||
return suite; | return suite; |
/******************************************************************************* | |||||
* 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; | if (entry == null) break; | ||||
String filename = entry.getName(); | String filename = entry.getName(); | ||||
// System.out.println("? copyResourcesFromJarFile() filename='" + filename +"'"); | |||||
if (!entry.isDirectory() && acceptResource(filename)) { | if (!entry.isDirectory() && acceptResource(filename)) { | ||||
byte[] bytes = FileUtil.readAsByteArray(inStream); | byte[] bytes = FileUtil.readAsByteArray(inStream); | ||||
(resourceName.startsWith("CVS/")) || | (resourceName.startsWith("CVS/")) || | ||||
(resourceName.indexOf("/CVS/") != -1) || | (resourceName.indexOf("/CVS/") != -1) || | ||||
(resourceName.endsWith("/CVS")) || | (resourceName.endsWith("/CVS")) || | ||||
(resourceName.endsWith(".class")) | |||||
(resourceName.endsWith(".class")) || | |||||
(resourceName.toUpperCase().equals(MANIFEST_NAME)) | |||||
) | ) | ||||
{ | { | ||||
return false; | return false; |
makeTestJars(); | makeTestJars(); | ||||
makeURLWeavingClassLoaderJars(); | makeURLWeavingClassLoaderJars(); | ||||
makeDuplicateManifestTestJars(); | |||||
} | } | ||||
public static void makeJar0() throws IOException { | public static void makeJar0() throws IOException { | ||||
args.add(AjdtAjcTests.TESTDATA_PATH + "/src1/LTWPerthis.aj"); | args.add(AjdtAjcTests.TESTDATA_PATH + "/src1/LTWPerthis.aj"); | ||||
CommandTestCase.runCompiler(args, CommandTestCase.NO_ERRORS); | 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.FileInputStream; | ||||
import java.io.FileNotFoundException; | import java.io.FileNotFoundException; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.io.InputStream; | |||||
import java.io.OutputStream; | import java.io.OutputStream; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.Collection; | import java.util.Collection; | ||||
import java.util.Collections; | import java.util.Collections; | ||||
import java.util.Comparator; | import java.util.Comparator; | ||||
import java.util.Enumeration; | |||||
import java.util.HashSet; | import java.util.HashSet; | ||||
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.List; | import java.util.List; | ||||
import java.util.Set; | import java.util.Set; | ||||
import java.util.jar.Attributes; | import java.util.jar.Attributes; | ||||
import java.util.jar.Attributes.Name; | 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.JarInputStream; | ||||
import java.util.jar.Manifest; | import java.util.jar.Manifest; | ||||
import java.util.zip.ZipEntry; | import java.util.zip.ZipEntry; | ||||
// System.err.println("? addJarFile(" + inFile + ", " + outDir + ")"); | // System.err.println("? addJarFile(" + inFile + ", " + outDir + ")"); | ||||
List addedClassFiles = new ArrayList(); | List addedClassFiles = new ArrayList(); | ||||
needToReweaveWorld = true; | needToReweaveWorld = true; | ||||
JarInputStream inStream = null; | |||||
JarFile inJar = null; | |||||
try { | try { | ||||
// Is this a directory we are looking at? | // Is this a directory we are looking at? | ||||
addedClassFiles.addAll(addDirectoryContents(inFile,outDir)); | addedClassFiles.addAll(addDirectoryContents(inFile,outDir)); | ||||
} else { | } 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); | byte[] bytes = FileUtil.readAsByteArray(inStream); | ||||
String filename = entry.getName(); | String filename = entry.getName(); | ||||
// System.out.println("? addJarFile() filename='" + filename + "'"); | |||||
UnwovenClassFile classFile = new UnwovenClassFile(new File(outDir, filename).getAbsolutePath(), bytes); | UnwovenClassFile classFile = new UnwovenClassFile(new File(outDir, filename).getAbsolutePath(), bytes); | ||||
if (filename.endsWith(".class")) { | if (filename.endsWith(".class")) { | ||||
// addResource(filename,classFile); | // addResource(filename,classFile); | ||||
// } | // } | ||||
inStream.closeEntry(); | |||||
inStream.close(); | |||||
} | } | ||||
inStream.close(); | |||||
inJar.close(); | |||||
} | } | ||||
} catch (FileNotFoundException ex) { | } catch (FileNotFoundException ex) { | ||||
IMessage message = new Message( | IMessage message = new Message( | ||||
true); | true); | ||||
world.getMessageHandler().handleMessage(message); | world.getMessageHandler().handleMessage(message); | ||||
} finally { | } finally { | ||||
if (inStream != null) { | |||||
try {inStream.close();} | |||||
if (inJar != null) { | |||||
try {inJar.close();} | |||||
catch (IOException ex) { | catch (IOException ex) { | ||||
IMessage message = new Message( | IMessage message = new Message( | ||||
"Could not close input jar file " + inFile.getPath() + "(" + ex.getMessage() + ")", | "Could not close input jar file " + inFile.getPath() + "(" + ex.getMessage() + ")", | ||||
// } | // } | ||||
public void addManifest (Manifest newManifest) { | public void addManifest (Manifest newManifest) { | ||||
// System.out.println("? addManifest() newManifest=" + newManifest); | |||||
if (manifest == null) { | if (manifest == null) { | ||||
manifest = newManifest; | manifest = newManifest; | ||||
} | } | ||||
} | } | ||||
public static final String MANIFEST_NAME = "META-INF/MANIFEST.MF"; | |||||
private static final String WEAVER_MANIFEST_VERSION = "1.0"; | private static final String WEAVER_MANIFEST_VERSION = "1.0"; | ||||
private static final Attributes.Name CREATED_BY = new Name("Created-By"); | private static final Attributes.Name CREATED_BY = new Name("Created-By"); | ||||
private static final String WEAVER_CREATED_BY = "AspectJ Compiler"; | private static final String WEAVER_CREATED_BY = "AspectJ Compiler"; |