/** * */ package agg.xt_basis.agt; import java.util.Enumeration; import java.util.Iterator; import java.util.Vector; import agg.attribute.impl.DeclMember; import agg.attribute.impl.ValueMember; import agg.attribute.impl.ValueTuple; import agg.attribute.impl.VarMember; import agg.attribute.impl.VarTuple; import agg.xt_basis.BadMappingException; import agg.xt_basis.Graph; import agg.xt_basis.GraphObject; import agg.xt_basis.OrdinaryMorphism; import agg.xt_basis.Rule; import agg.xt_basis.TypeSet; /** * @author olga * */ public class AmalgamatedRule extends Rule { private RuleScheme itsRuleScheme; public AmalgamatedRule(final Graph left, final Graph right) { super(left, right); } public AmalgamatedRule(final TypeSet types) { super(types); } public AmalgamatedRule(final OrdinaryMorphism h) { super(h.getSource(), h.getTarget()); makeRuleFromMorphism(h); this.unsetInputParameter(); } public void dispose() { super.dispose(); this.itsRuleScheme = null; } public void setRuleScheme(final RuleScheme rs) { this.itsRuleScheme = rs; } public RuleScheme getRuleScheme() { return this.itsRuleScheme; } private void makeRuleFromMorphism(final OrdinaryMorphism h) { Vector<String> list = this.itsOrig.getVariableNamesOfAttributes(); list.addAll(this.itsImag.getVariableNamesOfAttributes()); // set variables VarTuple varsMorph = (VarTuple) h.getAttrContext().getVariables(); final VarTuple vars = (VarTuple) getAttrContext().getVariables(); for (int j = 0; j < varsMorph.getSize(); j++) { VarMember vm = varsMorph.getVarMemberAt(j); if (list.contains(vm.getName())) { DeclMember dm = (DeclMember) vm.getDeclaration(); if (!vars.isDeclared(dm.getTypeName(), dm.getName())) { vars.declare(dm.getHandler(), dm.getTypeName(), dm.getName()); if (vm.isSet()) { vars.getVarMemberAt(dm.getName()).setExprAsText(vm.getExprAsText()); } } } } // add object mapping final Enumeration<GraphObject> dom = h.getDomain(); while (dom.hasMoreElements()) { GraphObject obj = dom.nextElement(); try { GraphObject img = h.getImage(obj); this.applyAttrValue(obj, img, vars); addMapping(obj, img); } catch (BadMappingException ex) {} } // check attr. setting of graph objects of the RHS, use variable value if it is available applyVarValueToAttr(vars, getRight().getNodesSet().iterator()); applyVarValueToAttr(vars, getRight().getArcsSet().iterator()); this.removeUnusedVariableOfAttrContext(); } private void applyVarValueToAttr(final VarTuple vars, final Iterator<?> objs) { while (objs.hasNext()) { GraphObject o = (GraphObject) objs.next(); if (o.getAttribute() == null) continue; ValueTuple value = (ValueTuple) o.getAttribute(); for (int i = 0; i < value.getSize(); i++) { ValueMember vm = value.getValueMemberAt(i); if (vm.isSet() && vm.getExpr().isVariable()) { VarMember var = vars.getVarMemberAt(vm.getExprAsText()); if (var != null && var.isSet()) { vm.setExprAsText(var.getExprAsText()); } } } } } private void applyAttrValue( final GraphObject from, final GraphObject to, final VarTuple vars) { if (from.getAttribute() == null || to.getAttribute() == null) return; final ValueTuple valuefrom = (ValueTuple) from.getAttribute(); final ValueTuple value = (ValueTuple) to.getAttribute(); for (int i = 0; i < value.getSize(); i++) { ValueMember vm = value.getValueMemberAt(i); ValueMember vmfrom = valuefrom.getValueMemberAt(vm.getName()); if (vmfrom != null) { // side effect during gluing of objects // if (!vm.isSet() && vmfrom.isSet()) { // vm.setExpr(vmfrom.getExpr()); // } if (vm.isSet() && vm.getExpr().isVariable()) { if (vmfrom.isSet() && vmfrom.getExpr().isConstant()) { VarMember var = vars.getVarMemberAt(vm.getExprAsText()); if (var != null) { if (!var.isSet()) { vm.setExpr(vmfrom.getExpr()); var.setExpr(vmfrom.getExpr()); } else if (var.getExprAsText().equals(vmfrom.getExprAsText())) { vm.setExpr(vmfrom.getExpr()); } } } } } } } }