add new functionality to aai client 98/78398/1
authorBenjamin, Max (mb388a) <mb388a@us.att.com>
Wed, 13 Feb 2019 15:06:03 +0000 (10:06 -0500)
committerBenjamin, Max (mb388a) <mb388a@us.att.com>
Wed, 13 Feb 2019 15:17:02 +0000 (10:17 -0500)
Remove only the first occurrence of parentUri from uriTemplate.
add createIfNotExists to transaction clients
moved classes to generic GraphInventory location
removed unused interfaces from graphinventory client
refactored all graph inventory clients

Change-Id: I2b946674ff92c44d33fff2f327e96655ed5c0195
Issue-ID: SO-1501
Signed-off-by: Benjamin, Max (mb388a) <mb388a@us.att.com>
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;
-       }
 }