package agg.parser;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import agg.xt_basis.GraGra;
import agg.xt_basis.Graph;
import agg.xt_basis.GraphObject;
import agg.xt_basis.Rule;
import agg.xt_basis.Type;
//import com.objectspace.jgl.HashSet;
/**
* Extends the layer function for a NAC check.
* @deprecated
* @author $Author: olga $
* @version $Id: WeakLayerFunction.java,v 1.5 2010/09/23 08:25:00 olga Exp $
*/
public class WeakLayerFunction extends LayerFunction {
/**
* Creates a new layer function.
*
* @param gragra
* The graph grammar.
*/
public WeakLayerFunction(GraGra gragra) {
super(gragra);
// System.out.println("WeakLayerFunction created");
}
/**
* Checks the layer function.
*
* @return true if the layer function is valid.
*/
public boolean checkLayer() {
// System.out.println("WeakLayerFunction checkLayer");
Report.trace("starte ckeckLayer()", 2);
boolean result = true;
/* 0<= cl(l)<=dl(l)<=n */
for (Enumeration<?> en = getDeletionLayer().keys(); en.hasMoreElements()
&& result;) {
Object key = en.nextElement();
Integer dl = getDeletionLayer().get(key);
Integer cl = getCreationLayer().get(key);
/* layerfunktion muss total sein */
if (cl == null || dl == null) {
result = false;
this.errMsg = "Type name : " + ((Type) key).getStringRepr() + "\n"
+ " The condition that\n "
+ " cl, dl are total functions \n "
+ " is not satisfied.";
break;
}
if (!(0 <= cl.intValue()) || !(cl.intValue() <= dl.intValue())) {
result = false;
this.errMsg = "Type name : " + ((Type) key).getStringRepr() + "\n"
+ " Condition \n " + " 0 <= cl(l) <= dl(l) <= n \n "
+ " is not satisfied.";
}
}
HashSet<Object> deletionSet = new HashSet<Object>();
HashSet<Object> creationSet = new HashSet<Object>();
Enumeration<Rule> rules = getRuleLayer().keys();
while (result && rules.hasMoreElements()) {
deletionSet.clear();
creationSet.clear();
Rule rule = rules.nextElement();
Integer layerRule = getRuleLayer().get(rule);
/*
* gibt es keinen Layer fuer eine Regel, so ist die Layerfunktion
* nicht korrekt
*/
if (layerRule == null) {
result = false;
this.errMsg = "Rule name : " + rule.getName() + "\n"
+ " The condition that\n"
+ " rl is a total function \n" + " is not satisfied.";
break;
}
Graph leftGraph = rule.getLeft();
Graph rightGraph = rule.getRight();
/* alle geloeschten Objekte suchen */
for (Enumeration<GraphObject> en = leftGraph.getElements(); en.hasMoreElements();) {
GraphObject grob = en.nextElement();
if (rule.getImage(grob) == null)
deletionSet.add(grob);
}
Report.println("deletionSet ist " + deletionSet, Report.LAYER);
/* dl(l) <= k */
for (Iterator<?> en = deletionSet.iterator(); en.hasNext()
&& result;) {
GraphObject grob = (GraphObject) en.next();
Type t = grob.getType();
Integer dl = getDeletionLayer().get(t);
Report.println("dl(" + t + ") = " + dl + " <= rl(" + rule
+ ") = " + layerRule, Report.LAYER);
if (dl.intValue() > layerRule.intValue()) {
result = false;
this.errMsg = "Rule name : " + rule.getName() + "\n"
+ "Type name : " + t.getStringRepr() + "\n"
+ " The condition that \n"
+ " r deletes only nodes and edges with labels \n"
+ " l such that dl(l) <= rl(r) \n"
+ " is not satisfied.";
}
}
if (!result)
break;
/* alle erzeugten Objekte suchen */
for (Enumeration<GraphObject> en = rightGraph.getElements(); en
.hasMoreElements();)
creationSet.add(en.nextElement());
Report.println("creationSet ist " + creationSet, Report.LAYER);
for (Enumeration<GraphObject> en = leftGraph.getElements(); en.hasMoreElements();) {
try {
creationSet.remove(rule.getImage(en.nextElement()));
} catch (NullPointerException npe) {
}
}
Report.println("creationSet reduziert auf " + creationSet,
Report.LAYER);
/* cl > k */
for (Iterator<?> en = creationSet.iterator(); en.hasNext()
&& result;) {
GraphObject grob = (GraphObject) en.next();
Type t = grob.getType();
Integer cl = getCreationLayer().get(t);
Report.println("cl(" + t + ") = " + cl + " > rl(" + rule
+ ") = " + layerRule, Report.LAYER);
if (cl.intValue() <= layerRule.intValue()) {
result = false;
this.errMsg = "Rule name : " + rule.getName() + "\n"
+ "Type name : " + t.getStringRepr() + "\n"
+ " The condition that\n "
+ " r creates only nodes and edges with labels \n"
+ " l such that cl(l) > rl(r) \n"
+ " is not satisfied.";
}
}
}
this.valid = result;
Report.trace("beende checkLayer mit result = " + result, -2);
return result;
}
}
/*
* $Log: WeakLayerFunction.java,v $
* Revision 1.5 2010/09/23 08:25:00 olga
* tuning
*
* Revision 1.4 2007/11/01 09:58:17 olga
* Code refactoring: generic types- done
*
* Revision 1.3 2007/09/24 09:42:38 olga
* AGG transformation engine tuning
*
* Revision 1.2 2007/09/10 13:05:40 olga
* In this update:
* - package xerces2.5.0 is not used anymore;
* - class com.objectspace.jgl.Pair is replaced by the agg own generic class agg.util.Pair;
* - bugs fixed in: usage of PACs in rules; match completion;
* usage of static method calls in attr. conditions
* - graph editing: added some new features
* Revision 1.1 2005/08/25 11:56:57 enrico ***
* empty log message ***
*
* Revision 1.1 2005/05/30 12:58:03 olga Version with Eclipse
*
* Revision 1.4 2004/12/20 14:53:48 olga Changes because of matching
* optimisation.
*
* Revision 1.3 2003/06/12 07:27:33 olga Testausgabe auskommentiert
*
* Revision 1.2 2003/03/05 18:24:09 komm sorted/optimized import statements
*
* Revision 1.1.1.1 2002/07/11 12:17:24 olga Imported sources
*
* Revision 1.1 2001/08/16 14:14:09 olga LayerFunction erweitert:
* ExtendedLayerFunction erbt LayerFunction (checkLayer ueberschrieben)
* WeakLayerFunction erbt LayerFunction ( checkLayer ueberschrieben)
* WeakExtendedLayerFunction erbt WeakLayerFunction ( checkLayer ueberschrieben)
*
* Revision 1.4 2001/08/08 14:46:30 olga Default Layer Option Einstellung ist
* RCDN_LAYER.
*
* Revision 1.3 2001/08/02 15:22:15 olga Error-Meldungen eingebaut in
* LayerFunction und die Anzeige dieser Meldungen in GUI.
*
* Revision 1.2 2001/03/08 10:44:51 olga Neue Files aus parser branch in Head
* eingefuegt.
*
* Revision 1.1.2.2 2001/01/28 13:14:53 shultzke API fertig
*
* Revision 1.1.2.1 2000/12/26 10:00:04 shultzke Layered Parser hinzugefuegt
*
*/