diff options
Diffstat (limited to 'common')
64 files changed, 1332 insertions, 762 deletions
diff --git a/common/pom.xml b/common/pom.xml index 02d2f35545..d373d620cd 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -16,7 +16,7 @@ <protobuf.version>3.6.1</protobuf.version> <grpc.netty.version>4.1.30.Final</grpc.netty.version> <ccsdk.version>0.4.2</ccsdk.version> - <appc.client.version>1.6.0-SNAPSHOT</appc.client.version> + <appc.client.version>1.7.1-SNAPSHOT</appc.client.version> </properties> <dependencies> @@ -59,7 +59,7 @@ <dependency> <groupId>org.onap.aai.schema-service</groupId> <artifactId>aai-schema</artifactId> - <version>1.6.4-SNAPSHOT</version> + <version>1.6.5</version> </dependency> <dependency> <groupId>org.modelmapper</groupId> diff --git a/common/src/main/java/org/onap/so/appc/orchestrator/service/beans/ApplicationControllerTaskRequest.java b/common/src/main/java/org/onap/so/appc/orchestrator/service/beans/ApplicationControllerTaskRequest.java index 3811b52551..c240957ae9 100644 --- a/common/src/main/java/org/onap/so/appc/orchestrator/service/beans/ApplicationControllerTaskRequest.java +++ b/common/src/main/java/org/onap/so/appc/orchestrator/service/beans/ApplicationControllerTaskRequest.java @@ -1,6 +1,8 @@ package org.onap.so.appc.orchestrator.service.beans; import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; import org.onap.appc.client.lcm.model.Action; import org.onap.so.appc.orchestrator.service.beans.ApplicationControllerVnf; @@ -18,6 +20,15 @@ public class ApplicationControllerTaskRequest implements Serializable { private String existingSoftwareVersion; private String newSoftwareVersion; private ApplicationControllerVnf applicationControllerVnf; + private Map<String, String> configParams = new HashMap<String, String>(); + + public Map<String, String> getConfigParams() { + return configParams; + } + + public void setConfigParams(Map<String, String> configParams) { + this.configParams = configParams; + } public Action getAction() { return action; diff --git a/common/src/main/java/org/onap/so/client/RestClient.java b/common/src/main/java/org/onap/so/client/RestClient.java index 077ba24c2b..30389de742 100644 --- a/common/src/main/java/org/onap/so/client/RestClient.java +++ b/common/src/main/java/org/onap/so/client/RestClient.java @@ -188,8 +188,7 @@ public abstract class RestClient { client.register(new PayloadLoggingClientFilter(this.getMaxPayloadSize())); } CommonObjectMapperProvider provider = this.getCommonObjectMapperProvider(); - client.register(new JacksonJsonProvider(provider.getMapper())); - + client.register(provider).register(new JacksonJsonProvider(provider.getMapper())); metricLogClientFilter = new SOMetricLogClientFilter(); mdcSetup.setTargetEntity(getTargetEntity()); client.register(metricLogClientFilter); 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 @@ -100,12 +101,17 @@ public class AAIObjectPlurals implements GraphInventoryObjectPlurals, Serializab } @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<String, AAIObjectType> 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<Class<? extends AAIObjectType>> resources = r.getSubTypesOf(AAIObjectType.class); - try { - for (Class<? extends AAIObjectType> customTypeClass : resources) { - AAIObjectType customType; + + for (Class<? extends AAIObjectType> 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<AAIResourcesClient, AAIResourceUri, AAIEdgeLabel, AAIResultWrapper, AAITransactionalClient, AAISingleTransactionClient> { + GraphInventoryResourcesClient<AAIResourcesClient, AAIBaseResourceUri<?, ?>, AAIResourceUri, AAIPluralResourceUri, AAIEdgeLabel, AAIResultWrapper, AAITransactionalClient, AAISingleTransactionClient> { private AAIClient aaiClient; @@ -55,6 +56,11 @@ public class AAIResourcesClient extends } @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<GraphInventoryEdgeLabel> label) { + protected Relationship buildRelationship(AAIResourceUri uri, Optional<GraphInventoryEdgeLabel> 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<AAISingleTransactionClient, AAIResourceUri, AAIEdgeLabel> { +public class AAISingleTransactionClient extends + GraphInventoryTransactionClient<AAISingleTransactionClient, AAIBaseResourceUri<?, ?>, AAIResourceUri, AAIEdgeLabel> { private final SingleTransactionRequest request; private AAIResourcesClient resourcesClient; @@ -137,12 +138,12 @@ public class AAISingleTransactionClient } @Override - protected <T> Optional<T> get(GenericType<T> genericType, AAIResourceUri clone) { + protected <T> Optional<T> get(GenericType<T> 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<AAITransactionalClient, AAIResourceUri, AAIEdgeLabel> { +public class AAITransactionalClient extends + GraphInventoryTransactionClient<AAITransactionalClient, AAIBaseResourceUri<?, ?>, AAIResourceUri, AAIEdgeLabel> { private final Transactions transactions; private Transaction currentTransaction; @@ -189,12 +190,12 @@ public class AAITransactionalClient } @Override - protected <T> Optional<T> get(GenericType<T> genericType, AAIResourceUri clone) { + protected <T> Optional<T> get(GenericType<T> 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/AAIVersion.java b/common/src/main/java/org/onap/so/client/aai/AAIVersion.java index 4f06b787f7..42887884db 100644 --- a/common/src/main/java/org/onap/so/client/aai/AAIVersion.java +++ b/common/src/main/java/org/onap/so/client/aai/AAIVersion.java @@ -23,7 +23,16 @@ package org.onap.so.client.aai; import org.onap.so.client.graphinventory.GraphInventoryVersion; public enum AAIVersion implements GraphInventoryVersion { - V13("v13"), V14("v14"), V15("v15"), V16("v16"), V17("v17"), V18("v18"), V19("v19"); + V10("V10"), + V11("V11"), + V12("V12"), + V13("v13"), + V14("v14"), + V15("v15"), + V16("v16"), + V17("v17"), + V18("v18"), + V19("v19"); public static final AAIVersion LATEST = AAIVersion.values()[AAIVersion.values().length - 1]; private final String value; 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<T extends AAIBaseResourceUri<?, ?>, OT extends AAIObjectBase> + extends AAIUri<T, OT>, GraphInventoryResourceUri<T, OT> { + +} 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<AAIPluralResourceUri, AAIObjectPlurals>, + GraphInventoryPluralResourceUri<AAIPluralResourceUri, AAIObjectPlurals> { + +} 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<AAIResourceUri, AAIObjectType>, + GraphInventorySingleResourceUri<AAIResourceUri, AAIPluralResourceUri, AAIObjectType, AAIObjectPlurals> { - @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<AAIPluralResourceUri, AAIResourceUri, AAIObjectPlurals, AAIObjectType> + 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<AAIResourceUri, AAIPluralResourceUri, AAIObjectType, AAIObjectPlurals> + 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<T extends AAIUri<?, ?>, OP extends AAIObjectBase> extends GraphInventoryUri<T, OP> { - /** - * 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<String, String> map = getURIKeys(uri); - return super.build(map.values().toArray(values)); + Map<String, String> 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<String, String> 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 extends RestProperties> 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<Self, Uri extends GraphInventoryResourceUri, EdgeLabel extends GraphInventoryEdgeLabel, Wrapper extends GraphInventoryResultWrapper, TransactionalClient, SingleTransactionClient> { +public abstract class GraphInventoryResourcesClient<Self, Uri extends GraphInventoryResourceUri<?, ?>, 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<Self, Uri extends GraphInven * @param uri * @return */ - public void create(Uri uri, Object obj) { + public void create(SingleUri uri, Object obj) { RestClient giRC = client.createClient(uri); giRC.put(obj); } @@ -60,7 +69,7 @@ public abstract class GraphInventoryResourcesClient<Self, Uri extends GraphInven * @param uri * @return */ - public void createEmpty(Uri uri) { + public void createEmpty(SingleUri uri) { RestClient giRC = client.createClient(uri); giRC.put(""); } @@ -72,7 +81,7 @@ public abstract class GraphInventoryResourcesClient<Self, Uri extends GraphInven * @return */ public boolean exists(Uri uri) { - GraphInventoryResourceUri forceMinimal = uri.clone(); + GraphInventoryResourceUri<?, ?> forceMinimal = (Uri) uri.clone(); forceMinimal.format(Format.COUNT); forceMinimal.limit(1); try { @@ -91,8 +100,8 @@ public abstract class GraphInventoryResourcesClient<Self, Uri extends GraphInven * @param uriB * @return */ - public void connect(Uri uriA, Uri uriB) { - GraphInventoryResourceUri uriAClone = uriA.clone(); + public void connect(SingleUri uriA, SingleUri uriB) { + GraphInventorySingleResourceUri<?, ?, ?, ?> uriAClone = (SingleUri) uriA.clone(); RestClient giRC = client.createClient(uriAClone.relationshipAPI()); giRC.put(this.buildRelationship(uriB)); } @@ -105,8 +114,8 @@ public abstract class GraphInventoryResourcesClient<Self, Uri extends GraphInven * @param edge label * @return */ - public void connect(Uri uriA, Uri uriB, EdgeLabel label) { - GraphInventoryResourceUri uriAClone = uriA.clone(); + public void connect(SingleUri uriA, SingleUri uriB, EdgeLabel label) { + GraphInventorySingleResourceUri<?, ?, ?, ?> uriAClone = (SingleUri) uriA.clone(); RestClient giRC = client.createClient(uriAClone.relationshipAPI()); giRC.put(this.buildRelationship(uriB, label)); } @@ -118,8 +127,8 @@ public abstract class GraphInventoryResourcesClient<Self, Uri extends GraphInven * @param uriB * @return */ - public void disconnect(Uri uriA, Uri uriB) { - GraphInventoryResourceUri uriAClone = uriA.clone(); + public void disconnect(SingleUri uriA, SingleUri uriB) { + GraphInventorySingleResourceUri<?, ?, ?, ?> uriAClone = (SingleUri) uriA.clone(); RestClient giRC = client.createClient(uriAClone.relationshipAPI()); giRC.delete(this.buildRelationship(uriB)); } @@ -130,8 +139,8 @@ public abstract class GraphInventoryResourcesClient<Self, Uri extends GraphInven * @param uri * @return */ - public void delete(Uri uri) { - GraphInventoryResourceUri clone = uri.clone(); + public void delete(SingleUri uri) { + GraphInventorySingleResourceUri<?, ?, ?, ?> clone = (SingleUri) uri.clone(); RestClient giRC = client.createClient(clone); Map<String, Object> result = giRC.get(new GenericType<Map<String, Object>>() {}).orElseThrow( () -> new NotFoundException(clone.build() + " does not exist in " + client.getGraphDBName())); @@ -145,7 +154,7 @@ public abstract class GraphInventoryResourcesClient<Self, Uri extends GraphInven * @param uri * @return */ - public void update(Uri uri, Object obj) { + public void update(SingleUri uri, Object obj) { RestClient giRC = client.createClient(uri); giRC.patch(obj); } @@ -206,6 +215,88 @@ public abstract class GraphInventoryResourcesClient<Self, Uri extends GraphInven } } + public <T, R> Optional<R> getOne(Class<T> pluralClass, Class<R> resultClass, PluralUri uri) { + Optional<List<R>> 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 <T, R> Optional<R> getFirst(Class<T> pluralClass, Class<R> resultClass, PluralUri uri) { + Optional<List<R>> result = unwrapPlural(pluralClass, resultClass, uri); + + if (result.isPresent() && !result.get().isEmpty()) { + return Optional.of(result.get().get(0)); + } + + return Optional.empty(); + } + + public <T, R> Optional<Wrapper> getFirstWrapper(Class<T> pluralClass, Class<R> resultClass, PluralUri uri) { + + Optional<R> result = getFirst(pluralClass, resultClass, uri); + if (result.isPresent()) { + return Optional.of(this.createWrapper(result.get())); + } else { + return Optional.empty(); + } + } + + public <T, R> Optional<Wrapper> getOneWrapper(Class<T> pluralClass, Class<R> resultClass, PluralUri uri) { + + Optional<R> result = getOne(pluralClass, resultClass, uri); + if (result.isPresent()) { + return Optional.of(this.createWrapper(result.get())); + } else { + return Optional.empty(); + } + } + + protected <T, R> Optional<List<R>> unwrapPlural(Class<T> pluralClass, Class<R> resultClass, PluralUri uri) { + try { + PluralUri clone = (PluralUri) uri.clone().limit(1); + Optional<T> obj = client.createClient(clone).get(pluralClass); + if (obj.isPresent()) { + Optional<Method> 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<R>) 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<Self, Uri extends GraphInven * @param uri * @return */ - public Self createIfNotExists(Uri uri, Optional<Object> obj) { - if (!this.exists(uri)) { + public Self createIfNotExists(SingleUri uri, Optional<Object> obj) { + if (!this.exists((Uri) uri)) { if (obj.isPresent()) { this.create(uri, obj.get()); } else { @@ -281,17 +372,21 @@ public abstract class GraphInventoryResourcesClient<Self, Uri extends GraphInven return (Self) this; } - protected Relationship buildRelationship(GraphInventoryResourceUri uri) { + protected Relationship buildRelationship(SingleUri uri) { return buildRelationship(uri, Optional.empty()); } - protected Relationship buildRelationship(GraphInventoryResourceUri uri, GraphInventoryEdgeLabel label) { + protected Relationship buildRelationship(SingleUri uri, GraphInventoryEdgeLabel label) { return buildRelationship(uri, Optional.of(label)); } - protected Relationship buildRelationship(GraphInventoryResourceUri uri, Optional<GraphInventoryEdgeLabel> label) { + protected Relationship buildRelationship(SingleUri uri, Optional<GraphInventoryEdgeLabel> 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<Self, Uri extends GraphInven public abstract Wrapper createWrapper(String json); + public abstract Wrapper createWrapper(Object json); + /** * Starts a transaction which encloses multiple GraphInventory mutations * diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionClient.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionClient.java index 45ac1f741d..3469d73599 100644 --- a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionClient.java +++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionClient.java @@ -29,11 +29,12 @@ import javax.ws.rs.core.GenericType; import org.onap.aai.domain.yang.Relationship; import org.onap.so.client.graphinventory.entities.GraphInventoryEdgeLabel; import org.onap.so.client.graphinventory.entities.uri.GraphInventoryResourceUri; +import org.onap.so.client.graphinventory.entities.uri.GraphInventorySingleResourceUri; import org.onap.so.client.graphinventory.exceptions.BulkProcessFailed; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class GraphInventoryTransactionClient<Self, Uri extends GraphInventoryResourceUri, EdgeLabel extends GraphInventoryEdgeLabel> { +public abstract class GraphInventoryTransactionClient<Self, Uri extends GraphInventoryResourceUri<?, ?>, SingleUri extends GraphInventorySingleResourceUri<?, ?, ?, ?>, EdgeLabel extends GraphInventoryEdgeLabel> { protected static Logger logger = LoggerFactory.getLogger(GraphInventoryTransactionClient.class); @@ -50,7 +51,7 @@ public abstract class GraphInventoryTransactionClient<Self, Uri extends GraphInv * @param uri * @return */ - public Self create(Uri uri, Object obj) { + public Self create(SingleUri uri, Object obj) { this.put(uri.build().toString(), obj); incrementActionAmount(); return (Self) this; @@ -62,7 +63,7 @@ public abstract class GraphInventoryTransactionClient<Self, Uri extends GraphInv * @param uri * @return */ - public Self createEmpty(Uri uri) { + public Self createEmpty(SingleUri uri) { this.put(uri.build().toString(), new HashMap<String, String>()); incrementActionAmount(); return (Self) this; @@ -75,8 +76,8 @@ public abstract class GraphInventoryTransactionClient<Self, Uri extends GraphInv * @param uri * @return */ - public Self createIfNotExists(Uri uri, Optional<Object> obj) { - if (!this.exists(uri)) { + public Self createIfNotExists(SingleUri uri, Optional<Object> obj) { + if (!this.exists((Uri) uri)) { if (obj.isPresent()) { this.create(uri, obj.get()); } else { @@ -94,8 +95,8 @@ public abstract class GraphInventoryTransactionClient<Self, Uri extends GraphInv * @param uriB * @return */ - public Self connect(Uri uriA, Uri uriB) { - GraphInventoryResourceUri uriAClone = uriA.clone(); + public Self connect(SingleUri uriA, SingleUri uriB) { + GraphInventorySingleResourceUri uriAClone = uriA.clone(); this.put(uriAClone.relationshipAPI().build().toString(), this.buildRelationship(uriB)); incrementActionAmount(); return (Self) this; @@ -108,8 +109,8 @@ public abstract class GraphInventoryTransactionClient<Self, Uri extends GraphInv * @param uris * @return */ - public Self connect(Uri uriA, List<Uri> uris) { - for (Uri uri : uris) { + public Self connect(SingleUri uriA, List<SingleUri> uris) { + for (SingleUri uri : uris) { this.connect(uriA, uri); } return (Self) this; @@ -122,8 +123,8 @@ public abstract class GraphInventoryTransactionClient<Self, Uri extends GraphInv * @param uris * @return */ - public Self connect(Uri uriA, Uri uriB, EdgeLabel label) { - GraphInventoryResourceUri uriAClone = uriA.clone(); + public Self connect(SingleUri uriA, SingleUri uriB, EdgeLabel label) { + GraphInventorySingleResourceUri uriAClone = uriA.clone(); this.put(uriAClone.relationshipAPI().build().toString(), this.buildRelationship(uriB, label)); return (Self) this; } @@ -135,8 +136,8 @@ public abstract class GraphInventoryTransactionClient<Self, Uri extends GraphInv * @param uris * @return */ - public Self connect(Uri uriA, List<Uri> uris, EdgeLabel label) { - for (Uri uri : uris) { + public Self connect(SingleUri uriA, List<SingleUri> uris, EdgeLabel label) { + for (SingleUri uri : uris) { this.connect(uriA, uri, label); } return (Self) this; @@ -149,8 +150,8 @@ public abstract class GraphInventoryTransactionClient<Self, Uri extends GraphInv * @param uriB * @return */ - public Self disconnect(Uri uriA, Uri uriB) { - GraphInventoryResourceUri uriAClone = uriA.clone(); + public Self disconnect(SingleUri uriA, SingleUri uriB) { + GraphInventorySingleResourceUri uriAClone = uriA.clone(); this.delete(uriAClone.relationshipAPI().build().toString(), this.buildRelationship(uriB)); incrementActionAmount(); return (Self) this; @@ -163,8 +164,8 @@ public abstract class GraphInventoryTransactionClient<Self, Uri extends GraphInv * @param uris * @return */ - public Self disconnect(Uri uriA, List<Uri> uris) { - for (Uri uri : uris) { + public Self disconnect(SingleUri uriA, List<SingleUri> uris) { + for (SingleUri uri : uris) { this.disconnect(uriA, uri); } return (Self) this; @@ -176,8 +177,8 @@ public abstract class GraphInventoryTransactionClient<Self, Uri extends GraphInv * @param uri * @return */ - public Self delete(Uri uri) { - Map<String, Object> result = this.get(new GenericType<Map<String, Object>>() {}, (Uri) uri.clone()) + public Self delete(SingleUri uri) { + Map<String, Object> result = this.get(new GenericType<Map<String, Object>>() {}, (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<Self, Uri extends GraphInv */ public abstract void execute() throws BulkProcessFailed; - private Relationship buildRelationship(Uri uri) { + private Relationship buildRelationship(SingleUri uri) { return buildRelationship(uri, Optional.empty()); } - private Relationship buildRelationship(Uri uri, EdgeLabel label) { + private Relationship buildRelationship(SingleUri uri, EdgeLabel label) { return buildRelationship(uri, Optional.of(label)); } - private Relationship buildRelationship(Uri uri, Optional<EdgeLabel> label) { + private Relationship buildRelationship(SingleUri uri, Optional<EdgeLabel> 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/DSLNode.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLNodeBase.java index 7ee5bd328e..5802e9c4e8 100644 --- a/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLNode.java +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLNodeBase.java @@ -26,41 +26,51 @@ import java.util.List; import org.onap.so.client.aai.entities.QueryStep; import org.onap.so.client.graphinventory.GraphInventoryObjectName; -public class DSLNode implements QueryStep { +public abstract class DSLNodeBase<T extends DSLNodeBase<?>> implements QueryStep { - private final String nodeName; - private final List<DSLNodeKey> nodeKeys; - private final StringBuilder query = new StringBuilder(); - private boolean output = false; + protected final String nodeName; + protected final List<DSLNodeKey> nodeKeys; + protected final StringBuilder query; + protected boolean output = false; - public DSLNode() { + public DSLNodeBase() { this.nodeName = ""; this.nodeKeys = new ArrayList<>(); + this.query = new StringBuilder(); } - public DSLNode(GraphInventoryObjectName name) { + public DSLNodeBase(GraphInventoryObjectName name) { this.nodeName = name.typeName(); this.nodeKeys = new ArrayList<>(); + this.query = new StringBuilder(); query.append(nodeName); } - public DSLNode(GraphInventoryObjectName name, DSLNodeKey... key) { + public DSLNodeBase(GraphInventoryObjectName name, DSLNodeKey... key) { this.nodeName = name.typeName(); this.nodeKeys = Arrays.asList(key); + this.query = new StringBuilder(); query.append(nodeName); } - public DSLNode output() { + public DSLNodeBase(DSLNodeBase<?> copy) { + this.nodeName = copy.nodeName; + this.nodeKeys = copy.nodeKeys; + this.query = new StringBuilder(copy.query); + this.output = copy.output; + } + + public DSLOutputNode output() { this.output = true; - return this; + return new DSLOutputNode(this); } - public DSLNode and(DSLNodeKey... key) { + public T and(DSLNodeKey... key) { this.nodeKeys.addAll(Arrays.asList(key)); - return this; + return (T) this; } @Override diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLOutputNode.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLOutputNode.java new file mode 100644 index 0000000000..d799795650 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLOutputNode.java @@ -0,0 +1,8 @@ +package org.onap.so.client.graphinventory.entities; + +public class DSLOutputNode extends DSLNodeBase<DSLOutputNode> implements Output { + + public DSLOutputNode(DSLNodeBase<?> copy) { + super(copy); + } +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLQuery.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLQuery.java index 3056c9ca80..1fa79a714c 100644 --- a/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLQuery.java +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLQuery.java @@ -31,17 +31,11 @@ public class DSLQuery { } - public DSLQuery(String dsl) { - this.dsl = dsl; + public DSLQuery(DSLTraversal<? extends Output> dsl) { + this.dsl = dsl.get(); } public String getDsl() { return dsl; } - - public void setDsl(String dsl) { - this.dsl = dsl; - } - - } diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLQueryBuilder.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLQueryBuilder.java index 540472a88d..7ff6e2ed22 100644 --- a/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLQueryBuilder.java +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLQueryBuilder.java @@ -27,35 +27,31 @@ import java.util.List; import java.util.stream.Collectors; import org.onap.so.client.aai.entities.QueryStep; import org.onap.so.client.graphinventory.GraphInventoryObjectName; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.google.common.base.Joiner; - -public class DSLQueryBuilder<S, E> implements QueryStep { +public class DSLQueryBuilder<S, E> { private List<QueryStep> steps = new ArrayList<>(); private String suffix = ""; - private static final Logger logger = LoggerFactory.getLogger(DSLQueryBuilder.class); - public DSLQueryBuilder() { + protected DSLQueryBuilder() { } - public DSLQueryBuilder(DSLNode node) { + protected DSLQueryBuilder(QueryStep node) { steps.add(node); } - public DSLQueryBuilder<S, DSLNode> node(DSLNode node) { + public <T> DSLQueryBuilder<S, DSLNodeBase<?>> node(DSLNodeBase<?> node) { steps.add(node); - return (DSLQueryBuilder<S, DSLNode>) this; + return (DSLQueryBuilder<S, DSLNodeBase<?>>) this; } - public DSLQueryBuilder<S, E> output() { + public DSLQueryBuilder<S, Node> output() { Object obj = steps.get(steps.size() - 1); - if (obj instanceof DSLNode) { - ((DSLNode) steps.get(steps.size() - 1)).output(); + if (obj instanceof DSLNodeBase) { + ((DSLNodeBase) steps.get(steps.size() - 1)).output(); } else if (obj.getClass().getName().contains("$$Lambda$")) { // process lambda expressions for (Field f : obj.getClass().getDeclaredFields()) { @@ -63,27 +59,28 @@ public class DSLQueryBuilder<S, E> implements QueryStep { Object o; try { o = f.get(obj); - if (o instanceof DSLQueryBuilder && ((DSLQueryBuilder) o).steps.get(0) instanceof DSLNode) { - ((DSLNode) ((DSLQueryBuilder) o).steps.get(0)).output(); + if (o instanceof DSLQueryBuilder && ((DSLQueryBuilder) o).steps.get(0) instanceof DSLNodeBase) { + ((DSLNodeBase) ((DSLQueryBuilder) o).steps.get(0)).output(); } } catch (IllegalArgumentException | IllegalAccessException e) { - logger.error("Exception occured", e); } f.setAccessible(false); break; } } - return this; + return (DSLQueryBuilder<S, Node>) this; } - public <E2> DSLQueryBuilder<S, E2> union(final DSLQueryBuilder<?, E2>... union) { + @SafeVarargs + public final <E2> DSLQueryBuilder<S, E2> union(final DSLQueryBuilder<?, E2>... union) { List<DSLQueryBuilder<?, ?>> unions = Arrays.asList(union); steps.add(() -> { StringBuilder query = new StringBuilder(); - query.append("> [ ").append( - Joiner.on(", ").join(unions.stream().map(item -> item.build()).collect(Collectors.toList()))) + query.append("> [ ") + .append(Joiner.on(", ") + .join(unions.stream().map(item -> item.compile()).collect(Collectors.toList()))) .append(" ]"); return query.toString(); }); @@ -95,7 +92,7 @@ public class DSLQueryBuilder<S, E> implements QueryStep { steps.add(() -> { StringBuilder query = new StringBuilder(); - query.append(where.build()).append(")"); + query.append(where.compile()).append(")"); String result = query.toString(); if (!result.startsWith(">")) { result = "> " + result; @@ -105,22 +102,22 @@ public class DSLQueryBuilder<S, E> implements QueryStep { return this; } - public DSLQueryBuilder<S, E> to(DSLQueryBuilder<?, ?> to) { + public <E2> DSLQueryBuilder<S, E2> to(DSLQueryBuilder<?, E2> to) { steps.add(() -> { StringBuilder query = new StringBuilder(); - query.append("> ").append(to.build()); + query.append("> ").append(to.compile()); return query.toString(); }); - return this; + return (DSLQueryBuilder<S, E2>) this; } public DSLQueryBuilder<S, E> to(GraphInventoryObjectName name) { - return to(__.node(name)); + return (DSLQueryBuilder<S, E>) to(__.node(name)); } public DSLQueryBuilder<S, E> to(GraphInventoryObjectName name, DSLNodeKey... key) { - return to(__.node(name, key)); + return (DSLQueryBuilder<S, E>) to(__.node(name, key)); } public DSLQueryBuilder<S, E> limit(int limit) { @@ -128,24 +125,19 @@ public class DSLQueryBuilder<S, E> implements QueryStep { return this; } - @Override - public String build() { - return compile(); + public DSLTraversal<E> build() { + return new DSLTraversal<>(compile()); } @Override public String toString() { - return build(); + return build().get(); } @Override public boolean equals(Object o) { if (o != null) { - if (o instanceof QueryStep) { - return ((QueryStep) o).build().equals(this.build()); - } else if (o instanceof String) { - return o.equals(this.build()); - } + return o.toString().equals(toString()); } return false; } @@ -153,11 +145,11 @@ public class DSLQueryBuilder<S, E> implements QueryStep { @Override public int hashCode() { - return build().hashCode(); + return compile().hashCode(); } private String compile() { - return Joiner.on(" ").join(steps.stream().map(item -> item.build()).collect(Collectors.toList())) + suffix; + return String.join(" ", steps.stream().map(item -> item.build()).collect(Collectors.toList())) + suffix; } protected QueryStep getFirst() { diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLStartNode.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLStartNode.java new file mode 100644 index 0000000000..fb0772726f --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLStartNode.java @@ -0,0 +1,19 @@ +package org.onap.so.client.graphinventory.entities; + +import org.onap.so.client.graphinventory.GraphInventoryObjectName; + +public class DSLStartNode extends DSLNodeBase<DSLStartNode> implements Start { + + + public DSLStartNode() { + super(); + } + + public DSLStartNode(GraphInventoryObjectName name) { + super(name); + } + + public DSLStartNode(GraphInventoryObjectName name, DSLNodeKey... key) { + super(name, key); + } +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLTraversal.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLTraversal.java new file mode 100644 index 0000000000..40f80463b2 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/DSLTraversal.java @@ -0,0 +1,33 @@ +package org.onap.so.client.graphinventory.entities; + +public class DSLTraversal<T> { + + private final String traversal; + + protected DSLTraversal(String traversal) { + this.traversal = traversal; + } + + public String get() { + return traversal; + } + + @Override + public String toString() { + return traversal; + } + + @Override + public int hashCode() { + return traversal.hashCode(); + } + + @Override + public boolean equals(Object o) { + if (o != null) { + return this.toString().equals(o); + } + return false; + } + +} 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<Wrapper extends GraphInventoryResultWrapper, Uri extends GraphInventoryResourceUri, Type extends GraphInventoryObjectType> { +public abstract class GraphInventoryRelationships<Wrapper extends GraphInventoryResultWrapper<?>, Uri extends GraphInventorySingleResourceUri<?, ?, ?, ?>, Type extends GraphInventoryObjectType> { protected final ObjectMapper mapper; protected Map<String, Object> map; diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/Node.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/Node.java new file mode 100644 index 0000000000..cdaae7d91f --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/Node.java @@ -0,0 +1,5 @@ +package org.onap.so.client.graphinventory.entities; + +public interface Node extends Output { + +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/Output.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/Output.java new file mode 100644 index 0000000000..06b8b65984 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/Output.java @@ -0,0 +1,7 @@ +package org.onap.so.client.graphinventory.entities; + +import org.onap.so.client.aai.entities.QueryStep; + +public interface Output extends QueryStep { + +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/Start.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/Start.java new file mode 100644 index 0000000000..c649e36eca --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/Start.java @@ -0,0 +1,7 @@ +package org.onap.so.client.graphinventory.entities; + +import org.onap.so.client.aai.entities.QueryStep; + +public interface Start extends QueryStep { + +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/TraversalBuilder.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/TraversalBuilder.java new file mode 100644 index 0000000000..0af29f78e6 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/TraversalBuilder.java @@ -0,0 +1,17 @@ +package org.onap.so.client.graphinventory.entities; + +public class TraversalBuilder { + + + private TraversalBuilder() { + + } + + public static DSLQueryBuilder<Start, Start> fragment(Start node) { + return new DSLQueryBuilder<>(node); + } + + public static DSLQueryBuilder<Output, Output> traversal(Output node) { + return new DSLQueryBuilder<>(node); + } +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/__.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/__.java index 87d4d84cac..ca0bd9e00d 100644 --- a/common/src/main/java/org/onap/so/client/graphinventory/entities/__.java +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/__.java @@ -32,24 +32,25 @@ public class __ { return new DSLQueryBuilder<>(); } - public static <A> DSLQueryBuilder<A, A> start(DSLNode node) { + public static <A> DSLQueryBuilder<A, A> start(Start node) { return new DSLQueryBuilder<>(node); } - public static DSLQueryBuilder<DSLNode, DSLNode> node(GraphInventoryObjectName name) { + public static DSLQueryBuilder<DSLStartNode, DSLStartNode> node(GraphInventoryObjectName name) { - return __.<DSLNode>start(new DSLNode(name)); + return __.<DSLStartNode>start(new DSLStartNode(name)); } - public static DSLQueryBuilder<DSLNode, DSLNode> node(GraphInventoryObjectName name, DSLNodeKey... key) { - return __.<DSLNode>start(new DSLNode(name, key)); + public static DSLQueryBuilder<DSLStartNode, DSLStartNode> node(GraphInventoryObjectName name, DSLNodeKey... key) { + return __.<DSLStartNode>start(new DSLStartNode(name, key)); } public static DSLNodeKey key(String keyName, Object... value) { return new DSLNodeKey(keyName, value); } - public static <A, B> DSLQueryBuilder<A, B> union(final DSLQueryBuilder<?, B>... traversal) { + @SafeVarargs + public static final <A, B> DSLQueryBuilder<A, B> union(final DSLQueryBuilder<?, B>... traversal) { return __.<A>identity().union(traversal); } 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<T extends GraphInventoryResourceUri<?, ?>, OT extends GraphInventoryObjectBase> + extends GraphInventoryResourceUri<T, OT> { + +} 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<T extends GraphInventoryResourceUri<?, ?>, OT extends GraphInventoryObjectBase> + extends GraphInventoryUri<T, OT> { - 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<T extends GraphInventorySingleResourceUri<?, ?, ?, ?>, P extends GraphInventoryPluralResourceUri<?, ?>, SingleObject extends GraphInventoryObjectType, PluralObject extends GraphInventoryObjectPlurals> + extends GraphInventoryResourceUri<T, SingleObject> { + + 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<T extends 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<String, String> 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<T extends GraphInventoryResourceUri<?, ?>, Parent extends GraphInventorySingleResourceUri<?, ?, ?, ?>, S extends GraphInventoryObjectBase> + implements GraphInventoryResourceUri<T, S> { + + 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<String, Set<String>> 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<T, Parent, S> 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<String, String> getURIKeys() { + return this.getURIKeys(this.build().toString()); + } + + protected Map<String, String> 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<String> 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<T extends GraphInventoryPluralResourceUri<?, ?>, Parent extends GraphInventorySingleResourceUri<?, ?, ?, ?>, PT extends GraphInventoryObjectPlurals, OT extends GraphInventoryObjectType> + extends SimpleBaseUri<T, Parent, PT> implements GraphInventoryPluralResourceUri<T, PT>, 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<T, Parent, PT, OT> 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<T extends GraphInventorySingleResourceUri<?, ?, ?, ?>, PT extends GraphInventoryPluralResourceUri<?, ?>, S extends GraphInventoryObjectType, P extends GraphInventoryObjectPlurals> + extends SimpleBaseUri<T, T, S> implements GraphInventorySingleResourceUri<T, PT, S, P> { 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<T, T, S> 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<String, String> getURIKeys() { - return this.getURIKeys(this.build().toString()); - } - - protected Map<String, String> 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<String> 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/main/java/org/onap/so/client/policy/CommonObjectMapperProvider.java b/common/src/main/java/org/onap/so/client/policy/CommonObjectMapperProvider.java index c55370f7dc..334e0f7231 100644 --- a/common/src/main/java/org/onap/so/client/policy/CommonObjectMapperProvider.java +++ b/common/src/main/java/org/onap/so/client/policy/CommonObjectMapperProvider.java @@ -20,13 +20,16 @@ package org.onap.so.client.policy; +import javax.ws.rs.ext.ContextResolver; +import javax.ws.rs.ext.Provider; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; -public class CommonObjectMapperProvider { +@Provider +public class CommonObjectMapperProvider implements ContextResolver<ObjectMapper> { protected ObjectMapper mapper; @@ -43,4 +46,10 @@ public class CommonObjectMapperProvider { public ObjectMapper getMapper() { return mapper; } + + @Override + public ObjectMapper getContext(Class<?> type) { + + return mapper; + } } 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<Results<Map<String, Object>>>() {})); 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<GenericVnf> 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<GenericVnf> 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<GenericVnf> 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<GenericVnf> 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<GenericVnf> 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<AAIResourceUri> uris = new ArrayList<AAIResourceUri>(); + List<AAIResourceUri> uris = new ArrayList<>(); uris.add(uriB); Map<String, Object> map = new HashMap<>(); @@ -117,7 +117,7 @@ public class AAITransactionalClientTest { @Test public void testDisconnect() throws IOException { - List<AAIResourceUri> uris = new ArrayList<AAIResourceUri>(); + List<AAIResourceUri> 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/DSLQueryBuilderTest.java b/common/src/test/java/org/onap/so/client/aai/DSLQueryBuilderTest.java index fb45652d53..1a1a7d124e 100644 --- a/common/src/test/java/org/onap/so/client/aai/DSLQueryBuilderTest.java +++ b/common/src/test/java/org/onap/so/client/aai/DSLQueryBuilderTest.java @@ -23,17 +23,19 @@ package org.onap.so.client.aai; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.junit.Test; -import org.onap.so.client.graphinventory.entities.DSLNode; import org.onap.so.client.graphinventory.entities.DSLNodeKey; import org.onap.so.client.graphinventory.entities.DSLQueryBuilder; +import org.onap.so.client.graphinventory.entities.DSLStartNode; +import org.onap.so.client.graphinventory.entities.Output; +import org.onap.so.client.graphinventory.entities.Start; +import org.onap.so.client.graphinventory.entities.TraversalBuilder; import org.onap.so.client.graphinventory.entities.__; public class DSLQueryBuilderTest { - @Test public void whereTest() { - DSLQueryBuilder<DSLNode, DSLNode> builder = new DSLQueryBuilder<>(new DSLNode(AAIObjectType.CLOUD_REGION, + DSLQueryBuilder<Start, Start> builder = TraversalBuilder.fragment(new DSLStartNode(AAIObjectType.CLOUD_REGION, __.key("cloud-owner", "att-nc"), __.key("cloud-region-id", "test"))); builder.to(__.node(AAIObjectType.VLAN_TAG)) @@ -42,13 +44,13 @@ public class DSLQueryBuilderTest { assertEquals("cloud-region('cloud-owner', 'att-nc')('cloud-region-id', 'test') > " + "vlan-tag (> owning-entity('owning-entity-name', 'name')) > " + "vlan-tag*('vlan-id-outer', '108')", - builder.build()); + builder.build().get()); } @Test public void unionTest() { - DSLQueryBuilder<DSLNode, DSLNode> builder = - new DSLQueryBuilder<>(new DSLNode(AAIObjectType.GENERIC_VNF, __.key("vnf-id", "vnfId")).output()); + DSLQueryBuilder<Output, Output> builder = TraversalBuilder + .traversal(new DSLStartNode(AAIObjectType.GENERIC_VNF, __.key("vnf-id", "vnfId")).output()); builder.union(__.node(AAIObjectType.PSERVER).output().to(__.node(AAIObjectType.COMPLEX).output()), __.node(AAIObjectType.VSERVER) @@ -56,53 +58,53 @@ public class DSLQueryBuilderTest { assertEquals( "generic-vnf*('vnf-id', 'vnfId') > " + "[ pserver* > complex*, " + "vserver > pserver* > complex* ]", - builder.build()); + builder.build().get()); } @Test public void whereUnionTest() { - DSLQueryBuilder<DSLNode, DSLNode> builder = - new DSLQueryBuilder<>(new DSLNode(AAIObjectType.GENERIC_VNF, __.key("vnf-id", "vnfId")).output()); + DSLQueryBuilder<Output, Output> builder = TraversalBuilder + .traversal(new DSLStartNode(AAIObjectType.GENERIC_VNF, __.key("vnf-id", "vnfId")).output()); builder.where(__.union(__.node(AAIObjectType.PSERVER, __.key("hostname", "hostname1")), __.node(AAIObjectType.VSERVER).to(__.node(AAIObjectType.PSERVER, __.key("hostname", "hostname1"))))); assertEquals("generic-vnf*('vnf-id', 'vnfId') (> [ pserver('hostname', 'hostname1'), " - + "vserver > pserver('hostname', 'hostname1') ])", builder.build()); + + "vserver > pserver('hostname', 'hostname1') ])", builder.build().get()); } @Test public void notNullTest() { - DSLQueryBuilder<DSLNode, DSLNode> builder = new DSLQueryBuilder<>( - new DSLNode(AAIObjectType.CLOUD_REGION, __.key("cloud-owner", "", "null").not()).output()); + DSLQueryBuilder<Output, Output> builder = TraversalBuilder.traversal( + new DSLStartNode(AAIObjectType.CLOUD_REGION, __.key("cloud-owner", "", "null").not()).output()); - assertEquals("cloud-region* !('cloud-owner', ' ', ' null ')", builder.build()); + assertEquals("cloud-region* !('cloud-owner', ' ', ' null ')", builder.build().get()); } @Test public void shortCutToTest() { - DSLQueryBuilder<DSLNode, DSLNode> builder = - new DSLQueryBuilder<>(new DSLNode(AAIObjectType.PSERVER, __.key("hostname", "my-hostname")).output()); + DSLQueryBuilder<Output, Output> builder = TraversalBuilder + .traversal(new DSLStartNode(AAIObjectType.PSERVER, __.key("hostname", "my-hostname")).output()); builder.to(AAIObjectType.P_INTERFACE).to(AAIObjectType.SRIOV_PF, __.key("pf-pci-id", "my-id")); assertEquals("pserver*('hostname', 'my-hostname') > p-interface > sriov-pf('pf-pci-id', 'my-id')", - builder.build()); + builder.build().get()); } @Test public void limitTest() { - DSLQueryBuilder<DSLNode, DSLNode> builder = - new DSLQueryBuilder<>(new DSLNode(AAIObjectType.PSERVER, __.key("hostname", "my-hostname")).output()); + DSLQueryBuilder<Output, Output> builder = TraversalBuilder + .traversal(new DSLStartNode(AAIObjectType.PSERVER, __.key("hostname", "my-hostname")).output()); builder.to(AAIObjectType.P_INTERFACE).limit(2).to(AAIObjectType.SRIOV_PF, __.key("pf-pci-id", "my-id")); assertEquals("pserver*('hostname', 'my-hostname') > p-interface > sriov-pf('pf-pci-id', 'my-id') LIMIT 2", - builder.build()); + builder.build().get()); } @Test public void equalsTest() { - DSLQueryBuilder<DSLNode, DSLNode> builder = - new DSLQueryBuilder<>(new DSLNode(AAIObjectType.PSERVER, __.key("hostname", "my-hostname")).output()); + DSLQueryBuilder<Output, Output> builder = TraversalBuilder + .traversal(new DSLStartNode(AAIObjectType.PSERVER, __.key("hostname", "my-hostname")).output()); builder.to(AAIObjectType.P_INTERFACE).to(AAIObjectType.SRIOV_PF, __.key("pf-pci-id", "my-id")); assertTrue( @@ -110,10 +112,9 @@ public class DSLQueryBuilderTest { assertTrue(builder.equals(builder)); } - @Test public void mixedTypeTest() { - DSLQueryBuilder<DSLNode, DSLNode> builder = new DSLQueryBuilder<>(new DSLNode(AAIObjectType.CLOUD_REGION, + DSLQueryBuilder<Start, Start> builder = TraversalBuilder.fragment(new DSLStartNode(AAIObjectType.CLOUD_REGION, __.key("cloud-owner", "owner"), __.key("cloud-region-id", "id"))); builder.to(__.node(AAIObjectType.VLAN_TAG, __.key("vlan-id-outer", 167), __.key("my-boolean", true)).output()); assertTrue(builder.equals( @@ -122,19 +123,19 @@ public class DSLQueryBuilderTest { @Test public void outputOnNodeLambdasTest() { - DSLQueryBuilder<DSLNode, DSLNode> builder = - new DSLQueryBuilder<>(new DSLNode(AAIObjectType.L_INTERFACE, new DSLNodeKey("interface-id", "myId"))); + DSLQueryBuilder<Start, Start> builder = TraversalBuilder + .fragment(new DSLStartNode(AAIObjectType.L_INTERFACE, new DSLNodeKey("interface-id", "myId"))); builder.to(AAIObjectType.VSERVER, __.key("vserver-name", "myName")).output().to(AAIObjectType.P_INTERFACE) .output(); assertEquals("l-interface('interface-id', 'myId') > vserver*('vserver-name', 'myName') > p-interface*", - builder.build()); + builder.build().get()); } @Test public void skipOutputOnUnionTest() { - DSLQueryBuilder<DSLNode, DSLNode> builder = - new DSLQueryBuilder<>(new DSLNode(AAIObjectType.GENERIC_VNF, __.key("vnf-id", "vnfId")).output()); + DSLQueryBuilder<Output, Output> builder = TraversalBuilder + .traversal(new DSLStartNode(AAIObjectType.GENERIC_VNF, __.key("vnf-id", "vnfId")).output()); builder.union(__.node(AAIObjectType.PSERVER).output().to(__.node(AAIObjectType.COMPLEX).output()), __.node(AAIObjectType.VSERVER) @@ -143,6 +144,6 @@ public class DSLQueryBuilderTest { assertEquals( "generic-vnf*('vnf-id', 'vnfId') > " + "[ pserver* > complex*, " + "vserver > pserver* > complex* ]", - builder.build()); + builder.build().get()); } } 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<AAIResourceUri> test = relationships.getRelatedUris(AAIObjectType.VCE); - - System.out.println(test.get(0).build()); List<AAIResourceUri> 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<String, String> 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<String, String> 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.<Class<NotFoundException>>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); } } |