2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.so.client.graphinventory.entities;
23 import java.io.IOException;
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.List;
28 import java.util.Optional;
29 import java.util.function.Predicate;
31 import org.onap.so.client.aai.AAICommonObjectMapperProvider;
32 import org.onap.so.client.aai.AAIObjectType;
33 import org.onap.so.client.aai.entities.AAIResultWrapper;
34 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
35 import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvider;
36 import org.onap.so.client.graphinventory.GraphInventoryObjectName;
37 import org.onap.so.client.graphinventory.GraphInventoryObjectType;
38 import org.onap.so.client.graphinventory.entities.uri.GraphInventoryResourceUri;
39 import org.onap.so.jsonpath.JsonPathUtil;
41 import com.fasterxml.jackson.core.type.TypeReference;
42 import com.fasterxml.jackson.databind.ObjectMapper;
44 public abstract class GraphInventoryRelationships<Wrapper extends GraphInventoryResultWrapper, Uri extends GraphInventoryResourceUri, Type extends GraphInventoryObjectType> {
46 protected final ObjectMapper mapper;
47 protected Map<String, Object> map;
48 protected final String jsonBody;
50 public GraphInventoryRelationships(String json) {
52 this.mapper = new GraphInventoryCommonObjectMapperProvider().getMapper();
54 this.map = mapper.readValue(json, new TypeReference<Map<String, Object>>() {});
55 } catch (IOException e) {
56 this.map = new HashMap<>();
60 public List<Wrapper> getByType(GraphInventoryObjectName type) {
62 return this.getAll(Optional.of(type));
65 public List<Wrapper> getAll() {
67 return this.getAll(Optional.empty());
71 public List<String> getRelatedLinks() {
72 return this.getRelatedLinks(Optional.empty());
75 public List<String> getRelatedLinks(GraphInventoryObjectName type) {
76 return this.getRelatedLinks(Optional.of(type));
79 public List<Uri> getRelatedUris() {
80 return this.getRelatedUris(x -> true);
83 public List<Uri> getRelatedUris(GraphInventoryObjectName type) {
84 return this.getRelatedUris(x -> type.typeName().equals(x));
86 protected List<Uri> getRelatedUris(Predicate<String> p) {
87 List<Uri> result = new ArrayList<>();
88 if (map.containsKey("relationship")) {
89 List<Map<String, Object>> relationships = (List<Map<String, Object>>)map.get("relationship");
90 for (Map<String, Object> relationship : relationships) {
91 final String relatedTo = (String)relationship.get("related-to");
92 if (p.test(relatedTo)) {
94 type = fromTypeName(relatedTo);
95 final String relatedLink = (String)relationship.get("related-link");
97 result.add(createUri(type, relatedLink));
106 protected List<Wrapper> getAll(final Optional<GraphInventoryObjectName> type) {
107 List<Uri> relatedLinks;
108 if (type.isPresent()) {
109 relatedLinks = this.getRelatedUris(type.get());
111 relatedLinks = this.getRelatedUris();
113 ArrayList<Wrapper> result = new ArrayList<>();
114 for (Uri link : relatedLinks) {
115 result.add(this.get(link));
120 protected abstract Wrapper get(Uri uri);
122 protected abstract Uri createUri(Type type, String relatedLink);
124 protected abstract Type fromTypeName(String name);
126 protected List<String> getRelatedLinks(Optional<GraphInventoryObjectName> type) {
128 if (type.isPresent()) {
129 matcher = "[?(@.related-to=='" + type.get().typeName() + "')]";
131 return JsonPathUtil.getInstance().locateResultList(this.jsonBody, String.format("$.relationship%s.related-link", matcher));
134 public String getJson() {
135 return this.jsonBody;