package agg.parser;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import agg.xt_basis.GraGra;
import agg.xt_basis.Graph;
import agg.xt_basis.GraphObject;
import agg.xt_basis.OrdinaryMorphism;
import agg.xt_basis.Rule;
import agg.xt_basis.Type;
/**
* Extends the layer function for a NAC check.
* @deprecated
* @author $Author: olga $
* @version $Id: WeakExtendedLayerFunction.java,v 1.1 2005/08/25 11:56:57 enrico
* Exp $
*/
public class WeakExtendedLayerFunction extends WeakLayerFunction {
/**
* Creates a new layer function.
*
* @param gragra
* The graph grammar.
*/
public WeakExtendedLayerFunction(GraGra gragra) {
super(gragra);
}
/**
* Checks the layer function.
*
* @return true if the layer function is valid.
*
* public boolean checkLayer(){ Report.trace("starte ckeckLayer()",2);
* boolean result = true; // 0<= cl(l)<=dl(l)<=n for(Enumeration enum =
* getDeletionLayer().keys(); enum.hasMoreElements() && result;){ Object key =
* enum.nextElement(); Integer dl = (Integer)getDeletionLayer().get(key);
* Integer cl = (Integer)getCreationLayer().get(key); // layerfunktion muss
* total sein if(cl == null || dl == null){ result = false; 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; errMsg = "Type name :
* "+((Type) key).getStringRepr()+"\n"+ " Condition \n "+ " 0 <= cl(l) <=
* dl(l) <= n \n "+ " is not satisfied."; } } // for
*
* HashSet deletionSet = new HashSet(); HashSet creationSet = new HashSet();
* Enumeration rules = getRuleLayer().keys(); while(result &&
* rules.hasMoreElements()){ deletionSet.clear(); creationSet.clear(); Rule
* rule = (Rule) rules.nextElement(); Integer layerRule = (Integer)
* getRuleLayer().get(rule); // gibt es keinen Layer fuer eine Regel, // so
* ist die Layerfunktion nicht korrekt if(layerRule == null){ result =
* false; 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 enum =
* leftGraph.getElements(); enum.hasMoreElements();){ GraphObject grob =
* (GraphObject) enum.nextElement(); if(rule.getImage(grob) == null)
* deletionSet.add(grob); } Report.println("deletionSet ist
* "+deletionSet,Report.LAYER); // dl(l) <= k for(Enumeration enum =
* deletionSet.elements(); enum.hasMoreElements() && result;){ GraphObject
* grob = (GraphObject) enum.nextElement(); Type t = grob.getType(); Integer
* dl = (Integer) getDeletionLayer().get(t); Report.println("dl("+t+") =
* "+dl+" <= rl("+rule+") = "+layerRule,Report.LAYER);
* if(dl.intValue()>layerRule.intValue()) { result = false; 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 enum =
* rightGraph.getElements(); enum.hasMoreElements();)
* creationSet.add(enum.nextElement()); Report.println("creationSet ist
* "+creationSet,Report.LAYER); for(Enumeration enum =
* leftGraph.getElements(); enum.hasMoreElements();){ try{
* creationSet.remove(rule.getImage((GraphObject)enum.nextElement())); }
* catch (NullPointerException npe){} } Report.println("creationSet
* reduziert auf "+creationSet,Report.LAYER); // cl > k for(Enumeration enum =
* creationSet.elements(); enum.hasMoreElements() && result;){ GraphObject
* grob = (GraphObject) enum.nextElement(); Type t = grob.getType(); Integer
* cl = (Integer) getCreationLayer().get(t); Report.println("cl("+t+") =
* "+cl+" > rl("+rule+") = "+layerRule,Report.LAYER); if(cl.intValue()<=layerRule.intValue()) {
* result = false; 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."; } } } // test: cl(l) <= rl(k) result = result &&
* checkLayerNAC();
*
* valid = result; Report.trace("beende checkLayer mit result =
* "+result,-2); return result; }
*/
/**
* Checks the layer function.
*
* @return true if the layer function is valid.
*/
public boolean checkLayer() {
Report.trace("starte extended ckeckLayer()", 2);
boolean result = super.checkLayer();
// boolean result = true;
for (Iterator<Rule> rules = this.grammar.getListOfRules().iterator(); rules.hasNext()
&& result;) {
Rule r = rules.next();
final List<OrdinaryMorphism> nacs = r.getNACsList();
for (int l=0; l<nacs.size(); l++) {
final OrdinaryMorphism nac = nacs.get(l);
Graph nacGraph = nac.getImage();
for (Enumeration<GraphObject> grobs = nacGraph.getElements(); grobs
.hasMoreElements()
&& result;) {
GraphObject grob = grobs.nextElement();
Type t = grob.getType();
Integer rl = getRuleLayer().get(r);
Integer cl = getCreationLayer().get(t);
if (!(cl.intValue() <= rl.intValue())) {
result = false;
this.errMsg = "Rule name : "
+ r.getName()
+ "\n"
+ "Type name : "
+ t.getStringRepr()
+ "\n"
+ " The condition that\n"
+ " r uses only complex negative predicates \n"
+ " over nodes and edges with labels \n"
+ " l such that cl(l) <= rl(r) \n"
+ " is not satisfied.";
}
}
}
}
this.valid = result;
Report.trace("beende extended checkLayer mit result = " + result, -2);
return result;
}
}
/*
* $Log: WeakExtendedLayerFunction.java,v $
* Revision 1.7 2010/09/23 08:25:00 olga
* tuning
*
* Revision 1.6 2009/05/12 10:36:57 olga
* CPA: bug fixed
* Applicability of Rule Seq. : bug fixed
*
* Revision 1.5 2008/04/07 09:36:51 olga
* Code tuning: refactoring + profiling
* Extension: CPA - two new options added
*
* 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:39 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.3 2003/06/12 07:27:33 olga Testausgabe auskommentiert
*
* Revision 1.2 2003/03/05 18:24:08 komm sorted/optimized import statements
*
* Revision 1.1.1.1 2002/07/11 12:17:24 olga Imported sources
*
* Revision 1.3 2001/08/16 15:44:08 olga cl(l) > rl(k) gilt!
*
* Revision 1.2 2001/08/16 15:06:35 olga LayerFunction: di Bedingung cl(l) >
* rl(k) gilt generell (auch mit NACs pruefung).
*
* Revision 1.1 2001/08/16 14:14:08 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
*
*/