Main { {{ public static ClassGraph cg; // for using different visitors public static XMLSchema schema; //.. // public static TraversalGraph tg ; }} {{ static public void main(String args[]) throws Exception { // String strategy = "from XMLSchema via Root only-through -> NewDec, typedec, TypeDec via TypeName to *"; String strategy = "from XMLSchema to *"; cg = new ClassGraph(true, false); TraversalGraph tg = new TraversalGraph(new Strategy(strategy), cg); schema = XMLSchema.parse(System.in); schema.process(tg); } }} } XMLSchema { {{ static File dir = new File("validator");//store validating cd & beh static int offset = 0; // if(!dir.exists()){ // dir.mkdir(); //} static{ if(!dir.exists()) dir.mkdir(); } public static PrintWriter writeCD () { PrintWriter pw = null; try { pw = new PrintWriter(new BufferedWriter(new FileWriter(new File(dir , "validate.cd")))); } catch(IOException e) { e.printStackTrace(); } finally {return pw;} } public static PrintWriter writeBEH () { PrintWriter pw = null; try { pw = new PrintWriter(new BufferedWriter(new FileWriter(new File(dir , "validate.beh")))); } catch(IOException e) { e.printStackTrace(); } finally { return pw;} } static StringBuffer file1 = new StringBuffer(""); //for cd file static StringBuffer file2 = new StringBuffer(""); //for Main of beh file static StringBuffer file3 = new StringBuffer(""); //for of ValidatingVisitor of beh file static String validating_data_type = ""; public void process(TraversalGraph where) { OurPrintVisitor visitor = new OurPrintVisitor(); CDPrintVisitor CDvisitor = new CDPrintVisitor(); visitor.set_CDvisitor(CDvisitor); where.traverse(this, visitor); } }} } //CDPrintVisitor CDPrintVisitor{ {{ public void before(NewDec host){ // cd file String name = host.get_namedec().get_elementname().get_string(); String name_type = host.get_typedec().get_typename().get_string(); int loc = name_type.lastIndexOf(":"); XMLSchema.file1.append(name).append(" = ").append("\"<").append(name).append(">\" "); if(loc > 0){ String str = name_type.substring(loc+1, name_type.length()); if(str.equals("string")){ XMLSchema.file1.append("String").append(" \"\".\n"); } else if(str.equals("decimal")){ XMLSchema.file1.append("Integer").append(" \"\".\n"); } else if(str.equals("date")){ XMLSchema.file1.append("String").append(" \"\".\n"); } } else{ XMLSchema.file1.append(name_type).append(" \"\".\n"); } } public void before(Attribute host){ String attr = null; String name = host.get_attrnamedec().get_string(); String type = host.get_typedec().get_typename().get_string(); // XMLSchema.file1.append(name).append(" = ").append("\"<").append(name).append(">\" "); XMLSchema.file1.append(name).append(" = "); int loc = type.lastIndexOf(":"); if(loc > 0){ String str = type.substring(loc+1, type.length()); if(str.equals("date") || str.equals("string") ){ // XMLSchema.file1.append("String").append(" \"\".\n"); // XMLSchema.file1.append("String.\n"); type = "String"; } else if(str.equals("decimal")){ // XMLSchema.file1.append("Integer.\n"); type = "Integer"; } } else attr = name + " = " + type + "\n"; XMLSchema.file1.append(attr); // XMLSchema.file1.insert(offset; attr); } public void before(SimpleType host) { String name = host.get_namedec().get_elementname().get_string(); String type = host.get_restrictions().get_base().get_string(); int location = type.lastIndexOf(':'); String real_type = null; XMLSchema.file1.append(name).append(" = "); if(location > 0){ real_type = type.substring(location+1); if(real_type.equalsIgnoreCase("integer") || real_type.equalsIgnoreCase("positiveInteger") ){ XMLSchema.file1.append("Integer.\n"); // XMLSchema.file1.append("Integer").append(" \"\".\n"); } else if(real_type.equalsIgnoreCase("string")){ XMLSchema.file1.append("String.\n"); // XMLSchema.file1.append("String").append(" \"\".\n"); } else if(real_type.equalsIgnoreCase("decimal")){ XMLSchema.file1.append("Integer.\n"); // XMLSchema.file1.append("Integer").append(" \"\".\n"); } } } }} } //OurPrintVisitor OurPrintVisitor { {{ private PrintWriter writer1 = XMLSchema.writeCD(); private PrintWriter writer2 = XMLSchema.writeBEH(); private String rootType = null; private int root = 0; private String tag = null; public void start() { XMLSchema.file1.append("import edu.neu.ccs.demeter.dj.*;\n");//import ... XMLSchema.file1.append("import java.lang.reflect.*;\n"); XMLSchema.file1.append("import java.util.*;\n"); XMLSchema.file1.append("import java.io.*;\n"); XMLSchema.file1.append("import java.text.*;\n"); XMLSchema.file1.append("Main = .\n"); // Main class XMLSchema.file1.append("ValidatingVisitor = extends Visitor. \n"); // visitor for validating XMLSchema.file1.append("List(S) ~ {S}.\n"); // XMLSchema.file1.append("XMLData=\"\"\n"); //????? new cd for validating XMLSchema.file1.append("XMLData= "); //????? new cd for validating XMLSchema.file2.append("Main {\n"); // Main class definition XMLSchema.file2.append("\t public static void main(String args[]) throws Exception{{\n"); // XMLSchema.file2.append("\t java.io.Reader in = new java.io.FileReader(args[0]);\n"); XMLSchema.file2.append("\t XMLData data = XMLData.parse(System.in);\n"); XMLSchema.file2.append("\t data.validate();\n"); XMLSchema.file2.append("\t }"); XMLSchema.file2.append("}\n"); XMLSchema.file2.append("}\n"); XMLSchema.file2.append("XMLData {\n"); XMLSchema.file2.append("\t{{\n"); XMLSchema.file2.append("\tstatic int total = 0; \n"); XMLSchema.file2.append("\t public void validate() {\n"); XMLSchema.file2.append("\t ClassGraph cg = new ClassGraph(true, false);\n"); XMLSchema.file2.append("\t String s = "); XMLSchema.file2.append("\"from ").append("XMLData").append(" to *\";\n"); XMLSchema.file2.append("\t TraversalGraph tg = new TraversalGraph(s, cg);\n"); XMLSchema.file2.append("\t ValidatingVisitor v = new ValidatingVisitor();\n"); XMLSchema.file2.append("\t tg.traverse(this, v);\n"); XMLSchema.file2.append("\t }\n"); XMLSchema.file2.append("\t}"); XMLSchema.file2.append("}\n"); XMLSchema.file2.append("}\n"); // finishing validating traverse here XMLSchema.file3.append("ValidatingVisitor {\n"); // ValidatingVisitor XMLSchema.file3.append("\t{{\n"); } public void before(Root host) { String s = host.get_newdec().get_namedec().get_elementname().get_string(); // cd file rootType = host.get_newdec().get_typedec().get_typename().get_string(); XMLSchema.file1.append("\"<").append(s).append(">\" "); XMLSchema.file1.append(rootType); XMLSchema.file1.append("\"\".\n"); } public void after(Root host) { String s = host.get_newdec().get_namedec().get_elementname().get_string(); // rootName = s; // XMLSchema.file1.append("\"\"\n"); //call another visitor // CDvisitor.start(); } public void before(NewDec host){ // cd file int min = 1; int max = 1; int total = 0; String name = host.get_namedec().get_elementname().get_string(); ElementConstraints constrs = host.get_elementconstraints(); if(constrs != null){ java.util.Enumeration list = constrs.get_econstraint_list().elements(); while(list.hasMoreElements()){ total++; EConstraint constr = (EConstraint)list.nextElement(); if(constr instanceof MinOccurs) min = Integer.parseInt(((MinOccurs)constr).get_string()); if(constr instanceof MaxOccurs){ String str = ((MaxOccurs)constr).get_string(); if(str.equals("unbounded")) max = 5; else max = Integer.parseInt(str); // System.out.println("????"+max); } } } // else // System.out.println("Invalidate datatype for ElementConstraints"); // System.out.println("??? "+rootName); // System.out.println("??? "+name); // if(!name.equals(rootName)){ if(min == 0 && max == 1 && root != 0) tag = tag + "[ "+name+" ]"; else if(min == 0 && max > 1 && root != 0) tag = tag + "List( " + name +" )"; else if(root != 0) tag = tag + " "+name+" "; //validating min and max if(constrs != null){ XMLSchema.file3.append("\tpublic void before ( ").append(name); XMLSchema.file3.append(" host ) {\n"); XMLSchema.file3.append("\tint min = ").append(min).append("; \n"); XMLSchema.file3.append("\tint max = ").append(max).append("; \n"); XMLSchema.file3.append("\tXMLData.total++; \n"); XMLSchema.file3.append("\tif(max < XMLData.total) \n"); XMLSchema.file3.append("\tSystem.out.println(\"Error: Max Occurs is larger than MaxOccurs! \"); \n"); // XMLSchema.file3.append("\t}\n"); XMLSchema.file3.append("}\n"); } } public void after(NewDec host){ root++; } public void before(ComplexType host) { String name = host.get_namedef().get_typename().get_string(); //XMLSchema.file1.append(name).append(" = "); tag = name + " = "; Sequence seq = host.get_seqList(); java.util.Enumeration list = seq.get_element_list().elements(); while(list.hasMoreElements()){ Element element = (Element)list.nextElement(); if(element.get_elementdef() instanceof NewDec){ NewDec newDec = (NewDec)element.get_elementdef(); CDvisitor.before(newDec); // String name_ele = newDec.get_namedec().get_elementname().get_string(); // tag = tag + name_ele + " "; } } Attributes attrs = host.get_attrList(); if(attrs != null){ java.util.Enumeration list1 = attrs.get_attribute_list().elements(); while(list1.hasMoreElements()){ Attribute attr = (Attribute)list1.nextElement(); CDvisitor.before(attr); } } } public void after(ComplexType host) { String name = host.get_namedef().get_typename().get_string(); // if (!name.equals(rootType)) tag = tag +".\n"; XMLSchema.file1.append(tag); //call main class another method to do similar thing with file1 //writting each ele or attr's definition } public void before(Attribute host){ String name = host.get_attrnamedec().get_string(); String type = host.get_typedec().get_typename().get_string(); //XMLSchema.file1.append(" ").append(name); //validating type if it is date int loc = type.lastIndexOf(":"); if(loc>0){ String str = type.substring(loc+1, type.length()); if(str.equals("date")){ XMLSchema.file3.append("\t public void before ( ").append(name); XMLSchema.file3.append(" host ) {\n"); XMLSchema.file3.append("\t try{\n"); XMLSchema.file3.append("\t String str = \"YYYY-MM-DD\";\n"); XMLSchema.file3.append("\t SimpleDateFormat sdf = "); XMLSchema.file3.append("new SimpleDateFormat(str);\n"); XMLSchema.file3.append("\t sdf.setLenient(false);\n"); XMLSchema.file3.append("\t Date dt = sdf.parse(host.get_string());\n"); XMLSchema.file3.append("\t}catch(ParseException e){}\n"); XMLSchema.file3.append("\tcatch(IllegalArgumentException ie){\n"); XMLSchema.file3.append("\tSystem.out.println(\"It should be in the format like YYYY-MM-DD. \"); }\n"); XMLSchema.file3.append("\t}\n"); XMLSchema.file3.append("}\n"); } } } public void before(SimpleType host) { String name = host.get_namedec().get_elementname().get_string(); //for validating String type = host.get_restrictions().get_base().get_string(); // System.out.println("????? "+type); int location = type.lastIndexOf(':'); // System.out.println("????? "+location); String real_type = null; XMLSchema.file3.append("\t public void before( ").append(name).append(" host) { \n"); if(location > 0){ real_type = type.substring(location+1); if(real_type.equalsIgnoreCase("integer") || real_type.equalsIgnoreCase("positiveInteger") ){ // System.out.println("????? "+real_type); XMLSchema.validating_data_type = "integer"; } else{ XMLSchema.validating_data_type = "not_implememted_yet"; } } else{ XMLSchema.validating_data_type = "InValidated data type!!!"; } CDvisitor.before(host); } public void after(SimpleType host) { XMLSchema.file3.append("}\n"); } public void before(MinExclusive host) { if(XMLSchema.validating_data_type.equalsIgnoreCase("integer")){ Value value = host.get_value(); // PrimitiveType type = value.get_primitivetype(); // if(ptype.getClass().getName().equals("Type4")){ // if(value instanceof Integer){ int minValue = value.get_integer().intValue(); XMLSchema.file3.append("\t if(host.get_").append(XMLSchema.validating_data_type); XMLSchema.file3.append("().intValue() <= ").append(minValue).append(") {\n"); String message = "The value is smaller than the minExclusive ("+ minValue+")"; XMLSchema.file3.append("\t System.out.println(\"").append(message).append("\");\n"); XMLSchema.file3.append("\t}\n"); // } // else // System.out.println("Just Integer data type is implemented at this stage"); } else return; } public void before(MaxExclusive host) { if(XMLSchema.validating_data_type.equalsIgnoreCase("integer")){ Value value = host.get_value(); //PrimitiveType type = value.get_primitivetype(); //Type4 == Integer // if(value instanceof Integer){ int maxValue = value.get_integer().intValue(); XMLSchema.file3.append("\t if(host.get_").append(XMLSchema.validating_data_type); XMLSchema.file3.append("().intValue() >= ").append(maxValue).append(") {\n"); String message = "The value is larger than the maxExclusive ("+ maxValue+")"; XMLSchema.file3.append("\t System.out.println(\"").append(message).append("\";\n"); XMLSchema.file3.append("\t}\n"); // }else // System.out.println("Just Integer data type is implemented at this stage"); } else return; } public void before(MinInclusive host) { if(XMLSchema.validating_data_type.equalsIgnoreCase("integer")){ Value value = host.get_value(); // PrimitiveType type = value.get_primitivetype(); // if(ptype.getClass().getName().equals("Type4")){ // if(value instanceof Integer){ int minValue = value.get_integer().intValue(); // int minValue = host.get_value().get_integer().intValue(); XMLSchema.file3.append("\t if(host.get_").append(XMLSchema.validating_data_type); XMLSchema.file3.append("().intValue() < ").append(minValue).append(") {\n"); String message = "The value is smaller than the minInclusive ("+ minValue+")"; XMLSchema.file3.append("\t System.out.println(\"").append(message).append("\");\n"); XMLSchema.file3.append("\t}\n"); // }else // System.out.println("Just Integer data type is implemented at this stage"); } else return; } public void before(MaxInclusive host) { if(XMLSchema.validating_data_type.equalsIgnoreCase("integer")){ Value value = host.get_value(); // PrimitiveType type = value.get_primitivetype(); // if(ptype.getClass().getName().equals("Type4")){ // if(value instanceof Integer){ // int maxValue = ((Type4)type).get_integer().intValue(); int maxValue = value.get_integer().intValue(); XMLSchema.file3.append("\t if(host.get_").append(XMLSchema.validating_data_type); XMLSchema.file3.append("().intValue() > ").append(maxValue).append(") {\n"); String message = "The value is larger than the maxInclusive ("+ maxValue+")"; XMLSchema.file3.append("\t System.out.println(\"").append(message).append("\");\n"); XMLSchema.file3.append("\t}\n"); // } // else // System.out.println("just Integer"); } else return; } public void before(Sequence host) { // define class correspoding to ComplexType // String name = ct.get_nameDec().get_elementName(); // file.append(name).append(" {\n"); // get offset here! // add elts } public void after(Sequence host) { // file.append("}\n\n"); // } public void before(ElementDef host) { } public void finish() { XMLSchema.file1.append("\n"); if (writer1 == null) System.out.println("Exception in IO, cannot write CD file."); else { writer1.print(XMLSchema.file1.toString()); writer1.flush(); writer1.close(); } XMLSchema.file2.append("\n"); XMLSchema.file3.append("}"); XMLSchema.file3.append("}\n"); XMLSchema.file3.append("}\n"); XMLSchema.file3.append("\n"); XMLSchema.file2.append(XMLSchema.file3.toString()); if (writer2 == null) System.out.println("Exception in IO, cannot write BEH file."); else { writer2.print(XMLSchema.file2.toString()); writer2.flush(); writer2.close(); } } }} }