Cd_graph{ void checkTerminalBuff(ClassGraph cg){{ flatten(cg); System.out.println("Checking for Terminal Buffer violations. . ."); Strategy sg = new Strategy("from Cd_graph to Opt_labeled_term"); TraversalGraph tg = new TraversalGraph(sg, cg); tg.traverse(this, new Visitor(){ int numTerminalBuff = 0; LinkedList lViolations = new LinkedList(); void before(Opt_labeled_term optLabeled){ String className = optLabeled.get_vertex().get_vertex(). get_vertex_name().toString(); if(optLabeled.isKnownTerminal(className)){ numTerminalBuff++; lViolations.add(className); } } void after(Adjacency adj){ if(numTerminalBuff > 0){ Ident currentSource = adj.get_source().get_vertex_name(); String output = "WARNING: Class " + currentSource + " violates terminal buffer rule: \n"; while(lViolations.size() != 0){ output += (String)lViolations.removeFirst() + " is not "+ "the only part of the class.\n"; } numTerminalBuff = 0; System.out.print(output); } } }); }} } //the following code was adapted from Earl Kidney and Joel Parker's code, who in //turn adapted it from http://www.ccs.neu.edu/research/demeter/DemeterJava/use/latest-demjava/ //* aplib/cd/utils.beh Opt_labeled_term { {{ private static String builtinTypes[] = { "boolean", "char", "byte", "short", "int", "long", "float", "double" }; private static String terminalClasses[] = { // from java.lang.*: "Boolean", "Character", "Integer", "Long", "Float", "Double", "Number", "String", "StringBuffer", // from demeter.*: "Ident", "Text", "Line", "Word" }; }} boolean isBuiltinType(String className) {{ for (int i = 0; i < builtinTypes.length; i++) { if (builtinTypes[i].equals(className)) return true; } return false; }} boolean isTerminalClass(String className) {{ for (int i = 0; i < terminalClasses.length; i++) { if (terminalClasses[i].equals(className)) return true; } return false; }} boolean isKnownTerminal(String className) {{ return isBuiltinType(className) || isTerminalClass(className); }} }