From 416c7a449548a2fc8709cd60b27b3bad40872b69 Mon Sep 17 00:00:00 2001 From: "Benjamin, Max (mb388a)" <mb388a@us.att.com> Date: Tue, 5 Mar 2019 16:42:10 -0500 Subject: query clients now have more useable result methods ResourceAndUrl now outputs the correct wrapper type query clients now have more useable result methods Change-Id: I000f8a7e7d4e204d1da7ad1c6bb5ce3e2d0135b2 Issue-ID: SO-1596 Signed-off-by: Benjamin, Max (mb388a) <mb388a@us.att.com> --- .../main/java/org/onap/so/client/RestClient.java | 4 ++ .../org/onap/so/client/aai/AAIDSLQueryClient.java | 14 ++++- .../org/onap/so/client/aai/AAIQueryClient.java | 13 +++- .../so/client/aai/entities/uri/HttpLookupUri.java | 5 +- .../graphinventory/GraphInventoryQueryClient.java | 72 +++++++++++++++++++++- .../graphinventory/entities/DSLQueryBuilder.java | 9 +++ .../entities/GraphInventoryRelationships.java | 2 +- .../entities/GraphInventoryResultWrapper.java | 15 +++-- .../onap/so/client/graphinventory/entities/Id.java | 5 ++ .../so/client/graphinventory/entities/Pathed.java | 5 ++ .../client/graphinventory/entities/Resource.java | 40 ++++++++++++ .../graphinventory/entities/ResourceAndUrl.java | 36 +++++++++++ 12 files changed, 208 insertions(+), 12 deletions(-) create mode 100644 common/src/main/java/org/onap/so/client/graphinventory/entities/Id.java create mode 100644 common/src/main/java/org/onap/so/client/graphinventory/entities/Pathed.java create mode 100644 common/src/main/java/org/onap/so/client/graphinventory/entities/Resource.java create mode 100644 common/src/main/java/org/onap/so/client/graphinventory/entities/ResourceAndUrl.java (limited to 'common/src/main/java/org') 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 76134a42f4..4284cea847 100644 --- a/common/src/main/java/org/onap/so/client/RestClient.java +++ b/common/src/main/java/org/onap/so/client/RestClient.java @@ -262,6 +262,10 @@ public abstract class RestClient { public <T> T put(Object obj, Class<T> resultClass) { return format(method("PUT", obj), resultClass).orElse(null); } + + public <T> T put(Object obj, GenericType<T> resultClass) { + return format(method("PUT", obj), resultClass).orElse(null); + } public <T> T delete(Class<T> resultClass) { return format(method("DELETE", null), resultClass).orElse(null); diff --git a/common/src/main/java/org/onap/so/client/aai/AAIDSLQueryClient.java b/common/src/main/java/org/onap/so/client/aai/AAIDSLQueryClient.java index 4cee4f3df7..5f2c623d57 100644 --- a/common/src/main/java/org/onap/so/client/aai/AAIDSLQueryClient.java +++ b/common/src/main/java/org/onap/so/client/aai/AAIDSLQueryClient.java @@ -20,12 +20,13 @@ package org.onap.so.client.aai; +import org.onap.so.client.aai.entities.AAIResultWrapper; import org.onap.so.client.aai.entities.uri.AAIUriFactory; import org.onap.so.client.graphinventory.GraphInventoryQueryClient; import org.onap.so.client.graphinventory.entities.DSLQuery; import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri; -public class AAIDSLQueryClient extends GraphInventoryQueryClient<AAIDSLQueryClient, DSLQuery> { +public class AAIDSLQueryClient extends GraphInventoryQueryClient<AAIDSLQueryClient, DSLQuery, AAIResultWrapper, AAIObjectType> { public AAIDSLQueryClient() { super(new AAIClient()); @@ -40,4 +41,15 @@ public class AAIDSLQueryClient extends GraphInventoryQueryClient<AAIDSLQueryClie return AAIUriFactory.createResourceUri(AAIObjectType.DSL); } + + @Override + public AAIResultWrapper createWrapper(String json) { + return new AAIResultWrapper(json); + } + + @Override + public AAIObjectType createType(String name) { + return AAIObjectType.fromTypeName(name); + } + } diff --git a/common/src/main/java/org/onap/so/client/aai/AAIQueryClient.java b/common/src/main/java/org/onap/so/client/aai/AAIQueryClient.java index 66d5d1f5cb..cc855e444a 100644 --- a/common/src/main/java/org/onap/so/client/aai/AAIQueryClient.java +++ b/common/src/main/java/org/onap/so/client/aai/AAIQueryClient.java @@ -20,12 +20,13 @@ package org.onap.so.client.aai; +import org.onap.so.client.aai.entities.AAIResultWrapper; import org.onap.so.client.aai.entities.CustomQuery; import org.onap.so.client.aai.entities.uri.AAIUriFactory; import org.onap.so.client.graphinventory.GraphInventoryQueryClient; import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri; -public class AAIQueryClient extends GraphInventoryQueryClient<AAIQueryClient, CustomQuery> { +public class AAIQueryClient extends GraphInventoryQueryClient<AAIQueryClient, CustomQuery, AAIResultWrapper, AAIObjectType> { public AAIQueryClient() { super(new AAIClient()); @@ -44,5 +45,15 @@ public class AAIQueryClient extends GraphInventoryQueryClient<AAIQueryClient, Cu protected GraphInventoryUri setupQueryParams(GraphInventoryUri uri) { return super.setupQueryParams(uri); } + + @Override + public AAIResultWrapper createWrapper(String json) { + return new AAIResultWrapper(json); + } + + @Override + public AAIObjectType createType(String name) { + return AAIObjectType.fromTypeName(name); + } } 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 324bb8abad..a627480d5d 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 @@ -33,6 +33,7 @@ import org.onap.so.client.aai.AAIObjectType; import org.onap.so.client.aai.AAIResourcesClient; import org.onap.so.client.aai.entities.Results; import org.onap.so.client.graphinventory.Format; +import org.onap.so.client.graphinventory.entities.Pathed; 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; @@ -82,9 +83,9 @@ public abstract class HttpLookupUri extends AAISimpleUri implements HttpAwareUri Optional<String> result; ObjectMapper mapper = new ObjectMapper(); - Results<Map<String, String>> results = mapper.readValue(jsonString, new TypeReference<Results<Map<String, String>>>(){}); + Results<Pathed> results = mapper.readValue(jsonString, new TypeReference<Results<Pathed>>(){}); if (results.getResult().size() == 1) { - String uriString = results.getResult().get(0).get("resource-link"); + String uriString = results.getResult().get(0).getResourceLink(); URI uri = UriBuilder.fromUri(uriString).build(); String rawPath = uri.getRawPath(); result = Optional.of(rawPath.replaceAll("/aai/v\\d+", "")); diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryQueryClient.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryQueryClient.java index c4bf0f0beb..152e9d7a36 100644 --- a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryQueryClient.java +++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryQueryClient.java @@ -20,17 +20,33 @@ package org.onap.so.client.graphinventory; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import java.util.Optional; +import java.util.stream.Collectors; -import org.onap.so.client.aai.entities.CustomQuery; +import javax.ws.rs.core.GenericType; + +import org.onap.so.client.aai.entities.Results; +import org.onap.so.client.graphinventory.entities.GraphInventoryResultWrapper; +import org.onap.so.client.graphinventory.entities.Pathed; +import org.onap.so.client.graphinventory.entities.ResourceAndUrl; import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri; -public abstract class GraphInventoryQueryClient<S, I> { +import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +public abstract class GraphInventoryQueryClient<S, I, Wrapper extends GraphInventoryResultWrapper<?>, Type extends GraphInventoryObjectType> { private Optional<String> depth = Optional.empty(); private boolean nodesOnly = false; private Optional<GraphInventorySubgraphType> subgraph = Optional.empty(); private GraphInventoryClient client; + private GraphInventoryCommonObjectMapperProvider mapperProvider = new GraphInventoryCommonObjectMapperProvider(); public GraphInventoryQueryClient(GraphInventoryClient client) { this.client = client; @@ -42,6 +58,58 @@ public abstract class GraphInventoryQueryClient<S, I> { return client.createClient(setupQueryParams(getQueryUri().queryParam("format", format.toString()))).put(query, String.class); } + protected <R> List<R> querySingleType(Format format, I query, Class<R> clazz) { + return client.createClient( + setupQueryParams(getQueryUri().queryParam("format", format.toString()))).put( + query, new GenericType<Results<Object>>(){}).getResult() + .stream().map(item -> { + try { + return mapperProvider.getMapper().readValue(mapperProvider.getMapper().writeValueAsString(item), clazz); + } catch (IOException e) { + throw new IllegalArgumentException("could not map values from json", e); + } + }).collect(Collectors.toList()); + } + + public List<Pathed> queryPathed(I query) { + return querySingleType(Format.PATHED, query, Pathed.class); + } + + public List<Id> queryId(I query) { + return querySingleType(Format.ID, query, Id.class); + } + + public <R> List<R> querySingleResource(I query, Class<R> clazz) { + try { + return getResourceAndUrl(query).stream().map(item -> item.getWrapper().asBean(clazz).get()).collect(Collectors.toList()); + } catch (IOException e) { + throw new IllegalArgumentException("could not map values from json", e); + } + } + + public List<ResourceAndUrl<Wrapper>> getResourceAndUrl(I query) throws IOException { + List<ResourceAndUrl<Wrapper>> result = new ArrayList<>(); + ObjectMapper mapper = mapperProvider.getMapper(); + Results<Map<String, Object>> resultsFromJson = mapper.readValue(query(Format.RESOURCE_AND_URL, query), + new TypeReference<Results<Map<String, Object>>>() { + }); + for (Map<String, Object> m : resultsFromJson.getResult()) { + for(Entry<String, Object> entrySet : m.entrySet()) { + if (!entrySet.getKey().equals("url")) { + String url = (String)m.get("url"); + String stringJson = mapper.writeValueAsString(entrySet.getValue()); + result.add(new ResourceAndUrl<Wrapper>(url, createType(entrySet.getKey()), createWrapper(stringJson))); + } + } + } + + return result; + } + + public abstract Wrapper createWrapper(String json); + + public abstract Type createType(String name); + public S depth (String depth) { this.depth = Optional.of(depth); return (S) this; 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 73dccea8e6..6554368b6d 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 @@ -26,6 +26,7 @@ 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 com.google.common.base.Joiner; @@ -94,6 +95,14 @@ public class DSLQueryBuilder<S, E> implements QueryStep { return this; } + public DSLQueryBuilder<S, E> to(GraphInventoryObjectName name) { + return to(__.node(name)); + } + + public DSLQueryBuilder<S, E> to(GraphInventoryObjectName name, DSLNodeKey... key) { + return to(__.node(name, key)); + } + public String limit(int limit) { return compile() + " LIMIT " + limit; } 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 759fad7e54..752a743247 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 @@ -126,7 +126,7 @@ public abstract class GraphInventoryRelationships<Wrapper extends GraphInventory protected List<String> getRelatedLinks(Optional<GraphInventoryObjectName> type) { String matcher = ""; if (type.isPresent()) { - matcher = "[?(@.related-to=='" + type.get() + "')]"; + matcher = "[?(@.related-to=='" + type.get().typeName() + "')]"; } return JsonPathUtil.getInstance().locateResultList(this.jsonBody, String.format("$.relationship%s.related-link", matcher)); } diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryResultWrapper.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryResultWrapper.java index c5651c0d26..c0b29e46c2 100644 --- a/common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryResultWrapper.java +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryResultWrapper.java @@ -86,22 +86,27 @@ public abstract class GraphInventoryResultWrapper<R extends GraphInventoryRelati } public Map<String, Object> asMap() { + + return asBean(new TypeReference<Map<String, Object>>(){}).orElse(new HashMap<>()); + } + + public <T> Optional<T> asBean(Class<T> clazz) { if (isEmpty()) { - return new HashMap<>(); + return Optional.empty(); } try { - return mapper.readValue(this.jsonBody, new TypeReference<Map<String, Object>>(){}); + return Optional.of(mapper.readValue(this.jsonBody, clazz)); } catch (IOException e) { - return new HashMap<>(); + return Optional.empty(); } } - public <T> Optional<T> asBean(Class<T> clazz) { + public <T> Optional<T> asBean(TypeReference<T> reference) { if (isEmpty()) { return Optional.empty(); } try { - return Optional.of(mapper.readValue(this.jsonBody, clazz)); + return Optional.of(mapper.readValue(this.jsonBody, reference)); } catch (IOException e) { return Optional.empty(); } diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/Id.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/Id.java new file mode 100644 index 0000000000..76492dc38b --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/Id.java @@ -0,0 +1,5 @@ +package org.onap.so.client.graphinventory.entities; + +public class Id extends Resource { + +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/Pathed.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/Pathed.java new file mode 100644 index 0000000000..a53bdc0259 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/Pathed.java @@ -0,0 +1,5 @@ +package org.onap.so.client.graphinventory.entities; + +public class Pathed extends Resource { + +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/Resource.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/Resource.java new file mode 100644 index 0000000000..5c53f2cbf1 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/Resource.java @@ -0,0 +1,40 @@ +package org.onap.so.client.graphinventory.entities; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "resource-type", + "resource-link" +}) +public class Resource { + + @JsonProperty("resource-type") + private String resourceType; + @JsonProperty("resource-link") + private String resourceLink; + + @JsonProperty("resource-type") + public String getResourceType() { + return resourceType; + } + + @JsonProperty("resource-type") + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + @JsonProperty("resource-link") + public String getResourceLink() { + return resourceLink; + } + + @JsonProperty("resource-link") + public void setResourceLink(String resourceLink) { + this.resourceLink = resourceLink; + } + +} + diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/ResourceAndUrl.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/ResourceAndUrl.java new file mode 100644 index 0000000000..e53fc02da7 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/ResourceAndUrl.java @@ -0,0 +1,36 @@ +package org.onap.so.client.graphinventory.entities; + +import org.onap.so.client.graphinventory.GraphInventoryObjectType; + +public class ResourceAndUrl<Wrapper extends GraphInventoryResultWrapper> { + + private String url; + private GraphInventoryObjectType type; + private Wrapper wrapper; + + public ResourceAndUrl(String url, GraphInventoryObjectType type, Wrapper wrapper) { + this.url = url; + this.type = type; + this.wrapper = wrapper; + } + public String getUrl() { + return url; + } + public void setUrl(String url) { + this.url = url; + } + public Wrapper getWrapper() { + return wrapper; + } + public void setWrapper(Wrapper wrapper) { + this.wrapper = wrapper; + } + public GraphInventoryObjectType getType() { + return type; + } + + public void setType(GraphInventoryObjectType type) { + this.type = type; + } + +} -- cgit 1.2.3-korg