Kaynağa Gözat

Fix for Bugzilla Bug 57666

	  	duplicate manifests cause resource-copying to gack
(Contributed by Matthew Webster)
tags/for_ajdt1_1_12
aclement 20 yıl önce
ebeveyn
işleme
2b8fa314f2

+ 3
- 0
ajde/testdata/DuplicateManifestTest/META-INF/MANIFEST.MF Dosyayı Görüntüle

Manifest-Version: 1.0
Created-By: DuplicateManifestTest

+ 4
- 0
ajde/testdata/DuplicateManifestTest/META-INF/test.xml Dosyayı Görüntüle

<?xml version="1.0" ?>
<jar name="input1.jar">
</jar>


BIN
ajde/testdata/DuplicateManifestTest/aspectjar.jar Dosyayı Görüntüle


BIN
ajde/testdata/DuplicateManifestTest/build.ajsym Dosyayı Görüntüle


+ 0
- 0
ajde/testdata/DuplicateManifestTest/build.lst Dosyayı Görüntüle


BIN
ajde/testdata/DuplicateManifestTest/injar.jar Dosyayı Görüntüle


BIN
ajde/testdata/DuplicateManifestTest/outjar.jar Dosyayı Görüntüle


+ 33
- 0
ajde/testdata/DuplicateManifestTest/update-injar.xml Dosyayı Görüntüle

<?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 Dosyayı Görüntüle

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;

+ 69
- 0
ajde/testsrc/org/aspectj/ajde/DuplicateManifestTest.java Dosyayı Görüntüle

/*******************************************************************************
* 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 Dosyayı Görüntüle

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;

+ 30
- 0
org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/BcweaverJarMaker.java Dosyayı Görüntüle

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);
}
} }

+ 20
- 11
weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java Dosyayı Görüntüle

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";

Loading…
İptal
Kaydet