Merge "Add Pagination and sorting"
authorSteve Smokowski <ss835w@att.com>
Tue, 12 Feb 2019 13:00:16 +0000 (13:00 +0000)
committerGerrit Code Review <gerrit@onap.org>
Tue, 12 Feb 2019 13:00:16 +0000 (13:00 +0000)
29 files changed:
asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/ExecuteBuildingBlockRainyDay.java
bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/CreateAAIVfModuleTest.groovy
bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/DeleteAAIVfModuleTest.groovy
bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/UpdateAAIVfModuleTest.groovy
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/ExecuteBuildlingBlockRainyDayTest.java
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ExecuteBuildingBlock.bpmn
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterRestV1.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterRestV1Test.java
common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperPatchProvider.java
common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperProvider.java
common/src/main/java/org/onap/so/client/aai/AAIResourcesClient.java
common/src/main/java/org/onap/so/client/aai/AAIRestClient.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/AAIResultWrapper.java
common/src/main/java/org/onap/so/client/graphinventory/EmptyStringToNullSerializer.java [moved from common/src/main/java/org/onap/so/client/aai/EmptyStringToNullSerializer.java with 97% similarity]
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperPatchProvider.java [new file with mode: 0644]
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperProvider.java [new file with mode: 0644]
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryPatchConverter.java [moved from common/src/main/java/org/onap/so/client/aai/AAIPatchConverter.java with 89% similarity]
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryResourcesClient.java [new file with mode: 0644]
common/src/main/java/org/onap/so/client/graphinventory/GraphInventorySingleTransactionClient.java [new file with mode: 0644]
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionalClient.java [new file with mode: 0644]
common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryResultWrapper.java [new file with mode: 0644]
common/src/test/java/org/onap/so/client/aai/AAIRestClientTest.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/adapter/rest/AdapterRestClientTest.java [new file with mode: 0644]
common/src/test/java/org/onap/so/client/graphinventory/GraphInventoryPatchConverterTest.java [moved from common/src/test/java/org/onap/so/client/aai/AAIPatchConverterTest.java with 88% similarity]

index 2f4d5ea..90b705c 100644 (file)
@@ -554,8 +554,14 @@ public class ToscaResourceInstaller {
                                                for (RequirementAssignment requirement :  requirementsList) {
                                                        if (requirement.getNodeTemplateName().equals(spNode.getName())) {
                                                                ConfigurationResourceCustomization configurationResource = createConfiguration(configNode, toscaResourceStruct, serviceProxy);
-                                                                                                                               
-                                                               configurationResourceList.add(configurationResource);
+                                                               
+                                                               Optional<ConfigurationResourceCustomization> matchingObject = configurationResourceList.stream()
+                                                                           .filter(configurationResourceCustomization -> configNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID).equals(configurationResource.getModelCustomizationUUID()))
+                                                                           .findFirst();
+                                                               if(!matchingObject.isPresent()){                                                                                                                                        
+                                                                       configurationResourceList.add(configurationResource);
+                                                               }
+                                                               
                                                                break;
                                                        }
                                                }
index b210b5e..ee7999f 100644 (file)
@@ -55,6 +55,7 @@ public class ExecuteBuildingBlockRainyDay {
        private Environment environment;
        protected String retryDurationPath = "mso.rainyDay.retryDurationMultiplier";
        protected String defaultCode = "mso.rainyDay.defaultCode";
+       protected String maxRetries = "mso.rainyDay.maxRetries";
 
        public void setRetryTimer(DelegateExecution execution) {
                try {
@@ -172,10 +173,17 @@ public class ExecuteBuildingBlockRainyDay {
                        msoLogger.debug("RainyDayHandler Status Code is: " + handlingCode);
                        execution.setVariable(HANDLING_CODE, handlingCode);
                } catch (Exception e) {
-                       msoLogger.error("Failed to determine RainyDayHandler Status. Seting handlingCode = Abort", e);
                        String code = this.environment.getProperty(defaultCode);
+                       msoLogger.error("Failed to determine RainyDayHandler Status. Seting handlingCode = "+ code, e);
                        execution.setVariable(HANDLING_CODE, code);
                }
+               try{
+                       int envMaxRetries = Integer.parseInt(this.environment.getProperty(maxRetries));
+                       execution.setVariable("maxRetries", envMaxRetries);
+               } catch (Exception ex) {
+                       msoLogger.error("Could not read maxRetries from config file. Setting max to 5 retries");
+                       execution.setVariable("maxRetries", 5);
+               }
        }
 
        public void setHandlingStatusSuccess(DelegateExecution execution) {
index 55f68f6..dac038f 100644 (file)
@@ -97,7 +97,7 @@ class CreateAAIVfModuleTest extends MsoGroovyTest{
     @Test
     void testCreateGenericVnf(){
         when(mockExecution.getVariable("CAAIVfMod_vnfName")).thenReturn("vnfName")
-        Mockito.doNothing().when(client).create(any(AAIResourceUri.class),anyObject())
+        Mockito.doNothing().when(client).create(any(AAIResourceUri.class) as AAIResourceUri,anyObject())
         createAAIVfModule.createGenericVnf(mockExecution)
         Mockito.verify(mockExecution).setVariable("CAAIVfMod_createGenericVnfResponseCode", 201)
         Mockito.verify(mockExecution).setVariable("CAAIVfMod_createGenericVnfResponse","Vnf Created")
@@ -112,7 +112,7 @@ class CreateAAIVfModuleTest extends MsoGroovyTest{
 
         when(mockExecution.getVariable("CAAIVfMod_personaId")).thenReturn("model1")
         when(mockExecution.getVariable("CAAIVfMod_moduleName")).thenReturn("vfModuleName")
-        Mockito.doNothing().when(client).create(any(AAIResourceUri.class),anyObject())
+        Mockito.doNothing().when(client).create(any(AAIResourceUri.class) as AAIResourceUri,anyObject())
         createAAIVfModule.createVfModule(mockExecution,false)
         Mockito.verify(mockExecution).setVariable("CAAIVfMod_createVfModuleResponseCode", 201)
         Mockito.verify(mockExecution).setVariable("CAAIVfMod_createVfModuleResponse","Vf Module Created")
@@ -173,7 +173,7 @@ class CreateAAIVfModuleTest extends MsoGroovyTest{
         Optional<GenericVnf> genericVnf = getAAIObjectFromJson(GenericVnf.class,"__files/aai/GenericVnfVfModule.json");
         when(mockExecution.getVariable("CAAIVfMod_queryGenericVnfResponse")).thenReturn(genericVnf.get())
         when(mockExecution.getVariable("CAAIVfMod_moduleName")).thenReturn("vfModuleName")
-        Mockito.doNothing().when(client).create(any(AAIResourceUri.class),anyObject())
+        Mockito.doNothing().when(client).create(any(AAIResourceUri.class) as AAIResourceUri,anyObject())
         createAAIVfModule.createVfModule(mockExecution,true)
         Mockito.verify(mockExecution).setVariable("CAAIVfMod_createVfModuleResponseCode", 201)
         Mockito.verify(mockExecution).setVariable("CAAIVfMod_createVfModuleResponse","Vf Module Created")
index 4b6f8aa..2a87251 100644 (file)
@@ -92,7 +92,7 @@ class DeleteAAIVfModuleTest extends  MsoGroovyTest{
     void testDeleteGenericVnf() {
         ExecutionEntity mockExecution = setupMock()
         when(mockExecution.getVariable("DAAIVfMod_vnfId")).thenReturn("vnfId1")
-        doNothing().when(client).delete(isA(AAIResourceUri.class))
+        doNothing().when(client).delete(isA(AAIResourceUri.class) as AAIResourceUri)
         deleteAAIVfModule.deleteGenericVnf(mockExecution)
         Mockito.verify(mockExecution).setVariable(prefix + "deleteGenericVnfResponseCode", 200)
     }
@@ -169,7 +169,7 @@ class DeleteAAIVfModuleTest extends  MsoGroovyTest{
         ExecutionEntity mockExecution = setupMock()
         when(mockExecution.getVariable("DAAIVfMod_vnfId")).thenReturn("vnfId1")
         try {
-            doThrow(new NotFoundException("Vnf Not Found")).when(client).delete(isA(AAIResourceUri.class))
+            doThrow(new NotFoundException("Vnf Not Found")).when(client).delete(isA(AAIResourceUri.class) as AAIResourceUri)
             deleteAAIVfModule.deleteGenericVnf(mockExecution)
         } catch (Exception ex) {
             println " Test End - Handle catch-throw BpmnError()! "
@@ -186,7 +186,7 @@ class DeleteAAIVfModuleTest extends  MsoGroovyTest{
         ExecutionEntity mockExecution = setupMock()
         when(mockExecution.getVariable("DAAIVfMod_vnfId")).thenReturn("vnfId1")
         when(mockExecution.getVariable("DAAIVfMod_vfModuleId")).thenReturn("vfModuleId1")
-        doNothing().when(client).delete(isA(AAIResourceUri.class))
+        doNothing().when(client).delete(isA(AAIResourceUri.class) as AAIResourceUri)
         deleteAAIVfModule.deleteVfModule(mockExecution)
         Mockito.verify(mockExecution).setVariable(prefix + "deleteVfModuleResponseCode", 200)
     }
@@ -197,7 +197,7 @@ class DeleteAAIVfModuleTest extends  MsoGroovyTest{
         when(mockExecution.getVariable("DAAIVfMod_vnfId")).thenReturn("vnfId1")
         when(mockExecution.getVariable("DAAIVfMod_vfModuleId")).thenReturn("vfModuleId1")
         try {
-            doThrow(new NotFoundException("Vnf Not Found")).when(client).delete(isA(AAIResourceUri.class))
+            doThrow(new NotFoundException("Vnf Not Found")).when(client).delete(isA(AAIResourceUri.class) as AAIResourceUri)
             deleteAAIVfModule.deleteVfModule(mockExecution)
         } catch (Exception ex) {
             println " Test End - Handle catch-throw BpmnError()! "
index 2d2f58b..72bcfcf 100644 (file)
@@ -111,7 +111,7 @@ class UpdateAAIVfModuleTest  extends MsoGroovyTest {
         vfModule.setVfModuleId("supercool")
         vfModule.setResourceVersion("12345")
         when(mockExecution.getVariable(prefix + "getVfModuleResponse")).thenReturn(vfModule)
-        doNothing().when(client).update(isA(AAIResourceUri.class), anyObject())
+        doNothing().when(client).update(isA(AAIResourceUri.class) as AAIResourceUri, anyObject())
         updateAAIVfModule.updateVfModule(mockExecution)
                verify(mockExecution).setVariable("UAAIVfMod_updateVfModuleResponseCode", 200)
     }
@@ -126,7 +126,7 @@ class UpdateAAIVfModuleTest  extends MsoGroovyTest {
         vfModule.setVfModuleId("supercool")
         vfModule.setResourceVersion("12345")
         when(mockExecution.getVariable(prefix + "getVfModuleResponse")).thenReturn(vfModule)
-        doThrow(new NotFoundException("Vf Module not found")).when(client).update(isA(AAIResourceUri.class), anyObject())
+        doThrow(new NotFoundException("Vf Module not found")).when(client).update(isA(AAIResourceUri.class) as AAIResourceUri, anyObject())
         thrown.expect(BpmnError.class)
         updateAAIVfModule.updateVfModule(mockExecution)
                verify(mockExecution).setVariable("UAAIVfMod_updateVfModuleResponseCode", 404)
@@ -143,7 +143,7 @@ class UpdateAAIVfModuleTest  extends MsoGroovyTest {
         vfModule.setVfModuleId("supercool")
         vfModule.setResourceVersion("12345")
         when(mockExecution.getVariable(prefix + "getVfModuleResponse")).thenReturn(vfModule)
-        doThrow(new IllegalStateException("Error in AAI client")).when(client).update(isA(AAIResourceUri.class), anyObject())
+        doThrow(new IllegalStateException("Error in AAI client")).when(client).update(isA(AAIResourceUri.class) as AAIResourceUri, anyObject())
         thrown.expect(BpmnError.class)
         updateAAIVfModule.updateVfModule(mockExecution)
                verify(mockExecution).setVariable("UAAIVfMod_updateVfModuleResponseCode", 500)
index 868aabf..6344a3f 100644 (file)
@@ -131,6 +131,7 @@ public class ExecuteBuildlingBlockRainyDayTest extends BaseTest {
                executeBuildingBlockRainyDay.queryRainyDayTable(delegateExecution,true);
                
                assertEquals("Rollback", delegateExecution.getVariable("handlingCode"));
+               assertEquals(5,delegateExecution.getVariable("maxRetries"));
        }
        
        @Test
index 943ce12..5189f8b 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.7.1">
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.8.2">
   <bpmn:process id="ExecuteBuildingBlock" name="ExecuteBuildingBlock" isExecutable="true">
     <bpmn:startEvent id="Start_ExecuteBuildingBlock" name="start">
       <bpmn:outgoing>SequenceFlow_0rq4c5r</bpmn:outgoing>
@@ -73,7 +73,7 @@
       <bpmn:sequenceFlow id="SequenceFlow_0ndt8ft" sourceRef="Task_SetRetryTimer" targetRef="IntermediateCatchEvent_RetryTimer" />
       <bpmn:sequenceFlow id="SequenceFlow_07a1ytc" sourceRef="IntermediateCatchEvent_RetryTimer" targetRef="EndEvent_1sez2lh" />
       <bpmn:sequenceFlow id="SequenceFlow_1wbevp0" name="yes" sourceRef="ExclusiveGateway_0ey4zpt" targetRef="Task_SetRetryTimer">
-        <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("retryCount")<5}]]></bpmn:conditionExpression>
+        <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("retryCount")<execution.getVariable("maxRetries")}]]></bpmn:conditionExpression>
       </bpmn:sequenceFlow>
       <bpmn:endEvent id="EndEvent_0mvmk3i">
         <bpmn:incoming>SequenceFlow_0h8v45y</bpmn:incoming>
index 18230c4..fec7e84 100644 (file)
@@ -35,6 +35,9 @@ import org.onap.so.adapters.nwrest.CreateNetworkResponse;
 import org.onap.so.adapters.nwrest.DeleteNetworkError;
 import org.onap.so.adapters.nwrest.DeleteNetworkRequest;
 import org.onap.so.adapters.nwrest.DeleteNetworkResponse;
+import org.onap.so.adapters.nwrest.UpdateNetworkError;
+import org.onap.so.adapters.nwrest.UpdateNetworkRequest;
+import org.onap.so.adapters.nwrest.UpdateNetworkResponse;
 import org.onap.so.client.exception.ExceptionBuilder;
 import org.onap.so.client.orchestration.NetworkAdapterResources;
 import org.slf4j.Logger;
@@ -115,6 +118,14 @@ public class NetworkAdapterRestV1 {
                                                DeleteNetworkResponse deleteNetworkResponse = (DeleteNetworkResponse) unmarshalXml(callback, DeleteNetworkResponse.class);
                                                execution.setVariable("deleteNetworkResponse", deleteNetworkResponse);
                                        }
+                               } else if (networkAdapterRequest instanceof UpdateNetworkRequest) {
+                                       if (callback.contains("updateNetworkError")) {
+                                               UpdateNetworkError updateNetworkError = (UpdateNetworkError) unmarshalXml(callback, UpdateNetworkError.class);
+                                               throw new Exception(updateNetworkError.getMessage());
+                                       } else {
+                                               UpdateNetworkResponse updateNetworkResponse = (UpdateNetworkResponse) unmarshalXml(callback, UpdateNetworkResponse.class);
+                                               execution.setVariable("updateNetworkResponse", updateNetworkResponse);
+                                       }
                                }
                        }
                } catch (Exception e) {
index 278afc7..516c948 100644 (file)
 
 package org.onap.so.bpmn.infrastructure.adapter.network.tasks;
 
+import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
+import static org.junit.Assert.assertThat;
+
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.xml.bind.JAXBException;
 
 import org.junit.Test;
 import org.onap.so.adapters.nwrest.CreateNetworkResponse;
+import org.onap.so.adapters.nwrest.UpdateNetworkResponse;
 
 public class NetworkAdapterRestV1Test {
 
@@ -36,4 +42,17 @@ public class NetworkAdapterRestV1Test {
                String returnedXml = response.toXmlString();
                System.out.println(returnedXml);
        }
+
+       @Test
+       public void testUnmarshalXmlUpdate() throws IOException, JAXBException {
+               UpdateNetworkResponse expectedResponse = new UpdateNetworkResponse();
+               expectedResponse.setMessageId("ec100bcc-2659-4aa4-b4d8-3255715c2a51");
+               expectedResponse.setNetworkId("80de31e3-cc78-4111-a9d3-5b92bf0a39eb");
+               Map<String,String>subnetMap = new HashMap<String,String>();
+               subnetMap.put("95cd8437-25f1-4238-8720-cbfe7fa81476", "d8d16606-5d01-4822-b160-9a0d257303e0");
+               expectedResponse.setSubnetMap(subnetMap);
+               String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><updateNetworkResponse><messageId>ec100bcc-2659-4aa4-b4d8-3255715c2a51</messageId><networkId>80de31e3-cc78-4111-a9d3-5b92bf0a39eb</networkId><subnetMap><entry><key>95cd8437-25f1-4238-8720-cbfe7fa81476</key><value>d8d16606-5d01-4822-b160-9a0d257303e0</value></entry></subnetMap></updateNetworkResponse>";
+               UpdateNetworkResponse response = (UpdateNetworkResponse) new NetworkAdapterRestV1().unmarshalXml(xml, UpdateNetworkResponse.class);
+               assertThat(expectedResponse, sameBeanAs(response));
+       }
 }
index 33c9769..9c8345d 100644 (file)
 
 package org.onap.so.client.aai;
 
-import com.fasterxml.jackson.databind.module.SimpleModule;
+import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperPatchProvider;
 
-public class AAICommonObjectMapperPatchProvider extends AAICommonObjectMapperProvider {
+public class AAICommonObjectMapperPatchProvider extends GraphInventoryCommonObjectMapperPatchProvider {
 
        
        public AAICommonObjectMapperPatchProvider() {
                super();
-               EmptyStringToNullSerializer sp = new EmptyStringToNullSerializer(); 
-               SimpleModule emptyStringModule = new SimpleModule();
-               emptyStringModule.addSerializer(String.class, sp);
-               mapper.registerModule(emptyStringModule);
        }
 }
index 0e20718..15bc2ea 100644 (file)
 
 package org.onap.so.client.aai;
 
-import org.onap.so.client.policy.CommonObjectMapperProvider;
+import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvider;
 
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import com.fasterxml.jackson.databind.AnnotationIntrospector;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.MapperFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
-import com.fasterxml.jackson.databind.type.TypeFactory;
-import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
-
-public class AAICommonObjectMapperProvider extends CommonObjectMapperProvider {
+public class AAICommonObjectMapperProvider extends GraphInventoryCommonObjectMapperProvider {
 
        public AAICommonObjectMapperProvider() {
-               mapper = new ObjectMapper();
-               mapper.setSerializationInclusion(Include.NON_NULL);
-               mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
-               mapper.enable(MapperFeature.USE_ANNOTATIONS);
-               mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
-               mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, false);
-               mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-               AnnotationIntrospector aiJaxb = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance());
-        AnnotationIntrospector aiJackson = new JacksonAnnotationIntrospector();
-        // first Jaxb, second Jackson annotations
-        mapper.setAnnotationIntrospector(AnnotationIntrospector.pair(aiJaxb, aiJackson));
+               super();
        }
 
 }
index 87951d5..288ac9b 100644 (file)
@@ -36,9 +36,10 @@ import org.onap.so.client.aai.entities.AAIEdgeLabel;
 import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUri;
+import org.onap.so.client.graphinventory.GraphInventoryResourcesClient;
 import org.onap.so.client.graphinventory.entities.uri.Depth;
 
-public class AAIResourcesClient extends AAIClient {
+public class AAIResourcesClient extends AAIClient implements GraphInventoryResourcesClient<AAIResourcesClient, AAIResourceUri, AAIEdgeLabel, AAIResultWrapper, AAITransactionalClient, AAISingleTransactionClient> {
                        
        public AAIResourcesClient() {
                super();
@@ -49,37 +50,30 @@ public class AAIResourcesClient extends AAIClient {
                this.version = version;
        }
        
-       /**
-        * creates a new object in A&AI
-        * 
-        * @param obj - can be any object which will marshal into a valid A&AI payload
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#create(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.lang.Object)
         */
+       @Override
        public void create(AAIResourceUri uri, Object obj) {
                RestClient aaiRC = this.createClient(uri);
                aaiRC.put(obj);
                return;
        }
        
-       /**
-        * creates a new object in A&AI with no payload body
-        * 
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#createEmpty(org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public void createEmpty(AAIResourceUri uri) {
                RestClient aaiRC = this.createClient(uri);
                aaiRC.put("");
                return;
        }
        
-       /**
-        * returns false if the object does not exist in A&AI
-        * 
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#exists(org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public boolean exists(AAIResourceUri uri) {
                AAIUri forceMinimal = this.addParams(Optional.of(Depth.ZERO), true, uri);
                try {
@@ -91,12 +85,10 @@ public class AAIResourcesClient extends AAIClient {
                }
        }
        
-       /**
-        * Adds a relationship between two objects in A&AI 
-        * @param uriA
-        * @param uriB
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public void connect(AAIResourceUri uriA, AAIResourceUri uriB) {
                AAIResourceUri uriAClone = uriA.clone();
                RestClient aaiRC = this.createClient(uriAClone.relationshipAPI());
@@ -104,14 +96,10 @@ public class AAIResourcesClient extends AAIClient {
                return;
        }
        
-       /**
-        * Adds a relationship between two objects in A&AI 
-        * with a given edge label
-        * @param uriA
-        * @param uriB
-        * @param edge label
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.AAIEdgeLabel)
         */
+       @Override
        public void connect(AAIResourceUri uriA, AAIResourceUri uriB, AAIEdgeLabel label) {
                AAIResourceUri uriAClone = uriA.clone();
                RestClient aaiRC = this.createClient(uriAClone.relationshipAPI());
@@ -119,13 +107,10 @@ public class AAIResourcesClient extends AAIClient {
                return;
        }
        
-       /**
-        * Removes relationship from two objects in A&AI
-        * 
-        * @param uriA
-        * @param uriB
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#disconnect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public void disconnect(AAIResourceUri uriA, AAIResourceUri uriB) {
                AAIResourceUri uriAClone = uriA.clone();
                RestClient aaiRC = this.createClient(uriAClone.relationshipAPI());
@@ -133,12 +118,10 @@ public class AAIResourcesClient extends AAIClient {
                return;
        }
        
-       /**
-        * Deletes object from A&AI. Automatically handles resource-version.
-        * 
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#delete(org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public void delete(AAIResourceUri uri) {
                AAIResourceUri clone = uri.clone();
                RestClient aaiRC = this.createClient(clone);
@@ -150,23 +133,20 @@ public class AAIResourcesClient extends AAIClient {
                return;
        }
        
-       /**
-        * @param obj - can be any object which will marshal into a valid A&AI payload
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#update(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.lang.Object)
         */
+       @Override
        public void update(AAIResourceUri uri, Object obj) {
                RestClient aaiRC = this.createClient(uri);
                aaiRC.patch(obj);
                return;
        }
        
-       /**
-        * Retrieves an object from A&AI and unmarshalls it into the Class specified
-        * @param clazz
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#get(java.lang.Class, org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public <T> Optional<T> get(Class<T> clazz, AAIResourceUri uri) {
                try {
                        return this.createClient(uri).get(clazz);
@@ -179,11 +159,10 @@ public class AAIResourcesClient extends AAIClient {
                }
        }
        
-       /**
-        * Retrieves an object from A&AI and returns complete response
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#getFullResponse(org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public Response getFullResponse(AAIResourceUri uri) {
                try {
                        return this.createClient(uri).get();
@@ -196,12 +175,10 @@ public class AAIResourcesClient extends AAIClient {
                }
        }
        
-       /**
-        * Retrieves an object from A&AI and automatically unmarshalls it into a Map or List 
-        * @param resultClass
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#get(javax.ws.rs.core.GenericType, org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public <T> Optional<T> get(GenericType<T> resultClass, AAIResourceUri uri) {
                try {
                        return this.createClient(uri).get(resultClass);
@@ -214,12 +191,10 @@ public class AAIResourcesClient extends AAIClient {
                }
        }
        
-       /**
-        * Retrieves an object from A&AI wrapped in a helper class which offer additional features
-        * 
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#get(org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public AAIResultWrapper get(AAIResourceUri uri) {
                String json;
                try {
@@ -234,13 +209,10 @@ public class AAIResourcesClient extends AAIClient {
                return new AAIResultWrapper(json);
        }
        
-       /**
-        * Retrieves an object from A&AI wrapped in a helper class which offer additional features
-        * If the object cannot be found in A&AI the method will throw the runtime exception
-        * included as an argument
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#get(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.lang.Class)
         */
+       @Override
        public AAIResultWrapper get(AAIResourceUri uri, Class<? extends RuntimeException> c) {
                String json;
                try {
@@ -285,13 +257,10 @@ public class AAIResourcesClient extends AAIClient {
                return result;
        }
        
-       /**
-        * Will automatically create the object if it does not exist
-        * 
-        * @param obj - Optional object which serializes to a valid A&AI payload
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#createIfNotExists(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.util.Optional)
         */
+       @Override
        public AAIResourcesClient createIfNotExists(AAIResourceUri uri, Optional<Object> obj) {
                if(!this.exists(uri)){
                        if (obj.isPresent()) {
@@ -304,20 +273,18 @@ public class AAIResourcesClient extends AAIClient {
                return this;
        }
 
-       /**
-        * Starts a transaction which encloses multiple A&AI mutations
-        * 
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#beginTransaction()
         */
+       @Override
        public AAITransactionalClient beginTransaction() {
                return new AAITransactionalClient(this.getVersion());
        }
        
-       /**
-        * Starts a transaction groups multiple A&AI mutations
-        * 
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#beginSingleTransaction()
         */
+       @Override
        public AAISingleTransactionClient beginSingleTransaction() {
                return new AAISingleTransactionClient(this.getVersion());
        }
@@ -333,6 +300,9 @@ public class AAIResourcesClient extends AAIClient {
                
                return clone;
        }
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryResourcesClient#getRestProperties()
+        */
        @Override
        public <T extends RestProperties> T getRestProperties() {
                return super.getRestProperties();
index 4f235c3..a265119 100644 (file)
@@ -28,6 +28,7 @@ import javax.ws.rs.core.Response;
 
 import org.onap.so.client.ResponseExceptionMapper;
 import org.onap.so.client.RestClientSSL;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
 import org.onap.so.client.policy.CommonObjectMapperProvider;
 import org.onap.so.utils.TargetEntity;
 
@@ -36,7 +37,7 @@ public class AAIRestClient extends RestClientSSL {
        private final AAIProperties aaiProperties;
        private static final AAICommonObjectMapperProvider standardProvider = new AAICommonObjectMapperProvider();
 
-       private final AAIPatchConverter patchConverter = new AAIPatchConverter();
+       private final GraphInventoryPatchConverter patchConverter = new GraphInventoryPatchConverter();
        
        protected AAIRestClient(AAIProperties props, URI uri) {
                super(props, Optional.of(uri));
@@ -81,7 +82,7 @@ public class AAIRestClient extends RestClientSSL {
                return super.patch(convertToPatchFormat(obj), resultClass);
        }
        
-       protected AAIPatchConverter getPatchConverter() {
+       protected GraphInventoryPatchConverter getPatchConverter() {
                return this.patchConverter;
        }
        
index 2ecdb7c..ba65ac3 100644 (file)
@@ -43,19 +43,21 @@ import org.onap.so.client.aai.entities.singletransaction.SingleTransactionRespon
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
+import org.onap.so.client.graphinventory.GraphInventorySingleTransactionClient;
 import org.onap.so.client.graphinventory.exceptions.BulkProcessFailed;
 
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Joiner;
 
-public class AAISingleTransactionClient extends AAIClient {
+public class AAISingleTransactionClient extends AAIClient implements GraphInventorySingleTransactionClient<AAISingleTransactionClient, AAIResourceUri, AAIEdgeLabel> {
 
        private final SingleTransactionRequest request;
        private final AAIVersion version;
        private int actionCount = 0;
        
-       private final AAIPatchConverter patchConverter = new AAIPatchConverter();
+       private final GraphInventoryPatchConverter patchConverter = new GraphInventoryPatchConverter();
        
        protected AAISingleTransactionClient(AAIVersion version) {
                super();
@@ -63,37 +65,30 @@ public class AAISingleTransactionClient extends AAIClient {
                this.request = new SingleTransactionRequest();
        }
 
-       /**
-        * creates a new object in A&AI
-        * 
-        * @param obj - can be any object which will marshal into a valid A&AI payload
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionClient#create(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.lang.Object)
         */
+       @Override
        public AAISingleTransactionClient create(AAIResourceUri uri, Object obj) {
                request.getOperations().add(new OperationBodyRequest().withAction("put").withUri(uri.build().toString()).withBody(obj));
                incrementActionAmount();
                return this;
        }
 
-       /**
-        * creates a new object in A&AI with no payload body
-        * 
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionClient#createEmpty(org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public AAISingleTransactionClient createEmpty(AAIResourceUri uri) {
                request.getOperations().add(new OperationBodyRequest().withAction("put").withUri(uri.build().toString()).withBody(new HashMap<String, String>()));
                incrementActionAmount();
                return this;
        }
 
-       /**
-        * Adds a relationship between two objects in A&AI 
-        * @param uriA
-        * @param uriB
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public AAISingleTransactionClient connect(AAIResourceUri uriA, AAIResourceUri uriB) {
                AAIResourceUri uriAClone = uriA.clone();
                request.getOperations().add(new OperationBodyRequest().withAction("put").withUri(uriAClone.relationshipAPI().build().toString()).withBody(this.buildRelationship(uriB)));
@@ -101,13 +96,10 @@ public class AAISingleTransactionClient extends AAIClient {
                return this;
        }
 
-       /**
-        * relationship between multiple objects in A&AI - connects A to all objects specified in list
-        * 
-        * @param uriA
-        * @param uris
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.util.List)
         */
+       @Override
        public AAISingleTransactionClient connect(AAIResourceUri uriA, List<AAIResourceUri> uris) {
                for (AAIResourceUri uri : uris) {
                        this.connect(uriA, uri);
@@ -115,6 +107,10 @@ public class AAISingleTransactionClient extends AAIClient {
                return this;
        }
        
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.AAIEdgeLabel)
+        */
+       @Override
        public AAISingleTransactionClient connect(AAIResourceUri uriA, AAIResourceUri uriB, AAIEdgeLabel label) {
                AAIResourceUri uriAClone = uriA.clone();
                RestClient aaiRC = this.createClient(uriAClone.relationshipAPI());
@@ -122,6 +118,10 @@ public class AAISingleTransactionClient extends AAIClient {
                return this;
        }
        
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.util.List, org.onap.so.client.aai.entities.AAIEdgeLabel)
+        */
+       @Override
        public AAISingleTransactionClient connect(AAIResourceUri uriA, List<AAIResourceUri> uris, AAIEdgeLabel label) {
                for (AAIResourceUri uri : uris) {
                        this.connect(uriA, uri, label);
@@ -129,13 +129,10 @@ public class AAISingleTransactionClient extends AAIClient {
                return this;
        }
 
-       /**
-        * Removes relationship from two objects in A&AI
-        * 
-        * @param uriA
-        * @param uriB
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionClient#disconnect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public AAISingleTransactionClient disconnect(AAIResourceUri uriA, AAIResourceUri uriB) {
                AAIResourceUri uriAClone = uriA.clone();
                request.getOperations().add(new OperationBodyRequest().withAction("delete").withUri(uriAClone.relationshipAPI().build().toString()).withBody(this.buildRelationship(uriB)));
@@ -143,24 +140,20 @@ public class AAISingleTransactionClient extends AAIClient {
                return this;
        }
 
-       /**
-        * Removes relationship from multiple objects - disconnects A from all objects specified in list
-        * @param uriA
-        * @param uris
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionClient#disconnect(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.util.List)
         */
+       @Override
        public AAISingleTransactionClient disconnect(AAIResourceUri uriA, List<AAIResourceUri> uris) {
                for (AAIResourceUri uri : uris) {
                        this.disconnect(uriA, uri);
                }
                return this;
        }
-       /**
-        * Deletes object from A&AI. Automatically handles resource-version.
-        * 
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionClient#delete(org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public AAISingleTransactionClient delete(AAIResourceUri uri) {
                AAIResourcesClient client = new AAIResourcesClient();
                AAIResourceUri clone = uri.clone();
@@ -172,11 +165,10 @@ public class AAISingleTransactionClient extends AAIClient {
                return this;
        }
 
-       /**
-        * @param obj - can be any object which will marshal into a valid A&AI payload
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionClient#update(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.lang.Object)
         */
+       @Override
        public AAISingleTransactionClient update(AAIResourceUri uri, Object obj) {
                
                final String payload = getPatchConverter().convertPatchFormat(obj);
@@ -188,10 +180,10 @@ public class AAISingleTransactionClient extends AAIClient {
        private void incrementActionAmount() {
                actionCount++;
        }
-       /**
-        * Executes all created transactions in A&AI
-        * @throws BulkProcessFailed 
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionClient#execute()
         */
+       @Override
        public void execute() throws BulkProcessFailed {
                RestClient client = this.createClient(AAIUriFactory.createResourceUri(AAIObjectType.SINGLE_TRANSACTION));
                try {
@@ -261,7 +253,7 @@ public class AAISingleTransactionClient extends AAIClient {
                return this.request;
        }
        
-       protected AAIPatchConverter getPatchConverter() {
+       protected GraphInventoryPatchConverter getPatchConverter() {
                return this.patchConverter;
        }
 }
index 118a3ed..dd4cb2f 100644 (file)
@@ -20,8 +20,6 @@
 
 package org.onap.so.client.aai;
 
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -42,8 +40,9 @@ import org.onap.so.client.aai.entities.bulkprocess.OperationBody;
 import org.onap.so.client.aai.entities.bulkprocess.Transaction;
 import org.onap.so.client.aai.entities.bulkprocess.Transactions;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
-import org.onap.so.client.aai.entities.uri.AAIUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
+import org.onap.so.client.graphinventory.GraphInventoryTransactionalClient;
 import org.onap.so.client.graphinventory.exceptions.BulkProcessFailed;
 import org.onap.so.jsonpath.JsonPathUtil;
 
@@ -51,14 +50,14 @@ import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Joiner;
 
-public class AAITransactionalClient extends AAIClient {
+public class AAITransactionalClient extends AAIClient implements GraphInventoryTransactionalClient<AAITransactionalClient, AAIResourceUri, AAIEdgeLabel> {
 
        private final Transactions transactions;
        private Transaction currentTransaction;
        private final AAIVersion version;
        private int actionCount = 0;
        
-       private final AAIPatchConverter patchConverter = new AAIPatchConverter();
+       private final GraphInventoryPatchConverter patchConverter = new GraphInventoryPatchConverter();
        
        protected AAITransactionalClient(AAIVersion version) {
                super();
@@ -73,47 +72,39 @@ public class AAITransactionalClient extends AAIClient {
                currentTransaction = transaction;
        }
        
-       /**
-        * adds an additional transaction and closes the previous transaction
-        * 
-        * @return AAITransactionalClient
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#beginNewTransaction()
         */
+       @Override
        public AAITransactionalClient beginNewTransaction() {
                startTransaction();
                return this;
        }
        
-       /**
-        * creates a new object in A&AI
-        * 
-        * @param obj - can be any object which will marshal into a valid A&AI payload
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#create(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.lang.Object)
         */
+       @Override
        public AAITransactionalClient create(AAIResourceUri uri, Object obj) {
                currentTransaction.getPut().add(new OperationBody().withUri(uri.build().toString()).withBody(obj));
                incrementActionAmount();
                return this;
        }
        
-       /**
-        * creates a new object in A&AI with no payload body
-        * 
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#createEmpty(org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public AAITransactionalClient createEmpty(AAIResourceUri uri) {
                currentTransaction.getPut().add(new OperationBody().withUri(uri.build().toString()).withBody(new HashMap<String, String>()));
                incrementActionAmount();
                return this;
        }
        
-       /**
-        * Adds a relationship between two objects in A&AI 
-        * @param uriA
-        * @param uriB
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public AAITransactionalClient connect(AAIResourceUri uriA, AAIResourceUri uriB) {
                AAIResourceUri uriAClone = uriA.clone();
                currentTransaction.getPut().add(new OperationBody().withUri(uriAClone.relationshipAPI().build().toString()).withBody(this.buildRelationship(uriB)));
@@ -121,13 +112,10 @@ public class AAITransactionalClient extends AAIClient {
                return this;
        }
        
-       /**
-        * relationship between multiple objects in A&AI - connects A to all objects specified in list
-        * 
-        * @param uriA
-        * @param uris
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.util.List)
         */
+       @Override
        public AAITransactionalClient connect(AAIResourceUri uriA, List<AAIResourceUri> uris) {
                for (AAIResourceUri uri : uris) {
                        this.connect(uriA, uri);
@@ -135,6 +123,10 @@ public class AAITransactionalClient extends AAIClient {
                return this;
        }
        
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.AAIEdgeLabel)
+        */
+       @Override
        public AAITransactionalClient connect(AAIResourceUri uriA, AAIResourceUri uriB, AAIEdgeLabel label) {
                AAIResourceUri uriAClone = uriA.clone();
                RestClient aaiRC = this.createClient(uriAClone.relationshipAPI());
@@ -142,6 +134,10 @@ public class AAITransactionalClient extends AAIClient {
                return this;
        }
        
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#connect(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.util.List, org.onap.so.client.aai.entities.AAIEdgeLabel)
+        */
+       @Override
        public AAITransactionalClient connect(AAIResourceUri uriA, List<AAIResourceUri> uris, AAIEdgeLabel label) {
                for (AAIResourceUri uri : uris) {
                        this.connect(uriA, uri, label);
@@ -149,13 +145,10 @@ public class AAITransactionalClient extends AAIClient {
                return this;
        }
        
-       /**
-        * Removes relationship from two objects in A&AI
-        * 
-        * @param uriA
-        * @param uriB
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#disconnect(org.onap.so.client.aai.entities.uri.AAIResourceUri, org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public AAITransactionalClient disconnect(AAIResourceUri uriA, AAIResourceUri uriB) {
                AAIResourceUri uriAClone = uriA.clone();
                currentTransaction.getDelete().add(new OperationBody().withUri(uriAClone.relationshipAPI().build().toString()).withBody(this.buildRelationship(uriB)));
@@ -163,24 +156,20 @@ public class AAITransactionalClient extends AAIClient {
                return this;
        }
        
-       /**
-        * Removes relationship from multiple objects - disconnects A from all objects specified in list
-        * @param uriA
-        * @param uris
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#disconnect(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.util.List)
         */
+       @Override
        public AAITransactionalClient disconnect(AAIResourceUri uriA, List<AAIResourceUri> uris) {
                for (AAIResourceUri uri : uris) {
                        this.disconnect(uriA, uri);
                }
                return this;
        }
-       /**
-        * Deletes object from A&AI. Automatically handles resource-version.
-        * 
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#delete(org.onap.so.client.aai.entities.uri.AAIResourceUri)
         */
+       @Override
        public AAITransactionalClient delete(AAIResourceUri uri) {
                AAIResourcesClient client = new AAIResourcesClient();
                AAIResourceUri clone = uri.clone();
@@ -192,11 +181,10 @@ public class AAITransactionalClient extends AAIClient {
                return this;
        }
        
-       /**
-        * @param obj - can be any object which will marshal into a valid A&AI payload
-        * @param uri
-        * @return
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#update(org.onap.so.client.aai.entities.uri.AAIResourceUri, java.lang.Object)
         */
+       @Override
        public AAITransactionalClient update(AAIResourceUri uri, Object obj) {
                final String payload = getPatchConverter().convertPatchFormat(obj);
                currentTransaction.getPatch().add(new OperationBody().withUri(uri.build().toString()).withBody(payload));
@@ -207,10 +195,10 @@ public class AAITransactionalClient extends AAIClient {
        private void incrementActionAmount() {
                actionCount++;
        }
-       /**
-        * Executes all created transactions in A&AI
-        * @throws BulkProcessFailed 
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#execute()
         */
+       @Override
        public void execute() throws BulkProcessFailed {
                RestClient client = this.createClient(AAIUriFactory.createResourceUri(AAIObjectType.BULK_PROCESS));
                try {
@@ -293,7 +281,7 @@ public class AAITransactionalClient extends AAIClient {
                return this.transactions;
        }
        
-       protected AAIPatchConverter getPatchConverter() {
+       protected GraphInventoryPatchConverter getPatchConverter() {
                return this.patchConverter;
        }
 }
index 77ea9bc..9b3f98b 100644 (file)
 
 package org.onap.so.client.aai.entities;
 
-import java.io.IOException;
 import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
 
-
-import org.onap.so.client.aai.AAICommonObjectMapperProvider;
-import org.onap.so.jsonpath.JsonPathUtil;
+import org.onap.so.client.graphinventory.entities.GraphInventoryResultWrapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-public class AAIResultWrapper implements Serializable {
+public class AAIResultWrapper extends GraphInventoryResultWrapper implements Serializable {
 
        private static final long serialVersionUID = 5895841925807816737L;
-       private final String jsonBody;
-       private final ObjectMapper mapper;
-       private final transient Logger logger = LoggerFactory.getLogger(AAIResultWrapper.class);
+       private final static transient Logger logger = LoggerFactory.getLogger(AAIResultWrapper.class);
        
        public AAIResultWrapper(String json) {
-               this.jsonBody = json;
-               this.mapper = new AAICommonObjectMapperProvider().getMapper();
+               super(json, logger);
        }
        
        public AAIResultWrapper(Object aaiObject) {
-               this.mapper = new AAICommonObjectMapperProvider().getMapper();
-               this.jsonBody = mapObjectToString(aaiObject);
-       }
-       
-       protected String mapObjectToString(Object aaiObject) {
-               try {
-                       return mapper.writeValueAsString(aaiObject);
-               } catch (JsonProcessingException e) {
-                       logger.warn("could not parse object into json - defaulting to {}");
-                       return "{}";
-               }
+               super(aaiObject, logger);
        }
-       public Optional<Relationships> getRelationships() {
-               final String path = "$.relationship-list";
-               if (isEmpty()) {
-                       return Optional.empty();
-               }
-               Optional<String> result = JsonPathUtil.getInstance().locateResult(jsonBody, path);
-               if (result.isPresent()) {
-                       return Optional.of(new Relationships(result.get()));
-               } else {
-                       return Optional.empty();
-               }
-       }
-       
-       public String getJson() {
-               if(jsonBody == null) {
-                       return "{}";
-               } else {
-                       return jsonBody;
-               }
-       }
-       
-       public Map<String, Object> asMap() {
-               if (isEmpty()) {
-                       return new HashMap<>();
-               }
-               try {
-                       return mapper.readValue(this.jsonBody, new TypeReference<Map<String, Object>>(){});
-               } catch (IOException e) {
-                       return new HashMap<>();
-               }
-       }
-       
-       public <T> Optional<T> asBean(Class<T> clazz) {
-               if (isEmpty()) {
-                       return Optional.empty();
-               }
-               try {
-                       return Optional.of(mapper.readValue(this.jsonBody, clazz));
-               } catch (IOException e) {
-                       return Optional.empty();
-               }
-       }
-       
-       public boolean isEmpty() {
-               return jsonBody == null;
-       }
-       @Override
-       public String toString() {
-               return this.getJson();
-       }
-
 }
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperPatchProvider.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperPatchProvider.java
new file mode 100644 (file)
index 0000000..47c9e77
--- /dev/null
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.graphinventory;
+
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+public class GraphInventoryCommonObjectMapperPatchProvider extends GraphInventoryCommonObjectMapperProvider {
+
+       
+       public GraphInventoryCommonObjectMapperPatchProvider() {
+               super();
+               EmptyStringToNullSerializer sp = new EmptyStringToNullSerializer(); 
+               SimpleModule emptyStringModule = new SimpleModule();
+               emptyStringModule.addSerializer(String.class, sp);
+               mapper.registerModule(emptyStringModule);
+       }
+}
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperProvider.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperProvider.java
new file mode 100644 (file)
index 0000000..f985742
--- /dev/null
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.graphinventory;
+
+import org.onap.so.client.policy.CommonObjectMapperProvider;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.databind.AnnotationIntrospector;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
+
+public class GraphInventoryCommonObjectMapperProvider extends CommonObjectMapperProvider {
+
+       public GraphInventoryCommonObjectMapperProvider() {
+               mapper = new ObjectMapper();
+               mapper.setSerializationInclusion(Include.NON_NULL);
+               mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
+               mapper.enable(MapperFeature.USE_ANNOTATIONS);
+               mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
+               mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, false);
+               mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+               AnnotationIntrospector aiJaxb = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance());
+        AnnotationIntrospector aiJackson = new JacksonAnnotationIntrospector();
+        // first Jaxb, second Jackson annotations
+        mapper.setAnnotationIntrospector(AnnotationIntrospector.pair(aiJaxb, aiJackson));
+       }
+
+}
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai;
+package org.onap.so.client.graphinventory;
 
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
 
+import org.onap.so.client.aai.AAICommonObjectMapperPatchProvider;
+import org.onap.so.client.aai.AAICommonObjectMapperProvider;
 import org.onap.so.client.graphinventory.exceptions.GraphInventoryPatchDepthExceededException;
 import org.onap.so.jsonpath.JsonPathUtil;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 
-public class AAIPatchConverter {
+public class GraphInventoryPatchConverter {
 
        private static final AAICommonObjectMapperProvider standardProvider = new AAICommonObjectMapperProvider();
        private static final AAICommonObjectMapperPatchProvider patchProvider = new AAICommonObjectMapperPatchProvider();
        private static final Pattern LOCATE_COMPLEX_OBJECT = Pattern.compile("^((?!relationship-list).)+?\\['[^\\[\\]]+?'\\]$");
 
        
-       protected String convertPatchFormat(Object obj) {
+       public String convertPatchFormat(Object obj) {
                return validatePatchObject(marshallObjectToPatchFormat(obj));
        }
        
-       protected String validatePatchObject(String payload) {
+       public String validatePatchObject(String payload) {
                if (hasComplexObject(payload)) {
                        throw new GraphInventoryPatchDepthExceededException(payload);
                }
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryResourcesClient.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryResourcesClient.java
new file mode 100644 (file)
index 0000000..7fbe286
--- /dev/null
@@ -0,0 +1,147 @@
+package org.onap.so.client.graphinventory;
+
+import java.util.Optional;
+
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.Response;
+
+import org.onap.so.client.RestProperties;
+import org.onap.so.client.graphinventory.entities.GraphInventoryEdgeLabel;
+import org.onap.so.client.graphinventory.entities.GraphInventoryResultWrapper;
+import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
+
+public interface GraphInventoryResourcesClient<Self, Uri extends GraphInventoryUri, EdgeLabel extends GraphInventoryEdgeLabel, Wrapper extends GraphInventoryResultWrapper, TransactionalClient, SingleTransactionClient> {
+
+       /**
+        * creates a new object in GraphInventory
+        * 
+        * @param obj - can be any object which will marshal into a valid GraphInventory payload
+        * @param uri
+        * @return
+        */
+       void create(Uri uri, Object obj);
+
+       /**
+        * creates a new object in GraphInventory with no payload body
+        * 
+        * @param uri
+        * @return
+        */
+       void createEmpty(Uri uri);
+
+       /**
+        * returns false if the object does not exist in GraphInventory
+        * 
+        * @param uri
+        * @return
+        */
+       boolean exists(Uri uri);
+
+       /**
+        * Adds a relationship between two objects in GraphInventory 
+        * @param uriA
+        * @param uriB
+        * @return
+        */
+       void connect(Uri uriA, Uri uriB);
+
+       /**
+        * Adds a relationship between two objects in GraphInventory 
+        * with a given edge label
+        * @param uriA
+        * @param uriB
+        * @param edge label
+        * @return
+        */
+       void connect(Uri uriA, Uri uriB, EdgeLabel label);
+
+       /**
+        * Removes relationship from two objects in GraphInventory
+        * 
+        * @param uriA
+        * @param uriB
+        * @return
+        */
+       void disconnect(Uri uriA, Uri uriB);
+
+       /**
+        * Deletes object from GraphInventory. Automatically handles resource-version.
+        * 
+        * @param uri
+        * @return
+        */
+       void delete(Uri uri);
+
+       /**
+        * @param obj - can be any object which will marshal into a valid GraphInventory payload
+        * @param uri
+        * @return
+        */
+       void update(Uri uri, Object obj);
+
+       /**
+        * Retrieves an object from GraphInventory and unmarshalls it into the Class specified
+        * @param clazz
+        * @param uri
+        * @return
+        */
+       <T> Optional<T> get(Class<T> clazz, Uri uri);
+
+       /**
+        * Retrieves an object from GraphInventory and returns complete response
+        * @param uri
+        * @return
+        */
+       Response getFullResponse(Uri uri);
+
+       /**
+        * Retrieves an object from GraphInventory and automatically unmarshalls it into a Map or List 
+        * @param resultClass
+        * @param uri
+        * @return
+        */
+       <T> Optional<T> get(GenericType<T> resultClass, Uri uri);
+
+       /**
+        * Retrieves an object from GraphInventory wrapped in a helper class which offer additional features
+        * 
+        * @param uri
+        * @return
+        */
+       Wrapper get(Uri uri);
+
+       /**
+        * Retrieves an object from GraphInventory wrapped in a helper class which offer additional features
+        * If the object cannot be found in GraphInventory the method will throw the runtime exception
+        * included as an argument
+        * @param uri
+        * @return
+        */
+       Wrapper get(Uri uri, Class<? extends RuntimeException> c);
+
+       /**
+        * Will automatically create the object if it does not exist
+        * 
+        * @param obj - Optional object which serializes to a valid GraphInventory payload
+        * @param uri
+        * @return
+        */
+       Self createIfNotExists(Uri uri, Optional<Object> obj);
+
+       /**
+        * Starts a transaction which encloses multiple GraphInventory mutations
+        * 
+        * @return
+        */
+       TransactionalClient beginTransaction();
+
+       /**
+        * Starts a transaction groups multiple GraphInventory mutations
+        * 
+        * @return
+        */
+       SingleTransactionClient beginSingleTransaction();
+
+       <T extends RestProperties> T getRestProperties();
+
+}
\ No newline at end of file
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventorySingleTransactionClient.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventorySingleTransactionClient.java
new file mode 100644 (file)
index 0000000..e1aa225
--- /dev/null
@@ -0,0 +1,87 @@
+package org.onap.so.client.graphinventory;
+
+import java.util.List;
+
+import org.onap.so.client.graphinventory.entities.GraphInventoryEdgeLabel;
+import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
+import org.onap.so.client.graphinventory.exceptions.BulkProcessFailed;
+
+public interface GraphInventorySingleTransactionClient<Self, Uri extends GraphInventoryUri, EdgeLabel extends GraphInventoryEdgeLabel> {
+
+       /**
+        * creates a new object in A&AI
+        * 
+        * @param obj - can be any object which will marshal into a valid A&AI payload
+        * @param uri
+        * @return
+        */
+       Self create(Uri uri, Object obj);
+
+       /**
+        * creates a new object in A&AI with no payload body
+        * 
+        * @param uri
+        * @return
+        */
+       Self createEmpty(Uri uri);
+
+       /**
+        * Adds a relationship between two objects in A&AI 
+        * @param uriA
+        * @param uriB
+        * @return
+        */
+       Self connect(Uri uriA, Uri uriB);
+
+       /**
+        * relationship between multiple objects in A&AI - connects A to all objects specified in list
+        * 
+        * @param uriA
+        * @param uris
+        * @return
+        */
+       Self connect(Uri uriA, List<Uri> uris);
+
+       Self connect(Uri uriA, Uri uriB, EdgeLabel label);
+
+       Self connect(Uri uriA, List<Uri> uris, EdgeLabel label);
+
+       /**
+        * Removes relationship from two objects in A&AI
+        * 
+        * @param uriA
+        * @param uriB
+        * @return
+        */
+       Self disconnect(Uri uriA, Uri uriB);
+
+       /**
+        * Removes relationship from multiple objects - disconnects A from all objects specified in list
+        * @param uriA
+        * @param uris
+        * @return
+        */
+       Self disconnect(Uri uriA, List<Uri> uris);
+
+       /**
+        * Deletes object from A&AI. Automatically handles resource-version.
+        * 
+        * @param uri
+        * @return
+        */
+       Self delete(Uri uri);
+
+       /**
+        * @param obj - can be any object which will marshal into a valid A&AI payload
+        * @param uri
+        * @return
+        */
+       Self update(Uri uri, Object obj);
+
+       /**
+        * Executes all created transactions in A&AI
+        * @throws BulkProcessFailed 
+        */
+       void execute() throws BulkProcessFailed;
+
+}
\ No newline at end of file
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionalClient.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionalClient.java
new file mode 100644 (file)
index 0000000..a7362c8
--- /dev/null
@@ -0,0 +1,94 @@
+package org.onap.so.client.graphinventory;
+
+import java.util.List;
+
+import org.onap.so.client.graphinventory.entities.GraphInventoryEdgeLabel;
+import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
+import org.onap.so.client.graphinventory.exceptions.BulkProcessFailed;
+
+public interface GraphInventoryTransactionalClient<Self, Uri extends GraphInventoryUri, EdgeLabel extends GraphInventoryEdgeLabel> {
+
+       /**
+        * adds an additional transaction and closes the previous transaction
+        * 
+        * @return Self
+        */
+       Self beginNewTransaction();
+
+       /**
+        * creates a new object in A&AI
+        * 
+        * @param obj - can be any object which will marshal into a valid A&AI payload
+        * @param uri
+        * @return
+        */
+       Self create(Uri uri, Object obj);
+
+       /**
+        * creates a new object in A&AI with no payload body
+        * 
+        * @param uri
+        * @return
+        */
+       Self createEmpty(Uri uri);
+
+       /**
+        * Adds a relationship between two objects in A&AI 
+        * @param uriA
+        * @param uriB
+        * @return
+        */
+       Self connect(Uri uriA, Uri uriB);
+
+       /**
+        * relationship between multiple objects in A&AI - connects A to all objects specified in list
+        * 
+        * @param uriA
+        * @param uris
+        * @return
+        */
+       Self connect(Uri uriA, List<Uri> uris);
+
+       Self connect(Uri uriA, Uri uriB, EdgeLabel label);
+
+       Self connect(Uri uriA, List<Uri> uris, EdgeLabel label);
+
+       /**
+        * Removes relationship from two objects in A&AI
+        * 
+        * @param uriA
+        * @param uriB
+        * @return
+        */
+       Self disconnect(Uri uriA, Uri uriB);
+
+       /**
+        * Removes relationship from multiple objects - disconnects A from all objects specified in list
+        * @param uriA
+        * @param uris
+        * @return
+        */
+       Self disconnect(Uri uriA, List<Uri> uris);
+
+       /**
+        * Deletes object from A&AI. Automatically handles resource-version.
+        * 
+        * @param uri
+        * @return
+        */
+       Self delete(Uri uri);
+
+       /**
+        * @param obj - can be any object which will marshal into a valid A&AI payload
+        * @param uri
+        * @return
+        */
+       Self update(Uri uri, Object obj);
+
+       /**
+        * Executes all created transactions in A&AI
+        * @throws BulkProcessFailed 
+        */
+       void execute() throws BulkProcessFailed;
+
+}
\ No newline at end of file
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryResultWrapper.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryResultWrapper.java
new file mode 100644 (file)
index 0000000..cc1ce00
--- /dev/null
@@ -0,0 +1,117 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.graphinventory.entities;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+import org.onap.so.client.aai.AAICommonObjectMapperProvider;
+import org.onap.so.client.aai.entities.Relationships;
+import org.onap.so.jsonpath.JsonPathUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class GraphInventoryResultWrapper implements Serializable {
+
+       private static final long serialVersionUID = 5895841925807816727L;
+       protected final String jsonBody;
+       protected final ObjectMapper mapper;
+       private final transient Logger logger;
+       
+       protected GraphInventoryResultWrapper(String json, Logger logger) {
+               this.jsonBody = json;
+               this.mapper = new AAICommonObjectMapperProvider().getMapper();
+               this.logger = logger;
+       }
+       
+       protected GraphInventoryResultWrapper(Object aaiObject, Logger logger) {
+               this.mapper = new AAICommonObjectMapperProvider().getMapper();
+               this.jsonBody = mapObjectToString(aaiObject);
+               this.logger = logger;
+       }
+       
+       protected String mapObjectToString(Object aaiObject) {
+               try {
+                       return mapper.writeValueAsString(aaiObject);
+               } catch (JsonProcessingException e) {
+                       logger.warn("could not parse object into json - defaulting to {}");
+                       return "{}";
+               }
+       }
+       public Optional<Relationships> getRelationships() {
+               final String path = "$.relationship-list";
+               if (isEmpty()) {
+                       return Optional.empty();
+               }
+               Optional<String> result = JsonPathUtil.getInstance().locateResult(jsonBody, path);
+               if (result.isPresent()) {
+                       return Optional.of(new Relationships(result.get()));
+               } else {
+                       return Optional.empty();
+               }
+       }
+       
+       public String getJson() {
+               if(jsonBody == null) {
+                       return "{}";
+               } else {
+                       return jsonBody;
+               }
+       }
+       
+       public Map<String, Object> asMap() {
+               if (isEmpty()) {
+                       return new HashMap<>();
+               }
+               try {
+                       return mapper.readValue(this.jsonBody, new TypeReference<Map<String, Object>>(){});
+               } catch (IOException e) {
+                       return new HashMap<>();
+               }
+       }
+       
+       public <T> Optional<T> asBean(Class<T> clazz) {
+               if (isEmpty()) {
+                       return Optional.empty();
+               }
+               try {
+                       return Optional.of(mapper.readValue(this.jsonBody, clazz));
+               } catch (IOException e) {
+                       return Optional.empty();
+               }
+       }
+       
+       public boolean isEmpty() {
+               return jsonBody == null;
+       }
+       @Override
+       public String toString() {
+               return this.getJson();
+       }
+
+}
index ad15417..95b30f9 100644 (file)
@@ -41,6 +41,7 @@ import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.so.client.RestClientSSL;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
 import org.onap.so.client.graphinventory.exceptions.GraphInventoryPatchDepthExceededException;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -68,7 +69,7 @@ public class AAIRestClientTest {
        public void verifyPatchValidation() throws URISyntaxException {
                AAIRestClient client = new AAIRestClient(props, new URI(""));
                AAIRestClient spy = spy(client);
-               AAIPatchConverter patchValidatorMock = mock(AAIPatchConverter.class);
+               GraphInventoryPatchConverter patchValidatorMock = mock(GraphInventoryPatchConverter.class);
                doReturn(patchValidatorMock).when(spy).getPatchConverter();
                String payload = "{}";
                doReturn(Response.ok().build()).when(spy).method(eq("PATCH"), any());
index 428fa27..2763712 100644 (file)
@@ -45,6 +45,7 @@ import org.onap.so.client.aai.entities.singletransaction.SingleTransactionRespon
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.defaultproperties.DefaultAAIPropertiesImpl;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
 import org.skyscreamer.jsonassert.JSONAssert;
 
 import com.fasterxml.jackson.core.JsonParseException;
@@ -117,7 +118,7 @@ public class AAISingleTransactionClientTest {
        @Test
        public void confirmPatchFormat() {
                AAISingleTransactionClient singleTransaction = spy(new AAISingleTransactionClient(AAIVersion.LATEST));
-               AAIPatchConverter mock = mock(AAIPatchConverter.class);
+               GraphInventoryPatchConverter mock = mock(GraphInventoryPatchConverter.class);
                doReturn(mock).when(singleTransaction).getPatchConverter();
                singleTransaction.update(uriA, "{}");
                verify(mock, times(1)).convertPatchFormat(any());
index 6213758..342e3b1 100644 (file)
@@ -43,6 +43,7 @@ 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;
 import org.onap.so.client.defaultproperties.DefaultAAIPropertiesImpl;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
 
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.core.type.TypeReference;
@@ -143,7 +144,7 @@ public class AAITransactionalClientTest {
        @Test
        public void confirmPatchFormat() {
                AAITransactionalClient client = spy(new AAITransactionalClient(AAIVersion.LATEST));
-               AAIPatchConverter mock = mock(AAIPatchConverter.class);
+               GraphInventoryPatchConverter mock = mock(GraphInventoryPatchConverter.class);
                doReturn(mock).when(client).getPatchConverter();
                client.update(uriA, "{}");
                verify(mock, times(1)).convertPatchFormat(any());
diff --git a/common/src/test/java/org/onap/so/client/adapter/rest/AdapterRestClientTest.java b/common/src/test/java/org/onap/so/client/adapter/rest/AdapterRestClientTest.java
new file mode 100644 (file)
index 0000000..f4490fa
--- /dev/null
@@ -0,0 +1,109 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Nokia.
+ * ================================================================================
+ * 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.adapter.rest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.entry;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.security.GeneralSecurityException;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.commons.codec.binary.Base64;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.so.client.policy.JettisonStyleMapperProvider;
+import org.onap.so.utils.CryptoUtils;
+import org.onap.so.utils.TargetEntity;
+
+public class AdapterRestClientTest {
+
+    private static final String CRYPTO_KEY = "546573746F736973546573746F736973";
+    private static final String INVALID_CRYPTO_KEY = "1234";
+
+    private Map<String, String> headerMap;
+    private AdapterRestProperties adapterRestPropertiesMock;
+
+    @Before
+    public void setup() {
+        headerMap = new HashMap<>();
+        adapterRestPropertiesMock = mock(AdapterRestProperties.class);
+    }
+
+    @Test
+    public void initializeHeaderMap_success() throws URISyntaxException, GeneralSecurityException {
+        // given
+        String encyptedMessage = CryptoUtils.encrypt("testAdapter", CRYPTO_KEY);
+        when(adapterRestPropertiesMock.getAuth()).thenReturn(encyptedMessage);
+        when(adapterRestPropertiesMock.getKey()).thenReturn(CRYPTO_KEY);
+        AdapterRestClient testedObject = new AdapterRestClient(adapterRestPropertiesMock, new URI(""));
+        // when
+        testedObject.initializeHeaderMap(headerMap);
+        // then
+        assertThat(headerMap).containsOnly(entry("Authorization", getExpectedEncodedString(encyptedMessage)));
+    }
+
+    @Test
+    public void initializeHeaderMap_putNullToMapWhenAuthIsNull() throws URISyntaxException {
+        // given
+        AdapterRestClient testedObject = new AdapterRestClient(adapterRestPropertiesMock, new URI(""));
+        // when
+        testedObject.initializeHeaderMap(headerMap);
+        // then
+        assertThat(headerMap).containsOnly(entry("Authorization", null));
+    }
+
+    @Test
+    public void initializeHeaderMap_putNullToMapWhenExOccurs() throws URISyntaxException, GeneralSecurityException {
+        // given
+        String encyptedMessage = CryptoUtils.encrypt("testAdapter", CRYPTO_KEY);
+        when(adapterRestPropertiesMock.getAuth()).thenReturn(encyptedMessage);
+        when(adapterRestPropertiesMock.getKey()).thenReturn(INVALID_CRYPTO_KEY);
+        AdapterRestClient testedObject = new AdapterRestClient(adapterRestPropertiesMock, new URI(""),
+                "accept", "contentType");
+        // when
+        testedObject.initializeHeaderMap(headerMap);
+        // then
+        assertThat(headerMap).containsOnly(entry("Authorization", null));
+    }
+
+    @Test
+    public void getTargetEntity_success() throws URISyntaxException {
+        AdapterRestClient testedObject = new AdapterRestClient(adapterRestPropertiesMock, new URI(""));
+        assertThat(testedObject.getTargetEntity()).isEqualTo(TargetEntity.OPENSTACK_ADAPTER);
+    }
+
+    @Test
+    public void getCommonObjectMapperProvider_success() throws URISyntaxException {
+        AdapterRestClient testedObject = new AdapterRestClient(adapterRestPropertiesMock, new URI(""));
+        assertThat(testedObject.getCommonObjectMapperProvider()).isInstanceOf(JettisonStyleMapperProvider.class);
+    }
+
+    private String getExpectedEncodedString(String encryptedMessage) throws GeneralSecurityException {
+        String auth = CryptoUtils.decrypt(encryptedMessage, CRYPTO_KEY);
+        byte[] encoded = Base64.encodeBase64(auth.getBytes());
+        String encodedString = new String(encoded);
+        return "Basic " + encodedString;
+    }
+}
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai;
+package org.onap.so.client.graphinventory;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -35,6 +35,8 @@ import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.aai.domain.yang.GenericVnf;
+import org.onap.so.client.aai.AAICommonObjectMapperProvider;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
 
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.databind.JsonMappingException;
@@ -42,13 +44,13 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 
 
 @RunWith(MockitoJUnitRunner.class)
-public class AAIPatchConverterTest {
+public class GraphInventoryPatchConverterTest {
 
        private ObjectMapper mapper = new AAICommonObjectMapperProvider().getMapper();
 
        @Test
        public void convertObjectToPatchFormatTest() throws URISyntaxException, JsonParseException, JsonMappingException, IOException {
-               AAIPatchConverter validator = new AAIPatchConverter();
+               GraphInventoryPatchConverter validator = new GraphInventoryPatchConverter();
                GenericVnf vnf = new GenericVnf();
                vnf.setIpv4Loopback0Address("");
                String result = validator.marshallObjectToPatchFormat(vnf);
@@ -60,7 +62,7 @@ public class AAIPatchConverterTest {
        
        @Test
        public void convertStringToPatchFormatTest() throws URISyntaxException, JsonParseException, JsonMappingException, IOException {
-               AAIPatchConverter validator = new AAIPatchConverter();
+               GraphInventoryPatchConverter validator = new GraphInventoryPatchConverter();
                String payload = "{\"ipv4-loopback0-address\":\"\"}";
                String result = validator.marshallObjectToPatchFormat(payload);
                
@@ -69,7 +71,7 @@ public class AAIPatchConverterTest {
        
        @Test
        public void convertStringToPatchFormatNull_Test() throws URISyntaxException, JsonParseException, JsonMappingException, IOException {
-               AAIPatchConverter validator = new AAIPatchConverter();
+               GraphInventoryPatchConverter validator = new GraphInventoryPatchConverter();
                String payload = "{\"ipv4-loopback0-address\": null}";
                String result = validator.marshallObjectToPatchFormat(payload);
                System.out.println(result);
@@ -78,7 +80,7 @@ public class AAIPatchConverterTest {
        
        @Test
        public void convertMapToPatchFormatTest() throws URISyntaxException, JsonParseException, JsonMappingException, IOException {
-               AAIPatchConverter validator = new AAIPatchConverter();
+               GraphInventoryPatchConverter validator = new GraphInventoryPatchConverter();
                HashMap<String, String> map = new HashMap<>();
                map.put("ipv4-loopback0-address", "");
                map.put("ipv4-loopback1-address", "192.168.1.1");
@@ -89,7 +91,7 @@ public class AAIPatchConverterTest {
        
        @Test
        public void hasComplexObjectTest() {
-               AAIPatchConverter validator = new AAIPatchConverter();
+               GraphInventoryPatchConverter validator = new GraphInventoryPatchConverter();
                String hasNesting = "{ \"hello\" : \"world\", \"nested\" : { \"key\" : \"value\" } }";
                String noNesting = "{ \"hello\" : \"world\" }";
                String arrayCase = "{ \"hello\" : \"world\", \"nestedSimple\" : [\"value1\" , \"value2\"], \"nestedComplex\" : [{\"key\" : \"value\"}]}";