blob: d5fe4c6e03a9d1bbe4a4e7380ac5d1ffca703da3 [file] [log] [blame]
Pankaj Berdeda809572013-02-22 15:31:20 -08001package net.onrc.onos.util;
2
3import java.util.Set;
4
Pankaj Berde2239f0d2013-04-04 09:42:43 -07005import org.slf4j.Logger;
6import org.slf4j.LoggerFactory;
7
Pankaj Berdeda809572013-02-22 15:31:20 -08008import com.thinkaurelius.titan.core.TitanFactory;
9import com.thinkaurelius.titan.core.TitanGraph;
Pankaj Berdea7095572013-04-05 14:42:17 -070010import com.tinkerpop.blueprints.TransactionalGraph;
Pankaj Berdeda809572013-02-22 15:31:20 -080011import com.tinkerpop.blueprints.TransactionalGraph.Conclusion;
Pankaj Berde86a0d412013-04-05 15:06:26 -070012import com.tinkerpop.blueprints.Vertex;
Pankaj Berde2239f0d2013-04-04 09:42:43 -070013import com.tinkerpop.blueprints.util.wrappers.event.EventTransactionalGraph;
Pankaj Berdeda809572013-02-22 15:31:20 -080014import com.tinkerpop.frames.FramedGraph;
15
16public class GraphDBConnection {
17 public enum Transaction {
18 COMMIT,
19 ROLLBACK
20 }
Pankaj Berde2239f0d2013-04-04 09:42:43 -070021 public enum GenerateEvent {
22 TRUE,
23 FALSE
24 }
Pankaj Berdea7095572013-04-05 14:42:17 -070025 class TransactionHandle {
26 protected TransactionalGraph tr;
27 public void create() {
28 tr = graph.startTransaction();
29 }
30 }
Pankaj Berde2239f0d2013-04-04 09:42:43 -070031 protected static Logger log = LoggerFactory.getLogger(GraphDBConnection.class);
Pankaj Berdeda809572013-02-22 15:31:20 -080032 private static GraphDBConnection singleton = new GraphDBConnection( );
33 private static TitanGraph graph;
Pankaj Berde2239f0d2013-04-04 09:42:43 -070034 private static EventTransactionalGraph<TitanGraph> eg;
Pankaj Berdeda809572013-02-22 15:31:20 -080035 private static GraphDBUtils utils;
Pankaj Berde2239f0d2013-04-04 09:42:43 -070036 private static String configFile;
37
Pankaj Berdeda809572013-02-22 15:31:20 -080038
39 /* A private Constructor prevents any other
40 * class from instantiating.
41 */
42 private GraphDBConnection(){ }
43
44 /* Static 'instance' method */
Pankaj Berde2239f0d2013-04-04 09:42:43 -070045 public static GraphDBConnection getInstance(final String conf) {
46 if (GraphDBConnection.configFile == null || GraphDBConnection.configFile.isEmpty()) {
47 GraphDBConnection.configFile = conf;
48 log.debug("GraphDBConnection::Setting Config File {}", GraphDBConnection.configFile);
49 }
50 if (!GraphDBConnection.configFile.isEmpty() &&
51 (graph == null||graph.isOpen() == Boolean.FALSE)) {
52 graph = TitanFactory.open(GraphDBConnection.configFile);
Pankaj Berdeda809572013-02-22 15:31:20 -080053 // FIXME: Creation on Indexes should be done only once
54 Set<String> s = graph.getIndexedKeys(Vertex.class);
55 if (!s.contains("dpid")) {
56 graph.createKeyIndex("dpid", Vertex.class);
57 }
58 if (!s.contains("type")) {
59 graph.createKeyIndex("type", Vertex.class);
60 }
61 if (!s.contains("dl_address")) {
62 graph.createKeyIndex("dl_address", Vertex.class);
63 }
Pavlin Radoslavovb6f53542013-03-01 16:02:14 -080064 if (!s.contains("flow_id")) {
65 graph.createKeyIndex("flow_id", Vertex.class);
66 }
67 if (!s.contains("flow_entry_id")) {
68 graph.createKeyIndex("flow_entry_id",
69 Vertex.class);
70 }
Pankaj Berded1c38592013-04-10 22:46:40 -070071 if (!s.contains("switch_state")) {
72 graph.createKeyIndex("switch_state",
73 Vertex.class);
74 }
Pankaj Berde2239f0d2013-04-04 09:42:43 -070075 graph.stopTransaction(Conclusion.SUCCESS);
76 eg = new EventTransactionalGraph<TitanGraph>(graph);
77 }
Pankaj Berdeda809572013-02-22 15:31:20 -080078 if (utils == null) {
79 utils = new GraphDBUtils();
80 }
81 return singleton;
82 }
83
84 public IDBUtils utils() {
85 return utils;
86 }
87
Pankaj Berde86a0d412013-04-05 15:06:26 -070088 public FramedGraph<TitanGraph> getFramedGraph() {
Pankaj Berdeda809572013-02-22 15:31:20 -080089
90 if (isValid()) {
91 FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
92 return fg;
93 } else {
Pankaj Berde62016142013-04-09 15:35:50 -070094 log.error("new FramedGraph failed");
Pankaj Berdeda809572013-02-22 15:31:20 -080095 return null;
96 }
97 }
98
Pankaj Berde2239f0d2013-04-04 09:42:43 -070099 protected EventTransactionalGraph<TitanGraph> getEventGraph() {
100
101 if (isValid()) {
102 return eg;
103 } else {
104 return null;
105 }
106 }
107
108 public void addEventListener(final LocalGraphChangedListener listener) {
109 EventTransactionalGraph<TitanGraph> eg = this.getEventGraph();
110 eg.addListener(listener);
111 log.debug("Registered listener {}",listener.getClass());
112 }
113
Pankaj Berdeda809572013-02-22 15:31:20 -0800114 public Boolean isValid() {
115
116 return (graph != null||graph.isOpen());
117 }
118
119 public void startTx() {
120
Pankaj Berdea7095572013-04-05 14:42:17 -0700121
Pankaj Berdeda809572013-02-22 15:31:20 -0800122 }
123
124 public void endTx(Transaction tx) {
Pankaj Berde86a0d412013-04-05 15:06:26 -0700125 try {
Pankaj Berde62016142013-04-09 15:35:50 -0700126 switch (tx) {
Pankaj Berde86a0d412013-04-05 15:06:26 -0700127 case COMMIT:
128 graph.stopTransaction(Conclusion.SUCCESS);
129 case ROLLBACK:
130 graph.stopTransaction(Conclusion.FAILURE);
131 }
Pankaj Berde62016142013-04-09 15:35:50 -0700132 } catch (Exception e) {
133 // TODO Auto-generated catch block
134 log.error("{}",e.toString());
135 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800136 }
137
Pankaj Berdea7095572013-04-05 14:42:17 -0700138 public void endTx(TransactionHandle tr, Transaction tx) {
139 switch (tx) {
140 case COMMIT:
141 if (tr != null && tr.tr != null) {
142 tr.tr.stopTransaction(Conclusion.SUCCESS);
143 } else {
144 graph.stopTransaction(Conclusion.SUCCESS);
145 }
146 case ROLLBACK:
147 if (tr != null && tr.tr != null) {
148 tr.tr.stopTransaction(Conclusion.FAILURE);
149 } else {
150 graph.stopTransaction(Conclusion.FAILURE);
151 }
152 }
153 }
154
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700155 public void endTx(Transaction tx, GenerateEvent fire) {
156
157 try {
158 if (fire.equals(GenerateEvent.TRUE)) {
159 switch (tx) {
160 case COMMIT:
161 eg.stopTransaction(Conclusion.SUCCESS);
162 case ROLLBACK:
163 eg.stopTransaction(Conclusion.FAILURE);
164 }
165 } else {
166 endTx(tx);
167 }
168 } catch (Exception e) {
169 // TODO Auto-generated catch block
170 e.printStackTrace();
171 }
172 }
173
Pankaj Berdeda809572013-02-22 15:31:20 -0800174 public void close() {
Pankaj Berde62016142013-04-09 15:35:50 -0700175 endTx(Transaction.COMMIT);
Pankaj Berdedf871be2013-04-05 18:04:17 -0700176// graph.shutdown();
Pankaj Berdeda809572013-02-22 15:31:20 -0800177 }
178
179}