import java.io.File; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import agg.attribute.impl.CondTuple; import agg.attribute.impl.DeclTuple; import agg.attribute.impl.ValueMember; import agg.attribute.impl.ValueTuple; import agg.convert.ConverterXML; import agg.util.XMLHelper; import agg.xt_basis.BaseFactory; import agg.xt_basis.CompletionStrategySelector; import agg.xt_basis.DefaultGraTraImpl; import agg.xt_basis.GraGra; import agg.xt_basis.GraTra; import agg.xt_basis.GraTraEvent; import agg.xt_basis.GraTraEventListener; import agg.xt_basis.Graph; import agg.xt_basis.LayeredGraTraImpl; import agg.xt_basis.MorphCompletionStrategy; import agg.xt_basis.Node; import agg.xt_basis.PriorityGraTraImpl; import agg.xt_basis.Rule; import agg.xt_basis.RuleSequencesGraTraImpl; import agg.xt_basis.Type; import agg.xt_basis.TypeException; import agg.xt_basis.TypeGraph; import agg.xt_basis.TypeSet; //import agg.xt_basis.Match; public class AGGBasicTest implements GraTraEventListener { private static XMLHelper h; private static GraGra gragra; private static GraGra impGraGra; private static Graph impGraph; private static Graph impTypeGraph; private static GraTra gratra; private int msgGraTra; private static boolean layered = false, ruleSequence = false, priority = false;; private static boolean didTransformation = false; private static String fileName; private static String impFileName; private static String outputFileName; private static String error; private static boolean writeLogFile = false; public AGGBasicTest() { } public AGGBasicTest(String filename) { fileName = filename; System.out.println("File name: " + fileName); /* load gragra */ gragra = load(fileName); // makeRule(gragra, BaseFactory.theFactory().createGraGra()); if (gragra != null) { gragra.getLevelOfTypeGraphCheck(); // do transform //attr test: use user-own class if (setAttrOfRHS(gragra.getRule(0))) { setAttrCondition(gragra.getRule(0)); ((CondTuple) gragra.getRule(0).getAttrContext().getConditions()).showConditions(); System.out.println(gragra.getRule(0).getAttrContext().getConditions().isDefinite()); System.out.println(gragra.getRule(0).getAttrContext().getConditions().isValid()); /* do transform */ transform(gragra, this); } if (didTransformation) { // save gragra String out = "_out.ggx"; save(gragra, out); System.out.println("Output file: " + outputFileName); if (writeLogFile) { if (gratra instanceof DefaultGraTraImpl) System.out.println("Transformation protocol: " + ((DefaultGraTraImpl) gratra) .getProtocolName()); else if (gratra instanceof PriorityGraTraImpl) System.out.println("Transformation protocol: " + ((PriorityGraTraImpl) gratra) .getProtocolName()); else if (gratra instanceof LayeredGraTraImpl) System.out.println("Transformation protocol: " + ((LayeredGraTraImpl) gratra) .getProtocolName()); else if (gratra instanceof RuleSequencesGraTraImpl) System.out.println("Transformation protocol: " + ((RuleSequencesGraTraImpl) gratra) .getProtocolName()); } } else System.out.println("Grammar: " + gragra.getName() + " could not perform any transformations!"); } else System.out.println("Grammar: " + filename + " FAILED! "+error); } public AGGBasicTest(String filename, String impFilename) { fileName = filename; impFileName = impFilename; System.out.println("File name: " + fileName); gragra = load(fileName); if (gragra != null) { int levelOfTGcheck = gragra.getLevelOfTypeGraphCheck(); System.out.println("Import file name: " + impFileName); impGraph = importGraph(impFilename); if (impGraGra != null) { if (impTypeGraph != null) { gragra.setLevelOfTypeGraphCheck(TypeSet.DISABLED); if (!gragra.importTypeGraph(impTypeGraph, true)) { System.out .println("Error: Import Type Graph failed! Please check types of the import. "); return; } System.out.println("Importing Type Graph successful."); } for (int ri = 0; ri<impGraGra.getListOfRules().size(); ri++) { Rule rulei = impGraGra.getListOfRules().get(ri); if (gragra.addImportRule(rulei, true)) { System.out.println("Importing rule successful: "+rulei.getName()); }else { System.out.println("Importing rule failed: "+rulei.getName()); } // Rule rule = BaseFactory.theFactory().cloneRule(rulei, gragra.getTypeSet()); // if (rule != null) { // System.out.println("Importing rule successful: "+rulei.getName()); // gragra.addRule(rule); // } else { // System.out.println("Importing rule failed: "+rulei.getName()); // } } System.out.println("Imported rules: "+gragra.getListOfRules().size()); } // if (impGraph != null) { // gragra.setLevelOfTypeGraphCheck(TypeSet.DISABLED); // // if (!gragra.importGraph(impGraph)) { // System.out // .println("Error: Import graph failed! Please check types of the import. "); // return; // } // System.out.println("Importing graph successful."); // } if (gragra.getTypeSet().hasInheritance()) { if (levelOfTGcheck != TypeSet.DISABLED) gragra.setLevelOfTypeGraphCheck(levelOfTGcheck); else gragra.setLevelOfTypeGraphCheck(TypeSet.ENABLED_MAX); } else { gragra.setLevelOfTypeGraphCheck(levelOfTGcheck); } // save current grammar with import graph save(gragra, "Import_" + fileName); System.out.println("Import is written into: " + "Import_" + fileName); /* do transform */ transform(gragra, this); if (didTransformation) { /* save gragra */ String out = "_out.ggx"; save(gragra, out); System.out.println("Output file: " + outputFileName); if (gratra instanceof DefaultGraTraImpl) System.out.println("Transformation protocol: " + ((DefaultGraTraImpl) gratra) .getProtocolName()); else if (gratra instanceof PriorityGraTraImpl) System.out.println("Transformation protocol: " + ((PriorityGraTraImpl) gratra) .getProtocolName()); else if (gratra instanceof LayeredGraTraImpl) System.out.println("Transformation protocol: " + ((LayeredGraTraImpl) gratra) .getProtocolName()); else if (gratra instanceof RuleSequencesGraTraImpl) System.out.println("Transformation protocol: " + ((RuleSequencesGraTraImpl) gratra) .getProtocolName()); } else { System.out.println("Grammar: " + gragra.getName() + " could not perform any transformations!"); } } else System.out.println("Grammar: " + filename + " FAILED!"); } public static void main(String[] args) { String vers = System.getProperty("java.version"); if (vers.compareTo("1.4.2") < 0) { System.out.println("WARNING : Swing must be run with the " + "1.4.2 version of the JVM."); } if (args.length == 0) { warning(); return; } if (args.length == 1) { if ((args[0]).compareToIgnoreCase("-logfile") != 0) { new AGGBasicTest(args[0]); writeLogFile = false; } } else if (args.length == 2) { if (args[0].compareToIgnoreCase("-logfile") == 0) { writeLogFile = true; new AGGBasicTest(args[1]); } else { new AGGBasicTest(args[0], args[1]); } } else if (args.length == 3) { if (args[0].compareToIgnoreCase("-logfile") == 0) { writeLogFile = true; new AGGBasicTest(args[1], args[2]); } else warning(); } } static void warning() { System.out .println("Usage unaliased: java -oss3m -Xmx1000m agg.xt_basis.AGGBasicTest [-logfile] grammar [import]"); System.out.println("Usage aliased:"); System.out.println("aggengine [-logfile] grammar [import]"); System.out .println("(aggengine: aliased to java -oss3m -Xmx1000m agg.xt_basis.AGGBasicTest)"); System.out.println(""); System.out.println(" -logfile \twrite transformation logfile"); System.out .println(" grammar \tfull file name of '.ggx' file in XML format"); System.out .println(" import \tfull file name of a GXL file '.gxl' in XML format \n\t\tthat contains the graph to import."); System.out.println("also possible"); System.out .println(" import \tfull file name of an OMONDO XMI file '.ecore' in XML format \n\t\tthat contains the graph to import."); System.out.println(""); } public static GraGra load(String fName) { // System.out.println(fileName.endsWith(".ggx")); if (fName.endsWith(".ggx")) { h = new XMLHelper(); if (h.read_from_xml(fName)) { // create a gragra GraGra gra = new GraGra(true); h.getTopObject(gra); gra.setFileName(fName); return gra; } return null; } return null; } public static Graph importGraph(String filename) { // System.out.println(filename.endsWith(".gxl")); if (filename.endsWith(".ggx")) { setItemsToImport(filename); return impGraph; // return importGraphGGX(filename); } else if (filename.endsWith(".gxl")) return importGraphGXL(filename); else if (filename.endsWith(".gtxl")) return importGraphGTXL(filename); else if (filename.endsWith(".ecore")) return importGraphOMONDO_XMI(filename); else { error = "Import failed! < " + filename + " > should be < .ggx > , < .gxl > or < .ecore > file."; return null; } } @SuppressWarnings("unused") private static Graph importGraphGGX(String filename) { // System.out.println("importGraphGGX: "+filename); impGraGra = load(filename); if (impGraGra != null) { // save(impGra, "_outImportGrammar.ggx"); //test if (impGraGra.getTypeGraph() != null) { impTypeGraph = impGraGra.getTypeGraph(); } return impGraGra.getGraph(); } return null; } private static void setItemsToImport(String ggxfilename) { System.out.println("importGGXfile: "+ggxfilename); impGraGra = load(ggxfilename); if (impGraGra != null) { if (impGraGra.getTypeGraph() != null) { impTypeGraph = impGraGra.getTypeGraph(); } impGraph = impGraGra.getGraph(); } } // not implemented now private static Graph importGraphGTXL(String filename) { return null; } private static Graph importGraphGXL(String filename) { String fd = "."; String fn = filename; String fnOut = ""; File gxldtd = null; File gtsdtd = null; File source = null; File layout = null; error = ""; File f = new File(fn); if (f.exists()) { if (f.isFile()) fd = f.getParent(); } if (fd != null) fd = fd + File.separator; else fd = "." + File.separator; // System.out.println("dir: "+fd); // System.out.println("file: "+fn); /* * if(XMLHelper.hasGermanSpecialCh(fn)){ System.out.println("File name: * "+fn); System.out.println("\nRead file name exception occurred! " * +"\nMaybe the German umlaut like ä, ö, ü or ß were used. " +"\nPlease * replace it by ae, oe, ue or ss " +"\nand try again."); return null; } */ ConverterXML converter = new ConverterXML(); fnOut = fn.substring(0, fn.length() - 4) + "_gxl.ggx"; source = converter.copyFile(fd, "gxl2ggx.xsl"); gxldtd = converter.copyFile(fd, "gxl.dtd"); gtsdtd = converter.copyFile(fd, "gts.dtd"); layout = converter.copyFile(fd, "agglayout.dtd"); if (source == null) { error = "Import failed! File < gxl2ggx.xsl > is not found."; return null; } else if (gxldtd == null) { error = "Import failed! File < gxl.dtd > is not found."; return null; } else if (gtsdtd == null) { error = "Import failed! File < gts.dtd > is not found."; return null; } else if (layout == null) { error = "Import failed! File < agglayout.dtd > is not found."; return null; } String in = fn; String out = fnOut; GraGra impGra = null; if (converter.gxl2ggx(in, out, fd + "gxl2ggx.xsl")) { if (out.endsWith(".ggx")) { h = new XMLHelper(); if (h.read_from_xml(out)) impGra = (GraGra) h.getTopObject( BaseFactory.theFactory().createGraGra()); if (impGra != null) return impGra.getGraph(); } } error = "Import failed! Please check format of the GXL file."; return null; } private static Graph importGraphOMONDO_XMI(String filename) { String fd = "."; String fn = filename; String fnOut = ""; File gxldtd = null; File gtsdtd = null; File source = null; File layout = null; File omondo = null; error = ""; File f = new File(fn); if (f.exists()) { if (f.isFile()) fd = f.getParent(); } if (fd != null) fd = fd + File.separator; else fd = "." + File.separator; // System.out.println("dir: "+fd); // System.out.println("file: "+fn); ConverterXML converter = new ConverterXML(); fnOut = fn.substring(0, fn.length() - 6) + "_ecore.ggx"; source = converter.copyFile(fd, "gxl2ggx.xsl"); gxldtd = converter.copyFile(fd, "gxl.dtd"); gtsdtd = converter.copyFile(fd, "gts.dtd"); layout = converter.copyFile(fd, "agglayout.dtd"); omondo = converter.copyFile(fd, "omondoxmi2gxl.xsl"); if (source == null) { error = "Import failed! File < gxl2ggx.xsl > is not found."; return null; } else if (gxldtd == null) { error = "Import failed! File < gxl.dtd > is not found."; return null; } else if (gtsdtd == null) { error = "Import failed! File < gts.dtd > is not found."; return null; } else if (layout == null) { error = "Import failed! File < agglayout.dtd > is not found."; return null; } else if (omondo == null) { error = "Import failed! File < omondoxmi2gxl.xsl > is not found."; return null; } String in = fn; String out = fnOut; GraGra impGra = null; if (converter.omondoxmi2ggx(in, out, fd + "omondoxmi2gxl.xsl", fd + "gxl2ggx.xsl")) { if (out.endsWith(".ggx")) { h = new XMLHelper(); if (h.read_from_xml(out)) impGra = (GraGra) h.getTopObject( BaseFactory.theFactory().createGraGra()); if (impGra != null) { return impGra.getGraph(); } } } error = "Import failed! Please check format of the GXL file."; return null; } public static void transform(GraGra grammar, GraTraEventListener l) { if (grammar == null) return; /* * test: there is a one way to set transformation options Vector gto = * new Vector(); gto.add("layered"); gto.add("CSP"); * gto.add("injective"); gto.add("dangling"); * gragra.setGraTraOptions(gto); */ // create trafo // System.out.println(gragra.getGraTraOptions().toString()); if (grammar.getGraTraOptions().contains("priority")) { gratra = new PriorityGraTraImpl(); priority = true; System.out.println("Transformation by rule priority ..."); } else if (grammar.getGraTraOptions().contains("layered")) { gratra = new LayeredGraTraImpl(); layered = true; System.out.println("Layered transformation ..."); } else if (grammar.getGraTraOptions().contains("ruleSequence")) { gratra = new RuleSequencesGraTraImpl(); ruleSequence = true; System.out.println("Transformation by rule sequences ..."); } else { gratra = new DefaultGraTraImpl(); System.out.println("Transformation non-deterministically ..."); } gratra.addGraTraListener(l); gratra.setGraGra(grammar); gratra.setHostGraph(grammar.getGraph()); gratra.enableWriteLogFile(writeLogFile); MorphCompletionStrategy strategy = CompletionStrategySelector .getDefault(); // strategy = new Completion_NAC(new Completion_InjCSP()); if (grammar.getGraTraOptions().isEmpty()) { grammar.setGraTraOptions(strategy); gratra.setCompletionStrategy(strategy); } else { if (grammar.getGraTraOptions().contains("showGraphAfterStep")) grammar.getGraTraOptions().remove("showGraphAfterStep"); gratra.setGraTraOptions(grammar.getGraTraOptions()); System.out.println("Options: " + grammar.getGraTraOptions()); System.out.println(); } grammar.destroyAllMatches(); if (priority) ((PriorityGraTraImpl) gratra).transform(); else if (layered) ((LayeredGraTraImpl) gratra).transform(); else if (ruleSequence) ((RuleSequencesGraTraImpl) gratra).transform(); else ((DefaultGraTraImpl) gratra).transform(); } public static void save(GraGra gra, String outFileName) { // System.out.println("Output into: "+outFileName); if (outFileName.equals("")) outputFileName = gra.getName() + "_out.ggx"; else if (outFileName.equals("_out.ggx")) outputFileName = fileName.substring(0, fileName.length() - 4) + "_out.ggx"; else if (outFileName.indexOf(".ggx") == -1) outputFileName = outFileName.concat(".ggx"); else if (outFileName.equals(fileName)) outputFileName = fileName.substring(0, fileName.length() - 4) + "_out.ggx"; else { outputFileName = outFileName; } // System.out.println("save :: Output into: "+outputFileName); if (outputFileName.endsWith(".ggx")) { XMLHelper xmlh = new XMLHelper(); xmlh.addTopObject(gra); xmlh.save_to_xml(outputFileName); } } /** Implements GraTraEventListener.graTraEventOccurred */ public void graTraEventOccurred(GraTraEvent event) { // System.out.println("AGGBasicAppl.graTraEventOccurred // "+event.getMessage()); // Match match = event.getMatch(); // String ruleName = "Rule"; // if (match != null) // ruleName = match.getRule().getName(); this.msgGraTra = event.getMessage(); if (this.msgGraTra == GraTraEvent.TRANSFORM_FINISHED) { gratra.stop(); didTransformation = gratra.transformationDone(); // System.out.println("GraTraEvent message : TRANSFORM_FINISHED"); } else if ((this.msgGraTra == GraTraEvent.INPUT_PARAMETER_NOT_SET)) { System.out.println("GraTraEvent message : PARAMETER NOT SET!"); } /* * else if((msgGraTra == GraTraEvent.STEP_COMPLETED)) { // * System.out.println("Rule : "+ruleName+" ==> STEP DONE" ); } * * else if (msgGraTra == GraTraEvent.NO_COMPLETION) { * //System.out.println("Rule : "+ ruleName+" ==> NO_COMPLETION"); } * else if (msgGraTra == GraTraEvent.CANNOT_TRANSFORM){ * //System.out.println("Rule : "+ ruleName+" ==> CANNOT_TRANSFORM"); } */ } @SuppressWarnings("unused") private void createNode(final Graph g, final String typeName) { Type type = g.getTypeSet().getTypeByName(typeName); System.out.println(type+" "+typeName); try { Node n = g.createNode(type); n.createAttributeInstance(); System.out.println(n); // set name attr /* ValueTuple vt = (ValueTuple) n.getAttribute(); System.out.println("ValueTuple:: "+vt); // vt.setValueAt("YYYYY", "name"); // vt.setExprAt("YYYYY", "name"); // !!! geht nicht !? String name = "name"; ValueMember vm = vt.getValueMemberAt(name); System.out.println("ValueMember:: name: "+vm); if (vm != null) { vm.setExprAsObject("XXXXX"); } System.out.println("ValueMember:: name: "+vm); */ } catch (TypeException ex) {} } @SuppressWarnings("unused") private void setParent(final TypeGraph tg, final String childTypeName, final String parentTypeName) { if (tg == null || tg.isEmpty()) { return; } final Type childType = tg.getTypeSet().getTypeByName(childTypeName); final Node child = tg.getNodes(childType).get(0); final Type parentType = tg.getTypeSet().getTypeByName(parentTypeName); final Node parent = tg.getNodes(parentType).get(0); tg.getTypeSet().addInheritanceRelation(childType, parentType); // childType.setParent(parentType); // childType.addParent(parentType); System.out.println(child+" Parents: "+child.getType().getAllParents()); } private boolean setAttrOfRHS(final Rule r) { Iterator<Node> nodes = r.getRight().getNodesCollection().iterator(); while (nodes.hasNext()) { Node n = nodes.next(); ValueTuple vt = (ValueTuple) n.getAttribute(); for (int i=0; i<vt.getNumberOfEntries(); i++) { ValueMember vm = vt.getEntryAt(i); if (!vm.isSet()) { if (vm.getDeclaration().getTypeName().equals("Integer")) { try { // String valStr = "spec.impl.N.add(Integer.valueOf(1),Integer.valueOf(2))"; String valStr = "$spec.impl.N$.add(Integer.valueOf(1),Integer.valueOf(2))"; vm.trySetExprAsText(valStr); System.out.println(vm.getExprAsText()); } catch (agg.attribute.handler.AttrHandlerException ex) { System.out.println("Attr setting failed!\n"+ex.getLocalizedMessage()); return false; } } else if (vm.getDeclaration().getTypeName().equals("Boolean")) { try { // String valStr = "Boolean.valueOf(\"true\")"; String valStr = "N.getTrue()"; System.out.println(valStr); vm.trySetExprAsText(valStr); System.out.println("RHS attr value: "+vm.getExprAsText()); } catch (agg.attribute.handler.AttrHandlerException ex) { System.out.println("Attr setting failed!\n"+ex.getLocalizedMessage()); return false; } } } } } return true; } private void setAttrCondition(final Rule r) { CondTuple cond = (CondTuple) r.getAttrContext().getConditions(); cond.addCondition("N.odd(Integer.valueOf(7)).booleanValue()"); // attr parse leak : public static field of static class cond.addCondition("$Boolean$.TRUE.booleanValue()"); cond.addCondition("$N$.getTrue().booleanValue()"); cond.addCondition("$Boolean$.valueOf(\"true\").booleanValue()"); cond.addCondition("N.odd(Integer.valueOf(7)).equals(Boolean.TRUE)"); cond.addCondition("N.odd(Integer.valueOf(7)).equals(N.getTrue())"); cond.addCondition("N.odd(Integer.valueOf(7)).equals(Boolean.valueOf(\"true\"))"); cond.addCondition("N.odd(Integer.valueOf(7)).booleanValue()&&N.odd(Integer.valueOf(5)).booleanValue()"); } @SuppressWarnings("unused") private void setAttributeValue(final Graph g, final String attrName, final String attrType, final String valueStr) { if (g.isEmpty()) { return; } final Node n = g.getNodesSet().iterator().next(); ValueTuple vt = (ValueTuple) n.getAttribute(); // ValueMember vm = vt.getValueMemberAt(attrName); // if (vm.getDeclaration().getTypeName().equals(attrType)) { // vm.setExprAsText(valueStr); // System.out.println("######## 1) "+vm); // } String val = valueStr+"00"; vt.setExprAt(val, attrName); } @SuppressWarnings("unused") private void refreshAttrType(TypeSet types) { Enumeration<Type> en = types.getTypes(); while (en.hasMoreElements()) { Type t = en.nextElement(); if (t.getAttrType() != null) { ((DeclTuple) t.getAttrType()).refreshParents(); } } } @SuppressWarnings("unused") private void makeRule(final GraGra sourceGra, final GraGra targetGra) { List<Rule> srcRules = sourceGra.getListOfRules(); for (int i=0; i<srcRules.size(); i++) { Rule srcRule = srcRules.get(i); // import the type graph if (sourceGra.getTypeGraph() != null) { targetGra.createTypeGraph(); targetGra.importTypeGraph(sourceGra.getTypeGraph(), true); targetGra.setLevelOfTypeGraphCheck(TypeSet.DISABLED); } else { // or adapt the types targetGra.getTypeSet().adaptTypes(sourceGra.getTypeSet(), false); } // one way is to import a rule // if (targetGra.addImportRule(srcRule, true)) { // } // other way is to add a copy of graph Rule tarRule = targetGra.createRule(); tarRule.setName(srcRule.getName()); if (tarRule.getLeft().addCopyOfGraph(srcRule.getLeft(), true)) { if (tarRule.getRight().addCopyOfGraph(srcRule.getRight(), true)) { } } // targetGra.save("TargetGraGra.ggx"); } } }