9e1e33a515be0948708c9179ea87adf17254fbf6
[aai/aai-common.git] / aai-core / src / test / java / org / onap / aai / util / GenerateXsdTest.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
4  * ================================================================================
5  * Copyright © 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  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
21  */
22 package org.onap.aai.util;
23
24 import static org.junit.Assert.*;
25
26 import java.io.StringReader;
27
28 import javax.xml.XMLConstants;
29 import javax.xml.parsers.DocumentBuilder;
30 import javax.xml.parsers.DocumentBuilderFactory;
31
32 import org.hamcrest.CoreMatchers;
33 import org.junit.Assert;
34 import org.junit.Before;
35 import org.junit.Rule;
36 import org.junit.Test;
37 import org.junit.runner.RunWith;
38
39 import org.w3c.dom.Document;
40 import org.w3c.dom.Element;
41 import org.w3c.dom.NodeList;
42 import org.xml.sax.InputSource;
43
44 import org.onap.aai.introspection.Version;
45
46
47 public class GenerateXsdTest {
48                 private static final int maxSizeForXml = 20000;
49                 private String testXML;
50                 
51         @Before
52         public void setUp() throws Exception {
53                 //PowerMockito.mockStatic(GenerateXsd.class);
54                 StringBuilder sb = new StringBuilder(maxSizeForXml);
55                 addNamespace(sb);
56                 addRelationshipList(sb);
57                 addRelationship(sb);
58                 addRelatedToProperty(sb);
59                 addRelationshipData(sb);
60                 addBusiness(sb);
61                 addCustomers(sb);
62                 addCustomer(sb);
63                 addServiceSubscriptions(sb);
64                 addServiceSubscription(sb);
65                 addEndOfXML(sb);
66                 testXML = sb.toString();
67         }
68         
69         private void addNamespace(StringBuilder sb){
70                 sb.append("<xml-bindings xmlns=\"http://www.eclipse.org/eclipselink/xsds/persistence/oxm\" package-name=\"inventory.aai.onap.org.v11\" xml-mapping-metadata-complete=\"true\">\n");
71                 sb.append("<xml-schema element-form-default=\"QUALIFIED\">\n");
72                 sb.append("<xml-ns namespace-uri=\"http://org.onap.aai.inventory/v11\" />\n");
73                 sb.append("</xml-schema>\n");
74                 sb.append("<java-types>\n");
75                 sb.append("<java-type name=\"Inventory\">\n");
76                 sb.append("<xml-root-element name=\"inventory\" />\n");
77                 sb.append("<java-attributes>\n");
78                 sb.append("<xml-element java-attribute=\"business\" name=\"business\" type=\"inventory.aai.onap.org.v11.Business\" />\n");
79                 sb.append("</java-attributes>\n");
80                 sb.append("</java-type>\n");
81         }
82         
83         private void addRelationshipList(StringBuilder sb ) {
84                 sb.append("<java-type name=\"RelationshipList\">\n");
85                 sb.append("<xml-root-element name=\"relationship-list\" />\n");
86                 sb.append("<java-attributes>\n");
87                         sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"relationship\" name=\"relationship\" type=\"inventory.aai.onap.org.v11.Relationship\" />/n");
88                 sb.append("</java-attributes>\n");
89         sb.append("</java-type>\n");
90         }
91         
92         private void addRelationship(StringBuilder sb ) {
93                 sb.append("<java-type name=\"Relationship\">\n");
94                 sb.append("<xml-root-element name=\"relationship\" />\n");
95                 sb.append("<java-attributes>\n");
96                 sb.append("<xml-element java-attribute=\"relatedTo\" name=\"related-to\" type=\"java.lang.String\">\n");
97                 sb.append("<xml-properties>\n");
98                 sb.append("<xml-property name=\"description\" value=\"A keyword provided by A&amp;AI to indicate type of node.\" />\n");
99                 sb.append("</xml-properties>\n");
100                 sb.append("</xml-element>\n");
101                 sb.append("<xml-element java-attribute=\"relatedLink\" name=\"related-link\" type=\"java.lang.String\">\n");
102                 sb.append("<xml-properties>\n");
103                 sb.append("<xml-property name=\"description\" value=\"URL to the object in A&amp;AI.\" />");
104                 sb.append("</xml-properties>\n");
105                 sb.append("</xml-element>\n");
106                 sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"relationshipData\" name=\"relationship-data\" type=\"inventory.aai.onap.org.v11.RelationshipData\" />\n");
107                 sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"relatedToProperty\" name=\"related-to-property\" type=\"inventory.aai.onap.org.v11.RelatedToProperty\" />\n");
108                 sb.append("</java-attributes>\n");
109                 sb.append("</java-type>\n");
110         }
111         
112         private void addRelatedToProperty(StringBuilder sb) {
113                 sb.append("<java-type name=\"RelatedToProperty\">\n");
114                 sb.append("<xml-root-element name=\"related-to-property\" />\n");
115                 sb.append("<java-attributes>\n");
116                         sb.append("<xml-element java-attribute=\"propertyKey\" name=\"property-key\" type=\"java.lang.String\">\n");
117                         sb.append("<xml-properties>\n");
118                         sb.append("<xml-property name=\"description\" value=\"Key part of a key/value pair\" />\n");
119                         sb.append("</xml-properties>\n");
120                         sb.append("</xml-element>\n");
121                         sb.append("<xml-element java-attribute=\"propertyValue\" name=\"property-value\" type=\"java.lang.String\">\n");
122                         sb.append("<xml-properties>\n");
123                         sb.append("<xml-property name=\"description\" value=\"Value part of a key/value pair\" />\n");
124                         sb.append("</xml-properties>\n");
125                         sb.append("</xml-element>\n");
126                         sb.append("</java-attributes>\n");
127                         sb.append("</java-type>\n");
128         }
129         
130         private void addRelationshipData(StringBuilder sb){
131                 sb.append("<java-type name=\"RelationshipData\">\n");
132                 sb.append("<xml-root-element name=\"relationship-data\" />\n");
133                 sb.append("<java-attributes>\n");
134                         sb.append("<xml-element java-attribute=\"relationshipKey\" name=\"relationship-key\" required=\"true\" type=\"java.lang.String\">\n");
135                         sb.append("<xml-properties>\n");
136                         sb.append("<xml-property name=\"description\" value=\"A keyword provided by A&amp;AI to indicate an attribute.\" />\n");
137                         sb.append("</xml-properties>\n");
138                         sb.append("</xml-element>\n");
139                         sb.append("<xml-element java-attribute=\"relationshipValue\" name=\"relationship-value\" required=\"true\" type=\"java.lang.String\">\n");
140                         sb.append("<xml-properties>\n");
141                         sb.append("<xml-property name=\"description\" value=\"Value of the attribute.\" />\n");
142                         sb.append("</xml-properties>\n");
143                         sb.append("</xml-element>\n");
144                         sb.append("</java-attributes>\n");
145                         sb.append("</java-type>\n");
146         }
147         
148         private void addBusiness(StringBuilder sb){
149                 sb.append("<java-type name=\"Business\">\n");
150                 sb.append("<xml-properties>\n");
151                                 sb.append("<xml-property name=\"description\" value=\"Namespace for business related constructs\" />\n");
152                                 sb.append("</xml-properties>\n");
153                                 sb.append("<xml-root-element name=\"business\" />\n");
154                                 sb.append("<java-attributes>\n");
155                                 sb.append("<xml-element java-attribute=\"customers\" name=\"customers\" type=\"inventory.aai.onap.org.v11.Customers\" />\n");
156                                 sb.append("</java-attributes>\n");
157                                 sb.append("</java-type>\n");            
158         }
159         
160         private void addCustomers(StringBuilder sb){
161                 sb.append("<java-type name=\"Customers\">\n");
162                 sb.append("<xml-properties>\n");
163                 sb.append("<xml-property name=\"description\" value=\"Collection of customer identifiers to provide linkage back to BSS information.\" />\n");
164                 sb.append("</xml-properties>\n");
165                 sb.append("<xml-root-element name=\"customers\" />\n");
166                 sb.append("<java-attributes>\n");
167                 sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"customer\" name=\"customer\" type=\"inventory.aai.onap.org.v11.Customer\" />\n");
168                 sb.append("</java-attributes>\n");
169                 sb.append("<xml-properties>\n");
170                 sb.append("<xml-property name=\"maximumDepth\" value=\"0\" />\n");
171                 sb.append("</xml-properties>\n");
172                 sb.append("</java-type>\n");
173         }
174         
175         private void addCustomer(StringBuilder sb){
176                 sb.append("<java-type name=\"Customer\">\n");
177                 sb.append("<xml-root-element name=\"customer\" />\n");
178                 sb.append("<java-attributes>\n");
179                 sb.append("<xml-element java-attribute=\"globalCustomerId\" name=\"global-customer-id\" required=\"true\" type=\"java.lang.String\" xml-key=\"true\">\n");
180                 sb.append("<xml-properties>\n");
181                 sb.append("<xml-property name=\"description\" value=\"Global customer id used across ECOMP to uniquely identify customer.\" />\n");
182                 sb.append("</xml-properties>\n");
183                 sb.append("</xml-element>\n");
184                 sb.append("<xml-element java-attribute=\"subscriberName\" name=\"subscriber-name\" required=\"true\" type=\"java.lang.String\">\n");
185                 sb.append("<xml-properties>\n");
186                 sb.append("<xml-property name=\"description\" value=\"Subscriber name, an alternate way to retrieve a customer.\" />\n");
187                 sb.append("</xml-properties>\n");
188                 sb.append("</xml-element>\n");
189                 sb.append("<xml-element java-attribute=\"subscriberType\" name=\"subscriber-type\" required=\"true\" type=\"java.lang.String\">\n");
190                 sb.append("<xml-properties>\n");
191                 sb.append("<xml-property name=\"description\" value=\"Subscriber type, a way to provide VID with only the INFRA customers.\" />\n");
192                 sb.append("<xml-property name=\"defaultValue\" value=\"CUST\" />\n");
193                 sb.append("</xml-properties>\n");
194                 sb.append("</xml-element>\n");
195                 sb.append("<xml-element java-attribute=\"resourceVersion\" name=\"resource-version\" type=\"java.lang.String\">\n");
196                 sb.append("<xml-properties>\n");
197                 sb.append("<xml-property name=\"description\" value=\"Used for optimistic concurrency.  Must be empty on create, valid on update and delete.\" />\n");
198                 sb.append("</xml-properties>\n");
199                 sb.append("</xml-element>\n");
200                 sb.append("<xml-element java-attribute=\"serviceSubscriptions\" name=\"service-subscriptions\" type=\"inventory.aai.onap.org.v11.ServiceSubscriptions\" />\n");
201                 sb.append("<xml-element java-attribute=\"relationshipList\" name=\"relationship-list\" type=\"inventory.aai.onap.org.v11.RelationshipList\" />\n");
202                 sb.append("</java-attributes>\n");
203                 sb.append("<xml-properties>\n");
204                 sb.append("<xml-property name=\"description\" value=\"customer identifiers to provide linkage back to BSS information.\" />\n");
205                 sb.append("<xml-property name=\"nameProps\" value=\"subscriber-name\" />\n");
206                 sb.append("<xml-property name=\"indexedProps\" value=\"subscriber-name,global-customer-id,subscriber-type\" />\n");
207                 sb.append("<xml-property name=\"searchable\" value=\"global-customer-id,subscriber-name\" />\n");
208                 sb.append("<xml-property name=\"uniqueProps\" value=\"global-customer-id\" />\n");
209                 sb.append("<xml-property name=\"container\" value=\"customers\" />\n");
210                 sb.append("<xml-property name=\"namespace\" value=\"business\" />\n");
211                 sb.append("</xml-properties>\n");
212                 sb.append("</java-type>\n");            
213         }
214         
215         private void addServiceSubscriptions(StringBuilder sb){
216                 sb.append("<java-type name=\"ServiceSubscriptions\">\n");
217                 sb.append("<xml-properties>\n");
218                 sb.append("<xml-property name=\"description\" value=\"Collection of objects that group service instances.\" />\n");
219                 sb.append("</xml-properties>\n");
220                 sb.append("<xml-root-element name=\"service-subscriptions\" />\n");
221                 sb.append("<java-attributes>\n");
222                 sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"serviceSubscription\" name=\"service-subscription\" type=\"inventory.aai.onap.org.v11.ServiceSubscription\" />\n");
223                 sb.append("</java-attributes>\n");
224                 sb.append("</java-type>\n");
225         }
226         private void addServiceSubscription(StringBuilder sb){
227                 sb.append("<java-type name=\"ServiceSubscription\">\n");
228                 sb.append("<xml-root-element name=\"service-subscription\" />\n");
229                 sb.append("<java-attributes>\n");
230                 sb.append("<xml-element java-attribute=\"serviceType\" name=\"service-type\" required=\"true\" type=\"java.lang.String\" xml-key=\"true\">\n");
231                 sb.append("<xml-properties>\n");
232                 sb.append("<xml-property name=\"description\" value=\"Value defined by orchestration to identify this service across ECOMP.\" />\n");
233                 sb.append("</xml-properties>\n");
234                 sb.append("</xml-element>\n");
235                 sb.append("<xml-element java-attribute=\"tempUbSubAccountId\" name=\"temp-ub-sub-account-id\" type=\"java.lang.String\">\n");
236                 sb.append("<xml-properties>\n");
237                 sb.append("<xml-property name=\"description\" value=\"This property will be deleted from A&amp;AI in the near future. Only stop gap solution.\" />\n");
238                 sb.append("</xml-properties>\n");
239                 sb.append("</xml-element>\n");
240                 sb.append("<xml-element java-attribute=\"resourceVersion\" name=\"resource-version\" type=\"java.lang.String\">\n");
241                 sb.append("<xml-properties>\n");
242                 sb.append("<xml-property name=\"description\" value=\"Used for optimistic concurrency.  Must be empty on create, valid on update and delete.\" />\n");
243                 sb.append("</xml-properties>\n");
244                 sb.append("</xml-element>\n");
245                 sb.append("<xml-element java-attribute=\"relationshipList\" name=\"relationship-list\" type=\"inventory.aai.onap.org.v11.RelationshipList\" />\n");
246                 sb.append("</java-attributes>\n");
247                 sb.append("<xml-properties>\n");
248                 sb.append("<xml-property name=\"description\" value=\"Object that group service instances.\" />\n");
249                 sb.append("<xml-property name=\"indexedProps\" value=\"service-type\" />\n");
250                 sb.append("<xml-property name=\"dependentOn\" value=\"customer\" />\n");
251                 sb.append("<xml-property name=\"container\" value=\"service-subscriptions\" />\n");
252                 sb.append("<xml-property name=\"crossEntityReference\" value=\"service-instance,service-type\" />\n");
253                 sb.append("</xml-properties>\n");
254                 sb.append("</java-type>\n");
255         }
256         
257         private void addEndOfXML(StringBuilder sb){
258                 sb.append("</java-types>\n");
259                 sb.append("</xml-bindings>\n");
260         }
261         
262         
263         @Test
264         public void test_processOxmFile() {
265                 
266
267                 GenerateXsd generateXsd = new GenerateXsd();
268             
269                 //GenerateXsd generateXsdSpy = PowerMockito.spy(generateXsd);
270
271                 //generateXsdSpy.processOxmFile(null, Version.getLatest(), testXML);
272
273                 String xsdResult = generateXsd.processOxmFile(null, Version.getLatest(), testXML);
274                 
275                 String relationshipListExpected = "  <xs:element name=\"relationship-list\">\n    <xs:complexType>\n      <xs:sequence>\n        <xs:element ref=\"tns:relationship\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n      </xs:sequence>\n    </xs:complexType>\n  </xs:element>";
276                 String relatedToPropertyExpected = "  <xs:element name=\"related-to-property\">\n    <xs:complexType>\n      <xs:sequence>\n        <xs:element name=\"property-key\" type=\"xs:string\" minOccurs=\"0\">\n          <xs:annotation>\r\n            <xs:appinfo>\r\n              <annox:annotate target=\"field\">@org.onap.aai.annotations.Metadata(description=\"Key part of a key/value pair\")</annox:annotate>\r\n            </xs:appinfo>\r\n          </xs:annotation>\r\n        </xs:element>\n"
277                                 + "        <xs:element name=\"property-value\" type=\"xs:string\" minOccurs=\"0\">\n          <xs:annotation>\r\n            <xs:appinfo>\r\n              <annox:annotate target=\"field\">@org.onap.aai.annotations.Metadata(description=\"Value part of a key/value pair\")</annox:annotate>\r\n            </xs:appinfo>\r\n          </xs:annotation>\r\n        </xs:element>\n      </xs:sequence>\n    </xs:complexType>\n  </xs:element>";
278                 assertNotNull(xsdResult);
279         }
280         @Test
281         public void test_generateSwaggerFromOxmFile( ) {
282                 
283
284                 GenerateXsd generateXsd = new GenerateXsd();
285
286                 String customerOperation = " /business/customers/customer/{global-customer-id}:\n    get:\n      tags:\n        - Business\n      summary: returns customer";
287                 String relationshipListDefinition = "  relationship-list:\n    properties:\n      relationship:\n        type: array\n        items:          \n          $ref: \"#/definitions/relationship\"";
288                 String swaggerResult = generateXsd.generateSwaggerFromOxmFile(null, testXML);
289                 assertNotNull(swaggerResult);
290         }
291 }