aboutsummaryrefslogtreecommitdiffstats
path: root/aai-resources/src/main/java/org/onap/aai/dbgen/tags/UpdateEdgeTagsCmd.java
blob: 6e10853bdaa0a2af5ec96e4c737b66d5265d45d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
/**
 * ============LICENSE_START=======================================================
 * org.onap.aai
 * ================================================================================
 * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
 * ================================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============LICENSE_END=========================================================
 */
package org.onap.aai.dbgen.tags;

import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.janusgraph.core.JanusGraph;
import org.onap.aai.dbmap.AAIGraph;
import org.onap.aai.exceptions.AAIException;
import org.onap.aai.logging.ErrorLogHelper;
import org.onap.aai.serialization.db.EdgeRule;
import org.onap.aai.serialization.db.EdgeRules;
import org.onap.aai.util.AAIConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;

public class UpdateEdgeTagsCmd implements Command {
	private JanusGraph graph;
	private String rulesFilename;
	private EdgeRules edgeRulesInstance = null;
	private String[] edgeRuleKeys = null;

	private String filter = "all";
	private static 	final  String    FROMAPPID = "AAI-DB";
	private static 	final  String    TRANSID   = UUID.randomUUID().toString();
	

	static final Logger logger = LoggerFactory.getLogger(UpdateEdgeTagsCmd.class);

	/**
	 * @param filter
	 */
	public UpdateEdgeTagsCmd(String filter) throws AAIException {
		super();
		this.filter = filter;
		createEdgeRuleSet();
	}

	/**
	 * @param filter
	 * @param rulesFilename
	 */
	public UpdateEdgeTagsCmd(String filter, String rulesFilename) {
		super();
		this.rulesFilename = rulesFilename;
		this.filter = filter;
		this.createEdgeRuleSet();
	}

	@Override
	public void execute() throws AAIException {
    	try {
    		ErrorLogHelper.loadProperties();
    		if(graph == null) {
    			AAIConfig.init();
    			logger.info("    ---- NOTE --- about to open graph (takes a little while)--------\n");    			
    			graph = AAIGraph.getInstance().getGraph();
    		}
    		if( graph == null ){
    			String emsg = "null graph object in updateEdgeTags() \n";
    			logger.info(emsg);
    			return;
    		}
    	}
	    catch (AAIException e1) {
			String msg =  e1.getErrorObject().toString();
			System.out.println(msg);
			return;
        }
        catch (Exception e2) {
	 		String msg =  e2.toString();
	 		System.out.println(msg);
	 		e2.printStackTrace();
	 		return;
        }

    	Graph g = graph.newTransaction();
		try {  
        	 Iterator<Edge> edgeItr = graph.traversal().E();
/*
    		 if("all".equalsIgnoreCase(filter)) {
    			 edgeItr = graph.traversal().E();
    		 } else {
    			 edgeItr = graph.traversal().E()..inV().property("aai-node-type",this.edgeRuleKeys[0]);    			 
    			 edgeItr = graph.traversal().E().inV().has("aai-node-type").values(this.edgeRuleKeys[0]).outV().has("aai-node-type").values(this.edgeRuleKeys[1]);
    		 }
*/
        	 //Iterate over all the edges of the in memory graph
        	 while( edgeItr != null && edgeItr.hasNext() ){

        		 Edge thisEdge = edgeItr.next();
        		 //The filter can limit the application of changes to edges between vertices of one pair of node-types
        		 //Other node type pairs found in in-memory graph are skipped 
        		 if(! passesFilter(thisEdge) ) {
        			 continue;
        		 }
 
        		 //Find the rules in the file between the node-type pair for the current in-memory edge
        		 if( edgeRulesInstance.hasEdgeRule(thisEdge.inVertex().<String>property("aai-node-type").orElse(null),thisEdge.outVertex().<String>property("aai-node-type").orElse(null))) {
    	        		 logger.info("key = " + thisEdge.inVertex().<String>property("aai-node-type").orElse(null)+"|"+ thisEdge.outVertex().<String>property("aai-node-type").orElse(null)+ ", label = " + thisEdge.label()
    	        				 + ", for id = " + thisEdge.id().toString() + ", set: "+thisEdge.keys()+"\n");
    	        		 //Get the rule map from the FILE  for the node-type pair, filtered by label found on the in-memory Edge; expecting one rule
    	        		 //Note: the filter label does not work -- adding equals/contains(thisEdge.label() tests below
    	        		 Map<String, EdgeRule> edgeRules =edgeRulesInstance.getEdgeRules(thisEdge.inVertex().<String>property("aai-node-type").orElse(null),thisEdge.outVertex().<String>property("aai-node-type").orElse(null), thisEdge.label());
//    			         Collection<EdgeRule> edgeRules = edgeRuleMultimap.get(derivedEdgeKey);
    	        		 //Apply the Edge properties from the FILE rule to the in-memory Edge
    			         for(EdgeRule e : edgeRules.values()) {
    			        	 if(e.getLabel().equals(thisEdge.label())) {
        			        	 logger.info("EdgeRule e: " + String.join("|",thisEdge.outVertex().<String>property("aai-node-type").orElse(null),thisEdge.inVertex().<String>property("aai-node-type").orElse(null),e.getLabel()));
    			        		 edgeRulesInstance.addProperties(thisEdge, e); 
    			        	 }
    			         }
    			         //The FILE ruleset is broken? -- run away; discard all changes!
    			         if(! edgeRules.containsKey(thisEdge.label())) {
    						// Couldn't find a rule for this edge
    			        	logger.error("Broken EdgeSet in edgeRuleFile: " + thisEdge.bothVertices());
    						throw new AAIException("AAI_6120", "No EdgeRule found for nodeTypes: " + String.join("|",thisEdge.outVertex().<String>property("aai-node-type").orElse(null),thisEdge.inVertex().<String>property("aai-node-type").orElse(null),thisEdge.label()));
    			         }
    	        } else {
    	        	//The expected FILE ruleset could not be found -- run away; discard all changes!
    	        	logger.error("Missing EdgeSet in edgeRuleFile: " + thisEdge.bothVertices());
					throw new AAIException("AAI_6120", "No EdgeRule found for nodeTypes: " + String.join("|",thisEdge.outVertex().<String>property("aai-node-type").orElse(null),thisEdge.inVertex().<String>property("aai-node-type").orElse(null),thisEdge.label()));
    	        }
	        	 
			 } // End of looping over all in-memory edges
			 graph.tx().commit();
			 logger.info("- committed updates for listed edges " );
		}
		catch (Exception e2) {
			String msg = e2.toString();
			logger.error(msg);
			e2.printStackTrace();
			if( g != null ){
				graph.tx().rollback();
			}
			if(e2 instanceof AAIException) {
				throw e2;
			}
			return;
		}
		finally {
			try {
				g.close();
			}
			catch (Exception e) {
				logger.error("Error occured while closing Transaction with graph" + e.getMessage());
			}
		}
	}


	/**
	 * @return the rulesFilename
	 */
	public String getRulesFilename() {
		return this.rulesFilename;
	}

	/**
	 * @return the graph
	 */
	public JanusGraph getGraph() {
		return this.graph;
	}

	/**
	 * @param graph the graph to set
	 */
	public void setGraph(JanusGraph graph) {
		this.graph = graph;
	}
	
	private void createEdgeRuleSet() {
		if(this.filter != null) this.edgeRuleKeys = filter.split("\\|");
		edgeRulesInstance = (this.rulesFilename == null) ? EdgeRules.getInstance() : EdgeRules.getInstance(rulesFilename);
		return;
	}
	
	private boolean passesFilter(Edge tEdge) {
		if("all".equalsIgnoreCase(filter) ) {
			logger.debug("EdgeRule PROCESSALL: " + String.join("|",tEdge.outVertex().<String>property("aai-node-type").orElse(null),tEdge.inVertex().<String>property("aai-node-type").orElse(null),tEdge.label()));
			return true;
		}
		Iterator<Vertex> vItr = tEdge.bothVertices();

		ArrayList<String> l = new ArrayList<String>(Arrays.asList(edgeRuleKeys));
		while( vItr != null && vItr.hasNext() ) {
			Vertex v = vItr.next();
			int i = l.indexOf(v.property("aai-node-type").value());
			if (i >= 0) l.remove(i);
		}
		if(l.isEmpty()) {
			logger.debug("EdgeRule filterPROCESS: " + String.join("|",tEdge.outVertex().<String>property("aai-node-type").orElse(null),tEdge.inVertex().<String>property("aai-node-type").orElse(null),tEdge.label()));
		}
		else {
			logger.debug("EdgeRule filterSKIP: " + String.join("|",tEdge.outVertex().<String>property("aai-node-type").orElse(null),tEdge.inVertex().<String>property("aai-node-type").orElse(null),tEdge.label()));
		}
		return l.isEmpty();
	}
}