From 5130e9dbb7ad9b806475355d8c2861eb57085656 Mon Sep 17 00:00:00 2001 From: mkersten Date: Tue, 27 Jul 2004 17:34:34 +0000 Subject: [PATCH] ASM Usage and extension examples, implemented as test cases and made available in the sandbox as an Eclipse project. --- docs/sandbox/api-clients/.classpath | 14 ++ docs/sandbox/api-clients/.project | 17 +++ .../samples/AffectedFilesReporter.java | 129 ------------------ .../AsmHierarchyBuilderExtensionTest.java | 67 +++++++++ .../samples/AsmRelationshipMapUsageTest.java | 81 +++++++++++ .../aspectj/samples/JoinPointCollector.java | 70 ---------- docs/sandbox/api-clients/readme.html | 0 7 files changed, 179 insertions(+), 199 deletions(-) create mode 100644 docs/sandbox/api-clients/.classpath create mode 100644 docs/sandbox/api-clients/.project delete mode 100644 docs/sandbox/api-clients/org/aspectj/samples/AffectedFilesReporter.java create mode 100644 docs/sandbox/api-clients/org/aspectj/samples/AsmHierarchyBuilderExtensionTest.java create mode 100644 docs/sandbox/api-clients/org/aspectj/samples/AsmRelationshipMapUsageTest.java delete mode 100644 docs/sandbox/api-clients/org/aspectj/samples/JoinPointCollector.java create mode 100644 docs/sandbox/api-clients/readme.html diff --git a/docs/sandbox/api-clients/.classpath b/docs/sandbox/api-clients/.classpath new file mode 100644 index 000000000..66888ff8c --- /dev/null +++ b/docs/sandbox/api-clients/.classpath @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/docs/sandbox/api-clients/.project b/docs/sandbox/api-clients/.project new file mode 100644 index 000000000..283272647 --- /dev/null +++ b/docs/sandbox/api-clients/.project @@ -0,0 +1,17 @@ + + + sandbox-api-clients + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/docs/sandbox/api-clients/org/aspectj/samples/AffectedFilesReporter.java b/docs/sandbox/api-clients/org/aspectj/samples/AffectedFilesReporter.java deleted file mode 100644 index 26572684f..000000000 --- a/docs/sandbox/api-clients/org/aspectj/samples/AffectedFilesReporter.java +++ /dev/null @@ -1,129 +0,0 @@ -/* @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 list 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 { - - /* - * Walk down asm hierarchy, looking for source files, - * and check if any of their children has a relation of - * kind ADVICE or INTER_TYPE_DECLARATION - */ - - /** - * 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 LinkedList(); - List /*IProgramElement*/ newNodes = new LinkedList(); - // 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 LinkedList(); - List /*IProgramElement*/ newNodes = new LinkedList(); - 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 diff --git a/docs/sandbox/api-clients/org/aspectj/samples/AsmHierarchyBuilderExtensionTest.java b/docs/sandbox/api-clients/org/aspectj/samples/AsmHierarchyBuilderExtensionTest.java new file mode 100644 index 000000000..acef32cf0 --- /dev/null +++ b/docs/sandbox/api-clients/org/aspectj/samples/AsmHierarchyBuilderExtensionTest.java @@ -0,0 +1,67 @@ +/* ******************************************************************* + * Copyright (c) 2004 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: + * Mik Kersten initial implementation + * ******************************************************************/ + package org.aspectj.samples; + +import java.util.ArrayList; + +import org.aspectj.ajde.AjdeTestCase; +import org.aspectj.ajdt.internal.core.builder.AjBuildManager; +import org.aspectj.ajdt.internal.core.builder.AsmHierarchyBuilder; +import org.aspectj.asm.AsmManager; +import org.aspectj.asm.IProgramElement; +import org.aspectj.asm.internal.ProgramElement; +import org.eclipse.jdt.internal.compiler.ast.MessageSend; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; + +/** + * This test demonstrates how hierarchy building in the ASM can be extended + * to put additional information in the model, for example method call sites. + * + * @author Mik Kersten + */ +public class AsmHierarchyBuilderExtensionTest extends AjdeTestCase { + + private ExtendedAsmHiearchyBuilder builder = new ExtendedAsmHiearchyBuilder(); + + public void testHiearchyExtension() { + assertNotNull(AsmManager.getDefault().getHierarchy().getRoot()); + System.out.println(AsmManager.getDefault().getHierarchy().getRoot().toLongString()); + } + + protected void setUp() throws Exception { + super.setUp("examples"); + AjBuildManager.setAsmHierarchyBuilder(builder); // NOTE that we set our builder here + assertTrue("build success", doSynchronousBuild("../examples/coverage/coverage.lst")); + } +} + +class ExtendedAsmHiearchyBuilder extends AsmHierarchyBuilder { + + public boolean visit(MessageSend messageSend, BlockScope scope) { + IProgramElement peNode = new ProgramElement( + new String(">>> found call: " + messageSend.toString()), + IProgramElement.Kind.CODE, + null, //makeLocation(messageSend), + 0, + "", + new ArrayList()); +// peNode.setCorrespondingType(messageSend.typ ieldDeclaration.type.toString()); +// peNode.setSourceSignature(genSourceSignature(fieldDeclaration)); + ((IProgramElement)stack.peek()).addChild(peNode); + stack.push(peNode); + return true; + } + public void endVisit(MessageSend messageSend, BlockScope scope) { + stack.pop(); + } + +} diff --git a/docs/sandbox/api-clients/org/aspectj/samples/AsmRelationshipMapUsageTest.java b/docs/sandbox/api-clients/org/aspectj/samples/AsmRelationshipMapUsageTest.java new file mode 100644 index 000000000..a35cda577 --- /dev/null +++ b/docs/sandbox/api-clients/org/aspectj/samples/AsmRelationshipMapUsageTest.java @@ -0,0 +1,81 @@ +/* ******************************************************************* + * Copyright (c) 2004 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: + * Mik Kersten initial implementation + * ******************************************************************/ + +package org.aspectj.samples; + +import java.util.Iterator; +import java.util.List; + +import org.aspectj.ajde.AjdeTestCase; +import org.aspectj.ajdt.internal.core.builder.AjBuildManager; +import org.aspectj.asm.*; + +/** + * Collects join point information for all advised methods and constructors. + * + * @author Mik Kersten + */ +public class AsmRelationshipMapUsageTest extends AjdeTestCase { + + public void testFindAdvisedMethods() { + System.out.println("----------------------------------"); + System.out.println("Methods affected by advice: "); + HierarchyWalker walker = new HierarchyWalker() { + public void preProcess(IProgramElement node) { + if (node.getKind().equals(IProgramElement.Kind.METHOD)) { + List relations = AsmManager.getDefault().getRelationshipMap().get(node); + if (relations != null) { + for (Iterator it = relations.iterator(); it.hasNext(); ) { + IRelationship relationship = (IRelationship)it.next(); + if (relationship.getKind().equals(IRelationship.Kind.ADVICE)) { + System.out.println( + "method: " + node.toString() + + ", advised by: " + relationship.getTargets()); + } + } + } + } + } + }; + AsmManager.getDefault().getHierarchy().getRoot().walk(walker); + } + + public void testListFilesAffectedByInterTypeDecs() { + System.out.println("----------------------------------"); + System.out.println("Files affected by inter type declarations: "); + HierarchyWalker walker = new HierarchyWalker() { + public void preProcess(IProgramElement node) { + if (node.getKind().equals(IProgramElement.Kind.CLASS)) { + List relations = AsmManager.getDefault().getRelationshipMap().get(node); + if (relations != null) { + for (Iterator it = relations.iterator(); it.hasNext(); ) { + IRelationship relationship = (IRelationship)it.next(); + if (relationship.getKind().equals(IRelationship.Kind.DECLARE_INTER_TYPE)) { + System.out.println( + "file: " + node.getSourceLocation().getSourceFile().getName() + + ", declared on by: " + relationship.getTargets()); + } + } + } + } + } + }; + AsmManager.getDefault().getHierarchy().getRoot().walk(walker); + } + + + protected void setUp() throws Exception { + super.setUp("examples"); + assertTrue("build success", doSynchronousBuild("../examples/spacewar/spacewar/debug.lst")); + } +} + diff --git a/docs/sandbox/api-clients/org/aspectj/samples/JoinPointCollector.java b/docs/sandbox/api-clients/org/aspectj/samples/JoinPointCollector.java deleted file mode 100644 index cf1c6a4d5..000000000 --- a/docs/sandbox/api-clients/org/aspectj/samples/JoinPointCollector.java +++ /dev/null @@ -1,70 +0,0 @@ -/* @author Mik Kersten */ - -// WTI sample broke with API updates in 1.1.1 -// START-BROKEN-SAMPLE api-ajde-modelWalker Walk model to collect join point information for advised methods and constructors -package org.aspectj.samples; - -import java.util.*; -import org.aspectj.tools.ajc.Main; - - -import org.aspectj.asm.*; - -/** - * Collects join point information for all advised methods and constructors. - * - * @author Mik Kersten - */ -public class JoinPointCollector extends Main { - - /** - * @param args - */ - public static void main(String[] args) { - String[] newArgs = new String[args.length +1]; - newArgs[0] = "-emacssym"; - for (int i = 0; i < args.length; i++) { - newArgs[i+1] = args[i]; - } - new JoinPointCollector().runMain(newArgs, false); - } - - public void runMain(String[] args, boolean useSystemExit) { - super.runMain(args, useSystemExit); - - ModelWalker walker = new ModelWalker() { - public void preProcess(StructureNode node) { - ProgramElementNode p = (ProgramElementNode)node; - - // first check if it is a method or constructor - if (p.getProgramElementKind().equals(ProgramElementNode.Kind.METHOD)) { - - // now check if it is advsied - for (Iterator it = p.getRelations().iterator(); it.hasNext(); ) { - - RelationNode relationNode = (RelationNode)it.next(); - Relation relation = relationNode.getRelation(); - if (relation == AdviceAssociation.METHOD_RELATION) { - System.out.println("method: " + p.toString() + ", advised by: " + relationNode.getChildren()); - } - } - } - - // code around the fact that constructor advice relationship is on the type - if (p.getProgramElementKind().equals(ProgramElementNode.Kind.CONSTRUCTOR)) { - for (Iterator it = ((ProgramElementNode)p.getParent()).getRelations().iterator(); it.hasNext(); ) { - RelationNode relationNode = (RelationNode)it.next(); - Relation relation = relationNode.getRelation(); - if (relation == AdviceAssociation.CONSTRUCTOR_RELATION) { - System.out.println("constructor: " + p.toString() + ", advised by: " + relationNode.getChildren()); - } - } - } - } - }; - - StructureModelManager.getDefault().getStructureModel().getRoot().walk(walker); - } -} -//END-BROKEN-SAMPLE api-ajde-modelWalker - diff --git a/docs/sandbox/api-clients/readme.html b/docs/sandbox/api-clients/readme.html new file mode 100644 index 000000000..e69de29bb -- 2.39.5