Просмотр исходного кода

Fix for Bugzilla Bug 57666

	  	duplicate manifests cause resource-copying to gack
(Contributed by Matthew Webster)
tags/for_ajdt1_1_12
aclement 20 лет назад
Родитель
Сommit
2b8fa314f2

+ 3
- 0
ajde/testdata/DuplicateManifestTest/META-INF/MANIFEST.MF Просмотреть файл

@@ -0,0 +1,3 @@
Manifest-Version: 1.0
Created-By: DuplicateManifestTest

+ 4
- 0
ajde/testdata/DuplicateManifestTest/META-INF/test.xml Просмотреть файл

@@ -0,0 +1,4 @@
<?xml version="1.0" ?>
<jar name="input1.jar">
</jar>


Двоичные данные
ajde/testdata/DuplicateManifestTest/aspectjar.jar Просмотреть файл


Двоичные данные
ajde/testdata/DuplicateManifestTest/build.ajsym Просмотреть файл


+ 0
- 0
ajde/testdata/DuplicateManifestTest/build.lst Просмотреть файл


Двоичные данные
ajde/testdata/DuplicateManifestTest/injar.jar Просмотреть файл


Двоичные данные
ajde/testdata/DuplicateManifestTest/outjar.jar Просмотреть файл


+ 33
- 0
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>

+ 1
- 0
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;

+ 69
- 0
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());
}
}

}

+ 3
- 1
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;

+ 30
- 0
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);
}
}

+ 20
- 11
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";

Загрузка…
Отмена
Сохранить