2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 you may not use this file except in compliance with the License.
9 You may obtain a copy of the License at
11 http://www.apache.org/licenses/LICENSE-2.0
13 Unless required by applicable law or agreed to in writing, software
14 distributed under the License is distributed on an "AS IS" BASIS,
15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 See the License for the specific language governing permissions and
17 limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.aai.dbmap;
23 import java.io.FileInputStream;
24 import java.io.FileNotFoundException;
25 import java.io.IOException;
26 import java.io.InputStream;
27 import java.util.HashMap;
29 import java.util.Properties;
31 import org.apache.commons.lang.exception.ExceptionUtils;
32 import org.apache.tinkerpop.gremlin.structure.io.IoCore;
34 import org.openecomp.aai.dbgen.SchemaGenerator;
35 import org.openecomp.aai.exceptions.AAIException;
36 import org.openecomp.aai.util.AAIConstants;
37 import com.att.eelf.configuration.EELFLogger;
38 import com.att.eelf.configuration.EELFManager;
39 import com.thinkaurelius.titan.core.TitanFactory;
40 import com.thinkaurelius.titan.core.TitanGraph;
41 import com.thinkaurelius.titan.core.TitanTransaction;
42 import com.thinkaurelius.titan.core.schema.TitanManagement;
45 * Database Mapping class which acts as the middle man between the REST
46 * interface objects and Titan DB objects. This class provides methods to commit
47 * the objects received on the REST interface into the Titan graph database as
48 * vertices and edges. Transactions are also managed here by using a TitanGraph
49 * object to load, commit/rollback and shutdown for each request. The data model
50 * rules such as keys/required properties are handled by calling DBMeth methods
51 * which are driven by a specification file in json.
55 public class AAIGraph {
57 protected Map<String, TitanGraph> graphs = new HashMap<>();
58 protected static final String COMPONENT = "aaidbmap";
59 private final String REALTIME_DB = "realtime";
60 private final String CACHED_DB = "cached";
61 private final EELFLogger logger = EELFManager.getInstance().getLogger(this.getClass().getSimpleName());
65 * Instantiates a new AAI graph.
69 String rtConfig = System.getProperty("realtime.db.config");
70 String cachedConfig = System.getProperty("cached.db.config");
71 if (rtConfig == null) {
72 rtConfig = AAIConstants.REALTIME_DB_CONFIG;
74 if (cachedConfig == null) {
75 cachedConfig = AAIConstants.CACHED_DB_CONFIG;
77 this.loadGraph(REALTIME_DB, rtConfig);
78 this.loadGraph(CACHED_DB, cachedConfig);
79 } catch (Exception e) {
80 throw new RuntimeException("Failed to instantiate graphs", e);
84 private static class Helper {
85 private static final AAIGraph INSTANCE = new AAIGraph();
89 * Gets the single instance of AAIGraph.
91 * @return single instance of AAIGraph
93 public static AAIGraph getInstance() {
94 return Helper.INSTANCE;
97 private void loadGraph(String name, String configPath) throws AAIException {
99 final TitanGraph graph = TitanFactory.open(configPath);
100 InputStream is = new FileInputStream(configPath);
101 Properties graphProps = new Properties();
104 if (graphProps.get("storage.backend").equals("inmemory")) {
105 // Load the propertyKeys, indexes and edge-Labels into the DB
107 if (graphProps.containsKey("load.snapshot.file")) {
108 String value = graphProps.getProperty("load.snapshot.file");
109 if ("true".equals(value)) {
111 String location = System.getProperty("snapshot.location");
112 logAndPrint(logger, "Loading snapshot to inmemory graph.");
113 TitanTransaction transaction = graph.newTransaction();
114 transaction.io(IoCore.graphson()).readGraph(location);
115 transaction.commit();
116 logAndPrint(logger, "Snapshot loaded to inmemory graph.");
117 } catch (IOException e) {
119 logAndPrint(logger, "ERROR: Could not load datasnapshot to in memory graph. \n" + ExceptionUtils.getFullStackTrace(e));
127 throw new AAIException("AAI_5102");
130 graphs.put(name, graph);
131 } catch (FileNotFoundException fnfe) {
132 throw new AAIException("AAI_4001");
133 } catch (IOException e) {
134 throw new AAIException("AAI_4002");
139 private void loadSchema(TitanGraph graph) {
140 // Load the propertyKeys, indexes and edge-Labels into the DB
141 TitanManagement graphMgt = graph.openManagement();
143 System.out.println("-- loading schema into Titan");
144 SchemaGenerator.loadSchemaIntoTitan( graph, graphMgt );
150 public void graphShutdown() {
151 graphs.get(REALTIME_DB).close();
159 public TitanGraph getGraph() {
160 return graphs.get(REALTIME_DB);
163 public void graphShutdown(DBConnectionType connectionType) {
165 graphs.get(this.getGraphName(connectionType)).close();
168 public TitanGraph getGraph(DBConnectionType connectionType) {
169 return graphs.get(this.getGraphName(connectionType));
172 private String getGraphName(DBConnectionType connectionType) {
173 String graphName = "";
174 if (DBConnectionType.CACHED.equals(connectionType)) {
175 graphName = this.CACHED_DB;
176 } else if (DBConnectionType.REALTIME.equals(connectionType)) {
177 graphName = this.REALTIME_DB;
183 private void logAndPrint(EELFLogger logger, String msg) {
184 System.out.println(msg);