aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraclement <aclement>2005-11-07 10:53:18 +0000
committeraclement <aclement>2005-11-07 10:53:18 +0000
commita625ea2ed4810fb5aa1334c027418d25cfb37834 (patch)
tree6b02edf6c31afafd77ecb4bdc28ca802b4c49596
parente9e0a7be5be07919d74f7da12fa59232a8b81a1e (diff)
downloadaspectj-a625ea2ed4810fb5aa1334c027418d25cfb37834.tar.gz
aspectj-a625ea2ed4810fb5aa1334c027418d25cfb37834.zip
fix for 95516 (-outxml / -outxmlfile) - from Matthew.
-rw-r--r--ajde/testsrc/org/aspectj/ajde/AjdeTests.java1
-rw-r--r--ajde/testsrc/org/aspectj/ajde/OutxmlTest.java93
-rw-r--r--docs/devGuideDB/ajc.xml12
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java10
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java9
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java54
-rw-r--r--org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/ajc/BuildArgParserTestCase.java18
-rw-r--r--testing/newsrc/org/aspectj/testing/CompileSpec.java20
-rw-r--r--testing/newsrc/org/aspectj/testing/RunSpec.java3
-rw-r--r--tests/ltw/pakkage/Aspect3.aj23
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java2
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/ltw/LTWTests.java13
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/ltw/ltw-tests.xml57
13 files changed, 310 insertions, 5 deletions
diff --git a/ajde/testsrc/org/aspectj/ajde/AjdeTests.java b/ajde/testsrc/org/aspectj/ajde/AjdeTests.java
index dfe880ddb..461dfc52f 100644
--- a/ajde/testsrc/org/aspectj/ajde/AjdeTests.java
+++ b/ajde/testsrc/org/aspectj/ajde/AjdeTests.java
@@ -59,6 +59,7 @@ public class AjdeTests extends TestCase {
suite.addTestSuite(JarManifestTest.class);
suite.addTestSuite(ExtensionTests.class);
suite.addTestSuite(GenericsTest.class);
+ suite.addTestSuite(OutxmlTest.class);
//$JUnit-END$
return suite;
diff --git a/ajde/testsrc/org/aspectj/ajde/OutxmlTest.java b/ajde/testsrc/org/aspectj/ajde/OutxmlTest.java
new file mode 100644
index 000000000..2ccb66b2d
--- /dev/null
+++ b/ajde/testsrc/org/aspectj/ajde/OutxmlTest.java
@@ -0,0 +1,93 @@
+/* *******************************************************************
+ * 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());
+ }
+ }
+
+}
diff --git a/docs/devGuideDB/ajc.xml b/docs/devGuideDB/ajc.xml
index ea2cab2da..ef3438987 100644
--- a/docs/devGuideDB/ajc.xml
+++ b/docs/devGuideDB/ajc.xml
@@ -108,6 +108,18 @@
</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>
<term>-incremental</term>
<listitem><para>Run the compiler continuously.
After the initial compilation, the compiler will
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java
index 84498d494..74135e9b6 100644
--- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java
+++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java
@@ -492,6 +492,16 @@ public class BuildArgParser extends Main {
} else {
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")){
// remove it as it's already been handled in org.aspectj.tools.ajc.Main
args.remove(args.get(nextArgIndex));
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java
index d5f80f1a8..8b5cf2132 100644
--- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java
+++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java
@@ -42,6 +42,7 @@ public class AjBuildConfig {
private File outputDir;
private File outputJar;
+ private String outxmlName;
private List/*File*/ sourceRoots = new ArrayList();
private List/*File*/ files = new ArrayList();
private List /*File*/ binaryFiles = new ArrayList(); // .class files in indirs...
@@ -165,6 +166,10 @@ public class AjBuildConfig {
public File getOutputJar() {
return outputJar;
}
+
+ public String getOutxmlName() {
+ return outxmlName;
+ }
public List/*File*/ getInpath() {
// Elements of the list are either archives (jars/zips) or directories
@@ -183,6 +188,10 @@ public class AjBuildConfig {
this.outputJar = outputJar;
}
+ public void setOutxmlName(String name) {
+ this.outxmlName = name;
+ }
+
public void setInJars(List sourceJars) {
this.inJars = sourceJars;
}
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java
index bbcb8ea9b..9cb561ea2 100644
--- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java
+++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java
@@ -14,15 +14,18 @@
package org.aspectj.ajdt.internal.core.builder;
import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
+import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -125,6 +128,7 @@ public class AjBuildManager implements IOutputClassFileNameProvider,IBinarySourc
// FIXME asc should this really be in here?
private IHierarchy structureModel;
public AjBuildConfig buildConfig;
+ private List aspectNames = new LinkedList();
AjState state = new AjState(this);
@@ -281,6 +285,11 @@ public class AjBuildManager implements IOutputClassFileNameProvider,IBinarySourc
state.successfulCompile(buildConfig,batch);
copyResourcesToDestination();
+
+ if (buildConfig.getOutxmlName() != null) {
+ writeOutxmlFile();
+ }
+
/*boolean weaved = *///weaveAndGenerateClassFiles();
// if not weaved, then no-op build, no model changes
// but always returns true
@@ -480,7 +489,38 @@ public class AjBuildManager implements IOutputClassFileNameProvider,IBinarySourc
}
}
+ 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() {
// IRelationshipMap irm = AsmManager.getDefault().getRelationshipMap();
// int ctr = 1;
@@ -792,11 +832,13 @@ public class AjBuildManager implements IOutputClassFileNameProvider,IBinarySourc
public void acceptResult(CompilationResult unitResult) {
// end of compile, must now write the results to the output destination
// 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();
+ boolean shouldAddAspectName = (buildConfig.getOutxmlName() != null);
for (Iterator iter = classFiles.iterator(); iter.hasNext();) {
ClassFile classFile = (ClassFile) iter.next();
String filename = new String(classFile.fileName());
+ String classname = filename.replace('/', '.');
filename = filename.replace('/', File.separatorChar) + ".class";
try {
if (buildConfig.getOutputJar() == null) {
@@ -804,6 +846,7 @@ public class AjBuildManager implements IOutputClassFileNameProvider,IBinarySourc
} else {
writeZipEntry(classFile,filename);
}
+ if (shouldAddAspectName) addAspectName(classname);
} catch (IOException ex) {
IMessage message = EclipseAdapterUtils.makeErrorMessage(
new String(unitResult.fileName),
@@ -854,6 +897,15 @@ public class AjBuildManager implements IOutputClassFileNameProvider,IBinarySourc
zos.write(classFile.getBytes());
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);
+ }
+ }
};
}
diff --git a/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/ajc/BuildArgParserTestCase.java b/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/ajc/BuildArgParserTestCase.java
index a020afe9f..e207fe91c 100644
--- a/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/ajc/BuildArgParserTestCase.java
+++ b/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/ajc/BuildArgParserTestCase.java
@@ -21,6 +21,8 @@ import org.aspectj.ajdt.internal.core.builder.*;
import org.aspectj.bridge.CountingMessageHandler;
import org.aspectj.bridge.IMessage;
import org.aspectj.bridge.IMessageHandler;
+import org.aspectj.bridge.IMessageHolder;
+import org.aspectj.bridge.MessageHandler;
import org.aspectj.bridge.MessageWriter;
import org.aspectj.testing.util.TestUtil;
import org.aspectj.org.eclipse.jdt.core.compiler.InvalidInputException;
@@ -490,6 +492,22 @@ public class BuildArgParserTestCase extends TestCase {
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 {
super.setUp();
}
diff --git a/testing/newsrc/org/aspectj/testing/CompileSpec.java b/testing/newsrc/org/aspectj/testing/CompileSpec.java
index 1b50387b0..6b98a6822 100644
--- a/testing/newsrc/org/aspectj/testing/CompileSpec.java
+++ b/testing/newsrc/org/aspectj/testing/CompileSpec.java
@@ -37,6 +37,7 @@ public class CompileSpec implements ITestStep {
private String inpath;
private String sourceroots;
private String outjar;
+ private String outxml;
private String xlintfile;
private String options;
private String baseDir;
@@ -166,6 +167,20 @@ public class CompileSpec implements ITestStep {
public void setOutjar(String 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.
*/
@@ -212,6 +227,11 @@ public class CompileSpec implements ITestStep {
args.append(getOutjar());
args.append(" ");
}
+ if (getOutxmlfile() != null) {
+ args.append("-outxmlfile ");
+ args.append(getOutxmlfile());
+ args.append(" ");
+ }
if (getOptions() != null) {
StringTokenizer strTok = new StringTokenizer(getOptions(),",");
while (strTok.hasMoreTokens()) {
diff --git a/testing/newsrc/org/aspectj/testing/RunSpec.java b/testing/newsrc/org/aspectj/testing/RunSpec.java
index 0716b8362..891600dbf 100644
--- a/testing/newsrc/org/aspectj/testing/RunSpec.java
+++ b/testing/newsrc/org/aspectj/testing/RunSpec.java
@@ -130,6 +130,9 @@ public class RunSpec implements ITestStep {
boolean useLtw = false;
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 to = new File(sandboxDirectory,"META-INF" + File.separator + "aop.xml");
// System.out.println("RunSpec.copyLtwFile() from=" + from.getAbsolutePath() + " to=" + to.getAbsolutePath());
diff --git a/tests/ltw/pakkage/Aspect3.aj b/tests/ltw/pakkage/Aspect3.aj
new file mode 100644
index 000000000..08894259e
--- /dev/null
+++ b/tests/ltw/pakkage/Aspect3.aj
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * 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());
+ }
+}
diff --git a/tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java b/tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java
index 3a7560290..915c55794 100644
--- a/tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java
+++ b/tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java
@@ -51,7 +51,7 @@ public class Ajc150Tests extends org.aspectj.testing.XMLBasedAjcTestCase {
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 testUnboundFormal_pr112027() { runTest("unexpected error unboundFormalInPC");}
public void testNPEScopeSetup_pr115038() { runTest("NPE in ensureScopeSetup");}
diff --git a/tests/src/org/aspectj/systemtest/ajc150/ltw/LTWTests.java b/tests/src/org/aspectj/systemtest/ajc150/ltw/LTWTests.java
index 543d586e8..3b489cf07 100644
--- a/tests/src/org/aspectj/systemtest/ajc150/ltw/LTWTests.java
+++ b/tests/src/org/aspectj/systemtest/ajc150/ltw/LTWTests.java
@@ -28,8 +28,15 @@ public class LTWTests extends org.aspectj.testing.XMLBasedAjcTestCase {
}
- 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");
+ }
}
diff --git a/tests/src/org/aspectj/systemtest/ajc150/ltw/ltw-tests.xml b/tests/src/org/aspectj/systemtest/ajc150/ltw/ltw-tests.xml
index 0e818afbf..34f2f3dab 100644
--- a/tests/src/org/aspectj/systemtest/ajc150/ltw/ltw-tests.xml
+++ b/tests/src/org/aspectj/systemtest/ajc150/ltw/ltw-tests.xml
@@ -30,4 +30,61 @@
</run>
</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>
+