From 9af6b62b36884bcffc8a1ceeb6e5490a651afcc8 Mon Sep 17 00:00:00 2001 From: wisberg Date: Sat, 6 Sep 2003 00:33:02 +0000 Subject: sample api code to list affected files --- .../org/aspectj/samples/AffectedFilesReporter.java | 124 +++++++++++++++++++++ docs/sandbox/sandbox-api-test.xml | 12 +- 2 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 docs/sandbox/api-clients/org/aspectj/samples/AffectedFilesReporter.java (limited to 'docs/sandbox') diff --git a/docs/sandbox/api-clients/org/aspectj/samples/AffectedFilesReporter.java b/docs/sandbox/api-clients/org/aspectj/samples/AffectedFilesReporter.java new file mode 100644 index 000000000..0a0a0a4e6 --- /dev/null +++ b/docs/sandbox/api-clients/org/aspectj/samples/AffectedFilesReporter.java @@ -0,0 +1,124 @@ +/* @author Wes Isberg */ + +// START-SAMPLE api-asm-listAffectedFiles Walk model to list affected files + +package org.aspectj.samples; + +import org.aspectj.tools.ajc.Main; +import org.aspectj.asm.*; +import org.aspectj.bridge.*; + +import java.io.*; +import java.util.*; + + +/** + * Run ajc and write "affected.lst" file listing those files + * affected by advice or inter-type declarations. + * + * WARNING: Does not emit info messages for uses-pointcut dependencies. + * @author Wes Isberg + */ +public class AffectedFilesReporter implements Runnable { + + /** + * Wrapper for ajc that emits list of affected files. + * @param args the String[] of args for ajc, + * optionally prefixed with -to {file} + * @throws IOException if unable to write to {file} + */ + public static void main(String[] args) throws IOException { + Main main = new Main(); + PrintStream toConfig = System.out; + FileOutputStream fin = null; + if ((args.length > 1) && ("-to".equals(args[0]))) { + File config = new File(args[1]); + fin = new FileOutputStream(config); + toConfig = new PrintStream(fin, true); + String[] temp = new String[args.length-2]; + System.arraycopy(args, 2, temp, 0, temp.length); + args = temp; + } + Runnable runner = new AffectedFilesReporter(toConfig); + main.setCompletionRunner(runner); + // should add -emacssym to args if not already there + main.runMain(args, false); + if (null != fin) { + fin.close(); + } + } + + final PrintStream sink; + + public AffectedFilesReporter(PrintStream sink) { + this.sink = (null == sink ? System.out : sink); + } + + public void run() { + IHierarchy hierarchy = AsmManager.getDefault().getHierarchy(); + if (null == hierarchy) { + sink.println("# no structure model - use -emacssym option"); + return; + } + List /*IProgramElement*/ nodes = new ArrayList(); + List /*IProgramElement*/ newNodes = new ArrayList(); + // root could be config file or blank root - either way, use kids + nodes.addAll(hierarchy.getRoot().getChildren()); + while (0 < nodes.size()) { + for (ListIterator it = nodes.listIterator(); it.hasNext();) { + IProgramElement node = (IProgramElement) it.next(); + if (node.getKind().isSourceFileKind()) { + if (isAffected(node)) { + ISourceLocation loc = node.getSourceLocation(); + sink.println(loc.getSourceFile().getPath()); + } + } else { + // XXX uncertain of structure - traverse all?? + newNodes.addAll(node.getChildren()); + } + it.remove(); + } + nodes.addAll(newNodes); + newNodes.clear(); + } + } + + /** + * Return true if this file node is affected by any aspects. + * Recursively search children for any effect, + * and halt on first affect found. + * @param node the IProgramElementNode for a source file + * @return true if affected. + */ + private boolean isAffected(final IProgramElement fileNode) { + final IRelationshipMap map = + AsmManager.getDefault().getRelationshipMap(); + List /*IProgramElement*/ nodes = new ArrayList(); + List /*IProgramElement*/ newNodes = new ArrayList(); + nodes.add(fileNode); + while (0 < nodes.size()) { + for (ListIterator iter = nodes.listIterator(); + iter.hasNext();) { + IProgramElement node = (IProgramElement) iter.next(); + List relations = map.get(node); + if (null != relations) { + for (Iterator riter = relations.iterator(); + riter.hasNext();) { + IRelationship.Kind kind = + ((IRelationship) riter.next()).getKind(); + if ((kind == IRelationship.Kind.ADVICE) + || (kind == IRelationship.Kind.DECLARE_INTER_TYPE)) { + return true; + } + } + } + iter.remove(); + newNodes.addAll(node.getChildren()); + } + nodes.addAll(newNodes); + newNodes.clear(); + } + return false; + } +} +// END-SAMPLE api-asm-listAffectedFiles Walk model to list affected files diff --git a/docs/sandbox/sandbox-api-test.xml b/docs/sandbox/sandbox-api-test.xml index 959272592..1c19e6e9c 100644 --- a/docs/sandbox/sandbox-api-test.xml +++ b/docs/sandbox/sandbox-api-test.xml @@ -14,13 +14,23 @@ + comment="BROKEN - function unvalidated, only that it compiles and runs"> + + + + + \ No newline at end of file -- cgit v1.2.3