package agg.xt_basis.csp;
import java.util.Vector;
import agg.attribute.AttrContext;
import agg.attribute.AttrException;
import agg.attribute.AttrManager;
import agg.attribute.AttrMapping;
import agg.attribute.impl.AttrTupleManager;
import agg.attribute.impl.ValueTuple;
import agg.attribute.impl.ValueMember;
import agg.attribute.impl.VarTuple;
import agg.attribute.impl.VarMember;
import agg.util.csp.BinaryConstraint;
import agg.util.csp.InstantiationHook;
import agg.util.csp.Variable;
import agg.xt_basis.GraphObject;
/**
* Please note: This class is only for internal use of the
* critical pair analysis for grammars with node type inheritance.
* Do not use it for any kind of implementations.
*/
public class Constraint_InheritAttribute extends BinaryConstraint implements
InstantiationHook {
private GraphObject itsGraphObj;
private AttrContext itsAttrContext;
private AttrManager itsAttrManager;
private AttrMapping itsAttrMapping;
private boolean attributed = true;
public Constraint_InheritAttribute(GraphObject graphobj, Variable var,
AttrContext ac, AttrManager man) {
super(var, 0);
var.addInstantiationHook(this);
this.itsGraphObj = graphobj;
this.itsAttrContext = ac;
this.itsAttrManager = man;
int fact = getWeightFactor();
if (fact > 0) {
this.itsWeight = this.itsWeight + fact;
var.addWeight(this.itsWeight);
}
}
public void clear() {
this.itsVar1 = null;
this.itsGraphObj = null;
}
// protected void resetAttrContext(Variable var, AttrContext ac) {
// uninstantiate(var);
// this.itsAttrContext = ac;
// }
private int getWeightFactor() {
if (this.itsGraphObj == null)
return 0;
if (this.itsGraphObj.getAttribute() == null)
return 0;
VarTuple vars = null;
if (this.itsAttrContext != null)
vars = (VarTuple) this.itsAttrContext.getVariables();
ValueTuple vt = (ValueTuple) this.itsGraphObj.getAttribute();
for (int i = 0; i < vt.getSize(); i++) {
ValueMember vm = vt.getValueMemberAt(i);
if (vm.isSet()) {
if (vm.getExpr().isConstant())
return 2;
else if (vm.getExpr().isVariable()) {
if (vars != null) {
VarMember var = vars.getVarMemberAt(vm.getExprAsText());
if ((var != null) && var.isInputParameter())
return 3;
}
}
}
}
return 1;
}
/**
* Return true iff the attributes of <code>graphobj</code> and of the
* current instance of <code>var</code> match. (The names correspond to my
* constructor arguments.)
*/
public final boolean execute() {
boolean result = false;
if (!this.attributed && this.itsAttrMapping == null)
result = true;
else if (this.attributed && this.itsAttrMapping != null)
result = true;
else
result = false;
// System.out.println("Constraint_InheritAttribute.execute: "+result);
return result;
}
public final void instantiate(Variable var) {
if (var.getInstance() instanceof GraphObject) {
if (this.itsGraphObj.getAttribute() == null
&& ((GraphObject) var.getInstance()).getAttribute() == null) {
this.attributed = false;
return;
}
try {
if (this.itsGraphObj.getAttribute() != null) {
if (((GraphObject) var.getInstance()).getAttribute() != null) {
if (this.itsGraphObj.getType().isChildOf(((GraphObject) var.getInstance()).getType())) {
if (((GraphObject) var.getInstance()).getAttribute().getType().compareTo(
this.itsGraphObj.getAttribute().getType())) {
// System.out.println("Constraint_InheritAttribute.instantiate:: isChildOf TRY!");
this.itsAttrMapping = ((AttrTupleManager)this.itsAttrManager).newMappingChild2Parent(
this.itsAttrContext, this.itsGraphObj.getAttribute(),
((GraphObject) var.getInstance()).getAttribute());
// System.out.println("Constraint_InheritAttribute.instantiate:: isChildOf OK");
this.itsAttrMapping.remove();
}
}
else if (this.itsGraphObj.getAttribute().getType().compareTo(
((GraphObject) var.getInstance()).getAttribute().getType())) {
this.itsAttrMapping = this.itsAttrManager.newMapping(
this.itsAttrContext, this.itsGraphObj.getAttribute(),
((GraphObject) var.getInstance()).getAttribute());
// System.out.println("Constraint_InheritAttribute.instantiate:: compareTo OK");
this.itsAttrMapping.remove();
}
}
}
else
this.itsAttrMapping = null;
} catch (AttrException exc) {
// System.out.println("Constraint_InheritAttribute.instantiate:: FAILED! "+exc.getMessage());
this.itsAttrMapping = null;
}
}
}
public final void uninstantiate(Variable var) {
if (var.getInstance() instanceof GraphObject) {
GraphObject go = (GraphObject) var.getInstance();
if (this.itsAttrContext != null)
unsetUsedVariable(go);
if (this.itsAttrMapping != null) {
this.itsAttrMapping.remove();
this.itsAttrMapping = null;
}
}
}
public GraphObject getGraphObject() {
return this.itsGraphObj;
}
private void unsetUsedVariable(GraphObject go) {
if (go.getAttribute() == null)
return;
Vector<String> attrVars = ((ValueTuple) go.getAttribute())
.getAllVariableNames();
VarTuple varTup = (VarTuple) this.itsAttrContext.getVariables();
for (int i = 0; i < attrVars.size(); i++) {
String name = attrVars.elementAt(i);
VarMember vm = varTup.getVarMemberAt(name);
if (vm != null)
vm.setExpr(null);
}
}
}