import java.io.File; import agg.convert.ConverterXML; import agg.editor.impl.EdGraGra; import agg.editor.impl.EdGraph; import agg.editor.impl.EditUndoManager; 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.PriorityGraTraImpl; import agg.xt_basis.Rule; import agg.xt_basis.RuleSequencesGraTraImpl; import agg.xt_basis.TypeSet; //import java.util.Enumeration; //import agg.xt_basis.Node; //import agg.xt_basis.Type; //import agg.xt_basis.TypeException; //import agg.xt_basis.Match; //import agg.attribute.impl.ValueMember; //import agg.attribute.impl.ValueTuple; //import agg.attribute.impl.DeclTuple; public class AGGUndoTrafoStepTest 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 EdGraGra edgragra; private static EdGraph edgraph; private static EditUndoManager undoManager; private static String fileName; private static String impFileName; private static String outputFileName; private static String error; private static boolean writeLogFile = false; public AGGUndoTrafoStepTest() { } public AGGUndoTrafoStepTest(String filename) { fileName = filename; System.out.println("File name: " + fileName); /* load grammar */ gragra = load(fileName); // create EdXXX instances edgragra = new EdGraGra(gragra); createUndoManager(edgragra); edgraph = edgragra.getGraph(); edgraph.setTransformChangeEnabled(true); if (gragra != null) { gragra.getLevelOfTypeGraphCheck(); // do transform transform(gragra, this); if (didTransformation) { // save gragra String out = "_out.ggx"; save(gragra, out); System.out.println("Output file: " + outputFileName); // UndoManager: test undo // undoTrafoStep(); undoAllTrafoSteps(); 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! "+error); } else System.out.println("Grammar: " + filename + " FAILED!"); } public AGGUndoTrafoStepTest(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 AGGUndoTrafoStepTest(args[0]); writeLogFile = false; } } else if (args.length == 2) { if (args[0].compareToIgnoreCase("-logfile") == 0) { writeLogFile = true; new AGGUndoTrafoStepTest(args[1]); } else { new AGGUndoTrafoStepTest(args[0], args[1]); } } else if (args.length == 3) { if (args[0].compareToIgnoreCase("-logfile") == 0) { writeLogFile = true; new AGGUndoTrafoStepTest(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) { if (fName.endsWith(".ggx")) { h = new XMLHelper(); if (h.read_from_xml(fName)) { // create a gragra GraGra gra = new GraGra(false); h.getTopObject(gra); gra.setFileName(fName); return gra; } return null; } return null; } public static Graph importGraph(String filename) { if (filename.endsWith(".ggx")) { setItemsToImport(filename); return impGraph; } 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; } } /* 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(); } else 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; /* * a 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) { this.msgGraTra = event.getMessage(); if (this.msgGraTra == GraTraEvent.MATCH_VALID) { if (undoManager != null && undoManager.isEnabled()) { undoManager.setUndoEndOfTransformStepAllowed(true); /* Note: undoManager.setUndoEndOfTransformStepAllowed(false); is done in EdGraph.storeState(..). Note: Each graph change during transformation is registered in EdGraph.update(final Observable o, final Object arg) (because EdGraph is an observer of Graph) and is propagated to the undoManager due to EdGraph.storeState(..). */ } } else if (this.msgGraTra == GraTraEvent.STEP_COMPLETED) { undoManager.setUndoEndOfTransformStep(); } else if (this.msgGraTra == GraTraEvent.TRANSFORM_FINISHED) { gratra.stop(); didTransformation = gratra.transformationDone(); edgraph.setTransformChangeEnabled(false); } else if ((this.msgGraTra == GraTraEvent.INPUT_PARAMETER_NOT_SET)) { System.out.println("GraTraEvent message : PARAMETER NOT SET!"); } } /* 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); System.out.println(n); // set name attr ValueTuple vt = (ValueTuple) n.getAttribute(); System.out.println("ValueTuple:: "+vt); 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) {} } 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(); } } } */ private void createUndoManager(EdGraGra gra) { undoManager = new EditUndoManager("Undo last edit"); undoManager.setLimit(1000); gra.setUndoManager(undoManager); gra.enableUndoManager(true); } /* private void undoTrafoStep() { if (undoManager != null && undoManager.isEnabled() && undoManager.canUndo()) { int undoID = undoManager.getUndoStateID(); int lastEndOfStepUndoID = undoManager.getUndoEndOfTransformStep(); while (lastEndOfStepUndoID >= 0 && undoID >= lastEndOfStepUndoID) { if (undoManager.canUndo()) { undoManager.undo(); undoID = undoManager.getUndoStateID(); // System.out.println(undoID+" ... "+ lastEndOfStepUndoID // +" undoManager: undo step done"); } else break; } save(gragra, "/home/olga/agg_V164/test/undoStep/UndoOneStepTest.ggx"); } } */ private void undoAllTrafoSteps() { if (undoManager != null && undoManager.isEnabled()) { while (undoManager.canUndo()) { undoManager.undo(); } save(gragra, "/home/olga/agg_V164/test/undoStep/UndoAllStepsTest.ggx"); } } }