From a577f75663e5c8ccddee54337328425c5b2361d2 Mon Sep 17 00:00:00 2001 From: "Benjamin, Max" Date: Mon, 16 Mar 2020 12:01:26 -0400 Subject: split single and plural graph inventory uris split single and plural graph inventory uris updated all object references in MSO using graph inventory plurals corrected unit test stubbings added additional unit tests correct interfaces to return plural after related-to modified the way http aware uris are built reformated interfaces to no longer duplicate methods corrected issues with identity of unbuilt uris removed AAIUri references from groovy files fixed clone behavior on Uri objects Issue-ID: SO-2743 Signed-off-by: Benjamin, Max (mb388a) Change-Id: I37aa2a13dcbf010b6c82ad73af3be5db5d9bd673 --- .../java/org/onap/so/client/aai/AAIClient.java | 8 +- .../java/org/onap/so/client/aai/AAIObjectBase.java | 7 + .../org/onap/so/client/aai/AAIObjectPlurals.java | 74 ++++--- .../java/org/onap/so/client/aai/AAIObjectType.java | 78 ++++++- .../org/onap/so/client/aai/AAIResourcesClient.java | 16 +- .../so/client/aai/AAISingleTransactionClient.java | 9 +- .../onap/so/client/aai/AAITransactionalClient.java | 9 +- .../aai/entities/uri/AAIBaseResourceUri.java | 29 +++ .../aai/entities/uri/AAIPluralResourceUri.java | 9 + .../so/client/aai/entities/uri/AAIResourceUri.java | 60 +----- .../aai/entities/uri/AAISimplePluralUri.java | 68 ++++++ .../so/client/aai/entities/uri/AAISimpleUri.java | 98 ++------- .../onap/so/client/aai/entities/uri/AAIUri.java | 51 +---- .../so/client/aai/entities/uri/AAIUriFactory.java | 24 +-- .../so/client/aai/entities/uri/HttpLookupUri.java | 23 +- .../so/client/aai/entities/uri/NodesPluralUri.java | 19 ++ .../so/client/aai/entities/uri/NodesSingleUri.java | 21 ++ .../onap/so/client/aai/entities/uri/NodesUri.java | 27 +-- .../graphinventory/GraphInventoryClient.java | 18 +- .../graphinventory/GraphInventoryObjectBase.java | 9 + .../GraphInventoryObjectPlurals.java | 5 +- .../graphinventory/GraphInventoryObjectType.java | 3 +- .../GraphInventoryResourcesClient.java | 135 ++++++++++-- .../GraphInventoryTransactionClient.java | 45 ++-- .../entities/GraphInventoryRelationships.java | 4 +- .../uri/GraphInventoryPluralResourceUri.java | 8 + .../entities/uri/GraphInventoryResourceUri.java | 39 +--- .../uri/GraphInventorySingleResourceUri.java | 16 ++ .../entities/uri/GraphInventoryUri.java | 26 ++- .../graphinventory/entities/uri/HttpAwareUri.java | 5 +- .../graphinventory/entities/uri/SimpleBaseUri.java | 237 ++++++++++++++++++++ .../entities/uri/SimplePluralUri.java | 77 +++++++ .../graphinventory/entities/uri/SimpleUri.java | 239 ++------------------- .../GraphInventoryMultipleItemsException.java | 13 ++ .../org/onap/so/client/aai/AAIObjectTypeTest.java | 8 +- .../org/onap/so/client/aai/AAIQueryClientTest.java | 11 +- .../onap/so/client/aai/AAIResourcesClientTest.java | 107 +++++++++ .../so/client/aai/AAITransactionalClientTest.java | 4 +- .../java/org/onap/so/client/aai/AAIURITest.java | 4 +- .../so/client/aai/entities/RelationshipsTest.java | 3 - .../uri/AAISimpleUriFromParentUriTest.java | 2 +- .../aai/entities/uri/AAISimpleUriFromUriTest.java | 18 +- .../client/aai/entities/uri/AAISimpleUriTest.java | 49 +++-- .../client/aai/entities/uri/AAIUriFactoryTest.java | 12 +- .../uri/AllottedResourceLookupUriTest.java | 2 +- .../entities/uri/IncorrectNumberOfUriKeysTest.java | 4 +- .../aai/entities/uri/ServiceInstanceUriTest.java | 45 +++- 47 files changed, 1113 insertions(+), 665 deletions(-) create mode 100644 common/src/main/java/org/onap/so/client/aai/AAIObjectBase.java create mode 100644 common/src/main/java/org/onap/so/client/aai/entities/uri/AAIBaseResourceUri.java create mode 100644 common/src/main/java/org/onap/so/client/aai/entities/uri/AAIPluralResourceUri.java create mode 100644 common/src/main/java/org/onap/so/client/aai/entities/uri/AAISimplePluralUri.java create mode 100644 common/src/main/java/org/onap/so/client/aai/entities/uri/NodesPluralUri.java create mode 100644 common/src/main/java/org/onap/so/client/aai/entities/uri/NodesSingleUri.java create mode 100644 common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectBase.java create mode 100644 common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryPluralResourceUri.java create mode 100644 common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventorySingleResourceUri.java create mode 100644 common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleBaseUri.java create mode 100644 common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimplePluralUri.java create mode 100644 common/src/main/java/org/onap/so/client/graphinventory/exceptions/GraphInventoryMultipleItemsException.java (limited to 'common') diff --git a/common/src/main/java/org/onap/so/client/aai/AAIClient.java b/common/src/main/java/org/onap/so/client/aai/AAIClient.java index a1e0d7c102..d376d85a83 100644 --- a/common/src/main/java/org/onap/so/client/aai/AAIClient.java +++ b/common/src/main/java/org/onap/so/client/aai/AAIClient.java @@ -25,7 +25,6 @@ import javax.ws.rs.NotFoundException; import javax.ws.rs.core.UriBuilder; import org.onap.so.client.RestClient; import org.onap.so.client.graphinventory.GraphInventoryClient; -import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri; import org.onap.so.client.graphinventory.exceptions.GraphInventoryUriComputationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,14 +45,15 @@ public class AAIClient extends GraphInventoryClient { } @Override - protected URI constructPath(GraphInventoryUri uri) { + protected URI constructPath(URI uri) { - return UriBuilder.fromUri(AAI_ROOT + "/" + this.getVersion().toString() + uri.build().toString()).build(); + return UriBuilder.fromUri(AAI_ROOT + "/" + this.getVersion().toString() + uri.toString()).build(); } @Override - public RestClient createClient(GraphInventoryUri uri) { + protected RestClient createClient(URI uri) { try { + return new AAIRestClient(getRestProperties(), constructPath(uri)); } catch (GraphInventoryUriComputationException | NotFoundException e) { logger.debug("failed to construct A&AI uri", e); diff --git a/common/src/main/java/org/onap/so/client/aai/AAIObjectBase.java b/common/src/main/java/org/onap/so/client/aai/AAIObjectBase.java new file mode 100644 index 0000000000..dab3cda32b --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIObjectBase.java @@ -0,0 +1,7 @@ +package org.onap.so.client.aai; + +import org.onap.so.client.graphinventory.GraphInventoryObjectBase; + +public interface AAIObjectBase extends GraphInventoryObjectBase { + +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIObjectPlurals.java b/common/src/main/java/org/onap/so/client/aai/AAIObjectPlurals.java index e42a2a2383..d14a4bedc3 100644 --- a/common/src/main/java/org/onap/so/client/aai/AAIObjectPlurals.java +++ b/common/src/main/java/org/onap/so/client/aai/AAIObjectPlurals.java @@ -25,63 +25,64 @@ import org.onap.so.client.graphinventory.GraphInventoryObjectPlurals; import org.onap.so.constants.Defaults; import com.google.common.base.CaseFormat; -public class AAIObjectPlurals implements GraphInventoryObjectPlurals, Serializable { +public class AAIObjectPlurals implements AAIObjectBase, GraphInventoryObjectPlurals, Serializable { private static final long serialVersionUID = 5312713297525740746L; public static final AAIObjectPlurals CUSTOMER = - new AAIObjectPlurals(AAINamespaceConstants.BUSINESS, "/customers", "customer"); + new AAIObjectPlurals(AAIObjectType.CUSTOMER, AAINamespaceConstants.BUSINESS, "/customers"); public static final AAIObjectPlurals GENERIC_VNF = - new AAIObjectPlurals(AAINamespaceConstants.NETWORK, "/generic-vnfs", "generic-vnf"); + new AAIObjectPlurals(AAIObjectType.GENERIC_VNF, AAINamespaceConstants.NETWORK, "/generic-vnfs"); public static final AAIObjectPlurals PORT_GROUP = - new AAIObjectPlurals(AAIObjectType.VCE.uriTemplate(), "/port-groups", "port-group"); + new AAIObjectPlurals(AAIObjectType.PORT_GROUP, AAIObjectType.VCE.uriTemplate(), "/port-groups"); public static final AAIObjectPlurals PSERVER = - new AAIObjectPlurals(AAINamespaceConstants.CLOUD_INFRASTRUCTURE, "/pservers", "pserver"); + new AAIObjectPlurals(AAIObjectType.PSERVER, AAINamespaceConstants.CLOUD_INFRASTRUCTURE, "/pservers"); public static final AAIObjectPlurals P_INTERFACE = - new AAIObjectPlurals(AAIObjectType.PSERVER.uriTemplate(), "/p-interfaces", "p-interface"); + new AAIObjectPlurals(AAIObjectType.P_INTERFACE, AAIObjectType.PSERVER.uriTemplate(), "/p-interfaces"); public static final AAIObjectPlurals L3_NETWORK = - new AAIObjectPlurals(AAINamespaceConstants.NETWORK, "/l3-networks", "l3-network"); + new AAIObjectPlurals(AAIObjectType.L3_NETWORK, AAINamespaceConstants.NETWORK, "/l3-networks"); public static final AAIObjectPlurals NETWORK_POLICY = - new AAIObjectPlurals(AAINamespaceConstants.NETWORK, "/network-policies", "network-policy"); + new AAIObjectPlurals(AAIObjectType.NETWORK_POLICY, AAINamespaceConstants.NETWORK, "/network-policies"); public static final AAIObjectPlurals VPN_BINDING = - new AAIObjectPlurals(AAINamespaceConstants.NETWORK, "/vpn-bindings", "vpn-binding"); - public static final AAIObjectPlurals SERVICE_SUBSCRIPTION = new AAIObjectPlurals( - AAIObjectType.CUSTOMER.uriTemplate(), "/service-subscriptions", "service-subscription"); - public static final AAIObjectPlurals SERVICE_INSTANCE = new AAIObjectPlurals( - AAIObjectType.SERVICE_SUBSCRIPTION.uriTemplate(), "/service-instances", "service-instance"); + new AAIObjectPlurals(AAIObjectType.VPN_BINDING, AAINamespaceConstants.NETWORK, "/vpn-bindings"); + public static final AAIObjectPlurals SERVICE_SUBSCRIPTION = new AAIObjectPlurals(AAIObjectType.SERVICE_SUBSCRIPTION, + AAIObjectType.CUSTOMER.uriTemplate(), "/service-subscriptions"); + public static final AAIObjectPlurals SERVICE_INSTANCE = new AAIObjectPlurals(AAIObjectType.SERVICE_INSTANCE, + AAIObjectType.SERVICE_SUBSCRIPTION.uriTemplate(), "/service-instances"); public static final AAIObjectPlurals OWNING_ENTITY = - new AAIObjectPlurals(AAINamespaceConstants.BUSINESS, "/owning-entities", "owning-entity"); - public static final AAIObjectPlurals VOLUME_GROUP = - new AAIObjectPlurals(AAIObjectType.CLOUD_REGION.uriTemplate(), "/volume-groups", "volume-group"); - public static final AAIObjectPlurals AVAILIBILITY_ZONE = - new AAIObjectPlurals(AAIObjectType.CLOUD_REGION.uriTemplate(), "/availability-zones", "availability-zone"); + new AAIObjectPlurals(AAIObjectType.OWNING_ENTITY, AAINamespaceConstants.BUSINESS, "/owning-entities"); + public static final AAIObjectPlurals VOLUME_GROUP = new AAIObjectPlurals(AAIObjectType.VOLUME_GROUP, + AAIObjectType.CLOUD_REGION.uriTemplate(), "/volume-groups"); + public static final AAIObjectPlurals AVAILIBILITY_ZONE = new AAIObjectPlurals(AAIObjectType.AVAILIBILITY_ZONE, + AAIObjectType.CLOUD_REGION.uriTemplate(), "/availability-zones"); public static final AAIObjectPlurals VF_MODULE = - new AAIObjectPlurals(AAIObjectType.GENERIC_VNF.uriTemplate(), "/vf-modules", "vf-module"); + new AAIObjectPlurals(AAIObjectType.VF_MODULE, AAIObjectType.GENERIC_VNF.uriTemplate(), "/vf-modules"); public static final AAIObjectPlurals CONFIGURATION = - new AAIObjectPlurals(AAINamespaceConstants.NETWORK, "/configurations", "configuration"); + new AAIObjectPlurals(AAIObjectType.CONFIGURATION, AAINamespaceConstants.NETWORK, "/configurations"); public static final AAIObjectPlurals DEFAULT_TENANT = - new AAIObjectPlurals(AAINamespaceConstants.CLOUD_INFRASTRUCTURE + "/cloud-regions/cloud-region/" - + Defaults.CLOUD_OWNER + "/AAIAIC25", "/tenants", "default-tenant"); - public static final AAIObjectPlurals NETWORK_TECHNOLOGY = new AAIObjectPlurals( - AAINamespaceConstants.CLOUD_INFRASTRUCTURE, "/network-technologies", "network-technology"); + new AAIObjectPlurals(AAIObjectType.DEFAULT_TENANT, AAINamespaceConstants.CLOUD_INFRASTRUCTURE + + "/cloud-regions/cloud-region/" + Defaults.CLOUD_OWNER + "/AAIAIC25", "/tenants"); + public static final AAIObjectPlurals NETWORK_TECHNOLOGY = new AAIObjectPlurals(AAIObjectType.NETWORK_TECHNOLOGY, + AAINamespaceConstants.CLOUD_INFRASTRUCTURE, "/network-technologies"); public static final AAIObjectPlurals LOGICAL_LINK = - new AAIObjectPlurals(AAINamespaceConstants.NETWORK, "/logical-links", "logical-link"); + new AAIObjectPlurals(AAIObjectType.LOGICAL_LINK, AAINamespaceConstants.NETWORK, "/logical-links"); public static final AAIObjectPlurals L_INTERFACE = - new AAIObjectPlurals(AAIObjectType.VSERVER.uriTemplate(), "/l-interfaces", "l-interface"); + new AAIObjectPlurals(AAIObjectType.L_INTERFACE, AAIObjectType.VSERVER.uriTemplate(), "/l-interfaces"); public static final AAIObjectPlurals SUB_L_INTERFACE = - new AAIObjectPlurals(AAIObjectType.L_INTERFACE.uriTemplate(), "/l-interfaces", "l-interface"); + new AAIObjectPlurals(AAIObjectType.L_INTERFACE, AAIObjectType.L_INTERFACE.uriTemplate(), "/l-interfaces"); public static final AAIObjectPlurals INSTANCE_GROUP = - new AAIObjectPlurals(AAINamespaceConstants.NETWORK, "/instance-groups", "instance-group"); - public static final AAIObjectPlurals PNF = new AAIObjectPlurals(AAINamespaceConstants.NETWORK, "/pnfs", "pnfs"); + new AAIObjectPlurals(AAIObjectType.INSTANCE_GROUP, AAINamespaceConstants.NETWORK, "/instance-groups"); + public static final AAIObjectPlurals PNF = + new AAIObjectPlurals(AAIObjectType.PNF, AAINamespaceConstants.NETWORK, "/pnfs"); private final String uriTemplate; private final String partialUri; - private final String name; + private final AAIObjectType type; - protected AAIObjectPlurals(String parentUri, String partialUri, String name) { + protected AAIObjectPlurals(AAIObjectType type, String parentUri, String partialUri) { this.uriTemplate = parentUri + partialUri; this.partialUri = partialUri; - this.name = name; + this.type = type; } @Override @@ -99,13 +100,18 @@ public class AAIObjectPlurals implements GraphInventoryObjectPlurals, Serializab return this.partialUri; } + @Override + public AAIObjectType getType() { + return this.type; + } + @Override public String typeName() { - return this.typeName(CaseFormat.LOWER_HYPHEN); + return this.getType().typeName(); } @Override public String typeName(CaseFormat format) { - return CaseFormat.LOWER_HYPHEN.to(format, this.name); + return this.getType().typeName(format); } } diff --git a/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java b/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java index 7de60181a6..c9b69cd9e4 100644 --- a/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java +++ b/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java @@ -22,7 +22,58 @@ package org.onap.so.client.aai; import com.google.common.base.CaseFormat; import org.onap.aai.annotations.Metadata; -import org.onap.aai.domain.yang.*; +import org.onap.aai.domain.yang.AggregateRoute; +import org.onap.aai.domain.yang.AllottedResource; +import org.onap.aai.domain.yang.AvailabilityZone; +import org.onap.aai.domain.yang.CloudRegion; +import org.onap.aai.domain.yang.Collection; +import org.onap.aai.domain.yang.CommunicationServiceProfile; +import org.onap.aai.domain.yang.Complex; +import org.onap.aai.domain.yang.Configuration; +import org.onap.aai.domain.yang.Connector; +import org.onap.aai.domain.yang.Customer; +import org.onap.aai.domain.yang.Device; +import org.onap.aai.domain.yang.EsrVnfm; +import org.onap.aai.domain.yang.ExtAaiNetwork; +import org.onap.aai.domain.yang.Flavor; +import org.onap.aai.domain.yang.GenericVnf; +import org.onap.aai.domain.yang.Image; +import org.onap.aai.domain.yang.InstanceGroup; +import org.onap.aai.domain.yang.L3Network; +import org.onap.aai.domain.yang.LInterface; +import org.onap.aai.domain.yang.LineOfBusiness; +import org.onap.aai.domain.yang.LogicalLink; +import org.onap.aai.domain.yang.ModelVer; +import org.onap.aai.domain.yang.NetworkPolicy; +import org.onap.aai.domain.yang.NetworkTechnology; +import org.onap.aai.domain.yang.OperationalEnvironment; +import org.onap.aai.domain.yang.OwningEntity; +import org.onap.aai.domain.yang.PInterface; +import org.onap.aai.domain.yang.PhysicalLink; +import org.onap.aai.domain.yang.Platform; +import org.onap.aai.domain.yang.Pnf; +import org.onap.aai.domain.yang.PortGroup; +import org.onap.aai.domain.yang.Project; +import org.onap.aai.domain.yang.Pserver; +import org.onap.aai.domain.yang.RouteTableReference; +import org.onap.aai.domain.yang.Service; +import org.onap.aai.domain.yang.ServiceInstance; +import org.onap.aai.domain.yang.ServiceProfile; +import org.onap.aai.domain.yang.ServiceSubscription; +import org.onap.aai.domain.yang.SliceProfile; +import org.onap.aai.domain.yang.SpPartner; +import org.onap.aai.domain.yang.SriovPf; +import org.onap.aai.domain.yang.Subnet; +import org.onap.aai.domain.yang.Tenant; +import org.onap.aai.domain.yang.TunnelXconnect; +import org.onap.aai.domain.yang.Vce; +import org.onap.aai.domain.yang.VfModule; +import org.onap.aai.domain.yang.VlanTag; +import org.onap.aai.domain.yang.Vnfc; +import org.onap.aai.domain.yang.VolumeGroup; +import org.onap.aai.domain.yang.VpnBinding; +import org.onap.aai.domain.yang.Vserver; +import org.onap.aai.domain.yang.Zone; import org.onap.so.client.graphinventory.GraphInventoryObjectType; import org.onap.so.constants.Defaults; import org.reflections.Reflections; @@ -36,7 +87,7 @@ import java.util.Map; import java.util.Set; import java.util.regex.Pattern; -public class AAIObjectType implements GraphInventoryObjectType, Serializable { +public class AAIObjectType implements AAIObjectBase, GraphInventoryObjectType, Serializable { private static final long serialVersionUID = -2877184776691514600L; private static Map map = new HashMap<>(); @@ -109,6 +160,8 @@ public class AAIObjectType implements GraphInventoryObjectType, Serializable { new AAIObjectType(AAIObjectType.PSERVER.uriTemplate(), PInterface.class); public static final AAIObjectType SRIOV_PF = new AAIObjectType(AAIObjectType.P_INTERFACE.uriTemplate(), SriovPf.class); + public static final AAIObjectType LOGICAL_LINK = + new AAIObjectType(AAINamespaceConstants.NETWORK, LogicalLink.class); public static final AAIObjectType PHYSICAL_LINK = new AAIObjectType(AAINamespaceConstants.NETWORK, PhysicalLink.class); public static final AAIObjectType INSTANCE_GROUP = @@ -135,7 +188,15 @@ public class AAIObjectType implements GraphInventoryObjectType, Serializable { public static final AAIObjectType IMAGE = new AAIObjectType(AAIObjectType.CLOUD_REGION.uriTemplate(), Image.class); public static final AAIObjectType FLAVOR = new AAIObjectType(AAIObjectType.CLOUD_REGION.uriTemplate(), Flavor.class); - public static final AAIObjectType UNKNOWN = new AAIObjectType("", "", "unknown"); + public static final AAIObjectType UNKNOWN = new AAIObjectType("", "", "unknown") { + + private static final long serialVersionUID = 9208984071038447607L; + + @Override + public boolean passThrough() { + return true; + } + }; public static final AAIObjectType DSL = new AAIObjectType("/dsl", "", "dsl"); public static final AAIObjectType VNFM = new AAIObjectType( AAINamespaceConstants.EXTERNAL_SYSTEM + "/esr-vnfm-list/esr-vnfm/{vnfm-id}", EsrVnfm.class); @@ -147,6 +208,8 @@ public class AAIObjectType implements GraphInventoryObjectType, Serializable { public static final AAIObjectType CLOUD_ESR_SYSTEM_INFO_LIST = new AAIObjectType( AAIObjectType.CLOUD_REGION.uriTemplate(), "/esr-system-info-list", "cloud-esr-system-info-list"); public static final AAIObjectType ZONE = new AAIObjectType(AAINamespaceConstants.NETWORK, Zone.class); + public static final AAIObjectType AVAILIBILITY_ZONE = + new AAIObjectType(AAIObjectType.CLOUD_REGION.uriTemplate(), AvailabilityZone.class); public static final AAIObjectType THIRDPARTY_SDNC_LIST = new AAIObjectType(AAINamespaceConstants.EXTERNAL_SYSTEM, "/esr-thirdparty-sdnc-list", "thirdparty-sdnc-list"); public static final AAIObjectType THIRDPARTY_SDNC_SYSTEM_INFO_LIST = @@ -180,12 +243,13 @@ public class AAIObjectType implements GraphInventoryObjectType, Serializable { new Reflections(new ConfigurationBuilder().setUrls(packages).setScanners(new SubTypesScanner())); Set> resources = r.getSubTypesOf(AAIObjectType.class); - try { - for (Class customTypeClass : resources) { - AAIObjectType customType; + + for (Class customTypeClass : resources) { + AAIObjectType customType; + try { customType = customTypeClass.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { } - } catch (InstantiationException | IllegalAccessException e) { } } diff --git a/common/src/main/java/org/onap/so/client/aai/AAIResourcesClient.java b/common/src/main/java/org/onap/so/client/aai/AAIResourcesClient.java index a89bea6975..8e334de396 100644 --- a/common/src/main/java/org/onap/so/client/aai/AAIResourcesClient.java +++ b/common/src/main/java/org/onap/so/client/aai/AAIResourcesClient.java @@ -24,13 +24,14 @@ import java.util.Optional; import org.onap.aai.domain.yang.Relationship; import org.onap.so.client.aai.entities.AAIEdgeLabel; import org.onap.so.client.aai.entities.AAIResultWrapper; +import org.onap.so.client.aai.entities.uri.AAIBaseResourceUri; +import org.onap.so.client.aai.entities.uri.AAIPluralResourceUri; import org.onap.so.client.aai.entities.uri.AAIResourceUri; import org.onap.so.client.graphinventory.GraphInventoryResourcesClient; import org.onap.so.client.graphinventory.entities.GraphInventoryEdgeLabel; -import org.onap.so.client.graphinventory.entities.uri.GraphInventoryResourceUri; public class AAIResourcesClient extends - GraphInventoryResourcesClient { + GraphInventoryResourcesClient, AAIResourceUri, AAIPluralResourceUri, AAIEdgeLabel, AAIResultWrapper, AAITransactionalClient, AAISingleTransactionClient> { private AAIClient aaiClient; @@ -54,6 +55,11 @@ public class AAIResourcesClient extends return new AAIResultWrapper(json); } + @Override + public AAIResultWrapper createWrapper(Object obj) { + return new AAIResultWrapper(obj); + } + @Override public AAITransactionalClient beginTransaction() { return new AAITransactionalClient(this, aaiClient); @@ -65,17 +71,17 @@ public class AAIResourcesClient extends } @Override - protected Relationship buildRelationship(GraphInventoryResourceUri uri) { + protected Relationship buildRelationship(AAIResourceUri uri) { return super.buildRelationship(uri, Optional.empty()); } @Override - protected Relationship buildRelationship(GraphInventoryResourceUri uri, GraphInventoryEdgeLabel label) { + protected Relationship buildRelationship(AAIResourceUri uri, GraphInventoryEdgeLabel label) { return super.buildRelationship(uri, Optional.of(label)); } @Override - protected Relationship buildRelationship(GraphInventoryResourceUri uri, Optional label) { + protected Relationship buildRelationship(AAIResourceUri uri, Optional label) { return super.buildRelationship(uri, label); } diff --git a/common/src/main/java/org/onap/so/client/aai/AAISingleTransactionClient.java b/common/src/main/java/org/onap/so/client/aai/AAISingleTransactionClient.java index 3f9715bdef..b1d29f445b 100644 --- a/common/src/main/java/org/onap/so/client/aai/AAISingleTransactionClient.java +++ b/common/src/main/java/org/onap/so/client/aai/AAISingleTransactionClient.java @@ -32,6 +32,7 @@ import org.onap.so.client.aai.entities.singletransaction.OperationBodyRequest; import org.onap.so.client.aai.entities.singletransaction.OperationBodyResponse; import org.onap.so.client.aai.entities.singletransaction.SingleTransactionRequest; import org.onap.so.client.aai.entities.singletransaction.SingleTransactionResponse; +import org.onap.so.client.aai.entities.uri.AAIBaseResourceUri; import org.onap.so.client.aai.entities.uri.AAIResourceUri; import org.onap.so.client.aai.entities.uri.AAIUriFactory; import org.onap.so.client.graphinventory.GraphInventoryPatchConverter; @@ -40,8 +41,8 @@ import org.onap.so.client.graphinventory.exceptions.BulkProcessFailed; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Joiner; -public class AAISingleTransactionClient - extends GraphInventoryTransactionClient { +public class AAISingleTransactionClient extends + GraphInventoryTransactionClient, AAIResourceUri, AAIEdgeLabel> { private final SingleTransactionRequest request; private AAIResourcesClient resourcesClient; @@ -137,12 +138,12 @@ public class AAISingleTransactionClient } @Override - protected Optional get(GenericType genericType, AAIResourceUri clone) { + protected Optional get(GenericType genericType, AAIBaseResourceUri clone) { return resourcesClient.get(genericType, clone); } @Override - protected boolean exists(AAIResourceUri uri) { + protected boolean exists(AAIBaseResourceUri uri) { return resourcesClient.exists(uri); } diff --git a/common/src/main/java/org/onap/so/client/aai/AAITransactionalClient.java b/common/src/main/java/org/onap/so/client/aai/AAITransactionalClient.java index e621566e5a..7b7dccc999 100644 --- a/common/src/main/java/org/onap/so/client/aai/AAITransactionalClient.java +++ b/common/src/main/java/org/onap/so/client/aai/AAITransactionalClient.java @@ -35,6 +35,7 @@ import org.onap.so.client.aai.entities.AAIError; 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.AAIBaseResourceUri; import org.onap.so.client.aai.entities.uri.AAIResourceUri; import org.onap.so.client.aai.entities.uri.AAIUriFactory; import org.onap.so.client.graphinventory.GraphInventoryPatchConverter; @@ -45,8 +46,8 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Joiner; -public class AAITransactionalClient - extends GraphInventoryTransactionClient { +public class AAITransactionalClient extends + GraphInventoryTransactionClient, AAIResourceUri, AAIEdgeLabel> { private final Transactions transactions; private Transaction currentTransaction; @@ -189,12 +190,12 @@ public class AAITransactionalClient } @Override - protected Optional get(GenericType genericType, AAIResourceUri clone) { + protected Optional get(GenericType genericType, AAIBaseResourceUri clone) { return resourcesClient.get(genericType, clone); } @Override - protected boolean exists(AAIResourceUri uri) { + protected boolean exists(AAIBaseResourceUri uri) { return resourcesClient.exists(uri); } diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIBaseResourceUri.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIBaseResourceUri.java new file mode 100644 index 0000000000..67f858a2bf --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIBaseResourceUri.java @@ -0,0 +1,29 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.so.client.aai.entities.uri; + +import org.onap.so.client.aai.AAIObjectBase; +import org.onap.so.client.graphinventory.entities.uri.GraphInventoryResourceUri; + +public interface AAIBaseResourceUri, OT extends AAIObjectBase> + extends AAIUri, GraphInventoryResourceUri { + +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIPluralResourceUri.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIPluralResourceUri.java new file mode 100644 index 0000000000..2cec021c95 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIPluralResourceUri.java @@ -0,0 +1,9 @@ +package org.onap.so.client.aai.entities.uri; + +import org.onap.so.client.aai.AAIObjectPlurals; +import org.onap.so.client.graphinventory.entities.uri.GraphInventoryPluralResourceUri; + +public interface AAIPluralResourceUri extends AAIBaseResourceUri, + GraphInventoryPluralResourceUri { + +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIResourceUri.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIResourceUri.java index 70dfd581e8..e93d52889a 100644 --- a/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIResourceUri.java +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIResourceUri.java @@ -1,64 +1,10 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP - SO - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - package org.onap.so.client.aai.entities.uri; import org.onap.so.client.aai.AAIObjectPlurals; import org.onap.so.client.aai.AAIObjectType; -import org.onap.so.client.graphinventory.Format; -import org.onap.so.client.graphinventory.entities.uri.Depth; -import org.onap.so.client.graphinventory.entities.uri.GraphInventoryResourceUri; - -public interface AAIResourceUri extends AAIUri, GraphInventoryResourceUri { - - public AAIResourceUri relationshipAPI(); - - public AAIResourceUri relatedTo(AAIObjectPlurals plural); - - public AAIResourceUri relatedTo(AAIObjectType type, String... values); - - public AAIResourceUri resourceVersion(String version); - - public AAIResourceUri format(Format format); - - @Override - public AAIResourceUri depth(Depth depth); - - @Override - public AAIResourceUri nodesOnly(boolean nodesOnly); - - @Override - public AAIResourceUri queryParam(String name, String... values); - - @Override - public AAIResourceUri replaceQueryParam(String name, String... values); - - @Override - public AAIResourceUri resultIndex(int index); - - @Override - public AAIResourceUri resultSize(int size); +import org.onap.so.client.graphinventory.entities.uri.GraphInventorySingleResourceUri; - @Override - public AAIResourceUri limit(int size); +public interface AAIResourceUri extends AAIBaseResourceUri, + GraphInventorySingleResourceUri { - @Override - public AAIResourceUri clone(); } diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/AAISimplePluralUri.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAISimplePluralUri.java new file mode 100644 index 0000000000..9ab45a8aa9 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAISimplePluralUri.java @@ -0,0 +1,68 @@ +/*- + * ============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.aai.entities.uri; + +import javax.ws.rs.core.UriBuilder; +import org.onap.so.client.aai.AAIObjectPlurals; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.graphinventory.entities.uri.SimplePluralUri; + +public class AAISimplePluralUri + extends SimplePluralUri + implements AAIPluralResourceUri { + + private static final long serialVersionUID = -6397024057188453229L; + + protected AAISimplePluralUri(AAIObjectPlurals type, UriBuilder builder, Object... values) { + super(type, builder, values); + } + + protected AAISimplePluralUri(AAIObjectPlurals type) { + super(type); + } + + protected AAISimplePluralUri(AAIObjectPlurals type, Object... values) { + super(type, values); + } + + protected AAISimplePluralUri(AAIObjectPlurals type, AAIResourceUri uri) { + super(type, uri); + } + + protected AAISimplePluralUri(AAIResourceUri parentUri, AAIObjectPlurals childType) { + super(parentUri, childType); + } + + protected AAISimplePluralUri(AAISimplePluralUri copy) { + super(copy); + } + + @Override + public AAISimplePluralUri clone() { + return new AAISimplePluralUri(this); + } + + @Override + public AAIObjectPlurals getObjectType() { + return this.pluralType; + } + +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/AAISimpleUri.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAISimpleUri.java index 1fe9da984f..49dab59fc1 100644 --- a/common/src/main/java/org/onap/so/client/aai/entities/uri/AAISimpleUri.java +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAISimpleUri.java @@ -21,15 +21,13 @@ package org.onap.so.client.aai.entities.uri; import java.net.URI; -import java.util.regex.Pattern; import javax.ws.rs.core.UriBuilder; import org.onap.so.client.aai.AAIObjectPlurals; import org.onap.so.client.aai.AAIObjectType; -import org.onap.so.client.graphinventory.Format; -import org.onap.so.client.graphinventory.entities.uri.Depth; import org.onap.so.client.graphinventory.entities.uri.SimpleUri; -public class AAISimpleUri extends SimpleUri implements AAIResourceUri { +public class AAISimpleUri extends SimpleUri + implements AAIResourceUri { private static final long serialVersionUID = -6397024057188453229L; @@ -46,102 +44,30 @@ public class AAISimpleUri extends SimpleUri implements AAIResourceUri { super(type, builder, values); } - protected AAISimpleUri(AAIObjectPlurals type, UriBuilder builder, Object... values) { - super(type, builder, values); - } - - protected AAISimpleUri(AAIObjectPlurals type) { - super(type); - } - - protected AAISimpleUri(AAIObjectPlurals type, Object... values) { - super(type, values); - } - protected AAISimpleUri(AAIResourceUri parentUri, AAIObjectType childType, Object... childValues) { super(parentUri, childType, childValues); } - protected AAISimpleUri(AAIResourceUri parentUri, AAIObjectPlurals childType) { - super(parentUri, childType); - } - - @Override - public AAISimpleUri relationshipAPI() { - return (AAISimpleUri) super.relationshipAPI(); - } - - @Override - public AAISimpleUri relatedTo(AAIObjectPlurals plural) { - return (AAISimpleUri) super.relatedTo(plural); - } - - @Override - public AAISimpleUri relatedTo(AAIObjectType type, String... values) { - return (AAISimpleUri) super.relatedTo(type, values); - } - - @Override - public AAISimpleUri resourceVersion(String version) { - return (AAISimpleUri) super.resourceVersion(version); - } - - @Override - public AAISimpleUri queryParam(String name, String... values) { - return (AAISimpleUri) super.queryParam(name, values); - } - - @Override - public AAISimpleUri replaceQueryParam(String name, String... values) { - return (AAISimpleUri) super.replaceQueryParam(name, values); - } - - @Override - public AAISimpleUri resultIndex(int index) { - return (AAISimpleUri) super.resultIndex(index); - } - - @Override - public AAISimpleUri resultSize(int size) { - return (AAISimpleUri) super.resultSize(size); - } - - @Override - public AAISimpleUri limit(int size) { - return (AAISimpleUri) super.limit(size); + // copy constructor + protected AAISimpleUri(AAISimpleUri copy) { + super(copy); } @Override public AAISimpleUri clone() { - if (this.type != null) { - return new AAISimpleUri((AAIObjectType) this.type, this.internalURI.clone(), values); - } else { - return new AAISimpleUri((AAIObjectPlurals) this.pluralType, this.internalURI.clone(), values); - } - } - - @Override - public AAIObjectType getObjectType() { - return (AAIObjectType) this.type; + return new AAISimpleUri(this); } @Override - public AAISimpleUri depth(Depth depth) { - return (AAISimpleUri) super.depth(depth); - } - - @Override - public AAISimpleUri nodesOnly(boolean nodesOnly) { - return (AAISimpleUri) super.nodesOnly(nodesOnly); + public AAISimpleUri relatedTo(AAIObjectType type, String... values) { + this.internalURI = internalURI.path(relatedTo); + return new AAISimpleUri(this, type, values); } @Override - public AAISimpleUri format(Format format) { - return (AAISimpleUri) super.format(format); + public AAISimplePluralUri relatedTo(AAIObjectPlurals plural) { + this.internalURI.path(relatedTo); + return new AAISimplePluralUri(this, plural); } - @Override - protected Pattern getPrefixPattern() { - return Pattern.compile("/aai/v\\d+"); - } } diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIUri.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIUri.java index 6a4c90a6ee..8101643b78 100644 --- a/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIUri.java +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIUri.java @@ -20,52 +20,13 @@ package org.onap.so.client.aai.entities.uri; -import org.onap.so.client.aai.AAIObjectType; -import org.onap.so.client.graphinventory.entities.uri.Depth; +import java.util.regex.Pattern; +import org.onap.so.client.aai.AAIObjectBase; import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri; -public interface AAIUri extends GraphInventoryUri { +public interface AAIUri, OP extends AAIObjectBase> extends GraphInventoryUri { - /** - * By default A&AI enforces a depth of 1. Some objects can be told to retrieve objects nested beneath them by - * increasing this number. - * - * You can use 0 to restrict the returned information to only the object you requested You can use all to retrieve - * all nested objects (this should only be used if you really need a massive amount of information and are caching - * the retrieval) - * - * @param depth - * @return - */ - @Override - public AAIUri depth(Depth depth); - - /** - * Makes client only return object fields, no relationships - * - * @return - */ - @Override - public AAIUri nodesOnly(boolean nodesOnly); - - @Override - public AAIUri queryParam(String name, String... values); - - @Override - public AAIUri replaceQueryParam(String name, String... values); - - @Override - public AAIUri resultIndex(int index); - - @Override - public AAIUri resultSize(int size); - - @Override - public AAIUri limit(int size); - - @Override - public AAIUri clone(); - - @Override - public AAIObjectType getObjectType(); + public default Pattern getPrefixPattern() { + return Pattern.compile("/aai/v\\d+"); + } } diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIUriFactory.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIUriFactory.java index 406ff09952..bdd3921851 100644 --- a/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIUriFactory.java +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIUriFactory.java @@ -47,13 +47,13 @@ public class AAIUriFactory { } } - public static AAIResourceUri createNodesUri(AAIObjectType type, Object... values) { - return new NodesUri(type, values); + public static NodesSingleUri createNodesUri(AAIObjectType type, Object... values) { + return new NodesSingleUri(type, values); } - public static AAIResourceUri createNodesUri(AAIObjectPlurals type) { - return new NodesUri(type); + public static NodesPluralUri createNodesUri(AAIObjectPlurals type) { + return new NodesPluralUri(type); } @@ -64,7 +64,7 @@ public class AAIUriFactory { * @param uri * @return */ - public static AAIResourceUri createResourceFromExistingURI(AAIObjectType type, URI uri) { + public static AAISimpleUri createResourceFromExistingURI(AAIObjectType type, URI uri) { return new AAISimpleUri(type, uri); } @@ -77,15 +77,15 @@ public class AAIUriFactory { * @param childValues * @return */ - public static AAIResourceUri createResourceFromParentURI(AAIResourceUri parentUri, AAIObjectType childType, + public static AAISimpleUri createResourceFromParentURI(AAIResourceUri parentUri, AAIObjectType childType, Object... childValues) { return new AAISimpleUri(parentUri, childType, childValues); } - public static AAIResourceUri createResourceFromParentURI(AAIResourceUri parentUri, AAIObjectPlurals childType) { + public static AAISimplePluralUri createResourceFromParentURI(AAIResourceUri parentUri, AAIObjectPlurals childType) { - return new AAISimpleUri(parentUri, childType); + return new AAISimplePluralUri(parentUri, childType); } /** @@ -94,9 +94,9 @@ public class AAIUriFactory { * @param type * @return */ - public static AAIResourceUri createResourceUri(AAIObjectPlurals type) { + public static AAISimplePluralUri createResourceUri(AAIObjectPlurals type) { - return new AAISimpleUri(type); + return new AAISimplePluralUri(type); } @@ -106,9 +106,9 @@ public class AAIUriFactory { * @param type * @return */ - public static AAIResourceUri createResourceUri(AAIObjectPlurals type, Object... values) { + public static AAISimplePluralUri createResourceUri(AAIObjectPlurals type, Object... values) { - return new AAISimpleUri(type, values); + return new AAISimplePluralUri(type, values); } } diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/HttpLookupUri.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/HttpLookupUri.java index 37d21b375e..a0f1962706 100644 --- a/common/src/main/java/org/onap/so/client/aai/entities/uri/HttpLookupUri.java +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/HttpLookupUri.java @@ -111,8 +111,24 @@ public abstract class HttpLookupUri extends AAISimpleUri implements HttpAwareUri try { if (this.values.length == 1) { String uri = getObjectById(this.values[0]); - Map map = getURIKeys(uri); - return super.build(map.values().toArray(values)); + Map map = super.getURIKeys(uri); + this.values = map.values().toArray(values); + return super.build(values); + } + } catch (GraphInventoryUriNotFoundException | GraphInventoryPayloadException e) { + throw new GraphInventoryUriComputationException(e); + } + return super.build(); + } + + @Override + public URI locateAndBuild() { + try { + if (this.values.length == 1) { + String uri = getObjectById(this.values[0]); + Map map = super.getURIKeys(uri); + this.values = map.values().toArray(values); + return super.build(values); } } catch (GraphInventoryUriNotFoundException | GraphInventoryPayloadException e) { throw new GraphInventoryUriComputationException(e); @@ -155,7 +171,4 @@ public abstract class HttpLookupUri extends AAISimpleUri implements HttpAwareUri } } - - @Override - public abstract URI buildNoNetwork(); } diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/NodesPluralUri.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/NodesPluralUri.java new file mode 100644 index 0000000000..8545fc96fb --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/NodesPluralUri.java @@ -0,0 +1,19 @@ +package org.onap.so.client.aai.entities.uri; + +import javax.ws.rs.core.UriBuilder; +import org.onap.so.client.aai.AAIObjectPlurals; +import org.onap.so.client.graphinventory.GraphInventoryObjectBase; + +public class NodesPluralUri extends AAISimplePluralUri implements NodesUri { + + private static final long serialVersionUID = -6743170679667245998L; + + protected NodesPluralUri(AAIObjectPlurals type) { + super(type); + } + + @Override + public String getTemplate(GraphInventoryObjectBase type) { + return UriBuilder.fromUri("/nodes").path(type.partialUri()).toTemplate(); + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/NodesSingleUri.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/NodesSingleUri.java new file mode 100644 index 0000000000..7274b1f3b9 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/NodesSingleUri.java @@ -0,0 +1,21 @@ +package org.onap.so.client.aai.entities.uri; + +import javax.ws.rs.core.UriBuilder; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.graphinventory.GraphInventoryObjectBase; + +public class NodesSingleUri extends AAISimpleUri implements NodesUri { + + private static final long serialVersionUID = 2721165364903444248L; + + protected NodesSingleUri(AAIObjectType type, Object... values) { + super(type, values); + } + + + @Override + public String getTemplate(GraphInventoryObjectBase type) { + return UriBuilder.fromUri("/nodes").path(type.partialUri()).toTemplate(); + } + +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/NodesUri.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/NodesUri.java index 4b4b5d92a2..6e5fa77f76 100644 --- a/common/src/main/java/org/onap/so/client/aai/entities/uri/NodesUri.java +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/NodesUri.java @@ -20,32 +20,7 @@ package org.onap.so.client.aai.entities.uri; -import javax.ws.rs.core.UriBuilder; -import org.onap.so.client.aai.AAIObjectPlurals; -import org.onap.so.client.aai.AAIObjectType; -import org.onap.so.client.graphinventory.GraphInventoryObjectPlurals; -import org.onap.so.client.graphinventory.GraphInventoryObjectType; +public interface NodesUri { -public class NodesUri extends AAISimpleUri { - private static final long serialVersionUID = 8818689895730182042L; - - protected NodesUri(AAIObjectType type, Object... values) { - super(type, values); - } - - protected NodesUri(AAIObjectPlurals type) { - super(type); - } - - - @Override - protected String getTemplate(GraphInventoryObjectType type) { - return UriBuilder.fromUri("/nodes").path(type.partialUri()).toTemplate(); - } - - @Override - protected String getTemplate(GraphInventoryObjectPlurals type) { - return UriBuilder.fromUri("/nodes").path(type.partialUri()).toTemplate(); - } } diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryClient.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryClient.java index 98d48ec3a8..09efb5a48d 100644 --- a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryClient.java +++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryClient.java @@ -25,6 +25,7 @@ import org.onap.so.client.RestClient; import org.onap.so.client.RestProperties; import org.onap.so.client.RestPropertiesLoader; import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri; +import org.onap.so.client.graphinventory.entities.uri.HttpAwareUri; public abstract class GraphInventoryClient { @@ -36,9 +37,22 @@ public abstract class GraphInventoryClient { this.props = props; } - protected abstract URI constructPath(GraphInventoryUri uri); + protected abstract URI constructPath(URI uri); + + protected abstract RestClient createClient(URI uri); + + public RestClient createClient(GraphInventoryUri uri) { + final URI result; + if (uri instanceof HttpAwareUri) { + result = ((HttpAwareUri) uri).locateAndBuild(); + } else { + result = uri.build(); + } + + return createClient(result); + + } - public abstract RestClient createClient(GraphInventoryUri uri); public T getRestProperties() { if (props == null) { diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectBase.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectBase.java new file mode 100644 index 0000000000..72de833884 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectBase.java @@ -0,0 +1,9 @@ +package org.onap.so.client.graphinventory; + +public interface GraphInventoryObjectBase + extends GraphInventoryObjectName, GraphInventoryObjectUriTemplate, GraphInventoryObjectUriPartial { + + public default boolean passThrough() { + return false; + } +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectPlurals.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectPlurals.java index 42f4733e47..84604a76cf 100644 --- a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectPlurals.java +++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectPlurals.java @@ -20,7 +20,8 @@ package org.onap.so.client.graphinventory; -public interface GraphInventoryObjectPlurals - extends GraphInventoryObjectName, GraphInventoryObjectUriTemplate, GraphInventoryObjectUriPartial { +public interface GraphInventoryObjectPlurals extends GraphInventoryObjectBase { + + public GraphInventoryObjectType getType(); } diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectType.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectType.java index c11a08e867..d09a83a644 100644 --- a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectType.java +++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectType.java @@ -20,7 +20,6 @@ package org.onap.so.client.graphinventory; -public interface GraphInventoryObjectType - extends GraphInventoryObjectName, GraphInventoryObjectUriTemplate, GraphInventoryObjectUriPartial { +public interface GraphInventoryObjectType extends GraphInventoryObjectBase { } 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 index c7cdb2ff58..f446e5ac4c 100644 --- a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryResourcesClient.java +++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryResourcesClient.java @@ -21,6 +21,11 @@ package org.onap.so.client.graphinventory; import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Arrays; +import java.util.List; import java.util.Map; import java.util.Optional; import javax.ws.rs.NotFoundException; @@ -32,9 +37,13 @@ import org.onap.so.client.RestClient; import org.onap.so.client.RestProperties; import org.onap.so.client.graphinventory.entities.GraphInventoryEdgeLabel; import org.onap.so.client.graphinventory.entities.GraphInventoryResultWrapper; +import org.onap.so.client.graphinventory.entities.uri.GraphInventoryPluralResourceUri; import org.onap.so.client.graphinventory.entities.uri.GraphInventoryResourceUri; +import org.onap.so.client.graphinventory.entities.uri.GraphInventorySingleResourceUri; +import org.onap.so.client.graphinventory.entities.uri.HttpAwareUri; +import org.onap.so.client.graphinventory.exceptions.GraphInventoryMultipleItemsException; -public abstract class GraphInventoryResourcesClient { +public abstract class GraphInventoryResourcesClient, SingleUri extends GraphInventorySingleResourceUri, PluralUri extends GraphInventoryPluralResourceUri, EdgeLabel extends GraphInventoryEdgeLabel, Wrapper extends GraphInventoryResultWrapper, TransactionalClient, SingleTransactionClient> { protected GraphInventoryClient client; @@ -49,7 +58,7 @@ public abstract class GraphInventoryResourcesClient forceMinimal = (Uri) uri.clone(); forceMinimal.format(Format.COUNT); forceMinimal.limit(1); try { @@ -91,8 +100,8 @@ public abstract class GraphInventoryResourcesClient uriAClone = (SingleUri) uriA.clone(); RestClient giRC = client.createClient(uriAClone.relationshipAPI()); giRC.put(this.buildRelationship(uriB)); } @@ -105,8 +114,8 @@ public abstract class GraphInventoryResourcesClient uriAClone = (SingleUri) uriA.clone(); RestClient giRC = client.createClient(uriAClone.relationshipAPI()); giRC.put(this.buildRelationship(uriB, label)); } @@ -118,8 +127,8 @@ public abstract class GraphInventoryResourcesClient uriAClone = (SingleUri) uriA.clone(); RestClient giRC = client.createClient(uriAClone.relationshipAPI()); giRC.delete(this.buildRelationship(uriB)); } @@ -130,8 +139,8 @@ public abstract class GraphInventoryResourcesClient clone = (SingleUri) uri.clone(); RestClient giRC = client.createClient(clone); Map result = giRC.get(new GenericType>() {}).orElseThrow( () -> new NotFoundException(clone.build() + " does not exist in " + client.getGraphDBName())); @@ -145,7 +154,7 @@ public abstract class GraphInventoryResourcesClient Optional getOne(Class pluralClass, Class resultClass, PluralUri uri) { + Optional> result = unwrapPlural(pluralClass, resultClass, uri); + + if (result.isPresent()) { + if (result.get().size() == 1) { + return Optional.of(result.get().get(0)); + } else { + throw new GraphInventoryMultipleItemsException(result.get().size(), uri); + } + } + + return Optional.empty(); + } + + public Optional getFirst(Class pluralClass, Class resultClass, PluralUri uri) { + Optional> result = unwrapPlural(pluralClass, resultClass, uri); + + if (result.isPresent() && !result.get().isEmpty()) { + return Optional.of(result.get().get(0)); + } + + return Optional.empty(); + } + + public Optional getFirstWrapper(Class pluralClass, Class resultClass, PluralUri uri) { + + Optional result = getFirst(pluralClass, resultClass, uri); + if (result.isPresent()) { + return Optional.of(this.createWrapper(result.get())); + } else { + return Optional.empty(); + } + } + + public Optional getOneWrapper(Class pluralClass, Class resultClass, PluralUri uri) { + + Optional result = getOne(pluralClass, resultClass, uri); + if (result.isPresent()) { + return Optional.of(this.createWrapper(result.get())); + } else { + return Optional.empty(); + } + } + + protected Optional> unwrapPlural(Class pluralClass, Class resultClass, PluralUri uri) { + try { + PluralUri clone = (PluralUri) uri.clone().limit(1); + Optional obj = client.createClient(clone).get(pluralClass); + if (obj.isPresent()) { + Optional listMethod = Arrays.stream(obj.get().getClass().getMethods()).filter(method -> { + + Type returnType = method.getGenericReturnType(); + if (returnType instanceof ParameterizedType) { + Type[] types = ((ParameterizedType) returnType).getActualTypeArguments(); + if (types != null && types[0] instanceof Class) { + Class listClass = (Class) types[0]; + return resultClass.equals(listClass); + } + } + + return false; + }).findFirst(); + if (listMethod.isPresent()) { + try { + return Optional.of((List) listMethod.get().invoke(obj.get())); + + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + } + return Optional.empty(); + + } catch (NotFoundException e) { + if (this.getRestProperties().mapNotFoundToEmpty()) { + return Optional.empty(); + } else { + throw e; + } + } + } + /** * Retrieves an object from GraphInventory wrapped in a helper class which offer additional features * @@ -269,8 +360,8 @@ public abstract class GraphInventoryResourcesClient obj) { - if (!this.exists(uri)) { + public Self createIfNotExists(SingleUri uri, Optional obj) { + if (!this.exists((Uri) uri)) { if (obj.isPresent()) { this.create(uri, obj.get()); } else { @@ -281,17 +372,21 @@ public abstract class GraphInventoryResourcesClient label) { + protected Relationship buildRelationship(SingleUri uri, Optional label) { final Relationship result = new Relationship(); - result.setRelatedLink(uri.build().toString()); + if (uri instanceof HttpAwareUri) { + result.setRelatedLink(((HttpAwareUri) uri).locateAndBuild().toString()); + } else { + result.setRelatedLink(uri.build().toString()); + } if (label.isPresent()) { result.setRelationshipLabel(label.get().toString()); } @@ -300,6 +395,8 @@ public abstract class GraphInventoryResourcesClient { +public abstract class GraphInventoryTransactionClient, SingleUri extends GraphInventorySingleResourceUri, EdgeLabel extends GraphInventoryEdgeLabel> { protected static Logger logger = LoggerFactory.getLogger(GraphInventoryTransactionClient.class); @@ -50,7 +51,7 @@ public abstract class GraphInventoryTransactionClient()); incrementActionAmount(); return (Self) this; @@ -75,8 +76,8 @@ public abstract class GraphInventoryTransactionClient obj) { - if (!this.exists(uri)) { + public Self createIfNotExists(SingleUri uri, Optional obj) { + if (!this.exists((Uri) uri)) { if (obj.isPresent()) { this.create(uri, obj.get()); } else { @@ -94,8 +95,8 @@ public abstract class GraphInventoryTransactionClient uris) { - for (Uri uri : uris) { + public Self connect(SingleUri uriA, List uris) { + for (SingleUri uri : uris) { this.connect(uriA, uri); } return (Self) this; @@ -122,8 +123,8 @@ public abstract class GraphInventoryTransactionClient uris, EdgeLabel label) { - for (Uri uri : uris) { + public Self connect(SingleUri uriA, List uris, EdgeLabel label) { + for (SingleUri uri : uris) { this.connect(uriA, uri, label); } return (Self) this; @@ -149,8 +150,8 @@ public abstract class GraphInventoryTransactionClient uris) { - for (Uri uri : uris) { + public Self disconnect(SingleUri uriA, List uris) { + for (SingleUri uri : uris) { this.disconnect(uriA, uri); } return (Self) this; @@ -176,8 +177,8 @@ public abstract class GraphInventoryTransactionClient result = this.get(new GenericType>() {}, (Uri) uri.clone()) + public Self delete(SingleUri uri) { + Map result = this.get(new GenericType>() {}, (Uri) uri) .orElseThrow(() -> new NotFoundException(uri.build() + " does not exist in " + this.getGraphDBName())); String resourceVersion = (String) result.get("resource-version"); this.delete(uri.resourceVersion(resourceVersion).build().toString()); @@ -223,15 +224,15 @@ public abstract class GraphInventoryTransactionClient label) { + private Relationship buildRelationship(SingleUri uri, Optional label) { final Relationship result = new Relationship(); result.setRelatedLink(uri.build().toString()); if (label.isPresent()) { diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryRelationships.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryRelationships.java index 6703416832..6e7b9c9f08 100644 --- a/common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryRelationships.java +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryRelationships.java @@ -30,12 +30,12 @@ import java.util.function.Predicate; import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvider; import org.onap.so.client.graphinventory.GraphInventoryObjectName; import org.onap.so.client.graphinventory.GraphInventoryObjectType; -import org.onap.so.client.graphinventory.entities.uri.GraphInventoryResourceUri; +import org.onap.so.client.graphinventory.entities.uri.GraphInventorySingleResourceUri; import org.onap.so.jsonpath.JsonPathUtil; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -public abstract class GraphInventoryRelationships { +public abstract class GraphInventoryRelationships, Uri extends GraphInventorySingleResourceUri, Type extends GraphInventoryObjectType> { protected final ObjectMapper mapper; protected Map map; diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryPluralResourceUri.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryPluralResourceUri.java new file mode 100644 index 0000000000..aa09702be8 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryPluralResourceUri.java @@ -0,0 +1,8 @@ +package org.onap.so.client.graphinventory.entities.uri; + +import org.onap.so.client.graphinventory.GraphInventoryObjectBase; + +public interface GraphInventoryPluralResourceUri, OT extends GraphInventoryObjectBase> + extends GraphInventoryResourceUri { + +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryResourceUri.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryResourceUri.java index c579a285d2..64933863d5 100644 --- a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryResourceUri.java +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryResourceUri.java @@ -21,42 +21,11 @@ package org.onap.so.client.graphinventory.entities.uri; import org.onap.so.client.graphinventory.Format; -import org.onap.so.client.graphinventory.entities.uri.Depth; -import org.onap.so.client.graphinventory.GraphInventoryObjectPlurals; -import org.onap.so.client.graphinventory.GraphInventoryObjectType; +import org.onap.so.client.graphinventory.GraphInventoryObjectBase; -public interface GraphInventoryResourceUri extends GraphInventoryUri { - public GraphInventoryResourceUri relationshipAPI(); +public interface GraphInventoryResourceUri, OT extends GraphInventoryObjectBase> + extends GraphInventoryUri { - public GraphInventoryResourceUri relatedTo(GraphInventoryObjectPlurals plural); + public T format(Format format); - public GraphInventoryResourceUri relatedTo(GraphInventoryObjectType type, String... values); - - public GraphInventoryResourceUri resourceVersion(String version); - - public GraphInventoryResourceUri format(Format format); - - @Override - public GraphInventoryResourceUri depth(Depth depth); - - @Override - public GraphInventoryResourceUri nodesOnly(boolean nodesOnly); - - @Override - public GraphInventoryResourceUri queryParam(String name, String... values); - - @Override - public GraphInventoryResourceUri replaceQueryParam(String name, String... values); - - @Override - public GraphInventoryResourceUri resultIndex(int index); - - @Override - public GraphInventoryResourceUri resultSize(int size); - - @Override - public GraphInventoryResourceUri limit(int size); - - @Override - public GraphInventoryResourceUri clone(); } diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventorySingleResourceUri.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventorySingleResourceUri.java new file mode 100644 index 0000000000..e45ff14a5e --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventorySingleResourceUri.java @@ -0,0 +1,16 @@ +package org.onap.so.client.graphinventory.entities.uri; + +import org.onap.so.client.graphinventory.GraphInventoryObjectPlurals; +import org.onap.so.client.graphinventory.GraphInventoryObjectType; + +public interface GraphInventorySingleResourceUri, P extends GraphInventoryPluralResourceUri, SingleObject extends GraphInventoryObjectType, PluralObject extends GraphInventoryObjectPlurals> + extends GraphInventoryResourceUri { + + public T resourceVersion(String version); + + public T relationshipAPI(); + + public P relatedTo(PluralObject plural); + + public T relatedTo(SingleObject type, String... values); +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryUri.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryUri.java index 6b48ad44ef..e3fda2fa23 100644 --- a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryUri.java +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryUri.java @@ -20,11 +20,15 @@ package org.onap.so.client.graphinventory.entities.uri; +import java.io.Serializable; import java.net.URI; import java.util.Map; +import java.util.regex.Pattern; +import org.onap.so.client.graphinventory.GraphInventoryObjectBase; import org.onap.so.client.graphinventory.GraphInventoryObjectType; -public interface GraphInventoryUri { +public interface GraphInventoryUri, OT extends GraphInventoryObjectBase> + extends Serializable { public URI build(); @@ -39,26 +43,26 @@ public interface GraphInventoryUri { * @param depth * @return */ - public GraphInventoryUri depth(Depth depth); + public T depth(Depth depth); /** * Makes client only return object fields, no relationships * * @return */ - public GraphInventoryUri nodesOnly(boolean nodesOnly); + public T nodesOnly(boolean nodesOnly); - public GraphInventoryUri queryParam(String name, String... values); + public T queryParam(String name, String... values); - public GraphInventoryUri replaceQueryParam(String name, String... values); + public T replaceQueryParam(String name, String... values); - public GraphInventoryUri resultIndex(int index); + public T resultIndex(int index); - public GraphInventoryUri resultSize(int size); + public T resultSize(int size); - public GraphInventoryUri limit(int size); + public T limit(int size); - public GraphInventoryUri clone(); + public T clone(); /** * returns all key values of the URI as a map. Key names can be found in {@link GraphInventoryObjectType} @@ -67,9 +71,11 @@ public interface GraphInventoryUri { */ public Map getURIKeys(); - public GraphInventoryObjectType getObjectType(); + public OT getObjectType(); public boolean equals(Object o); public int hashCode(); + + public Pattern getPrefixPattern(); } diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/HttpAwareUri.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/HttpAwareUri.java index fcfde74b33..1ee3d57b6c 100644 --- a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/HttpAwareUri.java +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/HttpAwareUri.java @@ -21,9 +21,12 @@ package org.onap.so.client.graphinventory.entities.uri; import java.net.URI; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; -public interface HttpAwareUri { +public interface HttpAwareUri extends AAIResourceUri { public URI buildNoNetwork(); + + public URI locateAndBuild(); } diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleBaseUri.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleBaseUri.java new file mode 100644 index 0000000000..fc1a008466 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleBaseUri.java @@ -0,0 +1,237 @@ +package org.onap.so.client.graphinventory.entities.uri; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import javax.ws.rs.core.UriBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.onap.so.client.graphinventory.Format; +import org.onap.so.client.graphinventory.GraphInventoryObjectBase; +import org.onap.so.client.graphinventory.entities.uri.parsers.UriParser; +import org.onap.so.client.graphinventory.entities.uri.parsers.UriParserSpringImpl; +import org.onap.so.client.graphinventory.exceptions.IncorrectNumberOfUriKeys; +import org.springframework.web.util.UriUtils; + +public abstract class SimpleBaseUri, Parent extends GraphInventorySingleResourceUri, S extends GraphInventoryObjectBase> + implements GraphInventoryResourceUri { + + private static final long serialVersionUID = -1011069933894179423L; + protected transient UriBuilder internalURI; + protected static final String relationshipAPI = "/relationship-list/relationship"; + protected static final String relatedTo = "/related-to"; + protected Object[] values; + protected final S type; + protected final Parent parentUri; + protected final Map> queryParams = new HashMap<>(); + + protected SimpleBaseUri(S type, Object... values) { + this.type = type; + this.internalURI = UriBuilder.fromPath(this.getTemplate(type)); + this.values = values; + this.parentUri = null; + validateValuesSize(this.getTemplate(type), values); + } + + protected SimpleBaseUri(S type, URI uri) { + if (!type.passThrough()) { + this.type = type; + this.internalURI = UriBuilder.fromPath(this.getTemplate(type)); + this.values = + this.getURIKeys(uri.getRawPath().replaceAll(getPrefixPattern().toString(), "")).values().toArray(); + this.parentUri = null; + } else { + this.type = type; + this.internalURI = UriBuilder.fromPath(uri.getRawPath().replaceAll(getPrefixPattern().toString(), "")); + this.values = new Object[0]; + this.parentUri = null; + } + + } + + protected SimpleBaseUri(S type, UriBuilder builder, Object... values) { + this.internalURI = builder; + this.values = values; + this.type = type; + this.parentUri = null; + + } + + protected SimpleBaseUri(Parent parentUri, S childType, Object... childValues) { + this.type = childType; + this.internalURI = UriBuilder.fromUri(type.partialUri()); + this.values = childValues; + this.parentUri = parentUri; + + validateValuesSize(childType.partialUri(), values); + } + + protected SimpleBaseUri(SimpleBaseUri copy) { + this.type = copy.type; + this.internalURI = copy.internalURI.clone(); + this.values = copy.values.clone(); + if (copy.parentUri != null) { + this.parentUri = (Parent) copy.parentUri.clone(); + } else { + this.parentUri = null; + } + } + + protected void setInternalURI(UriBuilder builder) { + this.internalURI = builder; + } + + @Override + public T queryParam(String name, String... values) { + this.internalURI = internalURI.queryParam(name, values); + if (queryParams.containsKey(name)) { + queryParams.get(name).addAll(Arrays.asList(values)); + } else { + queryParams.put(name, Stream.of(values).collect(Collectors.toSet())); + } + return (T) this; + } + + @Override + public T replaceQueryParam(String name, String... values) { + this.internalURI = internalURI.replaceQueryParam(name, values); + queryParams.put(name, Stream.of(values).collect(Collectors.toSet())); + return (T) this; + } + + @Override + public T resultIndex(int index) { + this.internalURI = internalURI.replaceQueryParam("resultIndex", index); + return (T) this; + } + + @Override + public T resultSize(int size) { + this.internalURI = internalURI.replaceQueryParam("resultSize", size); + return (T) this; + } + + @Override + public T limit(int size) { + this.resultIndex(0).resultSize(size); + return (T) this; + } + + @Override + public URI build() { + return build(this.values); + } + + protected URI build(Object... values) { + + // This is a workaround because resteasy does not encode URIs correctly + final String[] encoded = new String[values.length]; + for (int i = 0; i < values.length; i++) { + encoded[i] = UriUtils.encode(values[i].toString(), StandardCharsets.UTF_8.toString()); + } + if (this.parentUri != null) { + return UriBuilder + .fromUri(this.parentUri.build().toString() + internalURI.buildFromEncoded(encoded).toString()) + .build(); + } else { + return internalURI.buildFromEncoded(encoded); + } + } + + @Override + public Map getURIKeys() { + return this.getURIKeys(this.build().toString()); + } + + protected Map getURIKeys(String uri) { + UriParser parser; + if (!("".equals(this.getTemplate(type)))) { + parser = new UriParserSpringImpl(this.getTemplate(type)); + } else { + return new HashMap<>(); + } + + + return parser.parse(uri); + } + + @Override + public abstract T clone(); + + @Override + public S getObjectType() { + return this.type; + } + + @Override + public boolean equals(Object o) { + if (o != null) { + return this.toString().equals(o.toString()); + } + return false; + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(this.toString()).toHashCode(); + } + + + @Override + public T depth(Depth depth) { + this.internalURI.replaceQueryParam("depth", depth.toString()); + return (T) this; + } + + @Override + public T nodesOnly(boolean nodesOnly) { + if (nodesOnly) { + this.internalURI.replaceQueryParam("nodes-only", ""); + } + return (T) this; + } + + @Override + public T format(Format format) { + this.internalURI.replaceQueryParam("format", format); + return (T) this; + } + + public void validateValuesSize(String template, Object... values) { + UriParser parser = new UriParserSpringImpl(template); + Set variables = parser.getVariables(); + if (variables.size() != values.length) { + throw new IncorrectNumberOfUriKeys(String.format("Expected %s variables: %s", variables.size(), variables)); + } + } + + protected String getTemplate(GraphInventoryObjectBase type) { + return type.uriTemplate(); + } + + private void writeObject(ObjectOutputStream oos) throws IOException { + oos.defaultWriteObject(); + oos.writeUTF(this.internalURI.toTemplate()); + } + + private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { + ois.defaultReadObject(); + String uri = ois.readUTF(); + this.setInternalURI(UriBuilder.fromUri(uri)); + } + + @Override + public String toString() { + return new ToStringBuilder(null, ToStringStyle.NO_CLASS_NAME_STYLE).append("type", type) + .append("parentUri", parentUri).append("values", values).append("queryParams", queryParams).toString(); + } +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimplePluralUri.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimplePluralUri.java new file mode 100644 index 0000000000..c0b6d573c1 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimplePluralUri.java @@ -0,0 +1,77 @@ +/*- + * ============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.uri; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import javax.ws.rs.core.UriBuilder; +import org.onap.so.client.graphinventory.GraphInventoryObjectPlurals; +import org.onap.so.client.graphinventory.GraphInventoryObjectType; + +public abstract class SimplePluralUri, Parent extends GraphInventorySingleResourceUri, PT extends GraphInventoryObjectPlurals, OT extends GraphInventoryObjectType> + extends SimpleBaseUri implements GraphInventoryPluralResourceUri, Serializable { + + private static final long serialVersionUID = -337701171277616439L; + + protected final PT pluralType; + + protected SimplePluralUri(PT type, UriBuilder builder, Object... values) { + super(type, builder, values); + this.pluralType = type; + } + + protected SimplePluralUri(PT type) { + super(type, new Object[0]); + this.pluralType = type; + } + + protected SimplePluralUri(PT type, Object... values) { + super(type, values); + this.pluralType = type; + } + + protected SimplePluralUri(Parent parentUri, PT childType) { + super(parentUri, childType, new Object[0]); + this.pluralType = childType; + } + + public SimplePluralUri(SimplePluralUri copy) { + super(copy); + this.pluralType = copy.pluralType; + } + + protected void setInternalURI(UriBuilder builder) { + this.internalURI = builder; + } + + private void writeObject(ObjectOutputStream oos) throws IOException { + oos.defaultWriteObject(); + oos.writeUTF(this.internalURI.toTemplate()); + } + + private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { + ois.defaultReadObject(); + String uri = ois.readUTF(); + this.setInternalURI(UriBuilder.fromUri(uri)); + } +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleUri.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleUri.java index ffe47c5c51..aff7392efe 100644 --- a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleUri.java +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleUri.java @@ -23,254 +23,50 @@ package org.onap.so.client.graphinventory.entities.uri; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; -import java.io.Serializable; import java.net.URI; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.regex.Pattern; import javax.ws.rs.core.UriBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; -import org.onap.so.client.graphinventory.Format; import org.onap.so.client.graphinventory.GraphInventoryObjectPlurals; import org.onap.so.client.graphinventory.GraphInventoryObjectType; -import org.onap.so.client.graphinventory.entities.uri.parsers.UriParser; -import org.onap.so.client.graphinventory.entities.uri.parsers.UriParserSpringImpl; -import org.onap.so.client.graphinventory.exceptions.IncorrectNumberOfUriKeys; -import org.springframework.web.util.UriUtils; -public class SimpleUri implements GraphInventoryResourceUri, Serializable { +public abstract class SimpleUri, PT extends GraphInventoryPluralResourceUri, S extends GraphInventoryObjectType, P extends GraphInventoryObjectPlurals> + extends SimpleBaseUri implements GraphInventorySingleResourceUri { private static final long serialVersionUID = -337701171277616439L; - - protected transient UriBuilder internalURI; protected static final String relationshipAPI = "/relationship-list/relationship"; protected static final String relatedTo = "/related-to"; - protected final Object[] values; - protected final GraphInventoryObjectType type; - protected final GraphInventoryObjectPlurals pluralType; - - protected SimpleUri(GraphInventoryObjectType type, Object... values) { - this.type = type; - this.pluralType = null; - this.internalURI = UriBuilder.fromPath(this.getTemplate(type)); - this.values = values; - validateValuesSize(this.getTemplate(type), values); - } - - protected SimpleUri(GraphInventoryObjectType type, URI uri) { - this.type = type; - this.pluralType = null; - this.internalURI = UriBuilder.fromPath(uri.getRawPath().replaceAll(getPrefixPattern().toString(), "")); - this.values = new Object[0]; - } - protected SimpleUri(GraphInventoryObjectType type, UriBuilder builder, Object... values) { - this.internalURI = builder; - this.values = values; - this.type = type; - this.pluralType = null; + protected SimpleUri(S type, Object... values) { + super(type, values); } - protected SimpleUri(GraphInventoryObjectPlurals type, UriBuilder builder, Object... values) { - this.internalURI = builder; - this.values = values; - this.type = null; - this.pluralType = type; - } + protected SimpleUri(S type, URI uri) { + super(type, uri); - protected SimpleUri(GraphInventoryObjectPlurals type) { - this.type = null; - this.pluralType = type; - this.internalURI = UriBuilder.fromPath(this.getTemplate(type)); - this.values = new Object[0]; } - protected SimpleUri(GraphInventoryObjectPlurals type, Object... values) { - this.type = null; - this.pluralType = type; - this.internalURI = UriBuilder.fromPath(this.getTemplate(type)); - this.values = values; - validateValuesSize(this.getTemplate(type), values); - } + protected SimpleUri(S type, UriBuilder builder, Object... values) { + super(type, builder, values); - protected SimpleUri(GraphInventoryResourceUri parentUri, GraphInventoryObjectType childType, - Object... childValues) { - this.type = childType; - this.pluralType = null; - this.internalURI = UriBuilder.fromUri(parentUri.build()).path(childType.partialUri()); - this.values = childValues; - validateValuesSize(childType.partialUri(), values); } - protected SimpleUri(GraphInventoryResourceUri parentUri, GraphInventoryObjectPlurals childType) { - this.type = null; - this.pluralType = childType; - this.internalURI = UriBuilder.fromUri(parentUri.build()).path(childType.partialUri()); - this.values = new Object[0]; + protected SimpleUri(T parentUri, S childType, Object... childValues) { + super(parentUri, childType, childValues); } - protected void setInternalURI(UriBuilder builder) { - this.internalURI = builder; + protected SimpleUri(SimpleBaseUri copy) { + super(copy); } @Override - public SimpleUri relationshipAPI() { - this.internalURI = internalURI.path(relationshipAPI); - return this; - } - - @Override - public SimpleUri relatedTo(GraphInventoryObjectPlurals plural) { - - this.internalURI = internalURI.path(relatedTo).path(plural.partialUri()); - return this; - } - - @Override - public SimpleUri relatedTo(GraphInventoryObjectType type, String... values) { - this.internalURI = - internalURI.path(relatedTo).path(UriBuilder.fromPath(type.partialUri()).build(values).toString()); - return this; - } - - @Override - public SimpleUri resourceVersion(String version) { + public T resourceVersion(String version) { this.internalURI = internalURI.replaceQueryParam("resource-version", version); - return this; - } - - @Override - public SimpleUri queryParam(String name, String... values) { - this.internalURI = internalURI.queryParam(name, values); - return this; - } - - @Override - public SimpleUri replaceQueryParam(String name, String... values) { - this.internalURI = internalURI.replaceQueryParam(name, values); - return this; - } - - @Override - public SimpleUri resultIndex(int index) { - this.internalURI = internalURI.replaceQueryParam("resultIndex", index); - return this; - } - - @Override - public SimpleUri resultSize(int size) { - this.internalURI = internalURI.replaceQueryParam("resultSize", size); - return this; - } - - @Override - public SimpleUri limit(int size) { - return this.resultIndex(0).resultSize(size); - } - - @Override - public URI build() { - return build(this.values); - } - - protected Pattern getPrefixPattern() { - return Pattern.compile("/.*?/v\\d+"); - } - - protected URI build(Object... values) { - // This is a workaround because resteasy does not encode URIs correctly - final String[] encoded = new String[values.length]; - for (int i = 0; i < values.length; i++) { - encoded[i] = UriUtils.encode(values[i].toString(), StandardCharsets.UTF_8.toString()); - } - return internalURI.buildFromEncoded(encoded); - } - - @Override - public Map getURIKeys() { - return this.getURIKeys(this.build().toString()); - } - - protected Map getURIKeys(String uri) { - UriParser parser; - if (this.type != null) { - if (!("".equals(this.getTemplate(type)))) { - parser = new UriParserSpringImpl(this.getTemplate(type)); - } else { - return new HashMap<>(); - } - } else { - parser = new UriParserSpringImpl(this.getTemplate(pluralType)); - } - - - return parser.parse(uri); - } - - @Override - public SimpleUri clone() { - if (this.type != null) { - return new SimpleUri(this.type, this.internalURI.clone(), values); - } else { - return new SimpleUri(this.pluralType, this.internalURI.clone(), values); - } - } - - @Override - public GraphInventoryObjectType getObjectType() { - return this.type; - } - - @Override - public boolean equals(Object o) { - if (o instanceof GraphInventoryUri) { - return this.build().equals(((GraphInventoryUri) o).build()); - } - return false; + return (T) this; } @Override - public int hashCode() { - return new HashCodeBuilder().append(this.build()).toHashCode(); - } - - - @Override - public SimpleUri depth(Depth depth) { - this.internalURI.replaceQueryParam("depth", depth.toString()); - return this; - } - - @Override - public SimpleUri nodesOnly(boolean nodesOnly) { - if (nodesOnly) { - this.internalURI.replaceQueryParam("nodes-only", ""); - } - return this; - } - - @Override - public SimpleUri format(Format format) { - this.internalURI.replaceQueryParam("format", format); - return this; - } - - public void validateValuesSize(String template, Object... values) { - UriParser parser = new UriParserSpringImpl(template); - Set variables = parser.getVariables(); - if (variables.size() != values.length) { - throw new IncorrectNumberOfUriKeys(String.format("Expected %s variables: %s", variables.size(), variables)); - } - } - - protected String getTemplate(GraphInventoryObjectType type) { - return type.uriTemplate(); - } - - protected String getTemplate(GraphInventoryObjectPlurals type) { - return type.uriTemplate(); + public T relationshipAPI() { + this.internalURI = internalURI.path(relationshipAPI); + return (T) this; } private void writeObject(ObjectOutputStream oos) throws IOException { @@ -283,4 +79,5 @@ public class SimpleUri implements GraphInventoryResourceUri, Serializable { String uri = ois.readUTF(); this.setInternalURI(UriBuilder.fromUri(uri)); } + } diff --git a/common/src/main/java/org/onap/so/client/graphinventory/exceptions/GraphInventoryMultipleItemsException.java b/common/src/main/java/org/onap/so/client/graphinventory/exceptions/GraphInventoryMultipleItemsException.java new file mode 100644 index 0000000000..d3c17ce9e9 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/exceptions/GraphInventoryMultipleItemsException.java @@ -0,0 +1,13 @@ +package org.onap.so.client.graphinventory.exceptions; + +import org.onap.so.client.graphinventory.entities.uri.GraphInventoryPluralResourceUri; + +public class GraphInventoryMultipleItemsException extends RuntimeException { + + private static final long serialVersionUID = -1596266941681036917L; + + public GraphInventoryMultipleItemsException(int size, GraphInventoryPluralResourceUri uri) { + super(String.format("Found %s objects at %s when we only expected to find one.", size, uri.build())); + } + +} diff --git a/common/src/test/java/org/onap/so/client/aai/AAIObjectTypeTest.java b/common/src/test/java/org/onap/so/client/aai/AAIObjectTypeTest.java index 8f449c21f3..20a6678386 100644 --- a/common/src/test/java/org/onap/so/client/aai/AAIObjectTypeTest.java +++ b/common/src/test/java/org/onap/so/client/aai/AAIObjectTypeTest.java @@ -22,7 +22,7 @@ package org.onap.so.client.aai; import static org.junit.Assert.assertEquals; import org.junit.Test; -import org.onap.so.client.aai.entities.uri.AAIUri; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; import org.onap.so.client.aai.entities.uri.AAIUriFactory; public class AAIObjectTypeTest { @@ -56,14 +56,14 @@ public class AAIObjectTypeTest { @Test public void instanceGroupObjectTypeTest() { final String id = "test1"; - AAIUri aaiUri = AAIUriFactory.createResourceUri(AAIObjectType.INSTANCE_GROUP, id); + AAIResourceUri aaiUri = AAIUriFactory.createResourceUri(AAIObjectType.INSTANCE_GROUP, id); assertEquals("/network/instance-groups/instance-group/test1", aaiUri.build().toString()); } @Test public void collectionObjectTypeTest() { final String id = "test1"; - AAIUri aaiUri = AAIUriFactory.createResourceUri(AAIObjectType.COLLECTION, id); + AAIResourceUri aaiUri = AAIUriFactory.createResourceUri(AAIObjectType.COLLECTION, id); assertEquals("/network/collections/collection/test1", aaiUri.build().toString()); } @@ -85,7 +85,7 @@ public class AAIObjectTypeTest { @Test public void networkPolicyObjectTypeTest() { final String id = "test1"; - AAIUri aaiUri = AAIUriFactory.createResourceUri(AAIObjectType.NETWORK_POLICY, id); + AAIResourceUri aaiUri = AAIUriFactory.createResourceUri(AAIObjectType.NETWORK_POLICY, id); assertEquals("/network/network-policies/network-policy/test1", aaiUri.build().toString()); } } diff --git a/common/src/test/java/org/onap/so/client/aai/AAIQueryClientTest.java b/common/src/test/java/org/onap/so/client/aai/AAIQueryClientTest.java index 5b2bff277d..c70f16eb83 100644 --- a/common/src/test/java/org/onap/so/client/aai/AAIQueryClientTest.java +++ b/common/src/test/java/org/onap/so/client/aai/AAIQueryClientTest.java @@ -48,7 +48,6 @@ import org.onap.so.client.aai.entities.AAIResultWrapper; import org.onap.so.client.aai.entities.CustomQuery; import org.onap.so.client.aai.entities.Results; import org.onap.so.client.aai.entities.uri.AAIResourceUri; -import org.onap.so.client.aai.entities.uri.AAIUri; import org.onap.so.client.aai.entities.uri.AAIUriFactory; import org.onap.so.client.graphinventory.Format; import org.onap.so.client.graphinventory.GraphInventoryClient; @@ -83,10 +82,10 @@ public class AAIQueryClientTest { Format format = Format.SIMPLE; CustomQuery query = new CustomQuery(uris); - doReturn(restClient).when(client).createClient(isA(AAIUri.class)); + doReturn(restClient).when(client).createClient(isA(AAIResourceUri.class)); aaiQueryClient.query(format, query); - verify(client, times(1)).createClient( - AAIUriFactory.createResourceUri(AAIObjectType.CUSTOM_QUERY).queryParam("format", format.toString())); + verify(client, times(1)) + .createClient(AAIUriFactory.createResourceUri(AAIObjectType.CUSTOM_QUERY).format(format)); verify(restClient, times(1)).put(query, String.class); } @@ -99,7 +98,7 @@ public class AAIQueryClientTest { aaiQueryClient.nodesOnly(); aaiQueryClient.subgraph(subgraph); - AAIUri aaiUri = spy(AAIUriFactory.createResourceUri(AAIObjectType.CUSTOM_QUERY)); + AAIResourceUri aaiUri = spy(AAIUriFactory.createResourceUri(AAIObjectType.CUSTOM_QUERY)); doReturn(aaiUri).when(aaiUri).clone(); aaiQueryClient.setupQueryParams(aaiUri); @@ -133,7 +132,7 @@ public class AAIQueryClientTest { @Test public void querySingleTypeTest() throws IOException { - when(client.createClient(isA(AAIUri.class))).thenReturn(restClient); + when(client.createClient(isA(AAIResourceUri.class))).thenReturn(restClient); when(restClient.put(any(Object.class), any(GenericType.class))).thenReturn( mapper.readValue(getJson("pathed-result.json"), new TypeReference>>() {})); diff --git a/common/src/test/java/org/onap/so/client/aai/AAIResourcesClientTest.java b/common/src/test/java/org/onap/so/client/aai/AAIResourcesClientTest.java index 94d14684c7..a7fd6e904e 100644 --- a/common/src/test/java/org/onap/so/client/aai/AAIResourcesClientTest.java +++ b/common/src/test/java/org/onap/so/client/aai/AAIResourcesClientTest.java @@ -31,8 +31,12 @@ import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMoc import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs; import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import java.util.Optional; import javax.ws.rs.BadRequestException; import org.junit.Before; import org.junit.Rule; @@ -42,12 +46,17 @@ import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; +import org.onap.aai.domain.yang.GenericVnf; +import org.onap.aai.domain.yang.GenericVnfs; import org.onap.aai.domain.yang.Relationship; +import org.onap.so.client.RestClient; import org.onap.so.client.aai.entities.AAIEdgeLabel; import org.onap.so.client.aai.entities.AAIResultWrapper; +import org.onap.so.client.aai.entities.uri.AAIPluralResourceUri; 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.exceptions.GraphInventoryMultipleItemsException; import com.github.tomakehurst.wiremock.admin.NotFoundException; import com.github.tomakehurst.wiremock.junit.WireMockRule; @@ -198,4 +207,102 @@ public class AAIResourcesClientTest { } + @Test + public void testGetOne() { + GenericVnf vnf = new GenericVnf(); + vnf.setVnfId("my-vnf-id"); + GenericVnfs vnfs = new GenericVnfs(); + vnfs.getGenericVnf().add(vnf); + AAIPluralResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.GENERIC_VNF); + RestClient restClientMock = mock(RestClient.class); + doReturn(restClientMock).when(client).createClient(uri); + when(restClientMock.get(GenericVnfs.class)).thenReturn(Optional.of(vnfs)); + + Optional result = aaiClient.getOne(GenericVnfs.class, GenericVnf.class, uri); + + assertEquals("my-vnf-id", result.get().getVnfId()); + } + + @Test + public void testGetOneMultipleResults() { + GenericVnf vnf = new GenericVnf(); + vnf.setVnfId("my-vnf-id"); + GenericVnf vnf2 = new GenericVnf(); + vnf.setVnfId("my-vnf-id2"); + GenericVnfs vnfs = new GenericVnfs(); + vnfs.getGenericVnf().add(vnf); + vnfs.getGenericVnf().add(vnf2); + AAIPluralResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.GENERIC_VNF); + RestClient restClientMock = mock(RestClient.class); + doReturn(restClientMock).when(client).createClient(uri); + when(restClientMock.get(GenericVnfs.class)).thenReturn(Optional.of(vnfs)); + + thrown.expect(GraphInventoryMultipleItemsException.class); + aaiClient.getOne(GenericVnfs.class, GenericVnf.class, uri); + } + + @Test + public void testGetFirstMultipleResults() { + GenericVnf vnf = new GenericVnf(); + vnf.setVnfId("my-vnf-id"); + GenericVnf vnf2 = new GenericVnf(); + vnf2.setVnfId("my-vnf-id2"); + GenericVnfs vnfs = new GenericVnfs(); + vnfs.getGenericVnf().add(vnf); + vnfs.getGenericVnf().add(vnf2); + AAIPluralResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.GENERIC_VNF); + RestClient restClientMock = mock(RestClient.class); + doReturn(restClientMock).when(client).createClient(uri); + when(restClientMock.get(GenericVnfs.class)).thenReturn(Optional.of(vnfs)); + + Optional result = aaiClient.getFirst(GenericVnfs.class, GenericVnf.class, uri); + + assertEquals("my-vnf-id", result.get().getVnfId()); + } + + @Test + public void testGetOneNoResults() { + GenericVnf vnf = new GenericVnf(); + vnf.setVnfId("my-vnf-id"); + GenericVnfs vnfs = new GenericVnfs(); + vnfs.getGenericVnf().add(vnf); + AAIPluralResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.GENERIC_VNF); + RestClient restClientMock = mock(RestClient.class); + doReturn(restClientMock).when(client).createClient(uri); + when(restClientMock.get(GenericVnfs.class)).thenReturn(Optional.empty()); + + Optional result = aaiClient.getOne(GenericVnfs.class, GenericVnf.class, uri); + + assertFalse(result.isPresent()); + } + + @Test + public void testGetFirstNoResults() { + GenericVnf vnf = new GenericVnf(); + vnf.setVnfId("my-vnf-id"); + GenericVnfs vnfs = new GenericVnfs(); + vnfs.getGenericVnf().add(vnf); + AAIPluralResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.GENERIC_VNF); + RestClient restClientMock = mock(RestClient.class); + doReturn(restClientMock).when(client).createClient(uri); + when(restClientMock.get(GenericVnfs.class)).thenReturn(Optional.empty()); + + Optional result = aaiClient.getFirst(GenericVnfs.class, GenericVnf.class, uri); + + assertFalse(result.isPresent()); + } + + @Test + public void testGetFirstWrongPluralClass() { + GenericVnf vnf = new GenericVnf(); + AAIPluralResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.GENERIC_VNF); + RestClient restClientMock = mock(RestClient.class); + doReturn(restClientMock).when(client).createClient(uri); + when(restClientMock.get(GenericVnf.class)).thenReturn(Optional.of(vnf)); + + Optional result = aaiClient.getFirst(GenericVnf.class, GenericVnf.class, uri); + + assertFalse(result.isPresent()); + } + } diff --git a/common/src/test/java/org/onap/so/client/aai/AAITransactionalClientTest.java b/common/src/test/java/org/onap/so/client/aai/AAITransactionalClientTest.java index 305cdf59cc..cbcb60513b 100644 --- a/common/src/test/java/org/onap/so/client/aai/AAITransactionalClientTest.java +++ b/common/src/test/java/org/onap/so/client/aai/AAITransactionalClientTest.java @@ -95,7 +95,7 @@ public class AAITransactionalClientTest { @Test public void testConnect() throws IOException { - List uris = new ArrayList(); + List uris = new ArrayList<>(); uris.add(uriB); Map map = new HashMap<>(); @@ -117,7 +117,7 @@ public class AAITransactionalClientTest { @Test public void testDisconnect() throws IOException { - List uris = new ArrayList(); + List uris = new ArrayList<>(); uris.add(uriB); AAITransactionalClient transactions = aaiClient.beginTransaction().disconnect(uriA, uris); diff --git a/common/src/test/java/org/onap/so/client/aai/AAIURITest.java b/common/src/test/java/org/onap/so/client/aai/AAIURITest.java index 556b4429d4..8971f91602 100644 --- a/common/src/test/java/org/onap/so/client/aai/AAIURITest.java +++ b/common/src/test/java/org/onap/so/client/aai/AAIURITest.java @@ -23,7 +23,7 @@ package org.onap.so.client.aai; import static org.junit.Assert.assertEquals; import javax.ws.rs.core.UriBuilder; import org.junit.Test; -import org.onap.so.client.aai.entities.uri.AAIUri; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; import org.onap.so.client.aai.entities.uri.AAIUriFactory; public class AAIURITest { @@ -33,7 +33,7 @@ public class AAIURITest { @Test public void verifyTemplateReplacement() { final String id = "test1"; - AAIUri aaiUri = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, id); + AAIResourceUri aaiUri = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, id); String manualReplace = AAIObjectType.CONFIGURATION.toString().replaceAll("\\{configuration-id\\}", id); assertEquals("uri template replaced", aaiUri.build(), UriBuilder.fromPath(manualReplace).build()); diff --git a/common/src/test/java/org/onap/so/client/aai/entities/RelationshipsTest.java b/common/src/test/java/org/onap/so/client/aai/entities/RelationshipsTest.java index ec7c6434a7..039bbb3614 100644 --- a/common/src/test/java/org/onap/so/client/aai/entities/RelationshipsTest.java +++ b/common/src/test/java/org/onap/so/client/aai/entities/RelationshipsTest.java @@ -43,15 +43,12 @@ public class RelationshipsTest { Relationships relationships = wrapper.getRelationships().get(); List test = relationships.getRelatedUris(AAIObjectType.VCE); - - System.out.println(test.get(0).build()); List uris = Arrays.asList( AAIUriFactory.createResourceUri(AAIObjectType.VCE, "a9fec18e-1ea3-40e4-a6c0-a89b3de07053"), AAIUriFactory.createResourceUri(AAIObjectType.VCE, "8ae1e5f8-61f1-4c71-913a-b40cc4593cb9"), AAIUriFactory.createResourceUri(AAIObjectType.VCE, "a2935fa9-b743-49f4-9813-a127f13c4e93"), AAIUriFactory.createResourceUri(AAIObjectType.VCE, "c7fe7698-8063-4e26-8bd3-ca3edde0b0d4")); - assertTrue(uris.containsAll(test) && test.containsAll(uris)); } diff --git a/common/src/test/java/org/onap/so/client/aai/entities/uri/AAISimpleUriFromParentUriTest.java b/common/src/test/java/org/onap/so/client/aai/entities/uri/AAISimpleUriFromParentUriTest.java index d26ff8d507..0249bea794 100644 --- a/common/src/test/java/org/onap/so/client/aai/entities/uri/AAISimpleUriFromParentUriTest.java +++ b/common/src/test/java/org/onap/so/client/aai/entities/uri/AAISimpleUriFromParentUriTest.java @@ -33,7 +33,7 @@ public class AAISimpleUriFromParentUriTest { AAIResourceUri parentUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, "key1", "key2", "key3"); - AAIUri uri = new AAISimpleUri(parentUri, AAIObjectType.ALLOTTED_RESOURCE, "key4"); + AAIResourceUri uri = new AAISimpleUri(parentUri, AAIObjectType.ALLOTTED_RESOURCE, "key4"); assertEquals("path appended", "/business/customers/customer/key1/service-subscriptions/service-subscription/key2/service-instances/service-instance/key3/allotted-resources/allotted-resource/key4", diff --git a/common/src/test/java/org/onap/so/client/aai/entities/uri/AAISimpleUriFromUriTest.java b/common/src/test/java/org/onap/so/client/aai/entities/uri/AAISimpleUriFromUriTest.java index ab1529d3ba..6bf67ffce8 100644 --- a/common/src/test/java/org/onap/so/client/aai/entities/uri/AAISimpleUriFromUriTest.java +++ b/common/src/test/java/org/onap/so/client/aai/entities/uri/AAISimpleUriFromUriTest.java @@ -24,7 +24,6 @@ import static org.junit.Assert.assertEquals; import javax.ws.rs.core.UriBuilder; import org.junit.Test; import org.onap.so.client.aai.AAIObjectType; -import org.onap.so.client.graphinventory.entities.uri.SimpleUri; public class AAISimpleUriFromUriTest { @@ -33,7 +32,7 @@ public class AAISimpleUriFromUriTest { @Test public void removeHost() { - AAIUri uri = new AAISimpleUri(AAIObjectType.UNKNOWN, + AAIResourceUri uri = new AAISimpleUri(AAIObjectType.UNKNOWN, UriBuilder .fromUri("https://localhost:8443/aai/v9/network/vces/vce/a9fec18e-1ea3-40e4-a6c0-a89b3de07053") .build()); @@ -46,7 +45,7 @@ public class AAISimpleUriFromUriTest { @Test public void noChange() { - AAIUri uri = new AAISimpleUri(AAIObjectType.UNKNOWN, + AAIResourceUri uri = new AAISimpleUri(AAIObjectType.UNKNOWN, UriBuilder.fromUri("/network/vces/vce/a9fec18e-1ea3-40e4-a6c0-a89b3de07053").build()); assertEquals("no change", "/network/vces/vce/a9fec18e-1ea3-40e4-a6c0-a89b3de07053", uri.build().toString()); @@ -56,11 +55,22 @@ public class AAISimpleUriFromUriTest { @Test public void encodingPreserved() { - AAIUri uri = new AAISimpleUri(AAIObjectType.UNKNOWN, + AAIResourceUri uri = new AAISimpleUri(AAIObjectType.UNKNOWN, UriBuilder.fromUri("/network/vces/vce/a9f%20%20ec18e-1ea3-40e4-a6c0-a89b3de07053").build()); assertEquals("encoding preserved", "/network/vces/vce/a9f%20%20ec18e-1ea3-40e4-a6c0-a89b3de07053", uri.build().toString()); } + + @Test + public void beforeBuildEquality() { + + AAIResourceUri uri = new AAISimpleUri(AAIObjectType.VCE, + UriBuilder.fromUri("/network/vces/vce/a9f%20%20ec18e-1ea3-40e4-a6c0-a89b3de07053").build()); + + AAIResourceUri uri2 = new AAISimpleUri(AAIObjectType.VCE, "a9f ec18e-1ea3-40e4-a6c0-a89b3de07053"); + assertEquals("are equal", uri2, uri); + + } } diff --git a/common/src/test/java/org/onap/so/client/aai/entities/uri/AAISimpleUriTest.java b/common/src/test/java/org/onap/so/client/aai/entities/uri/AAISimpleUriTest.java index 4e9d5aa8e8..6c1b3d69a2 100644 --- a/common/src/test/java/org/onap/so/client/aai/entities/uri/AAISimpleUriTest.java +++ b/common/src/test/java/org/onap/so/client/aai/entities/uri/AAISimpleUriTest.java @@ -20,14 +20,10 @@ package org.onap.so.client.aai.entities.uri; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.collection.IsEmptyCollection.empty; -import static org.hamcrest.collection.IsIterableContainingInOrder.contains; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; @@ -36,7 +32,6 @@ import org.junit.Test; import org.onap.so.client.aai.AAIObjectPlurals; import org.onap.so.client.aai.AAIObjectType; import org.onap.so.client.graphinventory.entities.uri.Depth; -import org.onap.so.client.graphinventory.entities.uri.SimpleUri; public class AAISimpleUriTest { @@ -44,34 +39,52 @@ public class AAISimpleUriTest { @Test public void relatedToTestPlural() { - AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, "test1"); - uri.relatedTo(AAIObjectPlurals.PSERVER); + AAIPluralResourceUri uri = + AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, "test1").relatedTo(AAIObjectPlurals.PSERVER); String uriOutput = uri.build().toString(); - assertEquals(true, uriOutput.contains("related-to")); + assertEquals("/network/generic-vnfs/generic-vnf/test1/related-to/pservers", uriOutput); } @Test public void relatedToTestSingular() { - AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, "test1"); - uri.relatedTo(AAIObjectType.PSERVER, "test2"); + AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, "test1") + .relatedTo(AAIObjectType.PSERVER, "test2"); String uriOutput = uri.build().toString(); - assertEquals(true, uriOutput.contains("related-to")); + assertEquals("/network/generic-vnfs/generic-vnf/test1/related-to/pservers/pserver/test2", uriOutput); } @Test public void cloneTestSingular() { AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, "test1"); AAIResourceUri cloned = uri.clone(); - Map keys = cloned.getURIKeys(); - assertThat(keys.values(), contains("test1")); + assertEquals("/network/generic-vnfs/generic-vnf/test1", cloned.build().toString()); + + cloned.limit(2); + + assertNotEquals(uri.build().toString(), cloned.build().toString()); } @Test public void cloneTestPlural() { - AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.GENERIC_VNF); - AAIResourceUri cloned = uri.clone(); - Map keys = cloned.getURIKeys(); - assertThat(keys.values(), empty()); + AAISimplePluralUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.GENERIC_VNF); + AAISimplePluralUri cloned = uri.clone(); + assertEquals("/network/generic-vnfs", cloned.build().toString()); + } + + @Test + public void cloneTestWithRelatedTo() { + AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, "test1") + .relatedTo(AAIObjectType.PSERVER, "test2"); + String uriOutput = uri.clone().build().toString(); + assertEquals("/network/generic-vnfs/generic-vnf/test1/related-to/pservers/pserver/test2", uriOutput); + } + + @Test + public void cloneTestPluralWithRelatedTo() { + AAIPluralResourceUri uri = + AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, "test1").relatedTo(AAIObjectPlurals.PSERVER); + String uriOutput = uri.clone().build().toString(); + assertEquals("/network/generic-vnfs/generic-vnf/test1/related-to/pservers", uriOutput); } @Test diff --git a/common/src/test/java/org/onap/so/client/aai/entities/uri/AAIUriFactoryTest.java b/common/src/test/java/org/onap/so/client/aai/entities/uri/AAIUriFactoryTest.java index 9b4f5dafb5..8a203f6439 100644 --- a/common/src/test/java/org/onap/so/client/aai/entities/uri/AAIUriFactoryTest.java +++ b/common/src/test/java/org/onap/so/client/aai/entities/uri/AAIUriFactoryTest.java @@ -24,14 +24,13 @@ import static org.junit.Assert.assertEquals; import org.junit.Test; import org.onap.so.client.aai.AAIObjectPlurals; import org.onap.so.client.aai.AAIObjectType; -import org.onap.so.client.graphinventory.entities.uri.SimpleUri; public class AAIUriFactoryTest { @Test public void testCreateResourceUri() { - AAIUri uri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, "VIP(VelocitytoIP)"); + AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, "VIP(VelocitytoIP)"); String expected = "/network/generic-vnfs/generic-vnf/VIP%28VelocitytoIP%29"; assertEquals(expected, uri.build().toString()); @@ -40,7 +39,7 @@ public class AAIUriFactoryTest { @Test public void testCreateNodesUri() { - AAIUri uri = AAIUriFactory.createNodesUri(AAIObjectType.GENERIC_VNF, "VIP(VelocitytoIP)"); + AAIResourceUri uri = AAIUriFactory.createNodesUri(AAIObjectType.GENERIC_VNF, "VIP(VelocitytoIP)"); String expected = "/nodes/generic-vnfs/generic-vnf/VIP%28VelocitytoIP%29"; assertEquals(expected, uri.build().toString()); @@ -49,8 +48,8 @@ public class AAIUriFactoryTest { @Test public void testCreateResourceFromExistingURI() { - AAIUri uri = new AAISimpleUri(AAIObjectType.GENERIC_VNF, "VIP(VelocitytoIP)"); - AAIUri uri2 = AAIUriFactory.createResourceFromExistingURI(AAIObjectType.GENERIC_VNF, uri.build()); + AAIResourceUri uri = new AAISimpleUri(AAIObjectType.GENERIC_VNF, "VIP(VelocitytoIP)"); + AAIResourceUri uri2 = AAIUriFactory.createResourceFromExistingURI(AAIObjectType.GENERIC_VNF, uri.build()); String expected = "/network/generic-vnfs/generic-vnf/VIP%28VelocitytoIP%29"; assertEquals(expected, uri2.build().toString()); @@ -59,7 +58,8 @@ public class AAIUriFactoryTest { @Test public void testCreateResourceURIForPluralsWithValues() { - AAIUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.SERVICE_INSTANCE, "customerId", "serviceType"); + AAIPluralResourceUri uri = + AAIUriFactory.createResourceUri(AAIObjectPlurals.SERVICE_INSTANCE, "customerId", "serviceType"); String expected = "/business/customers/customer/customerId/service-subscriptions/service-subscription/serviceType/service-instances"; diff --git a/common/src/test/java/org/onap/so/client/aai/entities/uri/AllottedResourceLookupUriTest.java b/common/src/test/java/org/onap/so/client/aai/entities/uri/AllottedResourceLookupUriTest.java index 4be6753894..a92a7c3c1a 100644 --- a/common/src/test/java/org/onap/so/client/aai/entities/uri/AllottedResourceLookupUriTest.java +++ b/common/src/test/java/org/onap/so/client/aai/entities/uri/AllottedResourceLookupUriTest.java @@ -44,7 +44,7 @@ public class AllottedResourceLookupUriTest { "/business/customers/customer/key1/service-subscriptions/service-subscription/key2/service-instances/service-instance/key3/allotted-resources/allotted-resource/key4") .when(spy).getObjectById(any(Object.class)); - final URI result = spy.build(); + final URI result = spy.locateAndBuild(); final URI expected = UriBuilder.fromPath( "/business/customers/customer/key1/service-subscriptions/service-subscription/key2/service-instances/service-instance/key3/allotted-resources/allotted-resource/key4") .build(); diff --git a/common/src/test/java/org/onap/so/client/aai/entities/uri/IncorrectNumberOfUriKeysTest.java b/common/src/test/java/org/onap/so/client/aai/entities/uri/IncorrectNumberOfUriKeysTest.java index 86ee08c4e6..3fbbc7c110 100644 --- a/common/src/test/java/org/onap/so/client/aai/entities/uri/IncorrectNumberOfUriKeysTest.java +++ b/common/src/test/java/org/onap/so/client/aai/entities/uri/IncorrectNumberOfUriKeysTest.java @@ -21,8 +21,6 @@ package org.onap.so.client.aai.entities.uri; import static org.hamcrest.CoreMatchers.equalTo; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -48,7 +46,7 @@ public class IncorrectNumberOfUriKeysTest { public void verifyIncorrectNumberOfKeysPlural() { thrown.expect(IncorrectNumberOfUriKeys.class); - AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.VOLUME_GROUP, "my-cloud-owner"); + AAISimplePluralUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.VOLUME_GROUP, "my-cloud-owner"); } diff --git a/common/src/test/java/org/onap/so/client/aai/entities/uri/ServiceInstanceUriTest.java b/common/src/test/java/org/onap/so/client/aai/entities/uri/ServiceInstanceUriTest.java index 9bef35e3b5..71d65b6f45 100644 --- a/common/src/test/java/org/onap/so/client/aai/entities/uri/ServiceInstanceUriTest.java +++ b/common/src/test/java/org/onap/so/client/aai/entities/uri/ServiceInstanceUriTest.java @@ -56,11 +56,11 @@ import org.mockito.InjectMocks; import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; import org.onap.so.client.aai.AAIClient; -import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.aai.AAIObjectPlurals; import org.onap.so.client.aai.AAIResourcesClient; import org.onap.so.client.aai.entities.AAIResultWrapper; import org.onap.so.client.defaultproperties.DefaultAAIPropertiesImpl; -import org.onap.so.client.graphinventory.entities.uri.Depth; +import org.onap.so.client.graphinventory.entities.uri.HttpAwareUri; import org.onap.so.client.graphinventory.exceptions.GraphInventoryPayloadException; import org.onap.so.client.graphinventory.exceptions.GraphInventoryUriComputationException; import org.onap.so.client.graphinventory.exceptions.GraphInventoryUriNotFoundException; @@ -111,7 +111,7 @@ public class ServiceInstanceUriTest { "/business/customers/customer/key1/service-subscriptions/service-subscription/key2/service-instances/service-instance/key3") .when(spy).getObjectById(any(Object.class)); - final URI result = spy.build(); + final URI result = spy.locateAndBuild(); final URI expected = UriBuilder.fromPath( "/business/customers/customer/key1/service-subscriptions/service-subscription/key2/service-instances/service-instance/key3") .build(); @@ -129,7 +129,7 @@ public class ServiceInstanceUriTest { "/business/customers/customer/key1/service-subscriptions/service-subscription/key2/service-instances/service-instance/key3") .when(spy).getObjectById(any(Object.class)); - final URI result = spy.resourceVersion("1234").build(); + final URI result = ((HttpAwareUri) spy.resourceVersion("1234")).locateAndBuild(); final URI expected = UriBuilder.fromUri( "/business/customers/customer/key1/service-subscriptions/service-subscription/key2/service-instances/service-instance/key3?resource-version=1234") .build(); @@ -147,7 +147,7 @@ public class ServiceInstanceUriTest { "/business/customers/customer/key1/service-subscriptions/service-subscription/key2/service-instances/service-instance/key3%20space") .when(spy).getObjectById(any(Object.class)); - final URI result = spy.build(); + final URI result = spy.locateAndBuild(); final URI expected = UriBuilder.fromUri( "/business/customers/customer/key1/service-subscriptions/service-subscription/key2/service-instances/service-instance/key3%20space") .build(); @@ -175,9 +175,8 @@ public class ServiceInstanceUriTest { ServiceInstanceUri spy = spy(instance); String uri = "/business/customers/customer/key1/service-subscriptions/service-subscription/key2/service-instances/service-instance/key3"; - doReturn(uri).when(spy).getObjectById(any(Object.class)); doReturn(Optional.of(uri)).when(spy).getCachedValue(); - final URI result = spy.resourceVersion("1234").clone().build(); + final URI result = ((HttpAwareUri) spy.resourceVersion("1234").clone()).locateAndBuild(); final URI expected = UriBuilder.fromUri( "/business/customers/customer/key1/service-subscriptions/service-subscription/key2/service-instances/service-instance/key3?resource-version=1234") .build(); @@ -210,7 +209,7 @@ public class ServiceInstanceUriTest { when(wrapper.getJson()).thenReturn(content); when(spy.getResourcesClient()).thenReturn(mockResourcesClient); exception.expect(GraphInventoryUriComputationException.class); - spy.build(); + spy.locateAndBuild(); } @@ -233,7 +232,7 @@ public class ServiceInstanceUriTest { .stubFor(get(urlPathMatching("/aai/v[0-9]+/nodes/service-instances/service-instance/key3")).willReturn( aResponse().withStatus(404).withHeader("Content-Type", "application/json").withBodyFile(""))); exception.expect(NotFoundException.class); - spy.build(); + spy.locateAndBuild(); } @Test @@ -250,7 +249,7 @@ public class ServiceInstanceUriTest { ArgumentMatchers.>any())).thenReturn(wrapper); when(wrapper.getJson()).thenReturn(content); when(spy.getResourcesClient()).thenReturn(mockResourcesClient); - spy.build(); + spy.locateAndBuild(); instance = spy.clone(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); @@ -271,6 +270,32 @@ public class ServiceInstanceUriTest { // use the cached value do not call out to external system verify(spy2, times(0)).getResourcesClient(); + } + + @Test + public void relatedToTest() throws GraphInventoryUriNotFoundException, GraphInventoryPayloadException { + ServiceInstanceUri instance = new ServiceInstanceUri("key1"); + ServiceInstanceUri spy = spy(instance); + doReturn( + "/business/customers/customer/key1/service-subscriptions/service-subscription/key2/service-instances/service-instance/key3") + .when(spy).getObjectById(any(Object.class)); + + final URI result = spy.relatedTo(AAIObjectPlurals.GENERIC_VNF).queryParam("vnf-name", "my-vnf-name").build(); + final URI expected = UriBuilder.fromUri( + "/business/customers/customer/key1/service-subscriptions/service-subscription/key2/service-instances/service-instance/key3/related-to/generic-vnfs?vnf-name=my-vnf-name") + .build(); + assertEquals("result is equal", expected, result); + } + + @Test + public void relatedToEqualityTestBeforeBuildTest() + throws GraphInventoryUriNotFoundException, GraphInventoryPayloadException { + ServiceInstanceUri instance = new ServiceInstanceUri("key1"); + ServiceInstanceUri spy = spy(instance); + + final AAIPluralResourceUri result = + spy.relatedTo(AAIObjectPlurals.GENERIC_VNF).queryParam("vnf-name", "my-vnf-name"); + assertEquals("result is equal", result, result); } } -- cgit 1.2.3-korg