Merge "add new functionality to aai client"
authorSteve Smokowski <ss835w@att.com>
Thu, 14 Feb 2019 16:32:33 +0000 (16:32 +0000)
committerGerrit Code Review <gerrit@onap.org>
Thu, 14 Feb 2019 16:32:33 +0000 (16:32 +0000)
32 files changed:
common/src/main/java/org/onap/so/client/aai/AAIClient.java
common/src/main/java/org/onap/so/client/aai/AAIDSLQueryClient.java [new file with mode: 0644]
common/src/main/java/org/onap/so/client/aai/AAIObjectType.java
common/src/main/java/org/onap/so/client/aai/AAIQueryClient.java
common/src/main/java/org/onap/so/client/aai/AAIResourcesClient.java
common/src/main/java/org/onap/so/client/aai/AAISingleTransactionClient.java
common/src/main/java/org/onap/so/client/aai/AAITransactionalClient.java
common/src/main/java/org/onap/so/client/aai/entities/uri/AAISimpleUri.java
common/src/main/java/org/onap/so/client/aai/entities/uri/AAIUriFactory.java
common/src/main/java/org/onap/so/client/graphinventory/Format.java
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryClient.java
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryQueryClient.java [moved from common/src/main/java/org/onap/so/client/aai/AAIDSLQuery.java with 63% similarity]
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryResourcesClient.java
common/src/main/java/org/onap/so/client/graphinventory/GraphInventorySingleTransactionClient.java [deleted file]
common/src/main/java/org/onap/so/client/graphinventory/GraphInventorySubgraphType.java [moved from common/src/main/java/org/onap/so/client/aai/AAISubgraphType.java with 89% similarity]
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionClient.java [new file with mode: 0644]
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionalClient.java [deleted file]
common/src/main/java/org/onap/so/client/graphinventory/TransactionBuilder.java [new file with mode: 0644]
common/src/main/java/org/onap/so/client/graphinventory/entities/DSLNode.java [moved from common/src/main/java/org/onap/so/client/aai/entities/DSLNode.java with 95% similarity]
common/src/main/java/org/onap/so/client/graphinventory/entities/DSLNodeKey.java [moved from common/src/main/java/org/onap/so/client/aai/entities/DSLNodeKey.java with 95% similarity]
common/src/main/java/org/onap/so/client/graphinventory/entities/DSLQuery.java [moved from common/src/main/java/org/onap/so/client/aai/entities/DSLQuery.java with 96% similarity]
common/src/main/java/org/onap/so/client/graphinventory/entities/DSLQueryBuilder.java [moved from common/src/main/java/org/onap/so/client/aai/entities/DSLQueryBuilder.java with 96% similarity]
common/src/main/java/org/onap/so/client/graphinventory/entities/__.java [moved from common/src/main/java/org/onap/so/client/aai/entities/__.java with 97% similarity]
common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleUri.java
common/src/test/java/org/onap/so/client/aai/AAIObjectTypeTest.java
common/src/test/java/org/onap/so/client/aai/AAIQueryClientTest.java
common/src/test/java/org/onap/so/client/aai/AAIResourcesClientTest.java
common/src/test/java/org/onap/so/client/aai/AAIResourcesClientWithServiceInstanceUriTest.java
common/src/test/java/org/onap/so/client/aai/AAISingleTransactionClientTest.java
common/src/test/java/org/onap/so/client/aai/AAITransactionalClientTest.java
common/src/test/java/org/onap/so/client/aai/DSLQueryBuilderTest.java
common/src/test/java/org/onap/so/client/aai/entities/uri/ServiceInstanceUriTest.java

index be55342..21bbc51 100644 (file)
@@ -27,20 +27,24 @@ import javax.ws.rs.core.UriBuilder;
 
 import org.onap.so.client.RestClient;
 import org.onap.so.client.graphinventory.GraphInventoryClient;
+import org.onap.so.client.graphinventory.GraphInventoryVersion;
 import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
 import org.onap.so.client.graphinventory.exceptions.GraphInventoryUriComputationException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class AAIClient extends GraphInventoryClient {
+public class AAIClient extends GraphInventoryClient {
 
        private static final String AAI_ROOT = "/aai";
        protected static Logger logger = LoggerFactory.getLogger(AAIClient.class);
        protected AAIVersion version;
-       public AAIClient() {
+       protected AAIClient() {
+               super(AAIProperties.class);
+       }
+       
+       protected AAIClient(AAIVersion version) {
                super(AAIProperties.class);
        }
-
        @Override
        protected URI constructPath(GraphInventoryUri uri) {
                
@@ -48,7 +52,7 @@ public abstract class AAIClient extends GraphInventoryClient {
        }
 
        @Override
-       protected RestClient createClient(GraphInventoryUri uri) {
+       public RestClient createClient(GraphInventoryUri uri) {
                try {
                        return new AAIRestClient(getRestProperties(), constructPath(uri));
                } catch (GraphInventoryUriComputationException | NotFoundException e) {
@@ -57,11 +61,18 @@ public abstract class AAIClient extends GraphInventoryClient {
                }
        }
        
-       protected AAIVersion getVersion() {
+       @Override
+       public AAIVersion getVersion() {
                if (version == null) {
                        return this.<AAIProperties>getRestProperties().getDefaultVersion();
                } else {
                        return this.version;
                }
        }
+       
+
+       @Override
+       public String getGraphDBName() {
+               return "A&AI";
+       }
 }
diff --git a/common/src/main/java/org/onap/so/client/aai/AAIDSLQueryClient.java b/common/src/main/java/org/onap/so/client/aai/AAIDSLQueryClient.java
new file mode 100644 (file)
index 0000000..e9b58b4
--- /dev/null
@@ -0,0 +1,42 @@
+/*-
+ * ============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 org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.onap.so.client.graphinventory.GraphInventoryQueryClient;
+import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
+
+public class AAIDSLQueryClient extends GraphInventoryQueryClient<AAIDSLQueryClient> {
+
+       public AAIDSLQueryClient() {
+               super(new AAIClient());
+       }
+       
+       public AAIDSLQueryClient(AAIVersion version) {
+               super(new AAIClient(version));
+       }
+
+       @Override
+       protected GraphInventoryUri getQueryUri() {
+               return AAIUriFactory.createResourceUri(AAIObjectType.DSL);
+       }
+       
+}
index 14d7f43..21e36cd 100644 (file)
@@ -26,8 +26,7 @@ import java.net.URL;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
-
-import javax.annotation.Priority;
+import java.util.regex.Pattern;
 
 import org.onap.aai.annotations.Metadata;
 import org.onap.aai.domain.yang.AggregateRoute;
@@ -61,6 +60,7 @@ import org.onap.aai.domain.yang.RouteTableReference;
 import org.onap.aai.domain.yang.ServiceInstance;
 import org.onap.aai.domain.yang.ServiceSubscription;
 import org.onap.aai.domain.yang.SpPartner;
+import org.onap.aai.domain.yang.SriovPf;
 import org.onap.aai.domain.yang.Subnet;
 import org.onap.aai.domain.yang.Tenant;
 import org.onap.aai.domain.yang.TunnelXconnect;
@@ -119,6 +119,7 @@ public class AAIObjectType implements GraphInventoryObjectType, Serializable {
        public static final AAIObjectType MODEL_VER = new AAIObjectType(AAINamespaceConstants.SERVICE_DESIGN_AND_CREATION + "/models/model/{model-invariant-id}", ModelVer.class);
        public static final AAIObjectType TUNNEL_XCONNECT = new AAIObjectType(AAIObjectType.ALLOTTED_RESOURCE.uriTemplate(), TunnelXconnect.class);
        public static final AAIObjectType P_INTERFACE = new AAIObjectType(AAIObjectType.PSERVER.uriTemplate(), PInterface.class);
+       public static final AAIObjectType SRIOV_PF = new AAIObjectType(AAIObjectType.P_INTERFACE.uriTemplate(), SriovPf.class); 
        public static final AAIObjectType PHYSICAL_LINK = new AAIObjectType(AAINamespaceConstants.NETWORK, PhysicalLink.class);
        public static final AAIObjectType INSTANCE_GROUP = new AAIObjectType(AAINamespaceConstants.NETWORK, InstanceGroup.class);
        public static final AAIObjectType COLLECTION = new AAIObjectType(AAINamespaceConstants.NETWORK, Collection.class);
@@ -218,6 +219,6 @@ public class AAIObjectType implements GraphInventoryObjectType, Serializable {
        }
 
        protected String removeParentUri(Class<?> aaiObjectClass, String parentUri) {
-                return aaiObjectClass.getAnnotation(Metadata.class).uriTemplate().replace(parentUri, "");
+               return aaiObjectClass.getAnnotation(Metadata.class).uriTemplate().replaceFirst(Pattern.quote(parentUri), "");
        }
 }
index 184b4e5..c3523e9 100644 (file)
 
 package org.onap.so.client.aai;
 
-import java.util.Optional;
-
-import org.onap.so.client.RestClient;
-import org.onap.so.client.aai.entities.CustomQuery;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
-import org.onap.so.client.graphinventory.Format;
+import org.onap.so.client.graphinventory.GraphInventoryQueryClient;
 import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
 
-public class AAIQueryClient extends AAIClient {
+public class AAIQueryClient extends GraphInventoryQueryClient<AAIQueryClient> {
 
-       private Optional<String> depth = Optional.empty();
-       private boolean nodesOnly = false;
-       private Optional<AAISubgraphType> subgraph = Optional.empty();
-       
        public AAIQueryClient() {
-               super();
+               super(new AAIClient());
        }
        
        public AAIQueryClient(AAIVersion version) {
-               super();
-               this.version = version;
-       }
-       
-       public String query(Format format, CustomQuery query) {
-               return this.createClient(AAIUriFactory.createResourceUri(AAIObjectType.CUSTOM_QUERY).queryParam("format", format.toString()))
-               .put(query, String.class);
-       }
-       
-       public AAIQueryClient depth (String depth) {
-               this.depth = Optional.of(depth);
-               return this;
+               super(new AAIClient(version));
        }
-       public AAIQueryClient nodesOnly() {
-               this.nodesOnly = true;
-               return this;
-       }
-       public AAIQueryClient subgraph(AAISubgraphType type){
-               
-               subgraph =  Optional.of(type);
 
-               return this;
+       @Override
+       protected GraphInventoryUri getQueryUri() {
+               return AAIUriFactory.createResourceUri(AAIObjectType.CUSTOM_QUERY);
        }
        
-       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));
+       protected GraphInventoryUri setupQueryParams(GraphInventoryUri uri) {
+               return super.setupQueryParams(uri);
        }
+       
 }
index 288ac9b..ee1736f 100644 (file)
 
 package org.onap.so.client.aai;
 
-import java.lang.reflect.InvocationTargetException;
-import java.util.Map;
 import java.util.Optional;
 
-import javax.ws.rs.NotFoundException;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
-
 import org.onap.aai.domain.yang.Relationship;
-import org.onap.so.client.RestClient;
-import org.onap.so.client.RestProperties;
 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;
+import org.onap.so.client.graphinventory.entities.GraphInventoryEdgeLabel;
+import org.onap.so.client.graphinventory.entities.uri.GraphInventoryResourceUri;
 
-public class AAIResourcesClient extends AAIClient implements GraphInventoryResourcesClient<AAIResourcesClient, AAIResourceUri, AAIEdgeLabel, AAIResultWrapper, AAITransactionalClient, AAISingleTransactionClient> {
-                       
-       public AAIResourcesClient() {
-               super();
-       }
-       
-       public AAIResourcesClient(AAIVersion version) {
-               super();
-               this.version = version;
-       }
-       
-       /* (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;
-       }
-       
-       /* (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;
-       }
-       
-       /* (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 {
-                       RestClient aaiRC = this.createClient(forceMinimal);
-                       
-                       return aaiRC.get().getStatus() == Status.OK.getStatusCode();
-               } catch (NotFoundException e) {
-                       return false;
-               }
-       }
+public class AAIResourcesClient extends GraphInventoryResourcesClient<AAIResourcesClient, AAIResourceUri, AAIEdgeLabel, AAIResultWrapper, AAITransactionalClient, AAISingleTransactionClient> {
        
-       /* (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());
-               aaiRC.put(this.buildRelationship(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, 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());
-               aaiRC.put(this.buildRelationship(uriB, label));
-               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());
-               aaiRC.delete(this.buildRelationship(uriB));
-               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);
-               Map<String, Object> result = aaiRC.get(new GenericType<Map<String, Object>>(){})
-                               .orElseThrow(() -> new NotFoundException(clone.build() + " does not exist in A&AI"));
-               String resourceVersion = (String) result.get("resource-version");
-               aaiRC = this.createClient(clone.resourceVersion(resourceVersion));
-               aaiRC.delete();
-               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;
-       }
+       private AAIClient aaiClient;
        
-       /* (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);
-               } catch (NotFoundException e) {
-                       if (this.getRestProperties().mapNotFoundToEmpty()) {
-                               return Optional.empty();
-                       } else {
-                               throw e;
-                       }
-               }
-       }
-       
-       /* (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();
-               } catch (NotFoundException e) {
-                       if (this.getRestProperties().mapNotFoundToEmpty()) {
-                               return e.getResponse();
-                       } else {
-                               throw e;
-                       }
-               }
+       public AAIResourcesClient() {
+               super(new AAIClient());
+               aaiClient = (AAIClient) super.client;
        }
        
-       /* (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);
-               } catch (NotFoundException e) {
-                       if (this.getRestProperties().mapNotFoundToEmpty()) {
-                               return Optional.empty();
-                       } else {
-                               throw e;
-                       }
-               }
+       public AAIResourcesClient(AAIVersion version) {
+               super(new AAIClient(version));
+               aaiClient = (AAIClient) super.client;
        }
-       
-       /* (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 {
-                       json = this.createClient(uri).get(String.class).orElse(null);
-               } catch (NotFoundException e) {
-                       if (this.getRestProperties().mapNotFoundToEmpty()) {
-                               json = null;
-                       } else {
-                               throw e;
-                       }
-               }
+       public AAIResultWrapper createWrapper(String json) {
                return new AAIResultWrapper(json);
        }
-       
-       /* (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 {
-                       json = this.createClient(uri).get(String.class)
-                                       .orElseThrow(() -> createException(c, uri.build() + " not found in A&AI", Optional.empty()));
-               } catch (NotFoundException e) {
-                       throw createException(c, "could not construct uri for use with A&AI", Optional.of(e));
-               }
 
-               return new AAIResultWrapper(json);
-       }
-       
-       private RuntimeException createException(Class<? extends RuntimeException> c, String message, Optional<Throwable> t) {
-               RuntimeException e;
-               try {
-                       if (t.isPresent()) {
-                               e = c.getConstructor(String.class, Throwable.class).newInstance(message, t.get());
-                       } else {
-                               e = c.getConstructor(String.class).newInstance(message);
-                       }
-               } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
-                               | NoSuchMethodException | SecurityException e1) {
-                       throw new IllegalArgumentException("could not create instance for " + c.getName());
-               }
-               
-               return e;
-       }
-       
-       protected Relationship buildRelationship(AAIResourceUri uri) {
-               return buildRelationship(uri, Optional.empty());
-       }
-       
-       protected Relationship buildRelationship(AAIResourceUri uri, AAIEdgeLabel label) {
-               return buildRelationship(uri, Optional.of(label));
-       }
-       protected Relationship buildRelationship(AAIResourceUri uri, Optional<AAIEdgeLabel> label) {
-               final Relationship result = new Relationship();
-               result.setRelatedLink(uri.build().toString());
-               if (label.isPresent()) {
-                       result.setRelationshipLabel(label.get().toString());
-               }
-               return result;
-       }
-       
-       /* (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()) {
-                               this.create(uri, obj.get());
-                       } else {
-                               this.createEmpty(uri);
-                       }
-                       
-               }
-               return this;
+       public AAITransactionalClient beginTransaction() {
+               return new AAITransactionalClient(this, aaiClient);
        }
 
-       /* (non-Javadoc)
-        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#beginTransaction()
-        */
        @Override
-       public AAITransactionalClient beginTransaction() {
-               return new AAITransactionalClient(this.getVersion());
+       public AAISingleTransactionClient beginSingleTransaction() {
+               return new AAISingleTransactionClient(this, aaiClient);
        }
        
-       /* (non-Javadoc)
-        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#beginSingleTransaction()
-        */
        @Override
-       public AAISingleTransactionClient beginSingleTransaction() {
-               return new AAISingleTransactionClient(this.getVersion());
+       protected Relationship buildRelationship(GraphInventoryResourceUri uri) {
+               return super.buildRelationship(uri, Optional.empty());
        }
        
-       private AAIUri addParams(Optional<Depth> depth, boolean nodesOnly, AAIUri uri) {
-               AAIUri clone = uri.clone();
-               if (depth.isPresent()) {
-                       clone.depth(depth.get());
-               }
-               if (nodesOnly) {
-                       clone.nodesOnly(nodesOnly);
-               }
-               
-               return clone;
+       @Override
+       protected Relationship buildRelationship(GraphInventoryResourceUri uri, GraphInventoryEdgeLabel label) {
+               return super.buildRelationship(uri, Optional.of(label));
        }
-       /* (non-Javadoc)
-        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#getRestProperties()
-        */
+       
        @Override
-       public <T extends RestProperties> T getRestProperties() {
-               return super.getRestProperties();
+       protected Relationship buildRelationship(GraphInventoryResourceUri uri, Optional<GraphInventoryEdgeLabel> label) {
+               return super.buildRelationship(uri, label);
        }
+       
 }
index ba65ac3..ee15e10 100644 (file)
@@ -22,170 +22,45 @@ package org.onap.so.client.aai;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Optional;
 
-import javax.ws.rs.NotFoundException;
 import javax.ws.rs.core.GenericType;
 
-import org.onap.aai.domain.yang.Relationship;
 import org.onap.so.client.RestClient;
 import org.onap.so.client.aai.entities.AAIEdgeLabel;
 import org.onap.so.client.aai.entities.AAIError;
-import org.onap.so.client.aai.entities.bulkprocess.Transactions;
 import org.onap.so.client.aai.entities.singletransaction.OperationBodyRequest;
 import org.onap.so.client.aai.entities.singletransaction.OperationBodyResponse;
 import org.onap.so.client.aai.entities.singletransaction.SingleTransactionRequest;
 import org.onap.so.client.aai.entities.singletransaction.SingleTransactionResponse;
 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.GraphInventoryTransactionClient;
 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 implements GraphInventorySingleTransactionClient<AAISingleTransactionClient, AAIResourceUri, AAIEdgeLabel> {
+public class AAISingleTransactionClient extends GraphInventoryTransactionClient<AAISingleTransactionClient, AAIResourceUri, AAIEdgeLabel> {
 
        private final SingleTransactionRequest request;
-       private final AAIVersion version;
-       private int actionCount = 0;
-       
-       private final GraphInventoryPatchConverter patchConverter = new GraphInventoryPatchConverter();
-       
-       protected AAISingleTransactionClient(AAIVersion version) {
+       private AAIResourcesClient resourcesClient;
+       private AAIClient aaiClient;
+       protected AAISingleTransactionClient(AAIResourcesClient resourcesClient, AAIClient aaiClient) {
                super();
-               this.version = version;
+               this.resourcesClient = resourcesClient;
+               this.aaiClient = aaiClient;
                this.request = new SingleTransactionRequest();
        }
-
-       /* (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;
-       }
-
-       /* (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;
-       }
-
-       /* (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)));
-               incrementActionAmount();
-               return this;
-       }
-
-       /* (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);
-               }
-               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());
-               aaiRC.put(this.buildRelationship(uriB, label));
-               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);
-               }
-               return this;
-       }
-
-       /* (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)));
-               incrementActionAmount();
-               return this;
-       }
-
-       /* (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;
-       }
-       /* (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();
-               Map<String, Object> result = client.get(new GenericType<Map<String, Object>>(){}, clone)
-                               .orElseThrow(() -> new NotFoundException(clone.build() + " does not exist in A&AI"));
-               String resourceVersion = (String) result.get("resource-version");
-               request.getOperations().add(new OperationBodyRequest().withAction("delete").withUri(clone.resourceVersion(resourceVersion).build().toString()).withBody(""));
-               incrementActionAmount();
-               return this;
-       }
-
-       /* (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);
-               request.getOperations().add(new OperationBodyRequest().withAction("patch").withUri(uri.build().toString()).withBody(payload));
-               incrementActionAmount();
-               return this;
-       }
-
-       private void incrementActionAmount() {
-               actionCount++;
-       }
        /* (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));
+               RestClient client = aaiClient.createClient(AAIUriFactory.createResourceUri(AAIObjectType.SINGLE_TRANSACTION));
                try {
                        SingleTransactionResponse response = client.post(this.request, SingleTransactionResponse.class);
                        if (response != null) {
@@ -227,32 +102,43 @@ public class AAISingleTransactionClient extends AAIClient implements GraphInvent
                        return Optional.empty();
                }
        }
+
        
-       private Relationship buildRelationship(AAIResourceUri uri) {
-               return buildRelationship(uri, Optional.empty());
+       protected SingleTransactionRequest getRequest() {
+               return this.request;
        }
-       
-       private Relationship buildRelationship(AAIResourceUri uri, AAIEdgeLabel label) {
-               return buildRelationship(uri, Optional.of(label));
+
+       @Override
+       public void put(String uri, Object body) {
+               request.getOperations().add(new OperationBodyRequest().withAction("put").withUri(uri).withBody(body));
        }
-       private Relationship buildRelationship(AAIResourceUri uri, Optional<AAIEdgeLabel> label) {
-               final Relationship result = new Relationship();
-               result.setRelatedLink(uri.build().toString());
-               if (label.isPresent()) {
-                       result.setRelationshipLabel(label.toString());
-               }
-               return result;
+
+       @Override
+       public void delete(String uri, Object body) {
+               request.getOperations().add(new OperationBodyRequest().withAction("delete").withUri(uri).withBody(body));
+       }
+
+       @Override
+       public void patch(String uri, Object body) {
+               request.getOperations().add(new OperationBodyRequest().withAction("patch").withUri(uri).withBody(body));
        }
 
        @Override
-       protected AAIVersion getVersion() {
-               return this.version;
+       protected <T> Optional<T> get(GenericType<T> genericType, AAIResourceUri clone) {
+               return resourcesClient.get(genericType, clone);
        }
        
-       protected SingleTransactionRequest getRequest() {
-               return this.request;
+       @Override
+       protected boolean exists(AAIResourceUri uri) {
+               return resourcesClient.exists(uri);
        }
        
+       @Override
+       protected String getGraphDBName() {
+               return aaiClient.getGraphDBName();
+       }
+       
+       @Override
        protected GraphInventoryPatchConverter getPatchConverter() {
                return this.patchConverter;
        }
index dd4cb2f..474ae89 100644 (file)
@@ -22,13 +22,11 @@ package org.onap.so.client.aai;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
 
-import javax.ws.rs.NotFoundException;
 import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.Response;
 
@@ -42,7 +40,7 @@ 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.AAIUriFactory;
 import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
-import org.onap.so.client.graphinventory.GraphInventoryTransactionalClient;
+import org.onap.so.client.graphinventory.GraphInventoryTransactionClient;
 import org.onap.so.client.graphinventory.exceptions.BulkProcessFailed;
 import org.onap.so.jsonpath.JsonPathUtil;
 
@@ -50,18 +48,17 @@ import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Joiner;
 
-public class AAITransactionalClient extends AAIClient implements GraphInventoryTransactionalClient<AAITransactionalClient, AAIResourceUri, AAIEdgeLabel> {
+public class AAITransactionalClient extends GraphInventoryTransactionClient<AAITransactionalClient, AAIResourceUri, AAIEdgeLabel> {
 
        private final Transactions transactions;
        private Transaction currentTransaction;
-       private final AAIVersion version;
-       private int actionCount = 0;
        
-       private final GraphInventoryPatchConverter patchConverter = new GraphInventoryPatchConverter();
-       
-       protected AAITransactionalClient(AAIVersion version) {
+       private AAIResourcesClient resourcesClient;
+       private AAIClient aaiClient;
+       protected AAITransactionalClient(AAIResourcesClient resourcesClient, AAIClient aaiClient) {
                super();
-               this.version = version;
+               this.resourcesClient = resourcesClient;
+               this.aaiClient = aaiClient;
                this.transactions = new Transactions();
                startTransaction();
        }
@@ -75,132 +72,17 @@ public class AAITransactionalClient extends AAIClient implements GraphInventoryT
        /* (non-Javadoc)
         * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#beginNewTransaction()
         */
-       @Override
        public AAITransactionalClient beginNewTransaction() {
                startTransaction();
                return this;
        }
        
-       /* (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;
-       }
-       
-       /* (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;
-       }
-       
-       /* (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)));
-               incrementActionAmount();
-               return this;
-       }
-       
-       /* (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);
-               }
-               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());
-               aaiRC.put(this.buildRelationship(uriB, label));
-               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);
-               }
-               return this;
-       }
-       
-       /* (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)));
-               incrementActionAmount();
-               return this;
-       }
-       
-       /* (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;
-       }
-       /* (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();
-               Map<String, Object> result = client.get(new GenericType<Map<String, Object>>(){}, clone)
-                               .orElseThrow(() -> new NotFoundException(clone.build() + " does not exist in A&AI"));
-               String resourceVersion = (String) result.get("resource-version");
-               currentTransaction.getDelete().add(new OperationBody().withUri(clone.resourceVersion(resourceVersion).build().toString()).withBody(""));
-               incrementActionAmount();
-               return this;
-       }
-       
-       /* (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));
-               incrementActionAmount();
-               return this;
-       }
-       
-       private void incrementActionAmount() {
-               actionCount++;
-       }
        /* (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));
+               RestClient client = aaiClient.createClient(AAIUriFactory.createResourceUri(AAIObjectType.BULK_PROCESS));
                try {
                        Response response = client.put(this.transactions);
                        if (response.hasEntity()) {
@@ -271,16 +153,43 @@ public class AAITransactionalClient extends AAIClient implements GraphInventoryT
                }
                return result;
        }
+       
+       protected Transactions getTransactions() {
+               return this.transactions;
+       }
+
+       @Override
+       public void put(String uri, Object body) {
+               currentTransaction.getPut().add(new OperationBody().withUri(uri).withBody(body));
+       }
+
+       @Override
+       public void delete(String uri, Object body) {
+               currentTransaction.getDelete().add(new OperationBody().withUri(uri).withBody(body));
+               
+       }
 
        @Override
-       protected AAIVersion getVersion() {
-               return this.version;
+       public void patch(String uri, Object body) {
+               currentTransaction.getPatch().add(new OperationBody().withUri(uri).withBody(body));
+       }
+
+       @Override
+       protected <T> Optional<T> get(GenericType<T> genericType, AAIResourceUri clone) {
+               return resourcesClient.get(genericType, clone);
        }
        
-       protected Transactions getTransactions() {
-               return this.transactions;
+       @Override
+       protected boolean exists(AAIResourceUri uri) {
+               return resourcesClient.exists(uri);
+       }
+
+       @Override
+       protected String getGraphDBName() {
+               return aaiClient.getGraphDBName();
        }
        
+       @Override
        protected GraphInventoryPatchConverter getPatchConverter() {
                return this.patchConverter;
        }
index 76413c2..7cb37d9 100644 (file)
@@ -59,6 +59,10 @@ public class AAISimpleUri extends SimpleUri implements AAIResourceUri {
                super(parentUri, childType, childValues);
        }
        
+       protected AAISimpleUri(AAIResourceUri parentUri, AAIObjectPlurals childType) {
+               super(parentUri, childType);
+       }
+       
        @Override
        public AAISimpleUri relationshipAPI() {
                return (AAISimpleUri) super.relationshipAPI();
index 77c6108..ac0aba3 100644 (file)
@@ -85,6 +85,11 @@ public class AAIUriFactory {
                return new AAISimpleUri(parentUri, childType, childValues);
        }
        
+       public static AAIResourceUri createResourceFromParentURI(AAIResourceUri parentUri, AAIObjectPlurals childType) {
+               
+               return new AAISimpleUri(parentUri, childType);
+       }
+       
        /**
         * Creates a uri for a plural type e.g. /cloud-infrastructure/pservers
         * 
index 5cbf132..0a3e0b4 100644 (file)
@@ -23,6 +23,7 @@ package org.onap.so.client.graphinventory;
 public enum Format {
 
        RESOURCE("resource"),
+       RESOURCE_AND_URL("resource_and_url"),
        SIMPLE("simple"),
        RAW("raw"),
        CONSOLE("console"),
index 0d10c21..30e91dc 100644 (file)
@@ -37,12 +37,16 @@ public abstract class GraphInventoryClient {
        }
        protected abstract URI constructPath(GraphInventoryUri uri);
        
-       protected abstract RestClient createClient(GraphInventoryUri uri);
+       public abstract RestClient createClient(GraphInventoryUri uri);
 
-       protected <T extends RestProperties> T getRestProperties() {
+       public <T extends RestProperties> T getRestProperties() {
                if (props == null) {
                        throw new IllegalStateException("No RestProperty implementation found on classpath");
                }
                return (T)props;
        }
+       
+       public abstract GraphInventoryVersion getVersion();
+       
+       public abstract String getGraphDBName();
 }
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai;
+package org.onap.so.client.graphinventory;
 
 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.aai.entities.CustomQuery;
 import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
 
-public class AAIDSLQuery extends AAIClient {
+public abstract class GraphInventoryQueryClient<S> {
 
        private Optional<String> depth = Optional.empty();
        private boolean nodesOnly = false;
-       private Optional<AAISubgraphType> subgraph = Optional.empty();
+       private Optional<GraphInventorySubgraphType> subgraph = Optional.empty();
+       private GraphInventoryClient client;
        
-       public AAIDSLQuery() {
-               super();
+       public GraphInventoryQueryClient(GraphInventoryClient client) {
+               this.client = client;
        }
        
-       public AAIDSLQuery(AAIVersion version) {
-               super();
-               this.version = version;
-       }
+       protected abstract GraphInventoryUri getQueryUri();
        
-       public String query(Format format, DSLQuery query) {
-               return this.createClient(AAIUriFactory.createResourceUri(AAIObjectType.DSL).queryParam("format", format.toString()))
-               .put(query, String.class);
+       public String query(Format format, CustomQuery query) {
+               return client.createClient(setupQueryParams(getQueryUri().queryParam("format", format.toString()))).put(query, String.class);
        }
        
-       public AAIDSLQuery depth (String depth) {
+       public S depth (String depth) {
                this.depth = Optional.of(depth);
-               return this;
+               return (S) this;
        }
-       public AAIDSLQuery nodesOnly() {
+       public S nodesOnly() {
                this.nodesOnly = true;
-               return this;
+               return (S) this;
        }
-       public AAIDSLQuery subgraph(AAISubgraphType type){
+       public S subgraph(GraphInventorySubgraphType type){
                
                subgraph =  Optional.of(type);
 
-               return this;
+               return (S) this;
        }
        
        protected GraphInventoryUri setupQueryParams(GraphInventoryUri uri) {
@@ -76,8 +70,4 @@ public class AAIDSLQuery extends AAIClient {
                }
                return clone;
        }
-       @Override
-       protected RestClient createClient(GraphInventoryUri uri) {
-               return super.createClient(setupQueryParams(uri));
-       }
 }
index 7fbe286..39d2d01 100644 (file)
@@ -1,17 +1,30 @@
 package org.onap.so.client.graphinventory;
 
+import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
 import java.util.Optional;
 
+import javax.ws.rs.NotFoundException;
 import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
 
+import org.onap.aai.domain.yang.Relationship;
+import org.onap.so.client.RestClient;
 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.Depth;
+import org.onap.so.client.graphinventory.entities.uri.GraphInventoryResourceUri;
 import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
 
-public interface GraphInventoryResourcesClient<Self, Uri extends GraphInventoryUri, EdgeLabel extends GraphInventoryEdgeLabel, Wrapper extends GraphInventoryResultWrapper, TransactionalClient, SingleTransactionClient> {
+public abstract class GraphInventoryResourcesClient<Self, Uri extends GraphInventoryResourceUri, EdgeLabel extends GraphInventoryEdgeLabel, Wrapper extends GraphInventoryResultWrapper, TransactionalClient, SingleTransactionClient> {
 
+       protected GraphInventoryClient client;
+       
+       protected GraphInventoryResourcesClient(GraphInventoryClient client) {
+               this.client = client;
+       }
        /**
         * creates a new object in GraphInventory
         * 
@@ -19,7 +32,10 @@ public interface GraphInventoryResourcesClient<Self, Uri extends GraphInventoryU
         * @param uri
         * @return
         */
-       void create(Uri uri, Object obj);
+       public void create(Uri uri, Object obj) {
+               RestClient giRC = client.createClient(uri);
+               giRC.put(obj);
+       }
 
        /**
         * creates a new object in GraphInventory with no payload body
@@ -27,7 +43,10 @@ public interface GraphInventoryResourcesClient<Self, Uri extends GraphInventoryU
         * @param uri
         * @return
         */
-       void createEmpty(Uri uri);
+       public void createEmpty(Uri uri) {
+               RestClient giRC = client.createClient(uri);
+               giRC.put("");
+       }
 
        /**
         * returns false if the object does not exist in GraphInventory
@@ -35,7 +54,16 @@ public interface GraphInventoryResourcesClient<Self, Uri extends GraphInventoryU
         * @param uri
         * @return
         */
-       boolean exists(Uri uri);
+       public boolean exists(Uri uri) {
+               GraphInventoryUri forceMinimal = this.addParams(Optional.of(Depth.ZERO), true, uri);
+               try {
+                       RestClient giRC = client.createClient(forceMinimal);
+                       
+                       return giRC.get().getStatus() == Status.OK.getStatusCode();
+               } catch (NotFoundException e) {
+                       return false;
+               }
+       }
 
        /**
         * Adds a relationship between two objects in GraphInventory 
@@ -43,7 +71,11 @@ public interface GraphInventoryResourcesClient<Self, Uri extends GraphInventoryU
         * @param uriB
         * @return
         */
-       void connect(Uri uriA, Uri uriB);
+       public void connect(Uri uriA, Uri uriB) {
+               GraphInventoryResourceUri uriAClone = uriA.clone();
+               RestClient giRC = client.createClient(uriAClone.relationshipAPI());
+               giRC.put(this.buildRelationship(uriB));
+       }
 
        /**
         * Adds a relationship between two objects in GraphInventory 
@@ -53,7 +85,11 @@ public interface GraphInventoryResourcesClient<Self, Uri extends GraphInventoryU
         * @param edge label
         * @return
         */
-       void connect(Uri uriA, Uri uriB, EdgeLabel label);
+       public void connect(Uri uriA, Uri uriB, EdgeLabel label) {
+               GraphInventoryResourceUri uriAClone = uriA.clone();
+               RestClient giRC = client.createClient(uriAClone.relationshipAPI());
+               giRC.put(this.buildRelationship(uriB, label));
+       }
 
        /**
         * Removes relationship from two objects in GraphInventory
@@ -62,7 +98,11 @@ public interface GraphInventoryResourcesClient<Self, Uri extends GraphInventoryU
         * @param uriB
         * @return
         */
-       void disconnect(Uri uriA, Uri uriB);
+       public void disconnect(Uri uriA, Uri uriB) {
+               GraphInventoryResourceUri uriAClone = uriA.clone();
+               RestClient giRC = client.createClient(uriAClone.relationshipAPI());
+               giRC.delete(this.buildRelationship(uriB));
+       }
 
        /**
         * Deletes object from GraphInventory. Automatically handles resource-version.
@@ -70,14 +110,25 @@ public interface GraphInventoryResourcesClient<Self, Uri extends GraphInventoryU
         * @param uri
         * @return
         */
-       void delete(Uri uri);
+       public void delete(Uri uri) {
+               GraphInventoryResourceUri clone = uri.clone();
+               RestClient giRC = client.createClient(clone);
+               Map<String, Object> result = giRC.get(new GenericType<Map<String, Object>>(){})
+                               .orElseThrow(() -> new NotFoundException(clone.build() + " does not exist in " + client.getGraphDBName()));
+               String resourceVersion = (String) result.get("resource-version");
+               giRC = client.createClient(clone.resourceVersion(resourceVersion));
+               giRC.delete();
+       }
 
        /**
         * @param obj - can be any object which will marshal into a valid GraphInventory payload
         * @param uri
         * @return
         */
-       void update(Uri uri, Object obj);
+       public void update(Uri uri, Object obj) {
+               RestClient giRC = client.createClient(uri);
+               giRC.patch(obj);
+       }
 
        /**
         * Retrieves an object from GraphInventory and unmarshalls it into the Class specified
@@ -85,14 +136,34 @@ public interface GraphInventoryResourcesClient<Self, Uri extends GraphInventoryU
         * @param uri
         * @return
         */
-       <T> Optional<T> get(Class<T> clazz, Uri uri);
+       public <T> Optional<T> get(Class<T> clazz, Uri uri) {
+               try {
+                       return client.createClient(uri).get(clazz);
+               } catch (NotFoundException e) {
+                       if (this.getRestProperties().mapNotFoundToEmpty()) {
+                               return Optional.empty();
+                       } else {
+                               throw e;
+                       }
+               }
+       }
 
        /**
         * Retrieves an object from GraphInventory and returns complete response
         * @param uri
         * @return
         */
-       Response getFullResponse(Uri uri);
+       public Response getFullResponse(Uri uri) {
+               try {
+                       return client.createClient(uri).get();
+               } catch (NotFoundException e) {
+                       if (this.getRestProperties().mapNotFoundToEmpty()) {
+                               return e.getResponse();
+                       } else {
+                               throw e;
+                       }
+               }
+       }
 
        /**
         * Retrieves an object from GraphInventory and automatically unmarshalls it into a Map or List 
@@ -100,15 +171,36 @@ public interface GraphInventoryResourcesClient<Self, Uri extends GraphInventoryU
         * @param uri
         * @return
         */
-       <T> Optional<T> get(GenericType<T> resultClass, Uri uri);
-
+       public <T> Optional<T> get(GenericType<T> resultClass, Uri uri) {
+               try {
+                       return client.createClient(uri).get(resultClass);
+               } catch (NotFoundException e) {
+                       if (this.getRestProperties().mapNotFoundToEmpty()) {
+                               return Optional.empty();
+                       } else {
+                               throw e;
+                       }
+               }
+       }
        /**
         * Retrieves an object from GraphInventory wrapped in a helper class which offer additional features
         * 
         * @param uri
         * @return
         */
-       Wrapper get(Uri uri);
+       public Wrapper get(Uri uri) {
+               String json;
+               try {
+                       json = client.createClient(uri).get(String.class).orElse(null);
+               } catch (NotFoundException e) {
+                       if (this.getRestProperties().mapNotFoundToEmpty()) {
+                               json = null;
+                       } else {
+                               throw e;
+                       }
+               }
+               return this.createWrapper(json);
+       }
 
        /**
         * Retrieves an object from GraphInventory wrapped in a helper class which offer additional features
@@ -117,7 +209,33 @@ public interface GraphInventoryResourcesClient<Self, Uri extends GraphInventoryU
         * @param uri
         * @return
         */
-       Wrapper get(Uri uri, Class<? extends RuntimeException> c);
+       public Wrapper get(Uri uri, Class<? extends RuntimeException> c) {
+               String json;
+               try {
+                       json = client.createClient(uri).get(String.class)
+                                       .orElseThrow(() -> createException(c, uri.build() + " not found in " + client.getGraphDBName(), Optional.empty()));
+               } catch (NotFoundException e) {
+                       throw createException(c, "could not construct uri for use with " + client.getGraphDBName(), Optional.of(e));
+               }
+
+               return this.createWrapper(json);
+       }
+       
+       private RuntimeException createException(Class<? extends RuntimeException> c, String message, Optional<Throwable> t) {
+               RuntimeException e;
+               try {
+                       if (t.isPresent()) {
+                               e = c.getConstructor(String.class, Throwable.class).newInstance(message, t.get());
+                       } else {
+                               e = c.getConstructor(String.class).newInstance(message);
+                       }
+               } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+                               | NoSuchMethodException | SecurityException e1) {
+                       throw new IllegalArgumentException("could not create instance for " + c.getName());
+               }
+               
+               return e;
+       }
 
        /**
         * Will automatically create the object if it does not exist
@@ -126,22 +244,63 @@ public interface GraphInventoryResourcesClient<Self, Uri extends GraphInventoryU
         * @param uri
         * @return
         */
-       Self createIfNotExists(Uri uri, Optional<Object> obj);
-
+       public Self createIfNotExists(Uri uri, Optional<Object> obj) {
+               if(!this.exists(uri)){
+                       if (obj.isPresent()) {
+                               this.create(uri, obj.get());
+                       } else {
+                               this.createEmpty(uri);
+                       }
+                       
+               }
+               return (Self)this;
+       }
+       protected Relationship buildRelationship(GraphInventoryResourceUri uri) {
+               return buildRelationship(uri, Optional.empty());
+       }
+       
+       protected Relationship buildRelationship(GraphInventoryResourceUri uri, GraphInventoryEdgeLabel label) {
+               return buildRelationship(uri, Optional.of(label));
+       }
+       protected Relationship buildRelationship(GraphInventoryResourceUri uri, Optional<GraphInventoryEdgeLabel> label) {
+               final Relationship result = new Relationship();
+               result.setRelatedLink(uri.build().toString());
+               if (label.isPresent()) {
+                       result.setRelationshipLabel(label.get().toString());
+               }
+               return result;
+       }
+       
+       public abstract Wrapper createWrapper(String json);
+       
        /**
         * Starts a transaction which encloses multiple GraphInventory mutations
         * 
         * @return
         */
-       TransactionalClient beginTransaction();
+       public abstract TransactionalClient beginTransaction();
 
        /**
         * Starts a transaction groups multiple GraphInventory mutations
         * 
         * @return
         */
-       SingleTransactionClient beginSingleTransaction();
+       public abstract SingleTransactionClient beginSingleTransaction();
 
-       <T extends RestProperties> T getRestProperties();
+       private GraphInventoryUri addParams(Optional<Depth> depth, boolean nodesOnly, GraphInventoryUri uri) {
+               GraphInventoryUri clone = uri.clone();
+               if (depth.isPresent()) {
+                       clone.depth(depth.get());
+               }
+               if (nodesOnly) {
+                       clone.nodesOnly(nodesOnly);
+               }
+               
+               return clone;
+       }
+       
+       public <T extends RestProperties> T getRestProperties() {
+               return client.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
deleted file mode 100644 (file)
index e1aa225..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-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
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai;
+package org.onap.so.client.graphinventory;
 
 
-public enum AAISubgraphType {
+public enum GraphInventorySubgraphType {
        STAR("star"),
        PRUNE("prune");
 
        private final String name;
 
-       private AAISubgraphType(String name) {
+       private GraphInventorySubgraphType(String name) {
                this.name = name;
        }
 
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionClient.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionClient.java
new file mode 100644 (file)
index 0000000..8d1a945
--- /dev/null
@@ -0,0 +1,240 @@
+/*-
+ * ============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 java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import javax.ws.rs.NotFoundException;
+import javax.ws.rs.core.GenericType;
+
+import org.onap.aai.domain.yang.Relationship;
+import org.onap.so.client.aai.AAIVersion;
+import org.onap.so.client.aai.entities.singletransaction.SingleTransactionRequest;
+import org.onap.so.client.graphinventory.entities.GraphInventoryEdgeLabel;
+import org.onap.so.client.graphinventory.entities.uri.GraphInventoryResourceUri;
+import org.onap.so.client.graphinventory.exceptions.BulkProcessFailed;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class GraphInventoryTransactionClient<Self, Uri extends GraphInventoryResourceUri, EdgeLabel extends GraphInventoryEdgeLabel> implements TransactionBuilder {
+
+       protected static Logger logger = LoggerFactory.getLogger(GraphInventoryTransactionClient.class);
+
+       protected int actionCount = 0;
+       
+       protected final GraphInventoryPatchConverter patchConverter = new GraphInventoryPatchConverter();
+       
+       protected GraphInventoryTransactionClient() {
+       }
+
+       /**
+        * 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
+        */
+       public Self create(Uri uri, Object obj) {
+               this.put(uri.build().toString(), obj);
+               incrementActionAmount();
+               return (Self)this;
+       }
+
+       /**
+        * creates a new object in A&AI with no payload body
+        * 
+        * @param uri
+        * @return
+        */
+       public Self createEmpty(Uri uri) {
+               this.put(uri.build().toString(), new HashMap<String, String>());
+               incrementActionAmount();
+               return (Self)this;
+       }
+
+       /**
+        * Will automatically create the object if it does not exist
+        * 
+        * @param obj - Optional object which serializes to a valid GraphInventory payload
+        * @param uri
+        * @return
+        */
+       public Self createIfNotExists(Uri uri, Optional<Object> obj) {
+               if(!this.exists(uri)){
+                       if (obj.isPresent()) {
+                               this.create(uri, obj.get());
+                               incrementActionAmount();
+                       } else {
+                               this.createEmpty(uri);
+                               incrementActionAmount();
+                       }
+                       
+               }
+               return (Self)this;
+       }
+       
+       /**
+        * Adds a relationship between two objects in A&AI 
+        * @param uriA
+        * @param uriB
+        * @return
+        */
+       public Self connect(Uri uriA, Uri uriB) {
+               GraphInventoryResourceUri uriAClone = uriA.clone();
+               this.put(uriAClone.relationshipAPI().build().toString(), this.buildRelationship(uriB));
+               incrementActionAmount();
+               return (Self)this;
+       }
+
+       /**
+        * relationship between multiple objects in A&AI - connects A to all objects specified in list
+        * 
+        * @param uriA
+        * @param uris
+        * @return
+        */
+       public Self connect(Uri uriA, List<Uri> uris) {
+               for (Uri uri : uris) {
+                       this.connect(uriA, uri);
+               }
+               return (Self)this;
+       }
+       
+       /**
+        * relationship between multiple objects in A&AI - connects A to all objects specified in list
+        * 
+        * @param uriA
+        * @param uris
+        * @return
+        */
+       public Self connect(Uri uriA, Uri uriB, EdgeLabel label) {
+               GraphInventoryResourceUri uriAClone = uriA.clone();
+               this.put(uriAClone.relationshipAPI().build().toString(), this.buildRelationship(uriB, label));
+               return (Self)this;
+       }
+       
+       /**
+        * relationship between multiple objects in A&AI - connects A to all objects specified in list
+        * 
+        * @param uriA
+        * @param uris
+        * @return
+        */
+       public Self connect(Uri uriA, List<Uri> uris, EdgeLabel label) {
+               for (Uri uri : uris) {
+                       this.connect(uriA, uri, label);
+               }
+               return (Self)this;
+       }
+
+       /**
+        * Removes relationship from two objects in A&AI
+        * 
+        * @param uriA
+        * @param uriB
+        * @return
+        */
+       public Self disconnect(Uri uriA, Uri uriB) {
+               GraphInventoryResourceUri uriAClone = uriA.clone();
+               this.delete(uriAClone.relationshipAPI().build().toString(), this.buildRelationship(uriB));
+               incrementActionAmount();
+               return (Self)this;
+       }
+
+       /**
+        * Removes relationship from multiple objects - disconnects A from all objects specified in list
+        * @param uriA
+        * @param uris
+        * @return
+        */
+       public Self disconnect(Uri uriA, List<Uri> uris) {
+               for (Uri uri : uris) {
+                       this.disconnect(uriA, uri);
+               }
+               return (Self)this;
+       }
+       /**
+        * Deletes object from A&AI. Automatically handles resource-version.
+        * 
+        * @param uri
+        * @return
+        */
+       public Self delete(Uri uri) {
+               Map<String, Object> result = this.get(new GenericType<Map<String, Object>>(){}, (Uri)uri.clone())
+                               .orElseThrow(() -> new NotFoundException(uri.build() + " does not exist in " + this.getGraphDBName()));
+               String resourceVersion = (String) result.get("resource-version");
+               this.delete(uri.resourceVersion(resourceVersion).build().toString(), "");
+               incrementActionAmount();
+               return (Self)this;
+       }
+
+       protected abstract <T> Optional<T> get(GenericType<T> genericType, Uri clone);
+       
+       protected abstract boolean exists(Uri uri);
+       
+       protected abstract String getGraphDBName();
+
+       /**
+        * @param obj - can be any object which will marshal into a valid A&AI payload
+        * @param uri
+        * @return
+        */
+       public Self update(Uri uri, Object obj) {
+               
+               final String payload = getPatchConverter().convertPatchFormat(obj);
+               this.patch(uri.build().toString(), payload);
+               incrementActionAmount();
+               return (Self)this;
+       }
+
+       private void incrementActionAmount() {
+               actionCount++;
+       }
+       /**
+        * Executes all created transactions in A&AI
+        * @throws BulkProcessFailed 
+        */
+       public abstract void execute() throws BulkProcessFailed;
+       
+       private Relationship buildRelationship(Uri uri) {
+               return buildRelationship(uri, Optional.empty());
+       }
+       
+       private Relationship buildRelationship(Uri uri, EdgeLabel label) {
+               return buildRelationship(uri, Optional.of(label));
+       }
+       private Relationship buildRelationship(Uri uri, Optional<EdgeLabel> label) {
+               final Relationship result = new Relationship();
+               result.setRelatedLink(uri.build().toString());
+               if (label.isPresent()) {
+                       result.setRelationshipLabel(label.toString());
+               }
+               return result;
+       }
+       
+       protected GraphInventoryPatchConverter getPatchConverter() {
+               return this.patchConverter;
+       }
+       
+}
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
deleted file mode 100644 (file)
index a7362c8..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-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/TransactionBuilder.java b/common/src/main/java/org/onap/so/client/graphinventory/TransactionBuilder.java
new file mode 100644 (file)
index 0000000..2cab4b5
--- /dev/null
@@ -0,0 +1,10 @@
+package org.onap.so.client.graphinventory;
+
+public interface TransactionBuilder {
+
+       
+       void put(String uri, Object body);
+       void delete(String uri, Object body);
+       void patch(String uri,Object body);
+       
+}
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai.entities;
+package org.onap.so.client.graphinventory.entities;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import org.onap.so.client.aai.entities.QueryStep;
 import org.onap.so.client.graphinventory.GraphInventoryObjectName;
 
 public class DSLNode implements QueryStep {
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai.entities;
+package org.onap.so.client.graphinventory.entities;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import org.onap.so.client.aai.entities.QueryStep;
+
 import com.google.common.base.Joiner;
 
 
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai.entities;
+package org.onap.so.client.graphinventory.entities;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai.entities;
+package org.onap.so.client.graphinventory.entities;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import org.onap.so.client.aai.entities.QueryStep;
+
 import com.google.common.base.Joiner;
 
 
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai.entities;
+package org.onap.so.client.graphinventory.entities;
 
 import org.onap.so.client.graphinventory.GraphInventoryObjectName;
 
index 93de913..dc4179a 100644 (file)
@@ -98,6 +98,13 @@ public class SimpleUri implements GraphInventoryResourceUri, Serializable {
                validateValuesSize(childType.partialUri(), values);
        }
        
+       protected SimpleUri(GraphInventoryResourceUri parentUri, GraphInventoryObjectPlurals childType) {
+               this.type = null;
+               this.pluralType = childType;
+               this.internalURI =  UriBuilder.fromUri(parentUri.build()).path(childType.partialUri());
+               this.values = new Object[0];
+       }
+       
        protected void setInternalURI(UriBuilder builder) {
                this.internalURI = builder;
        }
index d4eaf08..64a83f9 100644 (file)
@@ -80,4 +80,11 @@ public class AAIObjectTypeTest {
                assertEquals("/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name}", type.uriTemplate());
                assertEquals("/p-interfaces/p-interface/{interface-name}", type.partialUri());
        }
+       
+       @Test
+       public void networkPolicyObjectTypeTest() {
+               final String id = "test1";
+               AAIUri aaiUri = AAIUriFactory.createResourceUri(AAIObjectType.NETWORK_POLICY, id);
+               assertEquals("/network/network-policies/network-policy/test1", aaiUri.build().toString());
+       }
 }
index 43616ba..84c3cad 100644 (file)
 
 package org.onap.so.client.aai;
 
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -36,9 +33,8 @@ import javax.ws.rs.core.Response;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
 import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.Spy;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.so.client.RestClient;
 import org.onap.so.client.aai.entities.CustomQuery;
@@ -46,6 +42,8 @@ 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.Format;
+import org.onap.so.client.graphinventory.GraphInventoryClient;
+import org.onap.so.client.graphinventory.GraphInventorySubgraphType;
 
 
 @RunWith(MockitoJUnitRunner.class) 
@@ -57,7 +55,10 @@ public class AAIQueryClientTest {
        @Mock
        RestClient restClient;
        
-       @Spy
+       @Mock
+       GraphInventoryClient client;
+       
+       @InjectMocks
        AAIQueryClient aaiQueryClient = new AAIQueryClient();
        
        @Test
@@ -67,16 +68,16 @@ public class AAIQueryClientTest {
                Format format = Format.SIMPLE;
                CustomQuery query = new CustomQuery(uris);
                
-               doReturn(restClient).when(aaiQueryClient).createClient(isA(AAIUri.class));
+               doReturn(restClient).when(client).createClient(isA(AAIUri.class));
                aaiQueryClient.query(format, query);
-               verify(aaiQueryClient, times(1)).createClient(AAIUriFactory.createResourceUri(AAIObjectType.CUSTOM_QUERY).queryParam("format", format.toString()));
+               verify(client, times(1)).createClient(AAIUriFactory.createResourceUri(AAIObjectType.CUSTOM_QUERY).queryParam("format", format.toString()));
                verify(restClient, times(1)).put(query, String.class);
        }
        
        @Test
        public void testCreateClient() {
                String depth = "testDepth";
-               AAISubgraphType subgraph = AAISubgraphType.STAR;
+               GraphInventorySubgraphType subgraph = GraphInventorySubgraphType.STAR;
                
                aaiQueryClient.depth(depth);
                aaiQueryClient.nodesOnly();
index 32a9ca5..a55fbc9 100644 (file)
@@ -35,18 +35,26 @@ import static org.junit.Assert.assertThat;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 
+import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.aai.domain.yang.Relationship;
 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.AAIUriFactory;
 import org.onap.so.client.defaultproperties.DefaultAAIPropertiesImpl;
+import org.onap.so.client.graphinventory.GraphInventoryClient;
 
 import com.github.tomakehurst.wiremock.admin.NotFoundException;
 import com.github.tomakehurst.wiremock.junit.WireMockRule;
+
+@RunWith(MockitoJUnitRunner.class)
 public class AAIResourcesClientTest {
 
 
@@ -56,6 +64,18 @@ public class AAIResourcesClientTest {
        @Rule
        public ExpectedException thrown = ExpectedException.none();
        
+       
+       @Spy
+       public AAIClient client;
+       
+       @InjectMocks
+       public AAIResourcesClient aaiClient = new AAIResourcesClient();
+       
+       @Before
+       public void beforeTest() {
+               doReturn(new DefaultAAIPropertiesImpl()).when(client).getRestProperties();
+       }
+       
        @Test
        public void verifyNotExists() {
                AAIResourceUri path = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, "test");
@@ -66,7 +86,7 @@ public class AAIResourcesClientTest {
                                        .withHeader("Content-Type", "text/plain")
                                        .withBody("hello")
                                        .withStatus(404)));
-               AAIResourcesClient client= createClient();
+               AAIResourcesClient client= aaiClient;
                boolean result = client.exists(path);
                assertEquals("path not found", false, result);
        }
@@ -87,7 +107,7 @@ public class AAIResourcesClientTest {
                                .willReturn(
                                        aResponse()
                                        .withStatus(204)));
-               AAIResourcesClient client= createClient();
+               AAIResourcesClient client= aaiClient;
                client.delete(path);
        }
        
@@ -102,7 +122,7 @@ public class AAIResourcesClientTest {
                                        .withHeader("Content-Type", "application/json")
                                        .withBodyFile("aai/resources/mockObject.json")
                                        .withStatus(200)));
-               AAIResourcesClient client= createClient();
+               AAIResourcesClient client= aaiClient;
                client.get(path);
        }
        
@@ -118,7 +138,7 @@ public class AAIResourcesClientTest {
                                        .withStatus(200)));
                
                AAIResourceUri pathClone = path.clone();
-               AAIResourcesClient client= createClient();
+               AAIResourcesClient client= aaiClient;
                client.connect(path, path2);
                assertEquals("uri not modified", pathClone.build().toString(), path.build().toString());
        }
@@ -135,7 +155,7 @@ public class AAIResourcesClientTest {
                                        .withStatus(204)));
                
                AAIResourceUri pathClone = path.clone();
-               AAIResourcesClient client= createClient();
+               AAIResourcesClient client= aaiClient;
                client.disconnect(path, path2);
                assertEquals("uri not modified", pathClone.build().toString(), path.build().toString());
        }
@@ -150,7 +170,7 @@ public class AAIResourcesClientTest {
                                        aResponse()
                                        .withStatus(200)));
                
-               AAIResourcesClient client= createClient();
+               AAIResourcesClient client= aaiClient;
 
                client.update(path, "{}");
        }
@@ -165,7 +185,7 @@ public class AAIResourcesClientTest {
                                        .withHeader("Content-Type", "text/plain")
                                        .withBody("hello")
                                        .withStatus(404)));
-               AAIResourcesClient client= createClient();
+               AAIResourcesClient client= aaiClient;
                AAIResultWrapper result = client.get(path);
                assertEquals("is empty", true, result.isEmpty());
        }
@@ -180,7 +200,7 @@ public class AAIResourcesClientTest {
                                        .withHeader("Content-Type", "text/plain")
                                        .withBody("hello")
                                        .withStatus(404)));
-               AAIResourcesClient client= createClient();
+               AAIResourcesClient client= aaiClient;
                thrown.expect(NotFoundException.class);
                thrown.expectMessage(containsString(path.build() + " not found in A&AI"));
                AAIResultWrapper result = client.get(path, NotFoundException.class);
@@ -188,7 +208,7 @@ public class AAIResourcesClientTest {
        
        @Test
        public void buildRelationshipTest() {
-               AAIResourcesClient client = createClient();
+               AAIResourcesClient client = aaiClient;
                AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, "test");
                Relationship relationship = new Relationship();
                relationship.setRelatedLink(uri.build().toString());
@@ -200,10 +220,5 @@ public class AAIResourcesClientTest {
                assertThat("expect equal has label", actual, sameBeanAs(relationship));
                
        }
-       
-       private AAIResourcesClient createClient() {
-               AAIResourcesClient client = spy(new AAIResourcesClient());
-               doReturn(new DefaultAAIPropertiesImpl()).when(client).getRestProperties();
-               return client;
-       }
+
 }
index 3d23213..5493d67 100644 (file)
@@ -40,6 +40,10 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.aai.entities.uri.ServiceInstanceUri;
@@ -47,6 +51,7 @@ import org.onap.so.client.defaultproperties.DefaultAAIPropertiesImpl;
 
 import com.github.tomakehurst.wiremock.junit.WireMockRule;
 
+@RunWith(MockitoJUnitRunner.class)
 public class AAIResourcesClientWithServiceInstanceUriTest {
 
        @Rule
@@ -55,9 +60,17 @@ public class AAIResourcesClientWithServiceInstanceUriTest {
        @Rule
        public ExpectedException thrown = ExpectedException.none();
        
+       @Spy
+       public AAIClient client;
+       
+       @InjectMocks
+       public AAIResourcesClient aaiClient = new AAIResourcesClient();
+       
        private ServiceInstanceUri uri;
        @Before
        public void setUp() {
+               
+               doReturn(new DefaultAAIPropertiesImpl()).when(client).getRestProperties();
                wireMockRule.stubFor(get(urlMatching("/aai/v[0-9]+/nodes.*")) 
                                .willReturn(aResponse() 
                                        .withStatus(404) 
@@ -65,12 +78,12 @@ public class AAIResourcesClientWithServiceInstanceUriTest {
                                        .withHeader("Mock", "true")));
                
                uri = spy((ServiceInstanceUri)AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, "id"));
-               doReturn(createClient()).when(uri).getResourcesClient();
+               doReturn(aaiClient).when(uri).getResourcesClient();
        }
        
        @Test
        public void getWithClass() {
-               AAIResourcesClient client = createClient();
+               AAIResourcesClient client = aaiClient;
                Optional<String> result = client.get(String.class, uri);
                
                assertThat(result.isPresent(), equalTo(false));
@@ -78,42 +91,38 @@ public class AAIResourcesClientWithServiceInstanceUriTest {
        
        @Test
        public void getFullResponse() {
-               AAIResourcesClient client = createClient();
+               AAIResourcesClient client = aaiClient;
                Response result = client.getFullResponse(uri);
                assertThat(result.getStatus(), equalTo(Status.NOT_FOUND.getStatusCode()));
        }
        
        @Test
        public void getWithGenericType() {
-               AAIResourcesClient client = createClient();
+               AAIResourcesClient client = aaiClient;
                Optional<List<String>> result = client.get(new GenericType<List<String>>() {}, uri);
                assertThat(result.isPresent(), equalTo(false));
        }
        
        @Test
        public void getAAIWrapper() {
-               AAIResourcesClient client = createClient();
+               AAIResourcesClient client = aaiClient;
                AAIResultWrapper result = client.get(uri);
                assertThat(result.isEmpty(), equalTo(true));
        }
        
        @Test
        public void getWithException() {
-               AAIResourcesClient client = createClient();
+               AAIResourcesClient client = aaiClient;
                this.thrown.expect(IllegalArgumentException.class);
                AAIResultWrapper result = client.get(uri, IllegalArgumentException.class);
        }
        
        @Test
        public void existsTest() {
-               AAIResourcesClient client = createClient();
+               AAIResourcesClient client = aaiClient;
                doReturn(uri).when(uri).clone();
                boolean result = client.exists(uri);
                assertThat(result, equalTo(false));
        }
-       private AAIResourcesClient createClient() {
-               AAIResourcesClient client = spy(new AAIResourcesClient());
-               doReturn(new DefaultAAIPropertiesImpl()).when(client).getRestProperties();
-               return client;
-       }
+
 }
index 2763712..d875f38 100644 (file)
@@ -38,6 +38,10 @@ import java.util.Optional;
 import org.json.JSONException;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.aai.domain.yang.Pserver;
 import org.onap.aai.domain.yang.v9.Complex;
 import org.onap.so.client.aai.entities.singletransaction.SingleTransactionRequest;
@@ -53,6 +57,7 @@ import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 
+@RunWith(MockitoJUnitRunner.class)
 public class AAISingleTransactionClientTest {
 
        private final static String AAI_JSON_FILE_LOCATION = "src/test/resources/__files/aai/singletransaction/";
@@ -61,6 +66,10 @@ public class AAISingleTransactionClientTest {
        
        ObjectMapper mapper;
        
+       public AAIClient client = new AAIClient();
+       
+       public AAIResourcesClient aaiClient = new AAIResourcesClient();
+       
        @Before
        public void before() throws JsonParseException, JsonMappingException, IOException {
                mapper = new AAICommonObjectMapperProvider().getMapper();
@@ -69,7 +78,6 @@ public class AAISingleTransactionClientTest {
        
        @Test
        public void testRequest() throws JSONException,IOException {
-               AAIResourcesClient client = createClient();
                Pserver pserver = new Pserver();
                pserver.setHostname("pserver-hostname");
                pserver.setFqdn("pserver-bulk-process-single-transactions-multiple-actions-1-fqdn");
@@ -78,7 +86,7 @@ public class AAISingleTransactionClientTest {
                Complex complex = new Complex();
                complex.setCity("my-city");
                AAISingleTransactionClient singleTransaction = 
-               client.beginSingleTransaction()
+               aaiClient.beginSingleTransaction()
                        .create(uriA, pserver)
                        .update(uriA, pserver2)
                        .create(uriB, complex);
@@ -93,8 +101,7 @@ public class AAISingleTransactionClientTest {
        
        @Test
        public void testFailure() throws IOException {
-               AAIResourcesClient client = createClient();
-               AAISingleTransactionClient singleTransaction = client.beginSingleTransaction();
+               AAISingleTransactionClient singleTransaction = aaiClient.beginSingleTransaction();
                SingleTransactionResponse expected = mapper.readValue(this.getJson("sample-response-failure.json"), SingleTransactionResponse.class);
                Optional<String> errorMessage = singleTransaction.locateErrorMessages(expected);
                
@@ -105,8 +112,7 @@ public class AAISingleTransactionClientTest {
        
        @Test
        public void testSuccessResponse() throws IOException {
-               AAIResourcesClient client = createClient();
-               AAISingleTransactionClient singleTransaction = client.beginSingleTransaction();
+               AAISingleTransactionClient singleTransaction = aaiClient.beginSingleTransaction();
                SingleTransactionResponse expected = mapper.readValue(this.getJson("sample-response.json"), SingleTransactionResponse.class);
                Optional<String> errorMessage = singleTransaction.locateErrorMessages(expected);
                
@@ -117,7 +123,7 @@ public class AAISingleTransactionClientTest {
        
        @Test
        public void confirmPatchFormat() {
-               AAISingleTransactionClient singleTransaction = spy(new AAISingleTransactionClient(AAIVersion.LATEST));
+               AAISingleTransactionClient singleTransaction = spy(new AAISingleTransactionClient(aaiClient, client));
                GraphInventoryPatchConverter mock = mock(GraphInventoryPatchConverter.class);
                doReturn(mock).when(singleTransaction).getPatchConverter();
                singleTransaction.update(uriA, "{}");
@@ -127,9 +133,4 @@ public class AAISingleTransactionClientTest {
                 return new String(Files.readAllBytes(Paths.get(AAI_JSON_FILE_LOCATION + filename)));
        }
        
-       private AAIResourcesClient createClient() {
-               AAIResourcesClient client = spy(new AAIResourcesClient());
-               doReturn(new DefaultAAIPropertiesImpl()).when(client).getRestProperties();
-               return client;
-       }
 }
index 342e3b1..3e2801c 100644 (file)
@@ -38,7 +38,10 @@ import java.util.Optional;
 
 import org.junit.Before;
 import org.junit.Test;
-
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.aai.domain.yang.Relationship;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
@@ -51,6 +54,7 @@ import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 
+@RunWith(MockitoJUnitRunner.class)
 public class AAITransactionalClientTest {
 
        private final static String AAI_JSON_FILE_LOCATION = "src/test/resources/__files/aai/bulkprocess/";
@@ -63,6 +67,10 @@ public class AAITransactionalClientTest {
        
        ObjectMapper mapper;
        
+       public AAIClient client = new AAIClient();
+       
+       public AAIResourcesClient aaiClient = new AAIResourcesClient();
+       
        @Before
        public void before() throws JsonParseException, JsonMappingException, IOException {
                mapper = new AAICommonObjectMapperProvider().getMapper();
@@ -74,7 +82,7 @@ public class AAITransactionalClientTest {
                final Relationship body = new Relationship();
                body.setRelatedLink(uriB.build().toString());
                
-               AAITransactionalClient transactions = createClient().beginTransaction()
+               AAITransactionalClient transactions = aaiClient.beginTransaction()
                                .create(uriA.clone().relationshipAPI(), body);
                
                String serializedTransactions = mapper.writeValueAsString(transactions.getTransactions());
@@ -90,7 +98,7 @@ public class AAITransactionalClientTest {
                uris.add(uriB);
                
                AAIResourceUri uriAClone = uriA.clone();
-               AAITransactionalClient transactions = createClient()
+               AAITransactionalClient transactions = aaiClient
                                .beginTransaction().connect(uriA, uris).connect(uriC, uriD)
                                .beginNewTransaction().connect(uriE, uriF);
                
@@ -107,7 +115,7 @@ public class AAITransactionalClientTest {
                List<AAIResourceUri> uris = new ArrayList<AAIResourceUri>();
                uris.add(uriB);
                
-               AAITransactionalClient transactions = createClient().beginTransaction()
+               AAITransactionalClient transactions = aaiClient.beginTransaction()
                                .disconnect(uriA, uris);
                
                String serializedTransactions = mapper.writeValueAsString(transactions.getTransactions());
@@ -123,7 +131,7 @@ public class AAITransactionalClientTest {
                body.setRelatedLink(uriB.build().toString());
                
                AAIResourceUri uriAClone = uriA.clone().relationshipAPI();
-               AAITransactionalClient transactions = createClient().beginTransaction().update(uriAClone, body);
+               AAITransactionalClient transactions = aaiClient.beginTransaction().update(uriAClone, body);
                
                String serializedTransactions = mapper.writeValueAsString(transactions.getTransactions());
                Map<String, Object> actual = mapper.readValue(serializedTransactions, new TypeReference<Map<String, Object>>(){});
@@ -134,7 +142,7 @@ public class AAITransactionalClientTest {
        
        @Test
        public void verifyResponse() throws IOException {
-               AAITransactionalClient transactions = createClient()
+               AAITransactionalClient transactions = aaiClient
                                .beginTransaction();
        
                assertEquals("success status", Optional.empty(), transactions.locateErrorMessages(getJson("response-success.json")));
@@ -143,10 +151,10 @@ public class AAITransactionalClientTest {
        
        @Test
        public void confirmPatchFormat() {
-               AAITransactionalClient client = spy(new AAITransactionalClient(AAIVersion.LATEST));
+               AAITransactionalClient transactionClient = spy(new AAITransactionalClient(aaiClient, client));
                GraphInventoryPatchConverter mock = mock(GraphInventoryPatchConverter.class);
-               doReturn(mock).when(client).getPatchConverter();
-               client.update(uriA, "{}");
+               doReturn(mock).when(transactionClient).getPatchConverter();
+               transactionClient.update(uriA, "{}");
                verify(mock, times(1)).convertPatchFormat(any());
        }
        
@@ -154,9 +162,4 @@ public class AAITransactionalClientTest {
                 return new String(Files.readAllBytes(Paths.get(AAI_JSON_FILE_LOCATION + filename)));
        }
        
-       private AAIResourcesClient createClient() {
-               AAIResourcesClient client = spy(new AAIResourcesClient());
-               doReturn(new DefaultAAIPropertiesImpl()).when(client).getRestProperties();
-               return client;
-       }
 }
index e66f43f..69d46de 100644 (file)
@@ -23,9 +23,9 @@ package org.onap.so.client.aai;
 import static org.junit.Assert.assertEquals;
 
 import org.junit.Test;
-import org.onap.so.client.aai.entities.DSLNode;
-import org.onap.so.client.aai.entities.DSLQueryBuilder;
-import org.onap.so.client.aai.entities.__;
+import org.onap.so.client.graphinventory.entities.DSLNode;
+import org.onap.so.client.graphinventory.entities.DSLQueryBuilder;
+import org.onap.so.client.graphinventory.entities.__;
 
 public class DSLQueryBuilderTest {
 
index 6059e7b..15c1c24 100644 (file)
@@ -26,7 +26,6 @@ import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
 import static com.github.tomakehurst.wiremock.client.WireMock.urlPathMatching;
 import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
 import static org.junit.Assert.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
@@ -45,10 +44,16 @@ import java.util.Optional;
 import javax.ws.rs.NotFoundException;
 import javax.ws.rs.core.UriBuilder;
 
+import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
 import org.mockito.ArgumentMatchers;
+import org.mockito.InjectMocks;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.so.client.aai.AAIClient;
 import org.onap.so.client.aai.AAIResourcesClient;
 import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.defaultproperties.DefaultAAIPropertiesImpl;
@@ -58,6 +63,7 @@ import org.onap.so.client.graphinventory.exceptions.GraphInventoryUriNotFoundExc
 
 import com.github.tomakehurst.wiremock.junit.WireMockRule;
 
+@RunWith(MockitoJUnitRunner.class)
 public class ServiceInstanceUriTest {
 
        private final static String AAI_JSON_FILE_LOCATION = "src/test/resources/__files/aai/resources/";
@@ -68,6 +74,16 @@ public class ServiceInstanceUriTest {
        @Rule
        public final ExpectedException exception = ExpectedException.none();
         
+       @Spy
+       public AAIClient client;
+       
+       @InjectMocks
+       public AAIResourcesClient aaiClient = new AAIResourcesClient();
+       
+       @Before
+       public void beforeTest() {
+               doReturn(new DefaultAAIPropertiesImpl()).when(client).getRestProperties();
+       }
        @Test
        public void found() throws IOException {
                final String content = new String(Files.readAllBytes(Paths.get(AAI_JSON_FILE_LOCATION + "service-instance-pathed-query.json")));
@@ -179,7 +195,7 @@ public class ServiceInstanceUriTest {
        public void noVertexFound() throws GraphInventoryUriNotFoundException, GraphInventoryPayloadException {
                ServiceInstanceUri instance = new ServiceInstanceUri("key3");
                ServiceInstanceUri spy = spy(instance);
-               AAIResourcesClient client = createClient();
+               AAIResourcesClient client = aaiClient;
                doReturn(client).when(spy).getResourcesClient();
                stubFor(get(urlPathMatching("/aai/v[0-9]+/nodes/service-instances/service-instance/key3")) 
                                .willReturn(aResponse() 
@@ -189,10 +205,4 @@ public class ServiceInstanceUriTest {
                exception.expect(NotFoundException.class);
                spy.build();    
        }
-       
-       private AAIResourcesClient createClient() {
-               AAIResourcesClient client = spy(new AAIResourcesClient());
-               doReturn(new DefaultAAIPropertiesImpl()).when(client).getRestProperties();
-               return client;
-       }
 }