public void createNewRepeat(FormIndex index) throws InvalidReferenceException { TreeReference destRef = getChildInstanceRef(index); TreeElement template = instance.getTemplate(destRef); instance.copyNode(template, destRef); preloadInstance(instance.resolveReference(destRef)); triggerTriggerables(destRef); // trigger conditions that depend on the creation of this new node initializeTriggerables(destRef); // initialize conditions for the node (and sub-nodes) }
public boolean isRepeatRelevant(TreeReference repeatRef) { boolean relev = true; Condition c = (Condition) conditionRepeatTargetIndex.get(repeatRef.genericize()); if (c != null) { relev = c.evalBool(instance, new EvaluationContext(exprEvalContext, repeatRef)); } // check the relevancy of the immediate parent if (relev) { TreeElement templNode = instance.getTemplate(repeatRef); TreeReference parentPath = templNode.getParent().getRef().genericize(); TreeElement parentNode = instance.resolveReference(parentPath.contextualize(repeatRef)); relev = parentNode.isRelevant(); } return relev; }
public int getNumRepetitions(FormIndex index) { Vector indexes = new Vector(); Vector multiplicities = new Vector(); Vector elements = new Vector(); if (!index.isInForm()) { throw new RuntimeException("not an in-form index"); } collapseIndex(index, indexes, multiplicities, elements); if (!(elements.lastElement() instanceof GroupDef) || !((GroupDef) elements.lastElement()).getRepeat()) { throw new RuntimeException("current element not a repeat"); } // so painful TreeElement templNode = instance.getTemplate(index.getReference()); TreeReference parentPath = templNode.getParent().getRef().genericize(); TreeElement parentNode = instance.resolveReference(parentPath.contextualize(index.getReference())); return parentNode.getChildMultiplicity(templNode.getName()); }
public void finalizeTriggerables() { // // DAGify the triggerables based on dependencies and sort them so that // trigbles come only after the trigbles they depend on // Vector partialOrdering = new Vector(); for (int i = 0; i < triggerables.size(); i++) { Triggerable t = (Triggerable) triggerables.elementAt(i); Vector deps = new Vector(); if (t.canCascade()) { for (int j = 0; j < t.getTargets().size(); j++) { TreeReference target = (TreeReference) t.getTargets().elementAt(j); Vector triggered = (Vector) triggerIndex.get(target); if (triggered != null) { for (int k = 0; k < triggered.size(); k++) { Triggerable u = (Triggerable) triggered.elementAt(k); if (!deps.contains(u)) deps.addElement(u); } } } } for (int j = 0; j < deps.size(); j++) { Triggerable u = (Triggerable) deps.elementAt(j); Triggerable[] edge = {t, u}; partialOrdering.addElement(edge); } } Vector vertices = new Vector(); for (int i = 0; i < triggerables.size(); i++) vertices.addElement(triggerables.elementAt(i)); triggerables.removeAllElements(); while (vertices.size() > 0) { // determine root nodes Vector roots = new Vector(); for (int i = 0; i < vertices.size(); i++) { roots.addElement(vertices.elementAt(i)); } for (int i = 0; i < partialOrdering.size(); i++) { Triggerable[] edge = (Triggerable[]) partialOrdering.elementAt(i); roots.removeElement(edge[1]); } // if no root nodes while graph still has nodes, graph has cycles if (roots.size() == 0) { throw new RuntimeException( "Cannot create partial ordering of triggerables due to dependency cycle. Why wasn't this caught during parsing?"); } // remove root nodes and edges originating from them for (int i = 0; i < roots.size(); i++) { Triggerable root = (Triggerable) roots.elementAt(i); triggerables.addElement(root); vertices.removeElement(root); } for (int i = partialOrdering.size() - 1; i >= 0; i--) { Triggerable[] edge = (Triggerable[]) partialOrdering.elementAt(i); if (roots.contains(edge[0])) partialOrdering.removeElementAt(i); } } triggerablesInOrder = true; // // build the condition index for repeatable nodes // conditionRepeatTargetIndex = new Hashtable(); for (int i = 0; i < triggerables.size(); i++) { Triggerable t = (Triggerable) triggerables.elementAt(i); if (t instanceof Condition) { Vector targets = t.getTargets(); for (int j = 0; j < targets.size(); j++) { TreeReference target = (TreeReference) targets.elementAt(j); if (instance.getTemplate(target) != null) { conditionRepeatTargetIndex.put(target, (Condition) t); } } } } }