suite.addTestSuite(JarManifestTest.class);
suite.addTestSuite(ExtensionTests.class);
suite.addTestSuite(GenericsTest.class);
+ suite.addTestSuite(OutxmlTest.class);
//$JUnit-END$
return suite;
--- /dev/null
+/* *******************************************************************
+ * 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>
</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.
} 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));
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...
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
this.outputJar = outputJar;
}
+ public void setOutxmlName(String name) {
+ this.outxmlName = name;
+ }
+
public void setInJars(List sourceJars) {
this.inJars = sourceJars;
}
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;
// FIXME asc should this really be in here?
private IHierarchy structureModel;
public AjBuildConfig buildConfig;
+ private List aspectNames = new LinkedList();
AjState state = new AjState(this);
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
}
}
+ 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;
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) {
} else {
writeZipEntry(classFile,filename);
}
+ if (shouldAddAspectName) addAspectName(classname);
} catch (IOException ex) {
IMessage message = EclipseAdapterUtils.makeErrorMessage(
new String(unitResult.fileName),
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);
+ }
+ }
};
}
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;
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();
}
private String inpath;
private String sourceroots;
private String outjar;
+ private String outxml;
private String xlintfile;
private String options;
private String baseDir;
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.
*/
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()) {
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());
--- /dev/null
+/*******************************************************************************
+ * 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 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");}
}
- 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>
</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>
+