import edu.neu.ccs.demeter.dj.*; import java.util.*; import java.lang.reflect.*; import edu.neu.ccs.demeter.*; class Main { public Main() { super(); } public static Main parse(java.io.Reader in) throws ParseException { return new Parser(in)._Main(); } public static Main parse(java.io.InputStream in) throws ParseException { return new Parser(in)._Main(); } public static Main parse(String s) { try { return parse(new java.io.StringReader(s)); } catch (ParseException e) { throw new RuntimeException(e.toString()); } } 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 { Cd_graph m = Cd_graph.parse(System.in); System.out.println("Input parsed!"); m.initialize(); /* System.out.print("Defined classes: "); System.out.println(m.definedClasses); System.out.print("Imported Classes: "); System.out.println(ClassFinder.predefined); System.out.print("Imported Packages: "); System.out.println(ClassFinder.packageNames); */ System.out.println("Checking to ensure single inheritance..."); if (!m.resolveSuperClassStructure()) { System.out.println("===Single Inheritance Violation Detected!==="); printMultiInheritClasses(m); System.out.println("Java does not support multiple inheritance.\nPlease fix your class dictionary."); System.out.println("halting..."); System.exit(1); } System.out.println("Checking for inheritance class cycles..."); if (m.hasSuperCycle()) { System.out.println("===Class inheritance cycle detected!==="); printAllClassCycles(m); System.out.println("Java does not support inheritance cycles.\nPlease fix your class dictionary."); System.out.println("halting..."); System.exit(1); } System.out.println("Checking to ensure unique part names..."); m.flatten(); System.out.println("Checking for undefined parts..."); if (m.hasUndefinedParts()) { System.out.println(m.undefinedParts); } Iterator iter = Cd_graph.adjs.keySet().iterator(); Adjacency temp; for (; iter.hasNext(); ) { temp = (Adjacency)Cd_graph.adjs.get(iter.next()); if (temp.tbrV) System.out.println("WARNING: " + temp.getName() + " violates the terminal buffer rule!"); } // m.display(); System.out.println(); //System.out.println(cg); } public static final boolean checkClass(String packageName, String className) { try { Class.forName(packageName + "." + className, false, null); } catch (ClassNotFoundException cnfe) { return false; } return true; } public static final void printMultiInheritClasses(Cd_graph cdg) { Visitor v = new Visitor() { void before(Adjacency host) { if (host.isMultiInherit()) { System.out.print(host.getName() + " inherits from: "); host.printSupers(); System.out.println(); } } }; new TraversalGraph("from Cd_graph to Adjacency", Main.cg).traverse(cdg, v); } public static final void printAllClassCycles(Cd_graph cdg) { List cycles = cdg.getCycleErrors(); Iterator iter = cycles.iterator(); List cycle; Iterator innerIter; for (; iter.hasNext(); ) { cycle = (List)iter.next(); for (innerIter = cycle.iterator(); innerIter.hasNext(); ) { System.out.print(innerIter.next().toString() + " -> "); } System.out.println(cycle.get(0).toString()); } } void universal_trv0_bef(UniversalVisitor _v_) { ((UniversalVisitor) _v_).before(this); } void universal_trv0_aft(UniversalVisitor _v_) { ((UniversalVisitor) _v_).after(this); } void universal_trv0(UniversalVisitor _v_) { universal_trv0_bef(_v_); universal_trv0_aft(_v_); } }