/* * 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; }
/** 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); }