suite.addTestSuite(JarManifestTest.class); | suite.addTestSuite(JarManifestTest.class); | ||||
suite.addTestSuite(ExtensionTests.class); | suite.addTestSuite(ExtensionTests.class); | ||||
suite.addTestSuite(GenericsTest.class); | suite.addTestSuite(GenericsTest.class); | ||||
suite.addTestSuite(OutxmlTest.class); | |||||
//$JUnit-END$ | //$JUnit-END$ | ||||
return suite; | return suite; |
/* ******************************************************************* | |||||
* Copyright (c) 2003 Contributors. | |||||
* 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.jar.JarEntry; | |||||
import java.util.jar.JarFile; | |||||
import org.aspectj.util.FileUtil; | |||||
public class OutxmlTest extends AjdeTestCase { | |||||
public static final String PROJECT_DIR = "OutxmlTest"; | |||||
public static final String BIN_DIR = "bin"; | |||||
public static final String OUTJAR_NAME = "/bin/test.jar"; | |||||
public static final String DEFAULT_AOPXML_NAME = "META-INF/aop.xml"; | |||||
public static final String CUSTOM_AOPXML_NAME = "custom/aop.xml"; | |||||
/* | |||||
* Ensure the output directory is clean | |||||
*/ | |||||
protected void setUp() throws Exception { | |||||
super.setUp(PROJECT_DIR); | |||||
FileUtil.deleteContents(openFile(BIN_DIR)); | |||||
} | |||||
/** | |||||
* Aim: Test "-outxml" option produces the correct xml file | |||||
* | |||||
*/ | |||||
public void testOutxmlToFile () { | |||||
// System.out.println("OutxmlTest.testOutxmlToFile() outputpath='" + ideManager.getProjectProperties().getOutputPath() + "'"); | |||||
assertTrue("Build failed",doSynchronousBuild("outxml-to-file.lst")); | |||||
assertTrue("Build warnings",ideManager.getCompilationSourceLineTasks().isEmpty()); | |||||
File aopxml = openFile(BIN_DIR + "/" + DEFAULT_AOPXML_NAME); | |||||
assertTrue(DEFAULT_AOPXML_NAME + " missing",aopxml.exists()); | |||||
} | |||||
/** | |||||
* Aim: Test "-outxmlfile filename" option produces the correct | |||||
* xml file | |||||
* | |||||
*/ | |||||
public void testOutxmlfileToFile () { | |||||
assertTrue("Build failed",doSynchronousBuild("outxmlfile-to-file.lst")); | |||||
assertTrue("Build warnings",ideManager.getCompilationSourceLineTasks().isEmpty()); | |||||
File aopxml = openFile(BIN_DIR + "/" + CUSTOM_AOPXML_NAME); | |||||
assertTrue(CUSTOM_AOPXML_NAME + " missing",aopxml.exists()); | |||||
} | |||||
/** | |||||
* Aim: Test "-outxmlfile filename" option produces the correct | |||||
* xml entry in outjar file | |||||
* | |||||
*/ | |||||
public void testOutxmlfileToOutjar () { | |||||
// System.out.println("OutxmlTest.testOutxmlToOutjar() outputpath='" + ideManager.getProjectProperties().getOutputPath() + "'"); | |||||
File outjar = openFile(OUTJAR_NAME); | |||||
ideManager.getProjectProperties().setOutJar(outjar.getAbsolutePath()); | |||||
assertTrue("Build failed",doSynchronousBuild("outxmlfile-to-outjar.lst")); | |||||
assertTrue("Build warnings",ideManager.getCompilationSourceLineTasks().isEmpty()); | |||||
File aopxml = openFile(BIN_DIR + "/" + CUSTOM_AOPXML_NAME); | |||||
assertFalse(CUSTOM_AOPXML_NAME + " should not exisit",aopxml.exists()); | |||||
assertJarContainsEntry(outjar,CUSTOM_AOPXML_NAME); | |||||
} | |||||
private void assertJarContainsEntry (File file, String entryName) { | |||||
try { | |||||
JarFile jarFile = new JarFile(file); | |||||
JarEntry jarEntry = jarFile.getJarEntry(entryName); | |||||
assertNotNull(entryName + " missing",jarEntry); | |||||
} | |||||
catch (IOException ex) { | |||||
fail(ex.toString()); | |||||
} | |||||
} | |||||
} |
</para></listitem> | </para></listitem> | ||||
</varlistentry> | </varlistentry> | ||||
<varlistentry> | |||||
<term>-outxml</term> | |||||
<listitem><para>Generate aop.xml file for load-time weaving with default name. | |||||
</para></listitem> | |||||
</varlistentry> | |||||
<varlistentry> | |||||
<term>-outxmlfile <replaceable>custom/aop.xml</replaceable></term> | |||||
<listitem><para>Generate aop.xml file for load-time weaving with custom name. | |||||
</para></listitem> | |||||
</varlistentry> | |||||
<varlistentry> | <varlistentry> | ||||
<term>-incremental</term> | <term>-incremental</term> | ||||
<listitem><para>Run the compiler continuously. | <listitem><para>Run the compiler continuously. |
} else { | } else { | ||||
showError("-outjar requires jar path argument"); | showError("-outjar requires jar path argument"); | ||||
} | } | ||||
} else if (arg.equals("-outxml")) { | |||||
buildConfig.setOutxmlName("META-INF/aop.xml"); | |||||
} else if (arg.equals("-outxmlfile")) { | |||||
if (args.size() > nextArgIndex) { | |||||
String name = ((ConfigParser.Arg)args.get(nextArgIndex)).getValue(); | |||||
buildConfig.setOutxmlName(name); | |||||
args.remove(args.get(nextArgIndex)); | |||||
} else { | |||||
showError("-outxmlfile requires file name argument"); | |||||
} | |||||
} else if (arg.equals("-log")){ | } else if (arg.equals("-log")){ | ||||
// remove it as it's already been handled in org.aspectj.tools.ajc.Main | // remove it as it's already been handled in org.aspectj.tools.ajc.Main | ||||
args.remove(args.get(nextArgIndex)); | args.remove(args.get(nextArgIndex)); |
private File outputDir; | private File outputDir; | ||||
private File outputJar; | private File outputJar; | ||||
private String outxmlName; | |||||
private List/*File*/ sourceRoots = new ArrayList(); | private List/*File*/ sourceRoots = new ArrayList(); | ||||
private List/*File*/ files = new ArrayList(); | private List/*File*/ files = new ArrayList(); | ||||
private List /*File*/ binaryFiles = new ArrayList(); // .class files in indirs... | private List /*File*/ binaryFiles = new ArrayList(); // .class files in indirs... | ||||
public File getOutputJar() { | public File getOutputJar() { | ||||
return outputJar; | return outputJar; | ||||
} | } | ||||
public String getOutxmlName() { | |||||
return outxmlName; | |||||
} | |||||
public List/*File*/ getInpath() { | public List/*File*/ getInpath() { | ||||
// Elements of the list are either archives (jars/zips) or directories | // Elements of the list are either archives (jars/zips) or directories | ||||
this.outputJar = outputJar; | this.outputJar = outputJar; | ||||
} | } | ||||
public void setOutxmlName(String name) { | |||||
this.outxmlName = name; | |||||
} | |||||
public void setInJars(List sourceJars) { | public void setInJars(List sourceJars) { | ||||
this.inJars = sourceJars; | this.inJars = sourceJars; | ||||
} | } |
package org.aspectj.ajdt.internal.core.builder; | package org.aspectj.ajdt.internal.core.builder; | ||||
import java.io.BufferedOutputStream; | import java.io.BufferedOutputStream; | ||||
import java.io.ByteArrayOutputStream; | |||||
import java.io.File; | import java.io.File; | ||||
import java.io.FileFilter; | import java.io.FileFilter; | ||||
import java.io.FileInputStream; | import java.io.FileInputStream; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.io.OutputStream; | import java.io.OutputStream; | ||||
import java.io.PrintStream; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.Collection; | import java.util.Collection; | ||||
import java.util.HashMap; | import java.util.HashMap; | ||||
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.LinkedList; | |||||
import java.util.List; | import java.util.List; | ||||
import java.util.Locale; | import java.util.Locale; | ||||
import java.util.Map; | import java.util.Map; | ||||
// FIXME asc should this really be in here? | // FIXME asc should this really be in here? | ||||
private IHierarchy structureModel; | private IHierarchy structureModel; | ||||
public AjBuildConfig buildConfig; | public AjBuildConfig buildConfig; | ||||
private List aspectNames = new LinkedList(); | |||||
AjState state = new AjState(this); | AjState state = new AjState(this); | ||||
state.successfulCompile(buildConfig,batch); | state.successfulCompile(buildConfig,batch); | ||||
copyResourcesToDestination(); | copyResourcesToDestination(); | ||||
if (buildConfig.getOutxmlName() != null) { | |||||
writeOutxmlFile(); | |||||
} | |||||
/*boolean weaved = *///weaveAndGenerateClassFiles(); | /*boolean weaved = *///weaveAndGenerateClassFiles(); | ||||
// if not weaved, then no-op build, no model changes | // if not weaved, then no-op build, no model changes | ||||
// but always returns true | // but always returns true | ||||
} | } | ||||
} | } | ||||
private void writeOutxmlFile () throws IOException { | |||||
String filename = buildConfig.getOutxmlName(); | |||||
// System.err.println("? AjBuildManager.writeOutxmlFile() outxml=" + filename); | |||||
// System.err.println("? AjBuildManager.writeOutxmlFile() outputDir=" + buildConfig.getOutputDir()); | |||||
ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |||||
PrintStream ps = new PrintStream(baos); | |||||
ps.println("<aspectj>"); | |||||
ps.println("<aspects>"); | |||||
for (Iterator i = aspectNames.iterator(); i.hasNext();) { | |||||
String name = (String)i.next(); | |||||
ps.println("<aspect name=\"" + name + "\"/>"); | |||||
} | |||||
ps.println("</aspects>"); | |||||
ps.println("</aspectj>"); | |||||
ps.println(); | |||||
ps.close(); | |||||
if (zos != null) { | |||||
ZipEntry newEntry = new ZipEntry(filename); | |||||
zos.putNextEntry(newEntry); | |||||
zos.write(baos.toByteArray()); | |||||
zos.closeEntry(); | |||||
} else { | |||||
OutputStream fos = | |||||
FileUtil.makeOutputStream(new File(buildConfig.getOutputDir(),filename)); | |||||
fos.write(baos.toByteArray()); | |||||
fos.close(); | |||||
} | |||||
} | |||||
// public static void dumprels() { | // public static void dumprels() { | ||||
// IRelationshipMap irm = AsmManager.getDefault().getRelationshipMap(); | // IRelationshipMap irm = AsmManager.getDefault().getRelationshipMap(); | ||||
// int ctr = 1; | // int ctr = 1; | ||||
public void acceptResult(CompilationResult unitResult) { | public void acceptResult(CompilationResult unitResult) { | ||||
// end of compile, must now write the results to the output destination | // end of compile, must now write the results to the output destination | ||||
// this is either a jar file or a file in a directory | // this is either a jar file or a file in a directory | ||||
if (!(unitResult.hasErrors() && !proceedOnError())) { | |||||
if (!(unitResult.hasErrors() && !proceedOnError())) { | |||||
Collection classFiles = unitResult.compiledTypes.values(); | Collection classFiles = unitResult.compiledTypes.values(); | ||||
boolean shouldAddAspectName = (buildConfig.getOutxmlName() != null); | |||||
for (Iterator iter = classFiles.iterator(); iter.hasNext();) { | for (Iterator iter = classFiles.iterator(); iter.hasNext();) { | ||||
ClassFile classFile = (ClassFile) iter.next(); | ClassFile classFile = (ClassFile) iter.next(); | ||||
String filename = new String(classFile.fileName()); | String filename = new String(classFile.fileName()); | ||||
String classname = filename.replace('/', '.'); | |||||
filename = filename.replace('/', File.separatorChar) + ".class"; | filename = filename.replace('/', File.separatorChar) + ".class"; | ||||
try { | try { | ||||
if (buildConfig.getOutputJar() == null) { | if (buildConfig.getOutputJar() == null) { | ||||
} else { | } else { | ||||
writeZipEntry(classFile,filename); | writeZipEntry(classFile,filename); | ||||
} | } | ||||
if (shouldAddAspectName) addAspectName(classname); | |||||
} catch (IOException ex) { | } catch (IOException ex) { | ||||
IMessage message = EclipseAdapterUtils.makeErrorMessage( | IMessage message = EclipseAdapterUtils.makeErrorMessage( | ||||
new String(unitResult.fileName), | new String(unitResult.fileName), | ||||
zos.write(classFile.getBytes()); | zos.write(classFile.getBytes()); | ||||
zos.closeEntry(); | zos.closeEntry(); | ||||
} | } | ||||
private void addAspectName (String name) { | |||||
BcelWorld world = getBcelWorld(); | |||||
ResolvedType type = world.resolve(name); | |||||
// System.err.println("? writeAspectName() type=" + type); | |||||
if (type.isAspect()) { | |||||
aspectNames.add(name); | |||||
} | |||||
} | |||||
}; | }; | ||||
} | } | ||||
import org.aspectj.bridge.CountingMessageHandler; | import org.aspectj.bridge.CountingMessageHandler; | ||||
import org.aspectj.bridge.IMessage; | import org.aspectj.bridge.IMessage; | ||||
import org.aspectj.bridge.IMessageHandler; | import org.aspectj.bridge.IMessageHandler; | ||||
import org.aspectj.bridge.IMessageHolder; | |||||
import org.aspectj.bridge.MessageHandler; | |||||
import org.aspectj.bridge.MessageWriter; | import org.aspectj.bridge.MessageWriter; | ||||
import org.aspectj.testing.util.TestUtil; | import org.aspectj.testing.util.TestUtil; | ||||
import org.aspectj.org.eclipse.jdt.core.compiler.InvalidInputException; | import org.aspectj.org.eclipse.jdt.core.compiler.InvalidInputException; | ||||
genBuildConfig(new String[] { TEST_DIR + "X.aj", TEST_DIR + "Y.aj"}, messageWriter); | genBuildConfig(new String[] { TEST_DIR + "X.aj", TEST_DIR + "Y.aj"}, messageWriter); | ||||
} | } | ||||
public void testOutxml () { | |||||
IMessageHolder messageHolder = new MessageHandler(); | |||||
AjBuildConfig config = genBuildConfig(new String[] { "-outxml", "-showWeaveInfo" }, messageHolder); | |||||
assertTrue("Warnings: " + messageHolder,!messageHolder.hasAnyMessage(IMessage.WARNING, true)); | |||||
assertEquals("Wrong outxml","META-INF/aop.xml",config.getOutxmlName()); | |||||
assertTrue("Following option currupted",config.getShowWeavingInformation()); | |||||
} | |||||
public void testOutxmlfile () { | |||||
IMessageHolder messageHolder = new MessageHandler(); | |||||
AjBuildConfig config = genBuildConfig(new String[] { "-outxmlfile", "custom/aop.xml", "-showWeaveInfo" }, messageHolder); | |||||
assertTrue("Warnings: " + messageHolder,!messageHolder.hasAnyMessage(IMessage.WARNING, true)); | |||||
assertEquals("Wrong outxml","custom/aop.xml",config.getOutxmlName()); | |||||
assertTrue("Following option currupted",config.getShowWeavingInformation()); | |||||
} | |||||
protected void setUp() throws Exception { | protected void setUp() throws Exception { | ||||
super.setUp(); | super.setUp(); | ||||
} | } |
private String inpath; | private String inpath; | ||||
private String sourceroots; | private String sourceroots; | ||||
private String outjar; | private String outjar; | ||||
private String outxml; | |||||
private String xlintfile; | private String xlintfile; | ||||
private String options; | private String options; | ||||
private String baseDir; | private String baseDir; | ||||
public void setOutjar(String outjar) { | public void setOutjar(String outjar) { | ||||
this.outjar = outjar; | this.outjar = outjar; | ||||
} | } | ||||
/** | |||||
* @return Returns the outxml. | |||||
*/ | |||||
public String getOutxmlfile() { | |||||
return outxml; | |||||
} | |||||
/** | |||||
* @param outxml The the of the aop.xml file to generate | |||||
*/ | |||||
public void setOutxmlfile(String outxml) { | |||||
this.outxml = outxml; | |||||
} | |||||
/** | /** | ||||
* @return Returns the sourceroots. | * @return Returns the sourceroots. | ||||
*/ | */ | ||||
args.append(getOutjar()); | args.append(getOutjar()); | ||||
args.append(" "); | args.append(" "); | ||||
} | } | ||||
if (getOutxmlfile() != null) { | |||||
args.append("-outxmlfile "); | |||||
args.append(getOutxmlfile()); | |||||
args.append(" "); | |||||
} | |||||
if (getOptions() != null) { | if (getOptions() != null) { | ||||
StringTokenizer strTok = new StringTokenizer(getOptions(),","); | StringTokenizer strTok = new StringTokenizer(getOptions(),","); | ||||
while (strTok.hasMoreTokens()) { | while (strTok.hasMoreTokens()) { |
boolean useLtw = false; | boolean useLtw = false; | ||||
if (ltwFile != null) { | if (ltwFile != null) { | ||||
// TODO maw use flag rather than empty file name | |||||
if (ltwFile.trim().length() == 0) return true; | |||||
File from = new File(baseDir,ltwFile); | File from = new File(baseDir,ltwFile); | ||||
File to = new File(sandboxDirectory,"META-INF" + File.separator + "aop.xml"); | File to = new File(sandboxDirectory,"META-INF" + File.separator + "aop.xml"); | ||||
// System.out.println("RunSpec.copyLtwFile() from=" + from.getAbsolutePath() + " to=" + to.getAbsolutePath()); | // System.out.println("RunSpec.copyLtwFile() from=" + from.getAbsolutePath() + " to=" + to.getAbsolutePath()); |
/******************************************************************************* | |||||
* Copyright (c) 2005 Contributors. | |||||
* All rights reserved. | |||||
* This program and the accompanying materials are made available | |||||
* under the terms of the Eclipse Public License v1.0 | |||||
* which accompanies this distribution and is available at | |||||
* http://eclipse.org/legal/epl-v10.html | |||||
* | |||||
* Contributors: | |||||
* Matthew Webster initial implementation | |||||
*******************************************************************************/ | |||||
package pakkage; | |||||
import org.aspectj.lang.JoinPoint; | |||||
public aspect Aspect3 { | |||||
declare precedence : *, Aspect3; | |||||
before () : execution(void Main.test2()){ | |||||
System.err.println("pakkage.Aspect3.before_" + thisJoinPoint.getSignature().getName()); | |||||
} | |||||
} |
public void testITDCtor_pr112783() { runTest("Problem with constructor ITDs");} | public void testITDCtor_pr112783() { runTest("Problem with constructor ITDs");} | ||||
*/ | */ | ||||
//public void testPossibleStaticImports_pr113066() { runTest("possible static imports bug");} | |||||
public void testPossibleStaticImports_pr113066() { runTest("possible static imports bug");} | |||||
public void testBrokenDecp_pr112476() { runTest("binary weaving decp broken");} | public void testBrokenDecp_pr112476() { runTest("binary weaving decp broken");} | ||||
public void testUnboundFormal_pr112027() { runTest("unexpected error unboundFormalInPC");} | public void testUnboundFormal_pr112027() { runTest("unexpected error unboundFormalInPC");} | ||||
public void testNPEScopeSetup_pr115038() { runTest("NPE in ensureScopeSetup");} | public void testNPEScopeSetup_pr115038() { runTest("NPE in ensureScopeSetup");} |
} | } | ||||
public void test001(){ | |||||
runTest("Ensure 1st aspect is rewoven when weaving 2nd aspect"); | |||||
} | |||||
public void test001(){ | |||||
runTest("Ensure 1st aspect is rewoven when weaving 2nd aspect"); | |||||
} | |||||
public void testOutxmlFile (){ | |||||
runTest("Ensure valid aop.xml file is generated"); | |||||
} | |||||
public void testOutxmlJar (){ | |||||
runTest("Ensure valid aop.xml is generated for -outjar"); | |||||
} | |||||
} | } | ||||
</run> | </run> | ||||
</ajc-test> | </ajc-test> | ||||
<ajc-test dir="ltw" | |||||
title="Ensure valid aop.xml file is generated" | |||||
keywords="-outxml"> | |||||
<compile | |||||
files="Main.java" | |||||
outjar="main.jar" | |||||
> | |||||
</compile> | |||||
<compile | |||||
classpath="main.jar" | |||||
files="Aspect1.aj, Aspect2.aj, pakkage/Aspect3.aj" | |||||
outxmlfile="META-INF/aop.xml" | |||||
> | |||||
</compile> | |||||
<run class="Main" ltw=""> | |||||
<stdout> | |||||
<line text="Main.main"/> | |||||
<line text="Main.test1"/> | |||||
<line text="Main.test2"/> | |||||
</stdout> | |||||
<stderr> | |||||
<line text="Aspect1.before_test1"/> | |||||
<line text="Aspect2.before_test2"/> | |||||
<line text="pakkage.Aspect3.before_test2"/> | |||||
</stderr> | |||||
</run> | |||||
</ajc-test> | |||||
<ajc-test dir="ltw" | |||||
title="Ensure valid aop.xml is generated for -outjar" | |||||
keywords="-outxml"> | |||||
<compile | |||||
files="Main.java" | |||||
outjar="main.jar" | |||||
> | |||||
</compile> | |||||
<compile | |||||
classpath="main.jar" | |||||
files="Aspect1.aj, Aspect2.aj, pakkage/Aspect3.aj" | |||||
outjar="aspects.jar" | |||||
options="-outxml" | |||||
> | |||||
</compile> | |||||
<run class="Main" ltw=""> | |||||
<stdout> | |||||
<line text="Main.main"/> | |||||
<line text="Main.test1"/> | |||||
<line text="Main.test2"/> | |||||
</stdout> | |||||
<stderr> | |||||
<line text="Aspect1.before_test1"/> | |||||
<line text="Aspect2.before_test2"/> | |||||
<line text="pakkage.Aspect3.before_test2"/> | |||||
</stderr> | |||||
</run> | |||||
</ajc-test> | |||||