Main { {{ public static ClassGraph cg = new ClassGraph(true,false); public static final String FIDENT = " edu.neu.ccs.demeter.Ident "; public static void main(String args[]) throws Exception { //cg = new ClassGraph(true,false); Cd_graph m = Cd_graph.parse(System.in); m.initialize(); //m.display(); System.out.println(); //System.out.println(cg); } }} } Cd_graph { {{ static Map adjs = new HashMap(); public static final String bypassed = " bypassing {Strategy, TraversalGraph, ClassGraph, String, Map} "; public static final Strategy allAdjsStrategy = new Strategy("from Cd_graph to Adjacency"); public static final Strategy flatteningStrategy = new Strategy("from Cd_graph to {Construct_ns, Alternat_ns}" + bypassed); public static final TraversalGraph flatteningGraph = new TraversalGraph(flatteningStrategy, Main.cg); void initialize() { TraversalGraph tg = new TraversalGraph(allAdjsStrategy, Main.cg); Iterator iter = tg.asList(this).iterator(); Adjacency adj; for(;iter.hasNext();) { adj = (Adjacency)iter.next(); adjs.put(adj.getName(), adj); } } void flatten() { flatteningGraph.traverse(this, new FlatteningVisitor(adjs)); } }} } Adjacency { {{ public static final String bypassed = " bypassing {Strategy, TraversalGraph, ClassGraph, String} "; public static final Strategy nameStrategy = new Strategy("from Vertex to" + Main.FIDENT + bypassed); public static final TraversalGraph nameGraph = new TraversalGraph(nameStrategy, Main.cg); String getName() { return nameGraph.fetch(get_source()).toString(); } void addPart(String partName) { ns.addPart(partName); } }} } Neighbors { {{ void addPart(String partName) {} }} } Construct_ns { {{ public static final String bypassed = " bypassing {Strategy, TraversalGraph, ClassGraph, String, Set}"; public static final Strategy partStrategy = new Strategy("from Construct_ns to {Regular, Labeled}" + bypassed); public static final TraversalGraph partGraph = new TraversalGraph(partStrategy, Main.cg); Set parts = new HashSet(); boolean gotParts = false; Set getParts() { if (! gotParts) partGraph.traverse(this, new PartGatherVisitor(parts)); return parts; } void addPart(String partName) { if (parts.contains(partName)) throw new RuntimeException(); parts.add(partName); } void flatten() { getParts(); } }} } Alternat_ns { {{ public static final String bypassed = " bypassing {Strategy, TraversalGraph, ClassGraph, String, Set}"; public static final Strategy partStrategy = new Strategy("from Alternat_ns to {Regular, Labeled}" + bypassed); public static final Strategy subclassStrategy = new Strategy("from Alternat_ns to Vertex" + bypassed); public static final TraversalGraph partGraph = new TraversalGraph(partStrategy, Main.cg); public static final TraversalGraph subclassGraph = new TraversalGraph(subclassStrategy, Main.cg); Set parts = new HashSet(); Set subclasses = new HashSet(); boolean gotParts = false; boolean gotSubclasses = false; Set getParts() { if (! gotParts) { partGraph.traverse(this, new PartGatherVisitor(parts)); gotParts = true; } return parts; } Set getSubclasses() { if (! gotSubclasses) { subclassGraph.traverse(this, new SubclassGatherVisitor(subclasses)); gotSubclasses = true; } return subclasses; } void addPart(String partName) { Iterator iter = getSubclasses().iterator(); for(;iter.hasNext();) { ((Adjacency)Cd_graph.adjs.get(iter.next())).addPart(partName); } } void flatten() { Iterator pIter = getParts().iterator(); Iterator sIter = getSubclasses().iterator(); for (;pIter.hasNext();) { for (sIter = getSubclasses().iterator();sIter.hasNext();) { ((Adjacency)Cd_graph.adjs.get(sIter.next())).addPart(pIter.next().toString()); } } } }} } FlatteningVisitor { {{ Map adjs; FlatteningVisitor(Map adjacencies) { adjs = adjacencies; } void before(Construct_ns host) { host.flatten(); } void before(Alternat_ns host) { host.flatten(); } }} } PartGatherVisitor { {{ Set partStorage; PartGatherVisitor(Set store) { partStorage = store; } void before(Regular host) { String name = host.get_vertex().get_vertex().get_vertex_name().toString(); if (partStorage.contains(name)) throw new RuntimeException(); partStorage.add(name); } }} } SubclassGatherVisitor { {{ Set subclassStorage; SubclassGatherVisitor(Set store) { subclassStorage = store; } void before(Vertex host) { String name = host.get_vertex_name().toString(); if (subclassStorage.contains(name)) throw new RuntimeException(); subclassStorage.add(name); } }} }