Cd_graph { void print() to * (PrintVisitor); } Cd_graph { (@ public static final Strategy sCdGraphAlt = new Strategy("from Cd_graph through Neighbors to Alternat_ns"); public static final Strategy sCdGraphTerm = new Strategy("from Cd_graph through Alternat_ns to Normal"); private boolean proceedToInherCycle = true; public void undefinedClasses(){ System.out.println("-------Running Undefined Class Check--------"); TraversalGraph tg1 = new TraversalGraph("from Cd_graph bypassing Neighbors to Vertex", Main.cg1); TraversalGraph tg2 = new TraversalGraph("from Cd_graph through Neighbors to Vertex", Main.cg1); VertexVisitor v1 = new VertexVisitor(); VertexVisitor v2 = new VertexVisitor(); tg1.traverse(this, v1); HashSet leftNodes = (HashSet) v1.getReturnValue(); tg2.traverse(this, v2); HashSet rightNodes = (HashSet) v2.getReturnValue(); Iterator i_right = rightNodes.iterator(); boolean pass = true; while (i_right.hasNext()) { Ident id = (Ident) i_right.next(); if (!leftNodes.contains(id)) { System.out.println("Class "+id.toString()+" is not defined in the cd"); pass = false; } } if (pass) System.out.println("Undefined Class Check pass."); } public void uniqueParts() { System.out.println("---------Running Unique Part Check----------"); String s = "from Cd_graph to Construct_ns"; TraversalGraph tg = new TraversalGraph(s, Main.cg1); HelpVisitor hv = new HelpVisitor(); tg.traverse(this, hv); if (hv.isPassed()) { System.out.println("Unique Part Check pass."); } } public void flatten() { System.out.println("-------Flattening the Cd_graph Object-------"); // show the structure of m before Flattening; System.out.println("***Before Flattening***"); Main.m.print(); System.out.println("\n\n***Start Flattening***"); TraversalGraph tg = new TraversalGraph(sCdGraphAlt, Main.cg1); CollectVisitor cv = new CollectVisitor(); tg.traverse(this, cv); System.out.println("\n***Flattening Done***"); // show the structure of m after flattening. System.out.println("\n***After Flattening***"); Main.m.print();System.out.println(); } public void singleInher() { System.out.println("----------Single Inheritance Check----------"); boolean pass = true; TraversalGraph tg = new TraversalGraph(sCdGraphTerm, Main.cg1); InherVisitor iv = new InherVisitor(); tg.traverse(this, iv); Set tempSet = iv.getMultiInherSet(); if(!tempSet.isEmpty()) { Iterator i = tempSet.iterator(); while (i.hasNext()) { System.out.println("Class "+i.next()+" has multiple inheritances."); pass = false; proceedToInherCycle = false; } } if (pass) System.out.println("Single Inheritance Check pass."); } public void inherCycle() { System.out.println("----------Inheritance Cycle Check-----------"); TraversalGraph tg = new TraversalGraph("from Cd_graph to Adjacency", Main.cg1); SetParentVisitor spv = new SetParentVisitor(); tg.traverse(this, spv); CheckCycleVisitor ccv = new CheckCycleVisitor(); tg.traverse(this, ccv); if (ccv.isPass()) System.out.println("Inheritance Cycle Check pass"); } boolean doInherCycle() { return proceedToInherCycle; } @) }//end Cd_graph Main { (@ public static ClassGraph cg1; public static ClassGraph cgT; public static ClassGraph cgP; public static Cd_graph m; public static void main(String args[]) throws Exception { m = Cd_graph.parse(System.in); cgT = new ClassGraph(true,false); cg1 = new MyClassGraph(Main.cgT, "from Cd_graph bypassing {->*,myparent,* , ->*,tail,*} to *"); cgP = new MyClassGraph(Main.cgT, "from Cd_graph bypassing {->*,tail,*} to *"); //m.display(); // Flattening the Cd_graph object m.flatten(); //undefined classes check m.undefinedClasses(); // Then do unique parts check m.uniqueParts(); // Single Inheritance Check m.singleInher(); // Inheritance Cycle Check if (m.doInherCycle()) m.inherCycle(); else System.out.println("Please fix the multiple inheritance before proceed to Inheritance Cycle Check"); System.out.println(); //System.out.println(cg1); } @) }