import java.util.Iterator;
import java.util.Vector;
import agg.util.XMLHelper;
import agg.xt_basis.BadMappingException;
import agg.xt_basis.BaseFactory;
import agg.xt_basis.CompletionStrategySelector;
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.GraphObject;
import agg.xt_basis.Match;
import agg.xt_basis.MorphCompletionStrategy;
import agg.xt_basis.Node;
import agg.xt_basis.Rule;
public class PartialMatchBasicTest implements GraTraEventListener {
private static XMLHelper h = new XMLHelper();
private static GraGra gragra;
private static GraTra gratra;
private int msgGraTra;
// private static boolean didTransformation = false;
private static String fileName;
public PartialMatchBasicTest() {
}
public PartialMatchBasicTest(String filename) {
fileName = filename;
System.out.println("File name: " + fileName);
/* load gragra */
gragra = load(fileName);
if (gragra != null) {
matchingTest();
} 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 == 1) {
if ((args[0]).compareToIgnoreCase("-logfile") != 0) {
new PartialMatchBasicTest(args[0]);
}
}
}
public static GraGra load(String fName) {
// System.out.println(fileName.endsWith(".ggx"));
if (fName.endsWith(".ggx")) {
if (h.read_from_xml(fName)) {
// create a gragra
GraGra gra = BaseFactory.theFactory().createGraGra();
h.getTopObject(gra);
gra.setFileName(fName);
return gra;
}
return null;
}
return null;
}
/** 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"); }
*/
}
public void matchingTest() {
long t = System.currentTimeMillis();
// test partial match completion
Rule r = gragra.getRule(0);
makeMatch(r);
int times = 3;
for (int i = 0; i < times; i++) {
System.out.println(i + ". test of partial match completion");
setPartialMatch(r, i);
completeMatch(r);
r.getMatch().clear();
r.getMatch().resetVariableDomainOfCompletionStrategy(true);
r.getMatch().getCompletionStrategy().reinitializeSolver(true);
// gragra.destroyMatch(r.getMatch());
// r.setMatch(null);
}
System.out.println("Now all match completions");
completeMatch(r);
r.getMatch().clear();
r.getMatch().resetVariableDomainOfCompletionStrategy(true);
r.getMatch().getCompletionStrategy().reinitializeSolver(true);
// gragra.destroyMatch(r.getMatch());
// r.setMatch(null);
System.out.println("*** Used time: " + (System.currentTimeMillis() - t)
+ "ms");
}
private void makeMatch(Rule r) {
gragra.createMatch(r);
MorphCompletionStrategy strategy = CompletionStrategySelector
.getDefault();
r.getMatch().setCompletionStrategy(strategy, true);
}
private void setPartialMatch(Rule r, int indx) {
if (r.getMatch() == null)
makeMatch(r);
Graph lhs = r.getLeft();
int nn = -1;
GraphObject orig = null;
GraphObject img = null;
Iterator<Node> en = lhs.getNodesSet().iterator();
while (en.hasNext()) {
GraphObject go = en.next();
Vector<GraphObject> dom = r.getMatch().getTarget().getElementsOfTypeAsVector(
go.getType());
int domSize = dom.size();
if ((domSize > 0) && (nn == -1 || domSize < nn)) {
nn = domSize;
orig = go;
img = dom.get(indx);
}
}
if (orig != null && img != null) {
try {
r.getMatch().addMapping(orig, img);
r.getMatch().setPartialMorphismCompletion(true);
System.out.println(orig.getType().getName() + " --> "
+ img.getType().getName());
} catch (BadMappingException ex) {
}
}
}
private void completeMatch(Rule r) {
if (r.getMatch() == null)
makeMatch(r);
Match m = r.getMatch();
System.out.println("Rule : " + r.getName() + " match is empty: "
+ m.isEmpty() + " isPartial: " + m.isPartial());
int nn = 0;
while (m.nextCompletion()) {
if (m.isValid()) {
nn++;
System.out.println(nn + ". completion of (part.) match");
} else {
m.clear();
}
}
System.out.println("NO MORE COMPLETION!");
}
}