package agg.xt_basis.csp; import java.util.Vector; import agg.attribute.AttrContext; import agg.attribute.AttrException; import agg.attribute.AttrInstance; import agg.attribute.AttrManager; import agg.attribute.AttrMapping; 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; public class Constraint_Attribute extends BinaryConstraint implements InstantiationHook { private GraphObject itsGraphObj; private AttrContext itsAttrContext; private AttrManager itsAttrManager; private AttrMapping itsAttrMapping; private boolean attributed = true; // pablo --> /** * State of instantiation/uninstantiation process. * Avoids unnecessary calls of instantiation_intern. */ private int state = NOTHING; /** * Do nothing. */ private static final int NOTHING = -1; /** * Instantiate, if execute()-method is called. */ private static final int INSTANTIATE = 0; /** * Uninstantiate, if execute()-method was called. */ private static final int UNINSTANTIATE = 1; /** * Variable, which the constraint should be instantiated with. */ private Variable instantiateVariable = null; // pablo > public Constraint_Attribute(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; } private int getWeightFactor() { if (this.itsGraphObj == null || 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() { // pablo --> if(this.state == INSTANTIATE) { instantiate_intern(this.instantiateVariable); this.state = UNINSTANTIATE; } // pablo > if ( (!this.attributed && this.itsAttrMapping == null) || (this.attributed && this.itsAttrMapping != null) ) return true; return false; } // pablo --> public final void instantiate(Variable var) { this.state = INSTANTIATE; this.instantiateVariable = var; } public final void uninstantiate(Variable var) { if(this.state == UNINSTANTIATE) uninstantiate_intern(var); this.state = NOTHING; this.instantiateVariable = null; } public final void instantiate_intern(Variable var) { if (!(var.getInstance() instanceof GraphObject)) return; if (!this.itsGraphObj.attrExists()) { this.attributed = false; return; } AttrInstance origAttr = this.itsGraphObj.getAttribute(); AttrInstance instAttr = ((GraphObject) var.getInstance()).getAttribute(); try { if (origAttr != null && instAttr != null) { this.itsAttrMapping = this.itsAttrManager.newMapping( this.itsAttrContext, this.itsGraphObj.getAttribute(), ((GraphObject) var.getInstance()).getAttribute()); this.itsAttrMapping.remove(); } } catch (AttrException exc) { if (this.itsAttrMapping != null) { this.itsAttrMapping.remove(); this.itsAttrMapping = null; } } } public final void uninstantiate_intern(Variable var) { if (var.getInstance() instanceof GraphObject) { GraphObject go = (GraphObject) var.getInstance(); if (this.itsAttrContext != null && go.getAttribute() != null) { unsetUsedVariable(go); } if (this.itsAttrMapping != null) { this.itsAttrMapping.remove(); this.itsAttrMapping = null; } } } // pablo > public GraphObject getGraphObject() { return this.itsGraphObj; } private void unsetUsedVariable(GraphObject go) { final Vector<String> attrVars = ((ValueTuple) go.getAttribute()) .getAllVariableNames(); if (attrVars.size() > 0) { final VarTuple varTup = (VarTuple) this.itsAttrContext.getVariables(); for (int i = 0; i < attrVars.size(); i++) { final String name = attrVars.elementAt(i); final VarMember vm = varTup.getVarMemberAt(name); if (vm != null) vm.setExpr(null); } } } /* private void showUsedVariable(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); System.out.println("Variable: "+name+" = "+vm.getExpr()+" hash: "+vm.hashCode()+" "+this.itsAttrContext.hashCode()); } } */ }