2 * ============LICENSE_START==========================================
4 * ===================================================================
5 * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6 * Copyright © 2017 Amdocs
7 * ===================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END============================================
20 * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22 package org.openecomp.aai.champ.graph.impl;
24 import java.io.IOException;
25 import java.util.Collection;
26 import java.util.HashMap;
28 import java.util.Optional;
29 import java.util.concurrent.ConcurrentHashMap;
30 import java.util.stream.Stream;
32 import org.apache.tinkerpop.gremlin.structure.Edge;
33 import org.apache.tinkerpop.gremlin.structure.Vertex;
34 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
35 import org.openecomp.aai.champ.ChampCapabilities;
36 import org.openecomp.aai.champ.exceptions.ChampIndexNotExistsException;
37 import org.openecomp.aai.champ.model.ChampObjectIndex;
38 import org.openecomp.aai.champ.model.ChampRelationshipIndex;
39 import org.openecomp.aai.champ.schema.ChampSchemaEnforcer;
40 import org.openecomp.aai.champ.schema.DefaultChampSchemaEnforcer;
41 import org.slf4j.Logger;
43 import com.att.nsa.cambria.client.CambriaPublisher;
45 public final class InMemoryChampGraphImpl extends AbstractTinkerpopChampGraph {
47 private static final ChampCapabilities CAPABILITIES = new ChampCapabilities() {
50 public boolean canDeleteObjectIndices() {
55 public boolean canDeleteRelationshipIndices() {
60 private final ConcurrentHashMap<String, ChampObjectIndex> objectIndices;
61 private final ConcurrentHashMap<String, ChampRelationshipIndex> relationshipIndices;
63 private final ChampSchemaEnforcer schemaEnforcer;
64 private final TinkerGraph graph;
66 private InMemoryChampGraphImpl(Builder builder) {
67 super(builder.graphConfiguration);
68 this.graph = TinkerGraph.open();
70 this.objectIndices = new ConcurrentHashMap<String, ChampObjectIndex> ();
71 this.relationshipIndices = new ConcurrentHashMap<String, ChampRelationshipIndex> ();
73 this.schemaEnforcer = builder.schemaEnforcer;
76 public static class Builder {
77 private final Map<String, Object> graphConfiguration = new HashMap<String, Object> ();
78 private ChampSchemaEnforcer schemaEnforcer = new DefaultChampSchemaEnforcer();
82 public Builder schemaEnforcer(ChampSchemaEnforcer schemaEnforcer) {
83 this.schemaEnforcer = schemaEnforcer;
87 public InMemoryChampGraphImpl build() {
88 return new InMemoryChampGraphImpl(this);
92 protected ChampSchemaEnforcer getSchemaEnforcer() {
93 return schemaEnforcer;
97 protected TinkerGraph getGraph() {
101 private ConcurrentHashMap<String, ChampObjectIndex> getObjectIndices() {
102 return objectIndices;
105 private ConcurrentHashMap<String, ChampRelationshipIndex> getRelationshipIndices() {
106 return relationshipIndices;
109 public void executeStoreObjectIndex(ChampObjectIndex index) {
110 if (isShutdown()) throw new IllegalStateException("Cannot call storeObjectIndex() after shutdown has been initiated");
112 getGraph().createIndex(index.getField().getName(), Vertex.class);
113 getObjectIndices().put(index.getName(), index);
117 public Optional<ChampObjectIndex> retrieveObjectIndex(String indexName) {
118 if (isShutdown()) throw new IllegalStateException("Cannot call retrieveObjectIndex() after shutdown has been initiated");
120 if (getObjectIndices().containsKey(indexName))
121 return Optional.of(getObjectIndices().get(indexName));
123 return Optional.empty();
127 public Stream<ChampObjectIndex> retrieveObjectIndices() {
128 if (isShutdown()) throw new IllegalStateException("Cannot call retrieveObjectIndices() after shutdown has been initiated");
130 return getObjectIndices().values().stream();
133 public void executeDeleteObjectIndex(String indexName) throws ChampIndexNotExistsException {
134 if (isShutdown()) throw new IllegalStateException("Cannot call deleteObjectIndex() after shutdown has been initiated");
136 final ChampObjectIndex objectIndex = getObjectIndices().remove(indexName);
138 if (objectIndex == null) throw new ChampIndexNotExistsException();
140 getGraph().dropIndex(objectIndex.getField().getName(), Vertex.class);
143 public void executeStoreRelationshipIndex(ChampRelationshipIndex index) {
144 if (isShutdown()) throw new IllegalStateException("Cannot call storeRelationshipIndex() after shutdown has been initiated");
146 getGraph().createIndex(index.getField().getName(), Edge.class);
147 getRelationshipIndices().put(index.getName(), index);
151 public Optional<ChampRelationshipIndex> retrieveRelationshipIndex(String indexName) {
152 if (isShutdown()) throw new IllegalStateException("Cannot call retrieveRelationshipIndex() after shutdown has been initiated");
154 if (getRelationshipIndices().containsKey(indexName)) {
155 return Optional.of(getRelationshipIndices().get(indexName));
158 return Optional.empty();
162 public Stream<ChampRelationshipIndex> retrieveRelationshipIndices() {
163 if (isShutdown()) throw new IllegalStateException("Cannot call retrieveRelationshipIndices() after shutdown has been initiated");
165 return getRelationshipIndices().values().stream();
168 public void executeDeleteRelationshipIndex(String indexName) throws ChampIndexNotExistsException {
169 if (isShutdown()) throw new IllegalStateException("Cannot call deleteRelationshipIndex() after shutdown has been initiated");
171 final ChampRelationshipIndex relationshipIndex = getRelationshipIndices().remove(indexName);
173 if (relationshipIndex == null) throw new ChampIndexNotExistsException();
175 getGraph().dropIndex(relationshipIndex.getField().getName(), Edge.class);
179 public ChampCapabilities capabilities() {