summaryrefslogtreecommitdiffstats
path: root/common/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'common/src/main')
-rw-r--r--common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperPatchProvider.java8
-rw-r--r--common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperProvider.java27
-rw-r--r--common/src/main/java/org/onap/so/client/aai/AAIDSLQuery.java83
-rw-r--r--common/src/main/java/org/onap/so/client/aai/AAIObjectType.java1
-rw-r--r--common/src/main/java/org/onap/so/client/aai/AAIResourcesClient.java136
-rw-r--r--common/src/main/java/org/onap/so/client/aai/AAIRestClient.java5
-rw-r--r--common/src/main/java/org/onap/so/client/aai/AAISingleTransactionClient.java88
-rw-r--r--common/src/main/java/org/onap/so/client/aai/AAITransactionalClient.java98
-rw-r--r--common/src/main/java/org/onap/so/client/aai/entities/AAIResultWrapper.java84
-rw-r--r--common/src/main/java/org/onap/so/client/aai/entities/DSLNode.java75
-rw-r--r--common/src/main/java/org/onap/so/client/aai/entities/DSLNodeKey.java69
-rw-r--r--common/src/main/java/org/onap/so/client/aai/entities/DSLQuery.java47
-rw-r--r--common/src/main/java/org/onap/so/client/aai/entities/DSLQueryBuilder.java111
-rw-r--r--common/src/main/java/org/onap/so/client/aai/entities/QueryStep.java28
-rw-r--r--common/src/main/java/org/onap/so/client/aai/entities/__.java59
-rw-r--r--common/src/main/java/org/onap/so/client/graphinventory/EmptyStringToNullSerializer.java (renamed from common/src/main/java/org/onap/so/client/aai/EmptyStringToNullSerializer.java)2
-rw-r--r--common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperPatchProvider.java35
-rw-r--r--common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperProvider.java52
-rw-r--r--common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryPatchConverter.java (renamed from common/src/main/java/org/onap/so/client/aai/AAIPatchConverter.java)10
-rw-r--r--common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryResourcesClient.java147
-rw-r--r--common/src/main/java/org/onap/so/client/graphinventory/GraphInventorySingleTransactionClient.java87
-rw-r--r--common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionalClient.java94
-rw-r--r--common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryResultWrapper.java117
-rw-r--r--common/src/main/java/org/onap/so/client/graphinventory/exceptions/IncorrectNumberOfUriKeys.java20
-rw-r--r--common/src/main/resources/dmaap/default-consumer.properties1
25 files changed, 1182 insertions, 302 deletions
diff --git a/common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperPatchProvider.java b/common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperPatchProvider.java
index 33c9769400..9c8345d4b6 100644
--- a/common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperPatchProvider.java
+++ b/common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperPatchProvider.java
@@ -20,16 +20,12 @@
package org.onap.so.client.aai;
-import com.fasterxml.jackson.databind.module.SimpleModule;
+import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperPatchProvider;
-public class AAICommonObjectMapperPatchProvider extends AAICommonObjectMapperProvider {
+public class AAICommonObjectMapperPatchProvider extends GraphInventoryCommonObjectMapperPatchProvider {
public AAICommonObjectMapperPatchProvider() {
super();
- EmptyStringToNullSerializer sp = new EmptyStringToNullSerializer();
- SimpleModule emptyStringModule = new SimpleModule();
- emptyStringModule.addSerializer(String.class, sp);
- mapper.registerModule(emptyStringModule);
}
}
diff --git a/common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperProvider.java b/common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperProvider.java
index 0e2071842f..15bc2ea8ef 100644
--- a/common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperProvider.java
+++ b/common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperProvider.java
@@ -20,33 +20,12 @@
package org.onap.so.client.aai;
-import org.onap.so.client.policy.CommonObjectMapperProvider;
+import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvider;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import com.fasterxml.jackson.databind.AnnotationIntrospector;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.MapperFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
-import com.fasterxml.jackson.databind.type.TypeFactory;
-import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
-
-public class AAICommonObjectMapperProvider extends CommonObjectMapperProvider {
+public class AAICommonObjectMapperProvider extends GraphInventoryCommonObjectMapperProvider {
public AAICommonObjectMapperProvider() {
- mapper = new ObjectMapper();
- mapper.setSerializationInclusion(Include.NON_NULL);
- mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
- mapper.enable(MapperFeature.USE_ANNOTATIONS);
- mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
- mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, false);
- mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
- AnnotationIntrospector aiJaxb = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance());
- AnnotationIntrospector aiJackson = new JacksonAnnotationIntrospector();
- // first Jaxb, second Jackson annotations
- mapper.setAnnotationIntrospector(AnnotationIntrospector.pair(aiJaxb, aiJackson));
+ super();
}
}
diff --git a/common/src/main/java/org/onap/so/client/aai/AAIDSLQuery.java b/common/src/main/java/org/onap/so/client/aai/AAIDSLQuery.java
new file mode 100644
index 0000000000..52bae20ff3
--- /dev/null
+++ b/common/src/main/java/org/onap/so/client/aai/AAIDSLQuery.java
@@ -0,0 +1,83 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 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.so.client.aai;
+
+import java.util.Optional;
+
+import org.onap.so.client.RestClient;
+import org.onap.so.client.aai.entities.DSLQuery;
+import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.onap.so.client.graphinventory.Format;
+import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
+
+public class AAIDSLQuery extends AAIClient {
+
+ private Optional<String> depth = Optional.empty();
+ private boolean nodesOnly = false;
+ private Optional<AAISubgraphType> subgraph = Optional.empty();
+
+ public AAIDSLQuery() {
+ super();
+ }
+
+ public AAIDSLQuery(AAIVersion version) {
+ super();
+ this.version = version;
+ }
+
+ public String query(Format format, DSLQuery query) {
+ return this.createClient(AAIUriFactory.createResourceUri(AAIObjectType.DSL).queryParam("format", format.toString()))
+ .put(query, String.class);
+ }
+
+ public AAIDSLQuery depth (String depth) {
+ this.depth = Optional.of(depth);
+ return this;
+ }
+ public AAIDSLQuery nodesOnly() {
+ this.nodesOnly = true;
+ return this;
+ }
+ public AAIDSLQuery subgraph(AAISubgraphType type){
+
+ subgraph = Optional.of(type);
+
+ return this;
+ }
+
+ protected GraphInventoryUri setupQueryParams(GraphInventoryUri uri) {
+ GraphInventoryUri clone = uri.clone();
+ if (this.depth.isPresent()) {
+ clone.queryParam("depth", depth.get());
+ }
+ if (this.nodesOnly) {
+ clone.queryParam("nodesOnly", "");
+ }
+ if (this.subgraph.isPresent()) {
+ clone.queryParam("subgraph", this.subgraph.get().toString());
+ }
+ return clone;
+ }
+ @Override
+ protected RestClient createClient(GraphInventoryUri uri) {
+ return super.createClient(setupQueryParams(uri));
+ }
+}
diff --git a/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java b/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java
index 66ff59d94f..14d7f43911 100644
--- a/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java
+++ b/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java
@@ -134,6 +134,7 @@ public class AAIObjectType implements GraphInventoryObjectType, Serializable {
public static final AAIObjectType AGGREGATE_ROUTE = new AAIObjectType(AAINamespaceConstants.NETWORK, AggregateRoute.class);
public static final AAIObjectType L_INTERFACE = new AAIObjectType(AAIObjectType.VSERVER.uriTemplate(), LInterface.class);
public static final AAIObjectType UNKNOWN = new AAIObjectType("", "", "unknown");
+ public static final AAIObjectType DSL = new AAIObjectType("/dsl", "", "dsl");
private final String uriTemplate;
private final String parentUri;
diff --git a/common/src/main/java/org/onap/so/client/aai/AAIResourcesClient.java b/common/src/main/java/org/onap/so/client/aai/AAIResourcesClient.java
index 87951d516b..288ac9bc7f 100644
--- a/common/src/main/java/org/onap/so/client/aai/AAIResourcesClient.java
+++ b/common/src/main/java/org/onap/so/client/aai/AAIResourcesClient.java
@@ -36,9 +36,10 @@ import org.onap.so.client.aai.entities.AAIEdgeLabel;
import org.onap.so.client.aai.entities.AAIResultWrapper;
import org.onap.so.client.aai.entities.uri.AAIResourceUri;
import org.onap.so.client.aai.entities.uri.AAIUri;
+import org.onap.so.client.graphinventory.GraphInventoryResourcesClient;
import org.onap.so.client.graphinventory.entities.uri.Depth;
-public class AAIResourcesClient extends AAIClient {
+public class AAIResourcesClient extends AAIClient implements GraphInventoryResourcesClient<AAIResourcesClient, AAIResourceUri, AAIEdgeLabel, AAIResultWrapper, AAITransactionalClient, AAISingleTransactionClient> {
public AAIResourcesClient() {
super();
@@ -49,37 +50,30 @@ public class AAIResourcesClient extends AAIClient {
this.version = version;
}
- /**
- * creates a new object in A&AI
- *
- * @param obj - can be any object which will marshal into a valid A&AI payload
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#create(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.lang.Object)
*/
+ @Override
public void create(AAIResourceUri uri, Object obj) {
RestClient aaiRC = this.createClient(uri);
aaiRC.put(obj);
return;
}
- /**
- * creates a new object in A&AI with no payload body
- *
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#createEmpty(org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public void createEmpty(AAIResourceUri uri) {
RestClient aaiRC = this.createClient(uri);
aaiRC.put("");
return;
}
- /**
- * returns false if the object does not exist in A&AI
- *
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#exists(org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public boolean exists(AAIResourceUri uri) {
AAIUri forceMinimal = this.addParams(Optional.of(Depth.ZERO), true, uri);
try {
@@ -91,12 +85,10 @@ public class AAIResourcesClient extends AAIClient {
}
}
- /**
- * Adds a relationship between two objects in A&AI
- * @param uriA
- * @param uriB
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public void connect(AAIResourceUri uriA, AAIResourceUri uriB) {
AAIResourceUri uriAClone = uriA.clone();
RestClient aaiRC = this.createClient(uriAClone.relationshipAPI());
@@ -104,14 +96,10 @@ public class AAIResourcesClient extends AAIClient {
return;
}
- /**
- * Adds a relationship between two objects in A&AI
- * with a given edge label
- * @param uriA
- * @param uriB
- * @param edge label
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.AAIEdgeLabel)
*/
+ @Override
public void connect(AAIResourceUri uriA, AAIResourceUri uriB, AAIEdgeLabel label) {
AAIResourceUri uriAClone = uriA.clone();
RestClient aaiRC = this.createClient(uriAClone.relationshipAPI());
@@ -119,13 +107,10 @@ public class AAIResourcesClient extends AAIClient {
return;
}
- /**
- * Removes relationship from two objects in A&AI
- *
- * @param uriA
- * @param uriB
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#disconnect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public void disconnect(AAIResourceUri uriA, AAIResourceUri uriB) {
AAIResourceUri uriAClone = uriA.clone();
RestClient aaiRC = this.createClient(uriAClone.relationshipAPI());
@@ -133,12 +118,10 @@ public class AAIResourcesClient extends AAIClient {
return;
}
- /**
- * Deletes object from A&AI. Automatically handles resource-version.
- *
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#delete(org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public void delete(AAIResourceUri uri) {
AAIResourceUri clone = uri.clone();
RestClient aaiRC = this.createClient(clone);
@@ -150,23 +133,20 @@ public class AAIResourcesClient extends AAIClient {
return;
}
- /**
- * @param obj - can be any object which will marshal into a valid A&AI payload
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#update(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.lang.Object)
*/
+ @Override
public void update(AAIResourceUri uri, Object obj) {
RestClient aaiRC = this.createClient(uri);
aaiRC.patch(obj);
return;
}
- /**
- * Retrieves an object from A&AI and unmarshalls it into the Class specified
- * @param clazz
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#get(java.lang.Class, org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public <T> Optional<T> get(Class<T> clazz, AAIResourceUri uri) {
try {
return this.createClient(uri).get(clazz);
@@ -179,11 +159,10 @@ public class AAIResourcesClient extends AAIClient {
}
}
- /**
- * Retrieves an object from A&AI and returns complete response
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#getFullResponse(org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public Response getFullResponse(AAIResourceUri uri) {
try {
return this.createClient(uri).get();
@@ -196,12 +175,10 @@ public class AAIResourcesClient extends AAIClient {
}
}
- /**
- * Retrieves an object from A&AI and automatically unmarshalls it into a Map or List
- * @param resultClass
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#get(javax.ws.rs.core.GenericType, org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public <T> Optional<T> get(GenericType<T> resultClass, AAIResourceUri uri) {
try {
return this.createClient(uri).get(resultClass);
@@ -214,12 +191,10 @@ public class AAIResourcesClient extends AAIClient {
}
}
- /**
- * Retrieves an object from A&AI wrapped in a helper class which offer additional features
- *
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#get(org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public AAIResultWrapper get(AAIResourceUri uri) {
String json;
try {
@@ -234,13 +209,10 @@ public class AAIResourcesClient extends AAIClient {
return new AAIResultWrapper(json);
}
- /**
- * Retrieves an object from A&AI wrapped in a helper class which offer additional features
- * If the object cannot be found in A&AI the method will throw the runtime exception
- * included as an argument
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#get(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.lang.Class)
*/
+ @Override
public AAIResultWrapper get(AAIResourceUri uri, Class<? extends RuntimeException> c) {
String json;
try {
@@ -285,13 +257,10 @@ public class AAIResourcesClient extends AAIClient {
return result;
}
- /**
- * Will automatically create the object if it does not exist
- *
- * @param obj - Optional object which serializes to a valid A&AI payload
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#createIfNotExists(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.util.Optional)
*/
+ @Override
public AAIResourcesClient createIfNotExists(AAIResourceUri uri, Optional<Object> obj) {
if(!this.exists(uri)){
if (obj.isPresent()) {
@@ -304,20 +273,18 @@ public class AAIResourcesClient extends AAIClient {
return this;
}
- /**
- * Starts a transaction which encloses multiple A&AI mutations
- *
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#beginTransaction()
*/
+ @Override
public AAITransactionalClient beginTransaction() {
return new AAITransactionalClient(this.getVersion());
}
- /**
- * Starts a transaction groups multiple A&AI mutations
- *
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#beginSingleTransaction()
*/
+ @Override
public AAISingleTransactionClient beginSingleTransaction() {
return new AAISingleTransactionClient(this.getVersion());
}
@@ -333,6 +300,9 @@ public class AAIResourcesClient extends AAIClient {
return clone;
}
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryResourcesClient#getRestProperties()
+ */
@Override
public <T extends RestProperties> T getRestProperties() {
return super.getRestProperties();
diff --git a/common/src/main/java/org/onap/so/client/aai/AAIRestClient.java b/common/src/main/java/org/onap/so/client/aai/AAIRestClient.java
index 4f235c35f1..a2651195ee 100644
--- a/common/src/main/java/org/onap/so/client/aai/AAIRestClient.java
+++ b/common/src/main/java/org/onap/so/client/aai/AAIRestClient.java
@@ -28,6 +28,7 @@ import javax.ws.rs.core.Response;
import org.onap.so.client.ResponseExceptionMapper;
import org.onap.so.client.RestClientSSL;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
import org.onap.so.client.policy.CommonObjectMapperProvider;
import org.onap.so.utils.TargetEntity;
@@ -36,7 +37,7 @@ public class AAIRestClient extends RestClientSSL {
private final AAIProperties aaiProperties;
private static final AAICommonObjectMapperProvider standardProvider = new AAICommonObjectMapperProvider();
- private final AAIPatchConverter patchConverter = new AAIPatchConverter();
+ private final GraphInventoryPatchConverter patchConverter = new GraphInventoryPatchConverter();
protected AAIRestClient(AAIProperties props, URI uri) {
super(props, Optional.of(uri));
@@ -81,7 +82,7 @@ public class AAIRestClient extends RestClientSSL {
return super.patch(convertToPatchFormat(obj), resultClass);
}
- protected AAIPatchConverter getPatchConverter() {
+ protected GraphInventoryPatchConverter getPatchConverter() {
return this.patchConverter;
}
diff --git a/common/src/main/java/org/onap/so/client/aai/AAISingleTransactionClient.java b/common/src/main/java/org/onap/so/client/aai/AAISingleTransactionClient.java
index 2ecdb7c480..ba65ac3f15 100644
--- a/common/src/main/java/org/onap/so/client/aai/AAISingleTransactionClient.java
+++ b/common/src/main/java/org/onap/so/client/aai/AAISingleTransactionClient.java
@@ -43,19 +43,21 @@ import org.onap.so.client.aai.entities.singletransaction.SingleTransactionRespon
import org.onap.so.client.aai.entities.uri.AAIResourceUri;
import org.onap.so.client.aai.entities.uri.AAIUri;
import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
+import org.onap.so.client.graphinventory.GraphInventorySingleTransactionClient;
import org.onap.so.client.graphinventory.exceptions.BulkProcessFailed;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Joiner;
-public class AAISingleTransactionClient extends AAIClient {
+public class AAISingleTransactionClient extends AAIClient implements GraphInventorySingleTransactionClient<AAISingleTransactionClient, AAIResourceUri, AAIEdgeLabel> {
private final SingleTransactionRequest request;
private final AAIVersion version;
private int actionCount = 0;
- private final AAIPatchConverter patchConverter = new AAIPatchConverter();
+ private final GraphInventoryPatchConverter patchConverter = new GraphInventoryPatchConverter();
protected AAISingleTransactionClient(AAIVersion version) {
super();
@@ -63,37 +65,30 @@ public class AAISingleTransactionClient extends AAIClient {
this.request = new SingleTransactionRequest();
}
- /**
- * creates a new object in A&AI
- *
- * @param obj - can be any object which will marshal into a valid A&AI payload
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionClient#create(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.lang.Object)
*/
+ @Override
public AAISingleTransactionClient create(AAIResourceUri uri, Object obj) {
request.getOperations().add(new OperationBodyRequest().withAction("put").withUri(uri.build().toString()).withBody(obj));
incrementActionAmount();
return this;
}
- /**
- * creates a new object in A&AI with no payload body
- *
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionClient#createEmpty(org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public AAISingleTransactionClient createEmpty(AAIResourceUri uri) {
request.getOperations().add(new OperationBodyRequest().withAction("put").withUri(uri.build().toString()).withBody(new HashMap<String, String>()));
incrementActionAmount();
return this;
}
- /**
- * Adds a relationship between two objects in A&AI
- * @param uriA
- * @param uriB
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public AAISingleTransactionClient connect(AAIResourceUri uriA, AAIResourceUri uriB) {
AAIResourceUri uriAClone = uriA.clone();
request.getOperations().add(new OperationBodyRequest().withAction("put").withUri(uriAClone.relationshipAPI().build().toString()).withBody(this.buildRelationship(uriB)));
@@ -101,13 +96,10 @@ public class AAISingleTransactionClient extends AAIClient {
return this;
}
- /**
- * relationship between multiple objects in A&AI - connects A to all objects specified in list
- *
- * @param uriA
- * @param uris
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.util.List)
*/
+ @Override
public AAISingleTransactionClient connect(AAIResourceUri uriA, List<AAIResourceUri> uris) {
for (AAIResourceUri uri : uris) {
this.connect(uriA, uri);
@@ -115,6 +107,10 @@ public class AAISingleTransactionClient extends AAIClient {
return this;
}
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.AAIEdgeLabel)
+ */
+ @Override
public AAISingleTransactionClient connect(AAIResourceUri uriA, AAIResourceUri uriB, AAIEdgeLabel label) {
AAIResourceUri uriAClone = uriA.clone();
RestClient aaiRC = this.createClient(uriAClone.relationshipAPI());
@@ -122,6 +118,10 @@ public class AAISingleTransactionClient extends AAIClient {
return this;
}
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.util.List, org.onap.so.client.aai.entities.AAIEdgeLabel)
+ */
+ @Override
public AAISingleTransactionClient connect(AAIResourceUri uriA, List<AAIResourceUri> uris, AAIEdgeLabel label) {
for (AAIResourceUri uri : uris) {
this.connect(uriA, uri, label);
@@ -129,13 +129,10 @@ public class AAISingleTransactionClient extends AAIClient {
return this;
}
- /**
- * Removes relationship from two objects in A&AI
- *
- * @param uriA
- * @param uriB
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionClient#disconnect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public AAISingleTransactionClient disconnect(AAIResourceUri uriA, AAIResourceUri uriB) {
AAIResourceUri uriAClone = uriA.clone();
request.getOperations().add(new OperationBodyRequest().withAction("delete").withUri(uriAClone.relationshipAPI().build().toString()).withBody(this.buildRelationship(uriB)));
@@ -143,24 +140,20 @@ public class AAISingleTransactionClient extends AAIClient {
return this;
}
- /**
- * Removes relationship from multiple objects - disconnects A from all objects specified in list
- * @param uriA
- * @param uris
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionClient#disconnect(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.util.List)
*/
+ @Override
public AAISingleTransactionClient disconnect(AAIResourceUri uriA, List<AAIResourceUri> uris) {
for (AAIResourceUri uri : uris) {
this.disconnect(uriA, uri);
}
return this;
}
- /**
- * Deletes object from A&AI. Automatically handles resource-version.
- *
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionClient#delete(org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public AAISingleTransactionClient delete(AAIResourceUri uri) {
AAIResourcesClient client = new AAIResourcesClient();
AAIResourceUri clone = uri.clone();
@@ -172,11 +165,10 @@ public class AAISingleTransactionClient extends AAIClient {
return this;
}
- /**
- * @param obj - can be any object which will marshal into a valid A&AI payload
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionClient#update(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.lang.Object)
*/
+ @Override
public AAISingleTransactionClient update(AAIResourceUri uri, Object obj) {
final String payload = getPatchConverter().convertPatchFormat(obj);
@@ -188,10 +180,10 @@ public class AAISingleTransactionClient extends AAIClient {
private void incrementActionAmount() {
actionCount++;
}
- /**
- * Executes all created transactions in A&AI
- * @throws BulkProcessFailed
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionClient#execute()
*/
+ @Override
public void execute() throws BulkProcessFailed {
RestClient client = this.createClient(AAIUriFactory.createResourceUri(AAIObjectType.SINGLE_TRANSACTION));
try {
@@ -261,7 +253,7 @@ public class AAISingleTransactionClient extends AAIClient {
return this.request;
}
- protected AAIPatchConverter getPatchConverter() {
+ protected GraphInventoryPatchConverter getPatchConverter() {
return this.patchConverter;
}
}
diff --git a/common/src/main/java/org/onap/so/client/aai/AAITransactionalClient.java b/common/src/main/java/org/onap/so/client/aai/AAITransactionalClient.java
index 118a3edf1c..dd4cb2f591 100644
--- a/common/src/main/java/org/onap/so/client/aai/AAITransactionalClient.java
+++ b/common/src/main/java/org/onap/so/client/aai/AAITransactionalClient.java
@@ -20,8 +20,6 @@
package org.onap.so.client.aai;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
@@ -42,8 +40,9 @@ import org.onap.so.client.aai.entities.bulkprocess.OperationBody;
import org.onap.so.client.aai.entities.bulkprocess.Transaction;
import org.onap.so.client.aai.entities.bulkprocess.Transactions;
import org.onap.so.client.aai.entities.uri.AAIResourceUri;
-import org.onap.so.client.aai.entities.uri.AAIUri;
import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
+import org.onap.so.client.graphinventory.GraphInventoryTransactionalClient;
import org.onap.so.client.graphinventory.exceptions.BulkProcessFailed;
import org.onap.so.jsonpath.JsonPathUtil;
@@ -51,14 +50,14 @@ import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Joiner;
-public class AAITransactionalClient extends AAIClient {
+public class AAITransactionalClient extends AAIClient implements GraphInventoryTransactionalClient<AAITransactionalClient, AAIResourceUri, AAIEdgeLabel> {
private final Transactions transactions;
private Transaction currentTransaction;
private final AAIVersion version;
private int actionCount = 0;
- private final AAIPatchConverter patchConverter = new AAIPatchConverter();
+ private final GraphInventoryPatchConverter patchConverter = new GraphInventoryPatchConverter();
protected AAITransactionalClient(AAIVersion version) {
super();
@@ -73,47 +72,39 @@ public class AAITransactionalClient extends AAIClient {
currentTransaction = transaction;
}
- /**
- * adds an additional transaction and closes the previous transaction
- *
- * @return AAITransactionalClient
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#beginNewTransaction()
*/
+ @Override
public AAITransactionalClient beginNewTransaction() {
startTransaction();
return this;
}
- /**
- * creates a new object in A&AI
- *
- * @param obj - can be any object which will marshal into a valid A&AI payload
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#create(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.lang.Object)
*/
+ @Override
public AAITransactionalClient create(AAIResourceUri uri, Object obj) {
currentTransaction.getPut().add(new OperationBody().withUri(uri.build().toString()).withBody(obj));
incrementActionAmount();
return this;
}
- /**
- * creates a new object in A&AI with no payload body
- *
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#createEmpty(org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public AAITransactionalClient createEmpty(AAIResourceUri uri) {
currentTransaction.getPut().add(new OperationBody().withUri(uri.build().toString()).withBody(new HashMap<String, String>()));
incrementActionAmount();
return this;
}
- /**
- * Adds a relationship between two objects in A&AI
- * @param uriA
- * @param uriB
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public AAITransactionalClient connect(AAIResourceUri uriA, AAIResourceUri uriB) {
AAIResourceUri uriAClone = uriA.clone();
currentTransaction.getPut().add(new OperationBody().withUri(uriAClone.relationshipAPI().build().toString()).withBody(this.buildRelationship(uriB)));
@@ -121,13 +112,10 @@ public class AAITransactionalClient extends AAIClient {
return this;
}
- /**
- * relationship between multiple objects in A&AI - connects A to all objects specified in list
- *
- * @param uriA
- * @param uris
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.util.List)
*/
+ @Override
public AAITransactionalClient connect(AAIResourceUri uriA, List<AAIResourceUri> uris) {
for (AAIResourceUri uri : uris) {
this.connect(uriA, uri);
@@ -135,6 +123,10 @@ public class AAITransactionalClient extends AAIClient {
return this;
}
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.AAIEdgeLabel)
+ */
+ @Override
public AAITransactionalClient connect(AAIResourceUri uriA, AAIResourceUri uriB, AAIEdgeLabel label) {
AAIResourceUri uriAClone = uriA.clone();
RestClient aaiRC = this.createClient(uriAClone.relationshipAPI());
@@ -142,6 +134,10 @@ public class AAITransactionalClient extends AAIClient {
return this;
}
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.util.List, org.onap.so.client.aai.entities.AAIEdgeLabel)
+ */
+ @Override
public AAITransactionalClient connect(AAIResourceUri uriA, List<AAIResourceUri> uris, AAIEdgeLabel label) {
for (AAIResourceUri uri : uris) {
this.connect(uriA, uri, label);
@@ -149,13 +145,10 @@ public class AAITransactionalClient extends AAIClient {
return this;
}
- /**
- * Removes relationship from two objects in A&AI
- *
- * @param uriA
- * @param uriB
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#disconnect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public AAITransactionalClient disconnect(AAIResourceUri uriA, AAIResourceUri uriB) {
AAIResourceUri uriAClone = uriA.clone();
currentTransaction.getDelete().add(new OperationBody().withUri(uriAClone.relationshipAPI().build().toString()).withBody(this.buildRelationship(uriB)));
@@ -163,24 +156,20 @@ public class AAITransactionalClient extends AAIClient {
return this;
}
- /**
- * Removes relationship from multiple objects - disconnects A from all objects specified in list
- * @param uriA
- * @param uris
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#disconnect(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.util.List)
*/
+ @Override
public AAITransactionalClient disconnect(AAIResourceUri uriA, List<AAIResourceUri> uris) {
for (AAIResourceUri uri : uris) {
this.disconnect(uriA, uri);
}
return this;
}
- /**
- * Deletes object from A&AI. Automatically handles resource-version.
- *
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#delete(org.onap.so.client.aai.entities.uri.AAIResourceUri)
*/
+ @Override
public AAITransactionalClient delete(AAIResourceUri uri) {
AAIResourcesClient client = new AAIResourcesClient();
AAIResourceUri clone = uri.clone();
@@ -192,11 +181,10 @@ public class AAITransactionalClient extends AAIClient {
return this;
}
- /**
- * @param obj - can be any object which will marshal into a valid A&AI payload
- * @param uri
- * @return
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#update(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.lang.Object)
*/
+ @Override
public AAITransactionalClient update(AAIResourceUri uri, Object obj) {
final String payload = getPatchConverter().convertPatchFormat(obj);
currentTransaction.getPatch().add(new OperationBody().withUri(uri.build().toString()).withBody(payload));
@@ -207,10 +195,10 @@ public class AAITransactionalClient extends AAIClient {
private void incrementActionAmount() {
actionCount++;
}
- /**
- * Executes all created transactions in A&AI
- * @throws BulkProcessFailed
+ /* (non-Javadoc)
+ * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#execute()
*/
+ @Override
public void execute() throws BulkProcessFailed {
RestClient client = this.createClient(AAIUriFactory.createResourceUri(AAIObjectType.BULK_PROCESS));
try {
@@ -293,7 +281,7 @@ public class AAITransactionalClient extends AAIClient {
return this.transactions;
}
- protected AAIPatchConverter getPatchConverter() {
+ protected GraphInventoryPatchConverter getPatchConverter() {
return this.patchConverter;
}
}
diff --git a/common/src/main/java/org/onap/so/client/aai/entities/AAIResultWrapper.java b/common/src/main/java/org/onap/so/client/aai/entities/AAIResultWrapper.java
index 77ea9bcdfe..9b3f98baa4 100644
--- a/common/src/main/java/org/onap/so/client/aai/entities/AAIResultWrapper.java
+++ b/common/src/main/java/org/onap/so/client/aai/entities/AAIResultWrapper.java
@@ -20,96 +20,22 @@
package org.onap.so.client.aai.entities;
-import java.io.IOException;
import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-
-import org.onap.so.client.aai.AAICommonObjectMapperProvider;
-import org.onap.so.jsonpath.JsonPathUtil;
+import org.onap.so.client.graphinventory.entities.GraphInventoryResultWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-public class AAIResultWrapper implements Serializable {
+public class AAIResultWrapper extends GraphInventoryResultWrapper implements Serializable {
private static final long serialVersionUID = 5895841925807816737L;
- private final String jsonBody;
- private final ObjectMapper mapper;
- private final transient Logger logger = LoggerFactory.getLogger(AAIResultWrapper.class);
+ private final static transient Logger logger = LoggerFactory.getLogger(AAIResultWrapper.class);
public AAIResultWrapper(String json) {
- this.jsonBody = json;
- this.mapper = new AAICommonObjectMapperProvider().getMapper();
+ super(json, logger);
}
public AAIResultWrapper(Object aaiObject) {
- this.mapper = new AAICommonObjectMapperProvider().getMapper();
- this.jsonBody = mapObjectToString(aaiObject);
- }
-
- protected String mapObjectToString(Object aaiObject) {
- try {
- return mapper.writeValueAsString(aaiObject);
- } catch (JsonProcessingException e) {
- logger.warn("could not parse object into json - defaulting to {}");
- return "{}";
- }
+ super(aaiObject, logger);
}
- public Optional<Relationships> getRelationships() {
- final String path = "$.relationship-list";
- if (isEmpty()) {
- return Optional.empty();
- }
- Optional<String> result = JsonPathUtil.getInstance().locateResult(jsonBody, path);
- if (result.isPresent()) {
- return Optional.of(new Relationships(result.get()));
- } else {
- return Optional.empty();
- }
- }
-
- public String getJson() {
- if(jsonBody == null) {
- return "{}";
- } else {
- return jsonBody;
- }
- }
-
- public Map<String, Object> asMap() {
- if (isEmpty()) {
- return new HashMap<>();
- }
- try {
- return mapper.readValue(this.jsonBody, new TypeReference<Map<String, Object>>(){});
- } catch (IOException e) {
- return new HashMap<>();
- }
- }
-
- public <T> Optional<T> asBean(Class<T> clazz) {
- if (isEmpty()) {
- return Optional.empty();
- }
- try {
- return Optional.of(mapper.readValue(this.jsonBody, clazz));
- } catch (IOException e) {
- return Optional.empty();
- }
- }
-
- public boolean isEmpty() {
- return jsonBody == null;
- }
- @Override
- public String toString() {
- return this.getJson();
- }
-
}
diff --git a/common/src/main/java/org/onap/so/client/aai/entities/DSLNode.java b/common/src/main/java/org/onap/so/client/aai/entities/DSLNode.java
new file mode 100644
index 0000000000..f94c28c5b7
--- /dev/null
+++ b/common/src/main/java/org/onap/so/client/aai/entities/DSLNode.java
@@ -0,0 +1,75 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 - 2019 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.so.client.aai.entities;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.onap.so.client.graphinventory.GraphInventoryObjectName;
+
+public class DSLNode implements QueryStep {
+
+ private final String nodeName;
+ private final List<DSLNodeKey> nodeKeys;
+ private final StringBuilder query = new StringBuilder();
+ private boolean output = false;
+
+ public DSLNode() {
+ this.nodeName = "";
+ this.nodeKeys = new ArrayList<>();
+
+ }
+ public DSLNode(GraphInventoryObjectName name) {
+ this.nodeName = name.typeName();
+ this.nodeKeys = new ArrayList<>();
+ query.append(nodeName);
+ }
+ public DSLNode(GraphInventoryObjectName name, DSLNodeKey... key) {
+ this.nodeName = name.typeName();
+ this.nodeKeys = Arrays.asList(key);
+ query.append(nodeName);
+ }
+
+ public DSLNode output() {
+ this.output = true;
+
+ return this;
+ }
+
+ public DSLNode and(DSLNodeKey... key) {
+ this.nodeKeys.addAll(Arrays.asList(key));
+
+ return this;
+ }
+
+ @Override
+ public String build() {
+ if (output) {
+ query.append("*");
+ }
+ for (DSLNodeKey key : nodeKeys) {
+ query.append(key.build());
+ }
+
+ return query.toString();
+ }
+}
diff --git a/common/src/main/java/org/onap/so/client/aai/entities/DSLNodeKey.java b/common/src/main/java/org/onap/so/client/aai/entities/DSLNodeKey.java
new file mode 100644
index 0000000000..a9795d1cc3
--- /dev/null
+++ b/common/src/main/java/org/onap/so/client/aai/entities/DSLNodeKey.java
@@ -0,0 +1,69 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 - 2019 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.so.client.aai.entities;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import com.google.common.base.Joiner;
+
+
+public class DSLNodeKey implements QueryStep {
+
+ private boolean not = false;
+ private final StringBuilder query = new StringBuilder();
+ private final String keyName;
+ private final List<String> values;
+ public DSLNodeKey(String keyName, String... value) {
+
+ this.keyName = keyName;
+ this.values = Arrays.asList(value);
+ }
+
+ public DSLNodeKey not() {
+
+ this.not = true;
+ return this;
+ }
+
+ @Override
+ public String build() {
+
+ if (not) {
+ query.append(" !");
+ }
+ query.append("('").append(keyName).append("', ");
+ List<String> temp = new ArrayList<>();
+ for (String item : values) {
+ if (item.equals("null")) {
+ temp.add(String.format("' %s '", item));
+ } else if (item.equals("")){
+ temp.add("' '");
+ } else {
+ temp.add(String.format("'%s'", item));
+ }
+ }
+ query.append(Joiner.on(", ").join(temp)).append(")");
+
+ return query.toString();
+ }
+}
diff --git a/common/src/main/java/org/onap/so/client/aai/entities/DSLQuery.java b/common/src/main/java/org/onap/so/client/aai/entities/DSLQuery.java
new file mode 100644
index 0000000000..0f4095177a
--- /dev/null
+++ b/common/src/main/java/org/onap/so/client/aai/entities/DSLQuery.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 - 2019 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.so.client.aai.entities;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class DSLQuery {
+
+ private String dsl;
+
+ public DSLQuery() {
+
+ }
+
+ public DSLQuery(String dsl) {
+ this.dsl = dsl;
+ }
+
+ public String getDsl() {
+ return dsl;
+ }
+
+ public void setDsl(String dsl) {
+ this.dsl = dsl;
+ }
+
+
+}
diff --git a/common/src/main/java/org/onap/so/client/aai/entities/DSLQueryBuilder.java b/common/src/main/java/org/onap/so/client/aai/entities/DSLQueryBuilder.java
new file mode 100644
index 0000000000..9f1dbeda8f
--- /dev/null
+++ b/common/src/main/java/org/onap/so/client/aai/entities/DSLQueryBuilder.java
@@ -0,0 +1,111 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 - 2019 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.so.client.aai.entities;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.google.common.base.Joiner;
+
+
+public class DSLQueryBuilder<S, E> implements QueryStep {
+
+ private List<QueryStep> steps = new ArrayList<>();
+
+
+ public DSLQueryBuilder() {
+
+ }
+ public DSLQueryBuilder(DSLNode node) {
+ steps.add(node);
+ }
+
+ public DSLQueryBuilder<S, DSLNode> node(DSLNode node) {
+ steps.add(node);
+
+ return (DSLQueryBuilder<S, DSLNode>) this;
+ }
+ public DSLQueryBuilder<S, E> output() {
+ if (steps.get(steps.size() -1) instanceof DSLNode) {
+ ((DSLNode)steps.get(steps.size() -1)).output();
+ }
+ return this;
+ }
+
+ public <E2> DSLQueryBuilder<S, E2> union(final DSLQueryBuilder<?, E2>... union) {
+
+ List<DSLQueryBuilder<?, ?>> unions = Arrays.asList(union);
+ steps.add(() -> {
+ StringBuilder query = new StringBuilder();
+
+ query.append("> [ ").append(
+ Joiner.on(", ").join(
+ unions.stream().map(item -> item.build()).collect(Collectors.toList())))
+ .append(" ]");
+ return query.toString();
+ });
+
+ return (DSLQueryBuilder<S, E2>) this;
+ }
+
+ public DSLQueryBuilder<S, E> where(DSLQueryBuilder<?, ?> where) {
+
+ steps.add(() -> {
+ StringBuilder query = new StringBuilder();
+ query.append(where.build()).append(")");
+ String result = query.toString();
+ if (!result.startsWith(">")) {
+ result = "> " + result;
+ }
+ return "(" + result;
+ });
+ return this;
+ }
+
+ public DSLQueryBuilder<S, E> to(DSLQueryBuilder<?, ?> to) {
+ steps.add(() -> {
+ StringBuilder query = new StringBuilder();
+
+ query.append("> ").append(to.build());
+ return query.toString();
+ });
+ return this;
+ }
+
+ public String limit(int limit) {
+ return compile() + " LIMIT " + limit;
+ }
+
+ @Override
+ public String build() {
+ return compile();
+ }
+
+ private String compile() {
+ return Joiner.on(" ").join(steps.stream().map(item -> item.build()).collect(Collectors.toList()));
+ }
+
+ protected QueryStep getFirst() {
+ return steps.get(0);
+ }
+}
diff --git a/common/src/main/java/org/onap/so/client/aai/entities/QueryStep.java b/common/src/main/java/org/onap/so/client/aai/entities/QueryStep.java
new file mode 100644
index 0000000000..b056fd0e40
--- /dev/null
+++ b/common/src/main/java/org/onap/so/client/aai/entities/QueryStep.java
@@ -0,0 +1,28 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 - 2019 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.so.client.aai.entities;
+
+@FunctionalInterface
+public interface QueryStep {
+
+
+ public String build();
+}
diff --git a/common/src/main/java/org/onap/so/client/aai/entities/__.java b/common/src/main/java/org/onap/so/client/aai/entities/__.java
new file mode 100644
index 0000000000..16d6f9b27e
--- /dev/null
+++ b/common/src/main/java/org/onap/so/client/aai/entities/__.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 - 2019 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.so.client.aai.entities;
+
+import org.onap.so.client.graphinventory.GraphInventoryObjectName;
+
+public class __ {
+
+ protected __() {
+
+ }
+
+ public static <A> DSLQueryBuilder<A, A> identity() {
+ return new DSLQueryBuilder<>();
+ }
+ public static <A> DSLQueryBuilder<A, A> start(DSLNode node) {
+ return new DSLQueryBuilder<>(node);
+ }
+ public static DSLQueryBuilder<DSLNode, DSLNode> node(GraphInventoryObjectName name) {
+
+ return __.<DSLNode>start(new DSLNode(name));
+ }
+
+ public static DSLQueryBuilder<DSLNode, DSLNode> node(GraphInventoryObjectName name, DSLNodeKey... key) {
+ return __.<DSLNode>start(new DSLNode(name, key));
+ }
+
+ public static DSLNodeKey key(String keyName, String... value) {
+ return new DSLNodeKey(keyName, value);
+ }
+
+ public static <A, B> DSLQueryBuilder<A, B> union(final DSLQueryBuilder<?, B>... traversal) {
+
+ return __.<A>identity().union(traversal);
+ }
+
+public static <A> DSLQueryBuilder<A, A> where(DSLQueryBuilder<A, A> traversal) {
+
+ return __.<A>identity().where(traversal);
+ }
+}
diff --git a/common/src/main/java/org/onap/so/client/aai/EmptyStringToNullSerializer.java b/common/src/main/java/org/onap/so/client/graphinventory/EmptyStringToNullSerializer.java
index 1120ebe0b9..e21386f809 100644
--- a/common/src/main/java/org/onap/so/client/aai/EmptyStringToNullSerializer.java
+++ b/common/src/main/java/org/onap/so/client/graphinventory/EmptyStringToNullSerializer.java
@@ -18,7 +18,7 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.so.client.aai;
+package org.onap.so.client.graphinventory;
import java.io.IOException;
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperPatchProvider.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperPatchProvider.java
new file mode 100644
index 0000000000..47c9e77b84
--- /dev/null
+++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperPatchProvider.java
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 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.so.client.graphinventory;
+
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+public class GraphInventoryCommonObjectMapperPatchProvider extends GraphInventoryCommonObjectMapperProvider {
+
+
+ public GraphInventoryCommonObjectMapperPatchProvider() {
+ super();
+ EmptyStringToNullSerializer sp = new EmptyStringToNullSerializer();
+ SimpleModule emptyStringModule = new SimpleModule();
+ emptyStringModule.addSerializer(String.class, sp);
+ mapper.registerModule(emptyStringModule);
+ }
+}
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperProvider.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperProvider.java
new file mode 100644
index 0000000000..f9857424a2
--- /dev/null
+++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperProvider.java
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 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.so.client.graphinventory;
+
+import org.onap.so.client.policy.CommonObjectMapperProvider;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.databind.AnnotationIntrospector;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
+
+public class GraphInventoryCommonObjectMapperProvider extends CommonObjectMapperProvider {
+
+ public GraphInventoryCommonObjectMapperProvider() {
+ mapper = new ObjectMapper();
+ mapper.setSerializationInclusion(Include.NON_NULL);
+ mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
+ mapper.enable(MapperFeature.USE_ANNOTATIONS);
+ mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
+ mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, false);
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ AnnotationIntrospector aiJaxb = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance());
+ AnnotationIntrospector aiJackson = new JacksonAnnotationIntrospector();
+ // first Jaxb, second Jackson annotations
+ mapper.setAnnotationIntrospector(AnnotationIntrospector.pair(aiJaxb, aiJackson));
+ }
+
+}
diff --git a/common/src/main/java/org/onap/so/client/aai/AAIPatchConverter.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryPatchConverter.java
index 6ccb592409..00e597b189 100644
--- a/common/src/main/java/org/onap/so/client/aai/AAIPatchConverter.java
+++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryPatchConverter.java
@@ -18,29 +18,31 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.so.client.aai;
+package org.onap.so.client.graphinventory;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
+import org.onap.so.client.aai.AAICommonObjectMapperPatchProvider;
+import org.onap.so.client.aai.AAICommonObjectMapperProvider;
import org.onap.so.client.graphinventory.exceptions.GraphInventoryPatchDepthExceededException;
import org.onap.so.jsonpath.JsonPathUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
-public class AAIPatchConverter {
+public class GraphInventoryPatchConverter {
private static final AAICommonObjectMapperProvider standardProvider = new AAICommonObjectMapperProvider();
private static final AAICommonObjectMapperPatchProvider patchProvider = new AAICommonObjectMapperPatchProvider();
private static final Pattern LOCATE_COMPLEX_OBJECT = Pattern.compile("^((?!relationship-list).)+?\\['[^\\[\\]]+?'\\]$");
- protected String convertPatchFormat(Object obj) {
+ public String convertPatchFormat(Object obj) {
return validatePatchObject(marshallObjectToPatchFormat(obj));
}
- protected String validatePatchObject(String payload) {
+ public String validatePatchObject(String payload) {
if (hasComplexObject(payload)) {
throw new GraphInventoryPatchDepthExceededException(payload);
}
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryResourcesClient.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryResourcesClient.java
new file mode 100644
index 0000000000..7fbe286b98
--- /dev/null
+++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryResourcesClient.java
@@ -0,0 +1,147 @@
+package org.onap.so.client.graphinventory;
+
+import java.util.Optional;
+
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.Response;
+
+import org.onap.so.client.RestProperties;
+import org.onap.so.client.graphinventory.entities.GraphInventoryEdgeLabel;
+import org.onap.so.client.graphinventory.entities.GraphInventoryResultWrapper;
+import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
+
+public interface GraphInventoryResourcesClient<Self, Uri extends GraphInventoryUri, EdgeLabel extends GraphInventoryEdgeLabel, Wrapper extends GraphInventoryResultWrapper, TransactionalClient, SingleTransactionClient> {
+
+ /**
+ * creates a new object in GraphInventory
+ *
+ * @param obj - can be any object which will marshal into a valid GraphInventory payload
+ * @param uri
+ * @return
+ */
+ void create(Uri uri, Object obj);
+
+ /**
+ * creates a new object in GraphInventory with no payload body
+ *
+ * @param uri
+ * @return
+ */
+ void createEmpty(Uri uri);
+
+ /**
+ * returns false if the object does not exist in GraphInventory
+ *
+ * @param uri
+ * @return
+ */
+ boolean exists(Uri uri);
+
+ /**
+ * Adds a relationship between two objects in GraphInventory
+ * @param uriA
+ * @param uriB
+ * @return
+ */
+ void connect(Uri uriA, Uri uriB);
+
+ /**
+ * Adds a relationship between two objects in GraphInventory
+ * with a given edge label
+ * @param uriA
+ * @param uriB
+ * @param edge label
+ * @return
+ */
+ void connect(Uri uriA, Uri uriB, EdgeLabel label);
+
+ /**
+ * Removes relationship from two objects in GraphInventory
+ *
+ * @param uriA
+ * @param uriB
+ * @return
+ */
+ void disconnect(Uri uriA, Uri uriB);
+
+ /**
+ * Deletes object from GraphInventory. Automatically handles resource-version.
+ *
+ * @param uri
+ * @return
+ */
+ void delete(Uri uri);
+
+ /**
+ * @param obj - can be any object which will marshal into a valid GraphInventory payload
+ * @param uri
+ * @return
+ */
+ void update(Uri uri, Object obj);
+
+ /**
+ * Retrieves an object from GraphInventory and unmarshalls it into the Class specified
+ * @param clazz
+ * @param uri
+ * @return
+ */
+ <T> Optional<T> get(Class<T> clazz, Uri uri);
+
+ /**
+ * Retrieves an object from GraphInventory and returns complete response
+ * @param uri
+ * @return
+ */
+ Response getFullResponse(Uri uri);
+
+ /**
+ * Retrieves an object from GraphInventory and automatically unmarshalls it into a Map or List
+ * @param resultClass
+ * @param uri
+ * @return
+ */
+ <T> Optional<T> get(GenericType<T> resultClass, Uri uri);
+
+ /**
+ * Retrieves an object from GraphInventory wrapped in a helper class which offer additional features
+ *
+ * @param uri
+ * @return
+ */
+ Wrapper get(Uri uri);
+
+ /**
+ * Retrieves an object from GraphInventory wrapped in a helper class which offer additional features
+ * If the object cannot be found in GraphInventory the method will throw the runtime exception
+ * included as an argument
+ * @param uri
+ * @return
+ */
+ Wrapper get(Uri uri, Class<? extends RuntimeException> c);
+
+ /**
+ * Will automatically create the object if it does not exist
+ *
+ * @param obj - Optional object which serializes to a valid GraphInventory payload
+ * @param uri
+ * @return
+ */
+ Self createIfNotExists(Uri uri, Optional<Object> obj);
+
+ /**
+ * Starts a transaction which encloses multiple GraphInventory mutations
+ *
+ * @return
+ */
+ TransactionalClient beginTransaction();
+
+ /**
+ * Starts a transaction groups multiple GraphInventory mutations
+ *
+ * @return
+ */
+ SingleTransactionClient beginSingleTransaction();
+
+ <T extends RestProperties> T getRestProperties();
+
+} \ No newline at end of file
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventorySingleTransactionClient.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventorySingleTransactionClient.java
new file mode 100644
index 0000000000..e1aa2252d9
--- /dev/null
+++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventorySingleTransactionClient.java
@@ -0,0 +1,87 @@
+package org.onap.so.client.graphinventory;
+
+import java.util.List;
+
+import org.onap.so.client.graphinventory.entities.GraphInventoryEdgeLabel;
+import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
+import org.onap.so.client.graphinventory.exceptions.BulkProcessFailed;
+
+public interface GraphInventorySingleTransactionClient<Self, Uri extends GraphInventoryUri, EdgeLabel extends GraphInventoryEdgeLabel> {
+
+ /**
+ * creates a new object in A&AI
+ *
+ * @param obj - can be any object which will marshal into a valid A&AI payload
+ * @param uri
+ * @return
+ */
+ Self create(Uri uri, Object obj);
+
+ /**
+ * creates a new object in A&AI with no payload body
+ *
+ * @param uri
+ * @return
+ */
+ Self createEmpty(Uri uri);
+
+ /**
+ * Adds a relationship between two objects in A&AI
+ * @param uriA
+ * @param uriB
+ * @return
+ */
+ Self connect(Uri uriA, Uri uriB);
+
+ /**
+ * relationship between multiple objects in A&AI - connects A to all objects specified in list
+ *
+ * @param uriA
+ * @param uris
+ * @return
+ */
+ Self connect(Uri uriA, List<Uri> uris);
+
+ Self connect(Uri uriA, Uri uriB, EdgeLabel label);
+
+ Self connect(Uri uriA, List<Uri> uris, EdgeLabel label);
+
+ /**
+ * Removes relationship from two objects in A&AI
+ *
+ * @param uriA
+ * @param uriB
+ * @return
+ */
+ Self disconnect(Uri uriA, Uri uriB);
+
+ /**
+ * Removes relationship from multiple objects - disconnects A from all objects specified in list
+ * @param uriA
+ * @param uris
+ * @return
+ */
+ Self disconnect(Uri uriA, List<Uri> uris);
+
+ /**
+ * Deletes object from A&AI. Automatically handles resource-version.
+ *
+ * @param uri
+ * @return
+ */
+ Self delete(Uri uri);
+
+ /**
+ * @param obj - can be any object which will marshal into a valid A&AI payload
+ * @param uri
+ * @return
+ */
+ Self update(Uri uri, Object obj);
+
+ /**
+ * Executes all created transactions in A&AI
+ * @throws BulkProcessFailed
+ */
+ void execute() throws BulkProcessFailed;
+
+} \ No newline at end of file
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionalClient.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionalClient.java
new file mode 100644
index 0000000000..a7362c85da
--- /dev/null
+++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionalClient.java
@@ -0,0 +1,94 @@
+package org.onap.so.client.graphinventory;
+
+import java.util.List;
+
+import org.onap.so.client.graphinventory.entities.GraphInventoryEdgeLabel;
+import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
+import org.onap.so.client.graphinventory.exceptions.BulkProcessFailed;
+
+public interface GraphInventoryTransactionalClient<Self, Uri extends GraphInventoryUri, EdgeLabel extends GraphInventoryEdgeLabel> {
+
+ /**
+ * adds an additional transaction and closes the previous transaction
+ *
+ * @return Self
+ */
+ Self beginNewTransaction();
+
+ /**
+ * creates a new object in A&AI
+ *
+ * @param obj - can be any object which will marshal into a valid A&AI payload
+ * @param uri
+ * @return
+ */
+ Self create(Uri uri, Object obj);
+
+ /**
+ * creates a new object in A&AI with no payload body
+ *
+ * @param uri
+ * @return
+ */
+ Self createEmpty(Uri uri);
+
+ /**
+ * Adds a relationship between two objects in A&AI
+ * @param uriA
+ * @param uriB
+ * @return
+ */
+ Self connect(Uri uriA, Uri uriB);
+
+ /**
+ * relationship between multiple objects in A&AI - connects A to all objects specified in list
+ *
+ * @param uriA
+ * @param uris
+ * @return
+ */
+ Self connect(Uri uriA, List<Uri> uris);
+
+ Self connect(Uri uriA, Uri uriB, EdgeLabel label);
+
+ Self connect(Uri uriA, List<Uri> uris, EdgeLabel label);
+
+ /**
+ * Removes relationship from two objects in A&AI
+ *
+ * @param uriA
+ * @param uriB
+ * @return
+ */
+ Self disconnect(Uri uriA, Uri uriB);
+
+ /**
+ * Removes relationship from multiple objects - disconnects A from all objects specified in list
+ * @param uriA
+ * @param uris
+ * @return
+ */
+ Self disconnect(Uri uriA, List<Uri> uris);
+
+ /**
+ * Deletes object from A&AI. Automatically handles resource-version.
+ *
+ * @param uri
+ * @return
+ */
+ Self delete(Uri uri);
+
+ /**
+ * @param obj - can be any object which will marshal into a valid A&AI payload
+ * @param uri
+ * @return
+ */
+ Self update(Uri uri, Object obj);
+
+ /**
+ * Executes all created transactions in A&AI
+ * @throws BulkProcessFailed
+ */
+ void execute() throws BulkProcessFailed;
+
+} \ No newline at end of file
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryResultWrapper.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryResultWrapper.java
new file mode 100644
index 0000000000..cc1ce0063b
--- /dev/null
+++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryResultWrapper.java
@@ -0,0 +1,117 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 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.so.client.graphinventory.entities;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+import org.onap.so.client.aai.AAICommonObjectMapperProvider;
+import org.onap.so.client.aai.entities.Relationships;
+import org.onap.so.jsonpath.JsonPathUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class GraphInventoryResultWrapper implements Serializable {
+
+ private static final long serialVersionUID = 5895841925807816727L;
+ protected final String jsonBody;
+ protected final ObjectMapper mapper;
+ private final transient Logger logger;
+
+ protected GraphInventoryResultWrapper(String json, Logger logger) {
+ this.jsonBody = json;
+ this.mapper = new AAICommonObjectMapperProvider().getMapper();
+ this.logger = logger;
+ }
+
+ protected GraphInventoryResultWrapper(Object aaiObject, Logger logger) {
+ this.mapper = new AAICommonObjectMapperProvider().getMapper();
+ this.jsonBody = mapObjectToString(aaiObject);
+ this.logger = logger;
+ }
+
+ protected String mapObjectToString(Object aaiObject) {
+ try {
+ return mapper.writeValueAsString(aaiObject);
+ } catch (JsonProcessingException e) {
+ logger.warn("could not parse object into json - defaulting to {}");
+ return "{}";
+ }
+ }
+ public Optional<Relationships> getRelationships() {
+ final String path = "$.relationship-list";
+ if (isEmpty()) {
+ return Optional.empty();
+ }
+ Optional<String> result = JsonPathUtil.getInstance().locateResult(jsonBody, path);
+ if (result.isPresent()) {
+ return Optional.of(new Relationships(result.get()));
+ } else {
+ return Optional.empty();
+ }
+ }
+
+ public String getJson() {
+ if(jsonBody == null) {
+ return "{}";
+ } else {
+ return jsonBody;
+ }
+ }
+
+ public Map<String, Object> asMap() {
+ if (isEmpty()) {
+ return new HashMap<>();
+ }
+ try {
+ return mapper.readValue(this.jsonBody, new TypeReference<Map<String, Object>>(){});
+ } catch (IOException e) {
+ return new HashMap<>();
+ }
+ }
+
+ public <T> Optional<T> asBean(Class<T> clazz) {
+ if (isEmpty()) {
+ return Optional.empty();
+ }
+ try {
+ return Optional.of(mapper.readValue(this.jsonBody, clazz));
+ } catch (IOException e) {
+ return Optional.empty();
+ }
+ }
+
+ public boolean isEmpty() {
+ return jsonBody == null;
+ }
+ @Override
+ public String toString() {
+ return this.getJson();
+ }
+
+}
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/exceptions/IncorrectNumberOfUriKeys.java b/common/src/main/java/org/onap/so/client/graphinventory/exceptions/IncorrectNumberOfUriKeys.java
index c94e561274..121708fc46 100644
--- a/common/src/main/java/org/onap/so/client/graphinventory/exceptions/IncorrectNumberOfUriKeys.java
+++ b/common/src/main/java/org/onap/so/client/graphinventory/exceptions/IncorrectNumberOfUriKeys.java
@@ -1,3 +1,23 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 - 2019 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.so.client.graphinventory.exceptions;
public class IncorrectNumberOfUriKeys extends RuntimeException {
diff --git a/common/src/main/resources/dmaap/default-consumer.properties b/common/src/main/resources/dmaap/default-consumer.properties
index f19b64242d..3f492e1d33 100644
--- a/common/src/main/resources/dmaap/default-consumer.properties
+++ b/common/src/main/resources/dmaap/default-consumer.properties
@@ -16,6 +16,7 @@ maxBatchSize=100
maxAgeMs=250
group=MSO
id=dev
+timeout=60000
AFT_DME2_EXCHANGE_REQUEST_HANDLERS=com.att.nsa.test.PreferredRouteRequestHandler
AFT_DME2_EXCHANGE_REPLY_HANDLERS=com.att.nsa.test.PreferredRouteReplyHandler
AFT_DME2_REQ_TRACE_ON=true