Exemplo n.º 1
0
  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)
  }
Exemplo n.º 2
0
  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;
  }
Exemplo n.º 3
0
  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());
  }
Exemplo n.º 4
0
  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);
          }
        }
      }
    }
  }