Exemplo n.º 1
0
  /*
   * gets the prevailing policy in a module (e.g. a query, relation, view)
   */
  private PolicyType getPrevailingPolicy(
      EvolutionEvent<V> event, V nr, PolicyType previousPolicyType) {

    EvolutionPolicies policies = nr.getPolicies();
    // if policy for this event exist override previousPolicy coming from provider node
    for (EvolutionPolicy<V> nrPolicy : policies) {
      if ((nrPolicy.getSourceEvent().getEventNode().equals(event.getEventNode()))
          && (nrPolicy.getSourceEvent().getEventType() == event.getEventType())) {
        return nrPolicy.getPolicyType();
      }
    }

    // If no policy is returned check parents' policy for this event to override provider's policy
    if (this.getParentNode(nr) != null) {
      EvolutionEvent<V> newEvent = new EvolutionEvent<V>(/*nr,*/ event.getEventType());
      return getPrevailingPolicy(newEvent, this.getParentNode(nr), previousPolicyType);
    }

    // if no self or parents policy exists then return provider's policy
    return previousPolicyType;
  }
Exemplo n.º 2
0
  /** makes the necessary initializations to execute propagateChanges() */
  public void initializeChange(EvolutionEvent<V> event) {

    for (Entry<V, Pair<Map<V, E>>> entry : this.vertices.entrySet()) { // Clear statuses of nodes.
      entry.getKey().setStatus(StatusType.NO_STATUS, true);
    }
    for (Entry<E, Pair<V>> entry : this.edges.entrySet()) { // Clear statuses of edges.
      entry.getKey().setStatus(StatusType.NO_STATUS, true);
    }

    V node = event.getEventNode();
    V toNode = null;
    V toSchema = null;
    String parameter = "";
    switch (node.getType()) {
      case NODE_TYPE_RELATION:
      case NODE_TYPE_QUERY:
      case NODE_TYPE_VIEW:
        toNode = node;
        for (int i = 0; i < node.getOutEdges().size(); i++) {
          toSchema = (V) node.getOutEdges().get(i).getToNode();
          if (toSchema.getType() == NodeType.NODE_TYPE_OUTPUT) {
            parameter = node.getName();
            break;
          }
        }
        break;

      case NODE_TYPE_OUTPUT:
      case NODE_TYPE_SEMANTICS:
        toSchema = node;
        for (int i = 0; i < node.getInEdges().size(); i++) {
          if (node.getInEdges().get(i).getType() == EdgeType.EDGE_TYPE_OUTPUT
              || node.getInEdges().get(i).getType() == EdgeType.EDGE_TYPE_SEMANTICS) {
            toNode = (V) node.getInEdges().get(i).getFromNode();
            break;
          }
          parameter = node.getName();
          if (event.getEventType() == EventType.ADD_ATTRIBUTE) {
            parameter = "";
          }
        }
        break;

      default:
        for (int i = 0; i < node.getInEdges().size(); i++) {
          if (node.getInEdges().get(i).getFromNode().getType() == NodeType.NODE_TYPE_OUTPUT) {
            toSchema = (V) node.getInEdges().get(i).getFromNode();
            for (int j = 0; j < toSchema.getInEdges().size(); j++) {
              if (toSchema.getInEdges().get(j).getFromNode().getType()
                      == NodeType.NODE_TYPE_RELATION
                  || toSchema.getInEdges().get(j).getFromNode().getType()
                      == NodeType.NODE_TYPE_QUERY
                  || toSchema.getInEdges().get(j).getFromNode().getType()
                      == NodeType.NODE_TYPE_VIEW) {
                toNode = (V) toSchema.getInEdges().get(j).getFromNode();
              }
            }
            parameter = node.getName();
            if (event.getEventType() == EventType.DELETE_SELF) {
              event.setEventType(EventType.DELETE_ATTRIBUTE);
            } else if (event.getEventType() == EventType.RENAME_SELF) {
              event.setEventType(EventType.RENAME_ATTRIBUTE);
            }
            break;
          }
        }
        if (toSchema == null) {
          while (toNode == null) {
            toSchema = (V) node.getInEdges().get(0).getFromNode();
            if (toSchema.getType() == NodeType.NODE_TYPE_SEMANTICS) {
              event.setEventType(EventType.ALTER_SEMANTICS);
              toNode = (V) toSchema.getInEdges().get(0).getFromNode();
            }
          }
        }
        break;
    }
    Message<V, E> firstMessage =
        new Message<V, E>(toNode, toSchema, event.getEventType(), parameter);
    propagateChanges(firstMessage);
  }