// The behavior file for Processing Class Graph and traversals // accessor methods for class graph ClassGraphDecl { // retrieve the string for the class graph variable public String getClassGraphVar() to ClassGraphVar { {{ String return_val = null; }} before ClassGraphVar {{ return_val = host.get_cgName().toString(); }} return String {{ return_val }} } } ClassGraphSliceDecl { public String getStrategy() to TraversalStrategy { {{ String return_val = null; }} before TraversalStrategy {{ return_val = host.get_s(); }} return String {{ return_val }} } } TraversalDecl { public String getClassGraphVar() to ClassGraphVar { {{ String return_val = null; }} before ClassGraphVar {{ return_val = host.get_cgName().toString(); }} return String {{ return_val }} } } TraversalAspectList { {{ static public boolean debug = false; }} public Hashtable processClassGraphTraversals(ClassGraph cg, File dir) to {TraversalDecl, ClassGraphSliceDecl, DefaultClassGraphDecl, VisitorDecl} { // initialize the hashtable {{ Hashtable cgEnv = new Hashtable(); }} {{ Hashtable visitorEnv = new Hashtable(); }} {{ AspectJTraversal ajt = null; }} // put stuff in the visitor env hastable for // each visitor declared before VisitorDecl {{ String visitorTypeName = host.get_visitorvar().get_ident().toString(); Class visitor = null; try { visitor = Class.forName(visitorTypeName); } catch (ClassNotFoundException ex) { System.out.println(ex); } VisitorClass vc = VisitorClass.fromClass(visitor); visitorEnv.put(visitorTypeName, vc); }} // initialize the AspectJTraversal generator before TraversalAspect {{ ajt = new AspectJTraversal(); }} after TraversalAspect {{ String aspName = host.get_aspectname().get_aname().toString(); //System.out.println("aspect name : " + aspName); ajt.setAspectName(aspName); try { ajt.toFile(new File(dir, ajt.getAspectName() + ".java")); if (TraversalAspectList.debug) System.out.println("New traversal file: \n" + ajt.toString()); } catch (IOException e) { System.out.println("Could not open file"); System.out.println(e); } }} before DefaultClassGraphDecl {{ String cgVar = host.getClassGraphVar(); if (TraversalAspectList.debug) System.out.println("Adding new default class graph " + cgVar); cgEnv.put(cgVar, cg); }} before ClassGraphSliceDecl {{ String cgVar = host.getClassGraphVar(); String superCGVar = host.get_supercg().toString(); ClassGraph superCG = (ClassGraph) cgEnv.get(superCGVar); String strategy = host.getStrategy(); if (superCG == null) { System.out.println("Error no Class Graph with name " + superCGVar + " declared."); System.out.println(cgEnv); } else { ClassGraph newCG = new ClassGraph(superCG, strategy); if (TraversalAspectList.debug) System.out.println("Adding new class graph " + cgVar + " = " + superCGVar + " + " + strategy); cgEnv.put(cgVar, newCG); } }} before TraversalDecl {{ ClassGraph thisCG = null; String classGraphVar = host.getClassGraphVar(); if (classGraphVar == null) thisCG = cg; else { // look in the hashtabel for the class graph thisCG = (ClassGraph) cgEnv.get(classGraphVar); if (thisCG == null) { System.out.println("Unknown class graph variable: " + classGraphVar); System.out.println(cgEnv); } } String visitorName = host.getVisitorTypeString(); String tname = host.getVarString(); String strategyStr = host.getStrategy(); if (visitorName.compareTo("") != 0) { VisitorClass visitor = (VisitorClass) visitorEnv.get(visitorName); if (visitor != null) { String visitorCode = visitor.toAspectJCode(tname, visitorName, AspectJTraversal.getSourceClassFromStrategy(strategyStr)); ajt.appendToTraversalCode(visitorCode); } else { System.out.println("%Error: Visitor passed to traversal " + tname + " has not \n" + "been declared.... Visitor = " + visitorName); } } try { String code = ajt.processTraversal(thisCG, host.getVarString(), host.getStrategy()); if (TraversalAspectList.debug) System.out.println("new generated code: \n" + code); } catch (edu.neu.ccs.demeter.aplib.NoSuchClassGraphNodeException e) { System.out.println(e); System.out.println("Error while Processing traversal " + host.getVarString()); } }} return Hashtable {{ cgEnv }} } }