]> source.dussan.org Git - aspectj.git/commitdiff
sample api code to list affected files
authorwisberg <wisberg>
Sat, 6 Sep 2003 00:33:02 +0000 (00:33 +0000)
committerwisberg <wisberg>
Sat, 6 Sep 2003 00:33:02 +0000 (00:33 +0000)
docs/sandbox/api-clients/org/aspectj/samples/AffectedFilesReporter.java [new file with mode: 0644]
docs/sandbox/sandbox-api-test.xml

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 (file)
index 0000000..0a0a0a4
--- /dev/null
@@ -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
index 959272592f34d63c33898a7a01b5dcd91afa88c9..1c19e6e9c913dddd91cc524ffc095fb020e850cd 100644 (file)
 <suite>
                
        <ajc-test dir="api-clients" title="api-ajde-modelWalker"
-               comment="function unvalidated, only that it compiles and runs">
+               comment="BROKEN - function unvalidated, only that it compiles and runs">
                <compile files="org/aspectj/samples/JoinPointCollector.java"
                        classpath="../../../aj-build/dist/tools/lib/aspectjtools.jar"/>
                <run class="org/aspectj/samples/JoinPointCollector"
                        options="-help"/>
                </ajc-test>
 
+       <ajc-test dir="api-clients" title="api-asm-listAffectedFiles"
+               comment="function unvalidated; note run paths are relative to harness cwd">
+               <compile files="org/aspectj/samples/AffectedFilesReporter.java"
+                       classpath="../../../aj-build/dist/tools/lib/aspectjtools.jar"/>
+               <run class="org/aspectj/samples/AffectedFilesReporter"
+            outStreamIsError="true"
+                       options="-emacssym,@../aj-build/dist/docs/doc/examples/tracing/notrace.lst"/>
+               <run class="org/aspectj/samples/AffectedFilesReporter"
+                       options="-emacssym,@../aj-build/dist/docs/doc/examples/tracing/tracev3.lst"/>
+               </ajc-test>
 </suite>
 
        
\ No newline at end of file