add custom object support to a ai client
[so.git] / common / src / main / java / org / onap / so / client / aai / AAIObjectType.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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=========================================================
19  */
20
21 package org.onap.so.client.aai;
22
23 import java.io.Serializable;
24 import java.lang.reflect.Field;
25 import java.net.URL;
26 import java.util.HashMap;
27 import java.util.Map;
28 import java.util.Set;
29
30 import javax.annotation.Priority;
31
32 import org.onap.aai.annotations.Metadata;
33 import org.onap.aai.domain.yang.AggregateRoute;
34 import org.onap.aai.domain.yang.AllottedResource;
35 import org.onap.aai.domain.yang.CloudRegion;
36 import org.onap.aai.domain.yang.Collection;
37 import org.onap.aai.domain.yang.Complex;
38 import org.onap.aai.domain.yang.Configuration;
39 import org.onap.aai.domain.yang.Connector;
40 import org.onap.aai.domain.yang.Customer;
41 import org.onap.aai.domain.yang.Device;
42 import org.onap.aai.domain.yang.ExtAaiNetwork;
43 import org.onap.aai.domain.yang.GenericVnf;
44 import org.onap.aai.domain.yang.InstanceGroup;
45 import org.onap.aai.domain.yang.L3Network;
46 import org.onap.aai.domain.yang.LineOfBusiness;
47 import org.onap.aai.domain.yang.ModelVer;
48 import org.onap.aai.domain.yang.NetworkPolicy;
49 import org.onap.aai.domain.yang.NetworkTechnology;
50 import org.onap.aai.domain.yang.OperationalEnvironment;
51 import org.onap.aai.domain.yang.OwningEntity;
52 import org.onap.aai.domain.yang.PInterface;
53 import org.onap.aai.domain.yang.PhysicalLink;
54 import org.onap.aai.domain.yang.Platform;
55 import org.onap.aai.domain.yang.Pnf;
56 import org.onap.aai.domain.yang.PortGroup;
57 import org.onap.aai.domain.yang.Project;
58 import org.onap.aai.domain.yang.Pserver;
59 import org.onap.aai.domain.yang.RouteTableReference;
60 import org.onap.aai.domain.yang.ServiceInstance;
61 import org.onap.aai.domain.yang.ServiceSubscription;
62 import org.onap.aai.domain.yang.SpPartner;
63 import org.onap.aai.domain.yang.Subnet;
64 import org.onap.aai.domain.yang.Tenant;
65 import org.onap.aai.domain.yang.TunnelXconnect;
66 import org.onap.aai.domain.yang.Vce;
67 import org.onap.aai.domain.yang.VfModule;
68 import org.onap.aai.domain.yang.VlanTag;
69 import org.onap.aai.domain.yang.Vnfc;
70 import org.onap.aai.domain.yang.VolumeGroup;
71 import org.onap.aai.domain.yang.VpnBinding;
72 import org.onap.aai.domain.yang.Vserver;
73 import org.onap.so.client.graphinventory.GraphInventoryObjectType;
74 import org.onap.so.constants.Defaults;
75 import org.reflections.Reflections;
76 import org.reflections.scanners.SubTypesScanner;
77 import org.reflections.util.ClasspathHelper;
78 import org.reflections.util.ConfigurationBuilder;
79
80 import com.google.common.base.CaseFormat;
81
82 public class AAIObjectType implements GraphInventoryObjectType, Serializable {
83
84         private static final long serialVersionUID = -2877184776691514600L;
85         private static Map<String, AAIObjectType> map = new HashMap<>();
86
87         public static final AAIObjectType DEFAULT_CLOUD_REGION = new AAIObjectType(AAINamespaceConstants.CLOUD_INFRASTRUCTURE, "/cloud-regions/cloud-region/" + Defaults.CLOUD_OWNER + "/{cloud-region-id}", "default-cloud-region");
88         public static final AAIObjectType CUSTOMER = new AAIObjectType(AAINamespaceConstants.BUSINESS, Customer.class);
89         public static final AAIObjectType GENERIC_QUERY = new AAIObjectType("/search", "/generic-query", "generic-query");
90         public static final AAIObjectType BULK_PROCESS = new AAIObjectType("/bulkprocess", "", "bulkprocess");
91         public static final AAIObjectType SINGLE_TRANSACTION = new AAIObjectType("/bulk/single-transaction", "", "single-transaction");
92         public static final AAIObjectType GENERIC_VNF = new AAIObjectType(AAINamespaceConstants.NETWORK, GenericVnf.class);
93         public static final AAIObjectType VF_MODULE = new AAIObjectType(AAIObjectType.GENERIC_VNF.uriTemplate(), VfModule.class);
94         public static final AAIObjectType L3_NETWORK = new AAIObjectType(AAINamespaceConstants.NETWORK, L3Network.class);
95         public static final AAIObjectType NETWORK_POLICY = new AAIObjectType(AAINamespaceConstants.NETWORK, NetworkPolicy.class);
96         public static final AAIObjectType NODES_QUERY = new AAIObjectType("/search", "/nodes-query", "nodes-query");
97         public static final AAIObjectType CUSTOM_QUERY = new AAIObjectType("/query", "", "query");
98         public static final AAIObjectType ROUTE_TABLE_REFERENCE = new AAIObjectType(AAINamespaceConstants.NETWORK, RouteTableReference.class);
99         public static final AAIObjectType DEFAULT_TENANT = new AAIObjectType(AAINamespaceConstants.CLOUD_INFRASTRUCTURE + "/cloud-regions/cloud-region/" + Defaults.CLOUD_OWNER + "/AAIAIC25", "/tenants/tenant/{tenant-id}", "default-tenant");
100         public static final AAIObjectType VCE = new AAIObjectType(AAINamespaceConstants.NETWORK, Vce.class);
101         public static final AAIObjectType PORT_GROUP = new AAIObjectType(AAIObjectType.VCE.uriTemplate(), PortGroup.class);
102         public static final AAIObjectType VPN_BINDING = new AAIObjectType(AAINamespaceConstants.NETWORK, VpnBinding.class);
103         public static final AAIObjectType CONFIGURATION = new AAIObjectType(AAINamespaceConstants.NETWORK, Configuration.class);
104         public static final AAIObjectType PSERVER = new AAIObjectType(AAINamespaceConstants.CLOUD_INFRASTRUCTURE, Pserver.class);
105         public static final AAIObjectType SERVICE_SUBSCRIPTION = new AAIObjectType(AAIObjectType.CUSTOMER.uriTemplate(), ServiceSubscription.class);
106         public static final AAIObjectType SERVICE_INSTANCE = new AAIObjectType(AAIObjectType.SERVICE_SUBSCRIPTION.uriTemplate(), ServiceInstance.class);
107         public static final AAIObjectType PROJECT = new AAIObjectType(AAINamespaceConstants.BUSINESS, Project.class);
108         public static final AAIObjectType LINE_OF_BUSINESS = new AAIObjectType(AAINamespaceConstants.BUSINESS, LineOfBusiness.class);
109         public static final AAIObjectType PLATFORM = new AAIObjectType(AAINamespaceConstants.BUSINESS, Platform.class);
110         public static final AAIObjectType OWNING_ENTITY = new AAIObjectType(AAINamespaceConstants.BUSINESS, OwningEntity.class);
111         public static final AAIObjectType ALLOTTED_RESOURCE = new AAIObjectType(AAIObjectType.SERVICE_INSTANCE.uriTemplate(), AllottedResource.class);
112         public static final AAIObjectType PNF = new AAIObjectType(AAINamespaceConstants.NETWORK, Pnf.class);
113         public static final AAIObjectType OPERATIONAL_ENVIRONMENT = new AAIObjectType(AAINamespaceConstants.CLOUD_INFRASTRUCTURE, OperationalEnvironment.class);
114         public static final AAIObjectType CLOUD_REGION = new AAIObjectType(AAINamespaceConstants.CLOUD_INFRASTRUCTURE, CloudRegion.class);
115         public static final AAIObjectType TENANT = new AAIObjectType(AAIObjectType.CLOUD_REGION.uriTemplate(), Tenant.class);
116         public static final AAIObjectType VOLUME_GROUP = new AAIObjectType(AAIObjectType.CLOUD_REGION.uriTemplate(), VolumeGroup.class);
117         public static final AAIObjectType VSERVER = new AAIObjectType(AAIObjectType.TENANT.uriTemplate(), Vserver.class);
118         public static final AAIObjectType MODEL_VER = new AAIObjectType(AAINamespaceConstants.SERVICE_DESIGN_AND_CREATION + "/models/model/{model-invariant-id}", ModelVer.class);
119         public static final AAIObjectType TUNNEL_XCONNECT = new AAIObjectType(AAIObjectType.ALLOTTED_RESOURCE.uriTemplate(), TunnelXconnect.class);
120         public static final AAIObjectType P_INTERFACE = new AAIObjectType(AAIObjectType.PSERVER.uriTemplate(), PInterface.class);
121         public static final AAIObjectType PHYSICAL_LINK = new AAIObjectType(AAINamespaceConstants.NETWORK, PhysicalLink.class);
122         public static final AAIObjectType INSTANCE_GROUP = new AAIObjectType(AAINamespaceConstants.NETWORK, InstanceGroup.class);
123         public static final AAIObjectType COLLECTION = new AAIObjectType(AAINamespaceConstants.NETWORK, Collection.class);
124         public static final AAIObjectType VNFC = new AAIObjectType(AAINamespaceConstants.NETWORK, Vnfc.class);
125         public static final AAIObjectType VLAN_TAG = new AAIObjectType(AAINamespaceConstants.NETWORK, VlanTag.class);
126         public static final AAIObjectType COMPLEX = new AAIObjectType(AAINamespaceConstants.CLOUD_INFRASTRUCTURE, Complex.class);
127         public static final AAIObjectType CONNECTOR = new AAIObjectType(AAINamespaceConstants.BUSINESS, Connector.class);
128         public static final AAIObjectType NETWORK_TECHNOLOGY = new AAIObjectType(AAINamespaceConstants.CLOUD_INFRASTRUCTURE, NetworkTechnology.class);
129         public static final AAIObjectType SUBNET = new AAIObjectType(AAIObjectType.L3_NETWORK.uriTemplate(), Subnet.class);
130         public static final AAIObjectType SP_PARTNER = new AAIObjectType(AAINamespaceConstants.BUSINESS, SpPartner.class);
131         public static final AAIObjectType DEVICE = new AAIObjectType(AAINamespaceConstants.NETWORK, Device.class);
132         public static final AAIObjectType EXT_AAI_NETWORK = new AAIObjectType(AAINamespaceConstants.NETWORK, ExtAaiNetwork.class);
133         public static final AAIObjectType AGGREGATE_ROUTE = new AAIObjectType(AAINamespaceConstants.NETWORK, AggregateRoute.class);
134         public static final AAIObjectType UNKNOWN = new AAIObjectType("", "", "unknown");
135
136         private final String uriTemplate;
137         private final String parentUri;
138         private final String partialUri;
139         private final Class<?> aaiObjectClass;
140         private final String name;
141         
142         static {
143                 /* Locate any AAIObjectTypes on the classpath and add them to our map */
144                 java.util.Collection<URL> packages = ClasspathHelper.forPackage("");
145                 Reflections r = new Reflections(new ConfigurationBuilder().setUrls(packages).setScanners(new SubTypesScanner()));
146                 
147                 Set<Class<? extends AAIObjectType>> resources =
148                             r.getSubTypesOf(AAIObjectType.class);
149                 try {
150                         for (Class<? extends AAIObjectType> customTypeClass : resources) {
151                                 AAIObjectType customType;
152                                 customType = customTypeClass.newInstance();
153                         }
154                 } catch (InstantiationException | IllegalAccessException e) {
155                 }
156         }
157         protected AAIObjectType() {
158                 this.parentUri = null;
159                 this.partialUri = null;
160                 this.uriTemplate = null;
161                 this.aaiObjectClass = null;
162                 this.name = null;
163         }
164         protected AAIObjectType(String parentUri, String partialUri, String name) {
165                 this.parentUri = parentUri;
166                 this.partialUri = partialUri;
167                 this.uriTemplate = parentUri + partialUri;
168                 this.aaiObjectClass = null;
169                 this.name = name;
170                 if (!AAIObjectType.map.containsKey(name)) {
171                         AAIObjectType.map.put(name, this);
172                 }
173         }
174
175         protected AAIObjectType(String parentUri, Class<?> aaiObjectClass) {
176                 this.parentUri = parentUri;
177                 this.partialUri = removeParentUri(aaiObjectClass, parentUri);
178                 this.uriTemplate = parentUri + partialUri;
179                 this.aaiObjectClass = aaiObjectClass;
180                 this.name = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN, aaiObjectClass.getSimpleName());
181                 if (!AAIObjectType.map.containsKey(name)) {
182                         AAIObjectType.map.put(name, this);
183                 }
184         }
185
186         @Override
187         public String toString() {
188                 return this.uriTemplate();
189         }
190
191         public static AAIObjectType fromTypeName(String name) {
192                 if (map.containsKey(name)) {
193                         return map.get(name);
194                 } else {
195                         return AAIObjectType.UNKNOWN;
196                 }
197         }
198         @Override
199         public String typeName() {
200                 return this.typeName(CaseFormat.LOWER_HYPHEN);
201         }
202         @Override
203         public String typeName(CaseFormat format) {
204                 return CaseFormat.LOWER_HYPHEN.to(format, this.name.replace("default-", ""));
205         }
206
207         @Override
208         public String uriTemplate() {
209                 return this.uriTemplate;
210         }
211
212         @Override
213         public String partialUri() {
214                 return this.partialUri;
215         }
216
217         protected String removeParentUri(Class<?> aaiObjectClass, String parentUri) {
218                  return aaiObjectClass.getAnnotation(Metadata.class).uriTemplate().replace(parentUri, "");
219         }
220 }