7ce87afedc49667762a5a7a4db93cd6e5201df77
[aai/schema-service.git] / aai-schema-gen / src / test / java / org / onap / aai / schemagen / genxsd / XSDElementTest.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
4  * ================================================================================
5  * Copyright © 2017-2018 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.aai.schemagen.genxsd;
22
23 import static org.hamcrest.CoreMatchers.*;
24 import static org.hamcrest.collection.IsIn.in;
25 import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
26 import static org.hamcrest.core.Every.everyItem;
27 import static org.junit.Assert.assertEquals;
28 import static org.junit.Assert.assertThat;
29
30 import java.io.IOException;
31 import java.io.StringReader;
32 import java.util.*;
33
34 import javax.xml.XMLConstants;
35 import javax.xml.parsers.DocumentBuilder;
36 import javax.xml.parsers.DocumentBuilderFactory;
37 import javax.xml.parsers.ParserConfigurationException;
38
39 import org.apache.commons.lang.StringUtils;
40 import org.junit.Before;
41 import org.junit.BeforeClass;
42 import org.junit.Test;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45 import org.w3c.dom.Document;
46 import org.w3c.dom.Element;
47 import org.w3c.dom.NodeList;
48 import org.xml.sax.InputSource;
49 import org.xml.sax.SAXException;
50
51 public class XSDElementTest {
52     private static final Logger logger = LoggerFactory.getLogger("XSDElementTest.class");
53     private static final int maxSizeForXml = 20000;
54     protected String testXML;
55     protected Document doc = null;
56     protected NodeList javaTypeNodes = null;
57
58     public String getTestXML() {
59         return testXML;
60     }
61
62     @BeforeClass
63     public static void setUpBeforeClass() throws Exception {
64     }
65
66     @Before
67     public void setUp() throws Exception {
68         setUp(0);
69     }
70
71     public void setUp(int sbopt) throws Exception {
72         StringBuilder sb = new StringBuilder(maxSizeForXml);
73         addNamespace(sb);
74         addBusiness(sb);
75         addCustomers(sb);
76         if (sbopt == 0) {
77             addCustomer(sb);
78         } else {
79             addCustomerNoSubscriberType(sb);
80             addCustomerSubscriberType(sb);
81         }
82         addServiceSubscriptions(sb);
83         addServiceSubscription(sb);
84         addEndOfXML(sb);
85         testXML = sb.toString();
86         init();
87     }
88
89     public void setUpRelationship() throws Exception {
90         StringBuilder sb = new StringBuilder(maxSizeForXml);
91         addNamespaceNoInventory(sb);
92         addRelationship(sb);
93         addRelationshipList(sb);
94         addRelatedToProperty(sb);
95         addRelationshipData(sb);
96         addEndOfXML(sb);
97         testXML = sb.toString();
98         init();
99     }
100
101     private void addNamespace(StringBuilder sb) {
102         sb.append(
103             "<xml-bindings xmlns=\"http://www.eclipse.org/eclipselink/xsds/persistence/oxm\" package-name=\"inventory.aai.onap.org.v11\" xml-mapping-metadata-complete=\"true\">\n");
104         sb.append("<xml-schema element-form-default=\"QUALIFIED\">\n");
105         sb.append("<xml-ns namespace-uri=\"http://org.onap.aai.inventory/v11\" />\n");
106         sb.append("</xml-schema>\n");
107         sb.append("<java-types>\n");
108         sb.append("<java-type name=\"Inventory\">\n");
109         sb.append("<xml-root-element name=\"inventory\" />\n");
110         sb.append("<java-attributes>\n");
111         sb.append(
112             "<xml-element java-attribute=\"business\" name=\"business\" type=\"inventory.aai.onap.org.v11.Business\" />\n");
113         sb.append("</java-attributes>\n");
114         sb.append("</java-type>\n");
115     }
116
117     private void addNamespaceNoInventory(StringBuilder sb) {
118         sb.append(
119             "<xml-bindings xmlns=\"http://www.eclipse.org/eclipselink/xsds/persistence/oxm\" package-name=\"inventory.aai.onap.org.v11\" xml-mapping-metadata-complete=\"true\">\n");
120         sb.append("<xml-schema element-form-default=\"QUALIFIED\">\n");
121         sb.append("<xml-ns namespace-uri=\"http://org.onap.aai.inventory/v11\" />\n");
122         sb.append("</xml-schema>\n");
123         sb.append("<java-types>\n");
124     }
125
126     private void addBusiness(StringBuilder sb) {
127         sb.append("<java-type name=\"Business\">\n");
128         sb.append("<xml-properties>\n");
129         sb.append(
130             "<xml-property name=\"description\" value=\"Namespace for business related constructs\" />\n");
131         sb.append("</xml-properties>\n");
132         sb.append("<xml-root-element name=\"business\" />\n");
133         sb.append("<java-attributes>\n");
134         sb.append(
135             "<xml-element java-attribute=\"customers\" name=\"customers\" type=\"inventory.aai.onap.org.v11.Customers\" />\n");
136         sb.append("</java-attributes>\n");
137         sb.append("</java-type>\n");
138     }
139
140     private void addCustomers(StringBuilder sb) {
141         sb.append("<java-type name=\"Customers\">\n");
142         sb.append("<xml-properties>\n");
143         sb.append(
144             "<xml-property name=\"description\" value=\"Collection of customer identifiers to provide linkage back to BSS information.\" />\n");
145         sb.append("</xml-properties>\n");
146         sb.append("<xml-root-element name=\"customers\" />\n");
147         sb.append("<java-attributes>\n");
148         sb.append(
149             "<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"customer\" name=\"customer\" type=\"inventory.aai.onap.org.v11.Customer\" />\n");
150         sb.append("</java-attributes>\n");
151         sb.append("<xml-properties>\n");
152         sb.append("<xml-property name=\"maximumDepth\" value=\"0\" />\n");
153         sb.append("</xml-properties>\n");
154         sb.append("</java-type>\n");
155     }
156
157     private void addCustomer(StringBuilder sb) {
158         sb.append("<java-type name=\"Customer\">\n");
159         sb.append("<xml-root-element name=\"customer\" />\n");
160         sb.append("<java-attributes>\n");
161         sb.append(
162             "<xml-element java-attribute=\"globalCustomerId\" name=\"global-customer-id\" required=\"true\" type=\"java.lang.String\" xml-key=\"true\">\n");
163         sb.append("<xml-properties>\n");
164         sb.append(
165             "<xml-property name=\"description\" value=\"Global customer id used across to uniquely identify customer.\" />\n");
166         sb.append("</xml-properties>\n");
167         sb.append("</xml-element>\n");
168         sb.append(
169             "<xml-element java-attribute=\"subscriberName\" name=\"subscriber-name\" required=\"true\" type=\"java.lang.String\">\n");
170         sb.append("<xml-properties>\n");
171         sb.append(
172             "<xml-property name=\"description\" value=\"Subscriber name, an alternate way to retrieve a customer.\" />\n");
173         sb.append("</xml-properties>\n");
174         sb.append("</xml-element>\n");
175         sb.append(
176             "<xml-element java-attribute=\"subscriberType\" name=\"subscriber-type\" required=\"true\" type=\"java.lang.String\">\n");
177         sb.append("<xml-properties>\n");
178         sb.append(
179             "<xml-property name=\"description\" value=\"Subscriber type, a way to provide VID with only the INFRA customers.\" />\n");
180         sb.append("<xml-property name=\"defaultValue\" value=\"CUST\" />\n");
181         sb.append("</xml-properties>\n");
182         sb.append("</xml-element>\n");
183         sb.append(
184             "<xml-element java-attribute=\"resourceVersion\" name=\"resource-version\" type=\"java.lang.String\">\n");
185         sb.append("<xml-properties>\n");
186         sb.append(
187             "<xml-property name=\"description\" value=\"Used for optimistic concurrency.  Must be empty on create, valid on update and delete.\" />\n");
188         sb.append("</xml-properties>\n");
189         sb.append("</xml-element>\n");
190         sb.append(
191             "<xml-element java-attribute=\"serviceSubscriptions\" name=\"service-subscriptions\" type=\"inventory.aai.onap.org.v11.ServiceSubscriptions\" />\n");
192         // sb.append("<xml-element java-attribute=\"relationshipList\" name=\"relationship-list\"
193         // type=\"inventory.aai.onap.org.v11.RelationshipList\" />\n");
194         sb.append("</java-attributes>\n");
195         sb.append("<xml-properties>\n");
196         sb.append(
197             "<xml-property name=\"description\" value=\"customer identifiers to provide linkage back to BSS information.\" />\n");
198         sb.append("<xml-property name=\"nameProps\" value=\"subscriber-name\" />\n");
199         sb.append(
200             "<xml-property name=\"indexedProps\" value=\"subscriber-name,global-customer-id,subscriber-type\" />\n");
201         sb.append(
202             "<xml-property name=\"searchable\" value=\"global-customer-id,subscriber-name\" />\n");
203         sb.append("<xml-property name=\"uniqueProps\" value=\"global-customer-id\" />\n");
204         sb.append("<xml-property name=\"container\" value=\"customers\" />\n");
205         sb.append("<xml-property name=\"namespace\" value=\"business\" />\n");
206         sb.append("</xml-properties>\n");
207         sb.append("</java-type>\n");
208     }
209
210     private void addCustomerNoSubscriberType(StringBuilder sb) {
211         sb.append("<java-type name=\"Customer\">\n");
212         sb.append("<xml-root-element name=\"customer\" />\n");
213         sb.append("<java-attributes>\n");
214         sb.append(
215             "<xml-element java-attribute=\"globalCustomerId\" name=\"global-customer-id\" required=\"true\" type=\"java.lang.String\" xml-key=\"true\">\n");
216         sb.append("<xml-properties>\n");
217         sb.append(
218             "<xml-property name=\"description\" value=\"Global customer id used across to uniquely identify customer.\" />\n");
219         sb.append("</xml-properties>\n");
220         sb.append("</xml-element>\n");
221         sb.append(
222             "<xml-element java-attribute=\"subscriberName\" name=\"subscriber-name\" required=\"true\" type=\"java.lang.String\">\n");
223         sb.append("<xml-properties>\n");
224         sb.append(
225             "<xml-property name=\"description\" value=\"Subscriber name, an alternate way to retrieve a customer.\" />\n");
226         sb.append("</xml-properties>\n");
227         sb.append("</xml-element>\n");
228         sb.append(
229             "<xml-element java-attribute=\"resourceVersion\" name=\"resource-version\" type=\"java.lang.String\">\n");
230         sb.append("<xml-properties>\n");
231         sb.append(
232             "<xml-property name=\"description\" value=\"Used for optimistic concurrency.  Must be empty on create, valid on update and delete.\" />\n");
233         sb.append("</xml-properties>\n");
234         sb.append("</xml-element>\n");
235         sb.append(
236             "<xml-element java-attribute=\"serviceSubscriptions\" name=\"service-subscriptions\" type=\"inventory.aai.onap.org.v11.ServiceSubscriptions\" />\n");
237         sb.append("</java-attributes>\n");
238         sb.append("<xml-properties>\n");
239         sb.append(
240             "<xml-property name=\"description\" value=\"customer identifiers to provide linkage back to BSS information.\" />\n");
241         sb.append("<xml-property name=\"nameProps\" value=\"subscriber-name\" />\n");
242         sb.append(
243             "<xml-property name=\"indexedProps\" value=\"subscriber-name,global-customer-id\" />\n");
244         sb.append(
245             "<xml-property name=\"searchable\" value=\"global-customer-id,subscriber-name\" />\n");
246         sb.append("<xml-property name=\"uniqueProps\" value=\"global-customer-id\" />\n");
247         sb.append("<xml-property name=\"container\" value=\"customers\" />\n");
248         sb.append("<xml-property name=\"namespace\" value=\"business\" />\n");
249         sb.append("</xml-properties>\n");
250         sb.append("</java-type>\n");
251     }
252
253     private void addCustomerSubscriberType(StringBuilder sb) {
254         sb.append("<java-type name=\"Customer\">\n");
255         sb.append("<xml-root-element name=\"customer\" />\n");
256         sb.append("<java-attributes>\n");
257         sb.append(
258             "<xml-element java-attribute=\"subscriberType\" name=\"subscriber-type\" required=\"true\" type=\"java.lang.String\">\n");
259         sb.append("<xml-properties>\n");
260         sb.append(
261             "<xml-property name=\"description\" value=\"Subscriber type, a way to provide VID with only the INFRA customers.\" />\n");
262         sb.append("<xml-property name=\"defaultValue\" value=\"CUST\" />\n");
263         sb.append("</xml-properties>\n");
264         sb.append("</xml-element>\n");
265         sb.append("</java-attributes>\n");
266         sb.append("<xml-properties>\n");
267         sb.append("<xml-property name=\"indexedProps\" value=\"subscriber-type\" />\n");
268         sb.append("<xml-property name=\"container\" value=\"customers\" />\n");
269         sb.append("</xml-properties>\n");
270         sb.append("</java-type>\n");
271     }
272
273     private void addServiceSubscriptions(StringBuilder sb) {
274         sb.append("<java-type name=\"ServiceSubscriptions\">\n");
275         sb.append("<xml-properties>\n");
276         sb.append(
277             "<xml-property name=\"description\" value=\"Collection of objects that group service instances.\" />\n");
278         sb.append("</xml-properties>\n");
279         sb.append("<xml-root-element name=\"service-subscriptions\" />\n");
280         sb.append("<java-attributes>\n");
281         sb.append(
282             "<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"serviceSubscription\" name=\"service-subscription\" type=\"inventory.aai.onap.org.v11.ServiceSubscription\" />\n");
283         sb.append("</java-attributes>\n");
284         sb.append("</java-type>\n");
285     }
286
287     private void addServiceSubscription(StringBuilder sb) {
288         sb.append("<java-type name=\"ServiceSubscription\">\n");
289         sb.append("<xml-root-element name=\"service-subscription\" />\n");
290         sb.append("<java-attributes>\n");
291         sb.append(
292             "<xml-element java-attribute=\"serviceType\" name=\"service-type\" required=\"true\" type=\"java.lang.String\" xml-key=\"true\">\n");
293         sb.append("<xml-properties>\n");
294         sb.append(
295             "<xml-property name=\"description\" value=\"Value defined by orchestration to identify this service.\" />\n");
296         sb.append("</xml-properties>\n");
297         sb.append("</xml-element>\n");
298         sb.append(
299             "<xml-element java-attribute=\"tempUbSubAccountId\" name=\"temp-ub-sub-account-id\" type=\"java.lang.String\">\n");
300         sb.append("<xml-properties>\n");
301         sb.append(
302             "<xml-property name=\"description\" value=\"This property will be deleted from A&amp;AI in the near future. Only stop gap solution.\" />\n");
303         sb.append("</xml-properties>\n");
304         sb.append("</xml-element>\n");
305         sb.append(
306             "<xml-element java-attribute=\"resourceVersion\" name=\"resource-version\" type=\"java.lang.String\">\n");
307         sb.append("<xml-properties>\n");
308         sb.append(
309             "<xml-property name=\"description\" value=\"Used for optimistic concurrency.  Must be empty on create, valid on update and delete.\" />\n");
310         sb.append("</xml-properties>\n");
311         sb.append("</xml-element>\n");
312         // sb.append("<xml-element java-attribute=\"relationshipList\" name=\"relationship-list\"
313         // type=\"inventory.aai.onap.org.v11.RelationshipList\" />\n");
314         sb.append("</java-attributes>\n");
315         sb.append("<xml-properties>\n");
316         sb.append(
317             "<xml-property name=\"description\" value=\"Object that group service instances.\" />\n");
318         sb.append("<xml-property name=\"indexedProps\" value=\"service-type\" />\n");
319         sb.append("<xml-property name=\"dependentOn\" value=\"customer\" />\n");
320         sb.append("<xml-property name=\"container\" value=\"service-subscriptions\" />\n");
321         sb.append(
322             "<xml-property name=\"crossEntityReference\" value=\"service-instance,service-type\" />\n");
323         sb.append("</xml-properties>\n");
324         sb.append("</java-type>\n");
325     }
326
327     private void addRelationshipList(StringBuilder sb) {
328         sb.append("<java-type name=\"RelationshipList\">\n");
329         sb.append("<xml-root-element name=\"relationship-list\" />\n");
330         sb.append("<java-attributes>\n");
331         sb.append(
332             "<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"relationship\" name=\"relationship\" type=\"inventory.aai.onap.org.v11.Relationship\" />/n");
333         sb.append("</java-attributes>\n");
334         sb.append("</java-type>\n");
335     }
336
337     private void addRelationship(StringBuilder sb) {
338         sb.append("<java-type name=\"Relationship\">\n");
339         sb.append("<xml-root-element name=\"relationship\" />\n");
340         sb.append("<java-attributes>\n");
341         sb.append(
342             "<xml-element java-attribute=\"relatedTo\" name=\"related-to\" type=\"java.lang.String\">\n");
343         sb.append("<xml-properties>\n");
344         sb.append(
345             "<xml-property name=\"description\" value=\"A keyword provided by A&amp;AI to indicate type of node.\" />\n");
346         sb.append("</xml-properties>\n");
347         sb.append("</xml-element>\n");
348         sb.append(
349             "<xml-element java-attribute=\"relatedLink\" name=\"related-link\" type=\"java.lang.String\">\n");
350         sb.append("<xml-properties>\n");
351         sb.append("<xml-property name=\"description\" value=\"URL to the object in A&amp;AI.\" />");
352         sb.append("</xml-properties>\n");
353         sb.append("</xml-element>\n");
354         sb.append(
355             "<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"relationshipData\" name=\"relationship-data\" type=\"inventory.aai.onap.org.v11.RelationshipData\" />\n");
356         sb.append(
357             "<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"relatedToProperty\" name=\"related-to-property\" type=\"inventory.aai.onap.org.v11.RelatedToProperty\" />\n");
358         sb.append("</java-attributes>\n");
359         sb.append("</java-type>\n");
360     }
361
362     private void addRelatedToProperty(StringBuilder sb) {
363         sb.append("<java-type name=\"RelatedToProperty\">\n");
364         sb.append("<xml-root-element name=\"related-to-property\" />\n");
365         sb.append("<java-attributes>\n");
366         sb.append(
367             "<xml-element java-attribute=\"propertyKey\" name=\"property-key\" type=\"java.lang.String\">\n");
368         sb.append("<xml-properties>\n");
369         sb.append("<xml-property name=\"description\" value=\"Key part of a key/value pair\" />\n");
370         sb.append("</xml-properties>\n");
371         sb.append("</xml-element>\n");
372         sb.append(
373             "<xml-element java-attribute=\"propertyValue\" name=\"property-value\" type=\"java.lang.String\">\n");
374         sb.append("<xml-properties>\n");
375         sb.append(
376             "<xml-property name=\"description\" value=\"Value part of a key/value pair\" />\n");
377         sb.append("</xml-properties>\n");
378         sb.append("</xml-element>\n");
379         sb.append("</java-attributes>\n");
380         sb.append("</java-type>\n");
381     }
382
383     private void addRelationshipData(StringBuilder sb) {
384         sb.append("<java-type name=\"RelationshipData\">\n");
385         sb.append("<xml-root-element name=\"relationship-data\" />\n");
386         sb.append("<java-attributes>\n");
387         sb.append(
388             "<xml-element java-attribute=\"relationshipKey\" name=\"relationship-key\" required=\"true\" type=\"java.lang.String\">\n");
389         sb.append("<xml-properties>\n");
390         sb.append(
391             "<xml-property name=\"description\" value=\"A keyword provided by A&amp;AI to indicate an attribute.\" />\n");
392         sb.append("</xml-properties>\n");
393         sb.append("</xml-element>\n");
394         sb.append(
395             "<xml-element java-attribute=\"relationshipValue\" name=\"relationship-value\" required=\"true\" type=\"java.lang.String\">\n");
396         sb.append("<xml-properties>\n");
397         sb.append("<xml-property name=\"description\" value=\"Value of the attribute.\" />\n");
398         sb.append("</xml-properties>\n");
399         sb.append("</xml-element>\n");
400         sb.append("</java-attributes>\n");
401         sb.append("</java-type>\n");
402     }
403
404     private void addEndOfXML(StringBuilder sb) {
405         sb.append("</java-types>\n");
406         sb.append("</xml-bindings>\n");
407     }
408
409     public void init() throws ParserConfigurationException, SAXException, IOException {
410         DocumentBuilder dBuilder = null;
411         try {
412             DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
413             dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
414             dBuilder = dbFactory.newDocumentBuilder();
415         } catch (ParserConfigurationException e) {
416             throw e;
417         }
418         try {
419             InputSource isInput = new InputSource(new StringReader(testXML));
420             doc = dBuilder.parse(isInput);
421         } catch (SAXException e) {
422             throw e;
423         } catch (IOException e) {
424             throw e;
425         }
426
427         NodeList bindingsNodes = doc.getElementsByTagName("xml-bindings");
428         Element bindingElement;
429         NodeList javaTypesNodes;
430         Element javaTypesElement;
431
432         if (bindingsNodes == null || bindingsNodes.getLength() == 0) {
433             throw new SAXException("OXM file error: missing <binding-nodes> in XML");
434         }
435
436         bindingElement = (Element) bindingsNodes.item(0);
437         javaTypesNodes = bindingElement.getElementsByTagName("java-types");
438         if (javaTypesNodes.getLength() < 1) {
439             throw new SAXException("OXM file error: missing <binding-nodes><java-types> in XML");
440         }
441         javaTypesElement = (Element) javaTypesNodes.item(0);
442
443         javaTypeNodes = javaTypesElement.getElementsByTagName("java-type");
444         if (javaTypeNodes.getLength() < 1) {
445             throw new SAXException(
446                 "OXM file error: missing <binding-nodes><java-types><java-type> in XML");
447         }
448         logger.debug(testXML);
449     }
450
451     @Test
452     public void testXSDElement() {
453         // repeat of testGetIndexedProps() which uses the constructor
454         ArrayList<String> target = new ArrayList<String>();
455         target.add("subscriber-name");
456         target.add("global-customer-id");
457         target.add("subscriber-type");
458         target.add("service-type");
459
460         Vector<String> indexedProps = new Vector<String>();
461         for (int i = 0; i < javaTypeNodes.getLength(); ++i) {
462             XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
463             indexedProps.addAll(javaTypeElement.getIndexedProps());
464         }
465         assertThat(new ArrayList<>(indexedProps),
466             both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray())));
467     }
468
469     @Test
470     public void testName() {
471         ArrayList<String> target = new ArrayList<String>();
472         target.add("ServiceSubscriptions");
473         target.add("ServiceSubscription");
474         target.add("Inventory");
475         target.add("Business");
476         target.add("Customers");
477         target.add("Customer");
478         ArrayList<String> names = new ArrayList<String>();
479         for (int i = 0; i < javaTypeNodes.getLength(); ++i) {
480             XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
481             names.add(javaTypeElement.name());
482         }
483         logger.debug(String.join("|", names));
484         assertThat(names,
485             both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray())));
486     }
487
488     @Test
489     public void testGetAddTypes() {
490         HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
491         HashMap<String, ArrayList<String>> target = new HashMap<String, ArrayList<String>>();
492         target.put("Customer",
493             new ArrayList<>(Arrays.asList("ServiceSubscriptions", "RelationshipList")));
494         target.put("Customer", new ArrayList<>(Arrays.asList("ServiceSubscriptions")));
495         target.put("Business", new ArrayList<>(Arrays.asList("Customers")));
496         target.put("Inventory", new ArrayList<>(Arrays.asList("Business")));
497         target.put("Customers", new ArrayList<>(Arrays.asList("Customer")));
498         target.put("ServiceSubscription", new ArrayList<>(Arrays.asList("RelationshipList")));
499         target.put("ServiceSubscription", new ArrayList<>(Arrays.asList()));
500         target.put("ServiceSubscriptions", new ArrayList<>(Arrays.asList("ServiceSubscription")));
501
502         for (int i = 0; i < javaTypeNodes.getLength(); ++i) {
503             XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
504             ArrayList<String> addTypes = new ArrayList<String>();
505             NodeList xmlElementNodes = javaTypeElement.getElementsByTagName("xml-element");
506             String name = javaTypeElement.name();
507             for (int j = 0; j < xmlElementNodes.getLength(); ++j) {
508                 XSDElement xmlElement = new XSDElement((Element) xmlElementNodes.item(j));
509                 addTypes.addAll(xmlElement.getAddTypes("v11"));
510                 map.put(name, addTypes);
511             }
512         }
513         for (String key : map.keySet()) {
514             assertThat("Expected for key:" + key, map.get(key), equalTo(target.get(key)));
515         }
516     }
517
518     /*
519      * @Test
520      * public void testGetRequiredElements() {
521      * HashMap<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>();
522      * ArrayList<String> target = new ArrayList<String>();
523      * target.add("global-customer-id\n");
524      * target.add("subscriber-name\n");
525      * target.add("subscriber-type");
526      * for ( int i = 0; i < javaTypeNodes.getLength(); ++i ) {
527      * XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
528      * ArrayList<String> requiredItems = new ArrayList<String>();
529      * String name=javaTypeElement.name();
530      * requiredItems.addAll(javaTypeElement.getRequiredElements("v11"));
531      * map.put(name,requiredItems);
532      * }
533      * for(String key : map.keySet()) {
534      * assertThat(map.get(key),equalTo(target));
535      * }
536      * }
537      */
538     @Test
539     public void testGetPathDescriptionProperty() {
540         ArrayList<String> target = new ArrayList<String>();
541         target.add("Namespace for business related constructs");
542         target
543             .add("Collection of customer identifiers to provide linkage back to BSS information.");
544         target.add("customer identifiers to provide linkage back to BSS information.");
545         target.add("Collection of objects that group service instances.");
546         target.add("Object that group service instances.");
547         List<String> descs = new ArrayList<String>();
548         for (int i = 0; i < javaTypeNodes.getLength(); ++i) {
549             XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
550             if (javaTypeElement.getPathDescriptionProperty() != null)
551                 descs.add(javaTypeElement.getPathDescriptionProperty());
552         }
553         logger.debug(String.join("|", descs));
554         assertThat(new ArrayList<>(descs),
555             both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray())));
556     }
557
558     @Test
559     public void testGetIndexedProps() {
560         ArrayList<String> target = new ArrayList<String>();
561         target.add("subscriber-name");
562         target.add("global-customer-id");
563         target.add("subscriber-type");
564         target.add("service-type");
565
566         Vector<String> indexedProps = new Vector<String>();
567         for (int i = 0; i < javaTypeNodes.getLength(); ++i) {
568             XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
569             indexedProps.addAll(javaTypeElement.getIndexedProps());
570         }
571         assertThat(new ArrayList<>(indexedProps),
572             both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray())));
573     }
574
575     @Test
576     public void testGetContainerProperty() {
577         ArrayList<String> target = new ArrayList<String>();
578         target.add("service-subscriptions");
579         target.add("customers");
580         List<String> containers = new ArrayList<String>();
581         for (int i = 0; i < javaTypeNodes.getLength(); ++i) {
582             XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
583             if (javaTypeElement.getContainerProperty() != null)
584                 containers.add(javaTypeElement.getContainerProperty());
585         }
586         logger.debug(String.join("|", containers));
587         assertThat(new ArrayList<>(containers),
588             both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray())));
589     }
590
591     @Test
592     public void testGetQueryParamYAML() {
593         ArrayList<String> target = new ArrayList<String>();
594         target.add(
595             "        - name: global-customer-id\n          in: query\n          description: n/a\n          required: false\n          type: string\n");
596         target.add(
597             "        - name: subscriber-name\n          in: query\n          description: n/a\n          required: false\n          type: string\n");
598         target.add(
599             "        - name: subscriber-type\n          in: query\n          description: n/a\n          required: false\n          type: string\n");
600         Vector<String> indexedProps = new Vector<String>();
601         for (int i = 0; i < javaTypeNodes.getLength(); ++i) {
602             XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
603             if (javaTypeElement.getContainerProperty() != null) {
604                 indexedProps.addAll(javaTypeElement.getIndexedProps());
605                 String container = javaTypeElement.getContainerProperty();
606                 Vector<String> containerProps = new Vector<String>();
607                 NodeList xmlElementNodes = javaTypeElement.getElementsByTagName("xml-element");
608                 for (int j = 0; j < xmlElementNodes.getLength(); ++j) {
609                     XSDElement xmlElement = new XSDElement((Element) xmlElementNodes.item(j));
610                     if (indexedProps.contains(xmlElement.name()))
611                         containerProps.add(xmlElement.getQueryParamYAML());
612                 }
613                 GetOperation.addContainerProps(container, containerProps);
614             }
615         }
616         /*
617          * List<String> queryParams = new ArrayList<String>();
618          * for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) {
619          * XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
620          * if(javaTypeElement.getQueryParamYAML() != null)
621          * queryParams.add(javaTypeElement.getQueryParamYAML());
622          * }
623          */
624         assertThat(GetOperation.containers.get("customers"), equalTo(target));
625     }
626
627     @Test
628     public void testGetPathParamYAML() {
629         ArrayList<String> target = new ArrayList<String>();
630         target.add(
631             "        - name: Inventory\n          in: path\n          description: Inventory\n          required: true\n          example: __INVENTORY__\n");
632         target.add(
633             "        - name: Business\n          in: path\n          description: Business\n          required: true\n          example: __BUSINESS__\n");
634         target.add(
635             "        - name: Customers\n          in: path\n          description: Customers\n          required: true\n          example: __CUSTOMERS__\n");
636         target.add(
637             "        - name: Customer\n          in: path\n          description: Customer\n          required: true\n          example: __CUSTOMER__\n");
638         target.add(
639             "        - name: ServiceSubscriptions\n          in: path\n          description: ServiceSubscriptions\n          required: true\n          example: __SERVICESUBSCRIPTIONS__\n");
640         target.add(
641             "        - name: ServiceSubscription\n          in: path\n          description: ServiceSubscription\n          required: true\n          example: __SERVICESUBSCRIPTION__\n");
642         List<String> pathParams = new ArrayList<String>();
643         for (int i = 0; i < javaTypeNodes.getLength(); ++i) {
644             XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
645             if (javaTypeElement.getPathParamYAML(javaTypeElement.name()) != null)
646                 pathParams.add(javaTypeElement.getPathParamYAML(javaTypeElement.name()));
647         }
648         logger.debug(String.join("|", pathParams));
649         assertThat(new ArrayList<>(pathParams),
650             both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray())));
651     }
652
653     @Test
654     public void testGetHTMLAnnotation() {
655         ArrayList<String> target = new ArrayList<String>();
656         target.add("  <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR + "    <xs:appinfo>"
657             + OxmFileProcessor.LINE_SEPARATOR
658             + "      <annox:annotate target=\"Business\">@org.onap.aai.annotations.Metadata(description=\"Namespace for business related constructs\")</annox:annotate>"
659             + OxmFileProcessor.LINE_SEPARATOR + "    </xs:appinfo>"
660             + OxmFileProcessor.LINE_SEPARATOR + "  </xs:annotation>"
661             + OxmFileProcessor.LINE_SEPARATOR);
662         target.add("  <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR + "    <xs:appinfo>"
663             + OxmFileProcessor.LINE_SEPARATOR
664             + "      <annox:annotate target=\"Customers\">@org.onap.aai.annotations.Metadata(description=\"Collection of customer identifiers to provide linkage back to BSS information.\")</annox:annotate>"
665             + OxmFileProcessor.LINE_SEPARATOR + "    </xs:appinfo>"
666             + OxmFileProcessor.LINE_SEPARATOR + "  </xs:annotation>"
667             + OxmFileProcessor.LINE_SEPARATOR);
668         target.add("  <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR + "    <xs:appinfo>"
669             + OxmFileProcessor.LINE_SEPARATOR
670             + "      <annox:annotate target=\"Customer\">@org.onap.aai.annotations.Metadata(description=\"customer identifiers to provide linkage back to BSS information.\",nameProps=\"subscriber-name\",indexedProps=\"subscriber-name,global-customer-id,subscriber-type\",searchable=\"global-customer-id,subscriber-name\",uniqueProps=\"global-customer-id\",container=\"customers\",namespace=\"business\")</annox:annotate>"
671             + OxmFileProcessor.LINE_SEPARATOR + "    </xs:appinfo>"
672             + OxmFileProcessor.LINE_SEPARATOR + "  </xs:annotation>"
673             + OxmFileProcessor.LINE_SEPARATOR);
674         target.add("  <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR + "    <xs:appinfo>"
675             + OxmFileProcessor.LINE_SEPARATOR
676             + "      <annox:annotate target=\"ServiceSubscriptions\">@org.onap.aai.annotations.Metadata(description=\"Collection of objects that group service instances.\")</annox:annotate>"
677             + OxmFileProcessor.LINE_SEPARATOR + "    </xs:appinfo>"
678             + OxmFileProcessor.LINE_SEPARATOR + "  </xs:annotation>"
679             + OxmFileProcessor.LINE_SEPARATOR);
680         target.add("  <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR + "    <xs:appinfo>"
681             + OxmFileProcessor.LINE_SEPARATOR
682             + "      <annox:annotate target=\"ServiceSubscription\">@org.onap.aai.annotations.Metadata(description=\"Object that group service instances.\",indexedProps=\"service-type\",dependentOn=\"customer\",container=\"service-subscriptions\",crossEntityReference=\"service-instance,service-type\")</annox:annotate>"
683             + OxmFileProcessor.LINE_SEPARATOR + "    </xs:appinfo>"
684             + OxmFileProcessor.LINE_SEPARATOR + "  </xs:annotation>"
685             + OxmFileProcessor.LINE_SEPARATOR);
686         List<String> annotes = new ArrayList<String>();
687         for (int i = 0; i < javaTypeNodes.getLength(); ++i) {
688             XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
689             if (StringUtils
690                 .isNotEmpty(javaTypeElement.getHTMLAnnotation(javaTypeElement.name(), "")))
691                 annotes.add(javaTypeElement.getHTMLAnnotation(javaTypeElement.name(), "  "));
692         }
693         logger.debug("result:");
694         logger.debug(String.join("|", annotes));
695         logger.debug("Expected:");
696         logger.debug(String.join("|", target));
697         assertThat(new ArrayList<>(annotes),
698             both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray())));
699
700     }
701
702     @Test
703     public void testGetTypePropertyYAML() {
704         ArrayList<String> target = new ArrayList<String>();
705         target.add("      Inventory:\n        type: ");
706         target.add(
707             "      Business:\n        type:         description: Namespace for business related constructs\n");
708         target.add(
709             "      Customers:\n        type:         description: Collection of customer identifiers to provide linkage back to BSS information.\n");
710         target.add(
711             "      Customer:\n        type:         description: customer identifiers to provide linkage back to BSS information.\n");
712         target.add(
713             "      ServiceSubscriptions:\n        type:         description: Collection of objects that group service instances.\n");
714         target.add(
715             "      ServiceSubscription:\n        type:         description: Object that group service instances.\n");
716         StringBuilder sb = new StringBuilder(
717             "      Customer:\n        type:         description: |\n          customer identifiers to provide linkage back to BSS information.\n");
718         sb.append(
719             "          *This property can be used as a filter to find the start node for a dsl query\n");
720         String yamlDesc = sb.toString();
721         List<String> types = new ArrayList<String>();
722         String container;
723         String customerDesc = null;
724         for (int i = 0; i < javaTypeNodes.getLength(); ++i) {
725             XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
726             if (javaTypeElement.getTypePropertyYAML(false) != null)
727                 types.add(javaTypeElement.getTypePropertyYAML(false));
728             container = javaTypeElement.getContainerProperty();
729             if ("customers".equals(container)) {
730                 customerDesc = javaTypeElement.getTypePropertyYAML(true);
731             }
732         }
733         assertThat(new ArrayList<>(types),
734             both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray())));
735         assertEquals(customerDesc, yamlDesc);
736     }
737
738     @Test
739     public void testIsStandardType() {
740         HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
741         HashMap<String, ArrayList<String>> target = new HashMap<String, ArrayList<String>>();
742         target.put("Customer", new ArrayList<>(Arrays.asList("global-customer-id",
743             "subscriber-name", "subscriber-type", "resource-version")));
744         target.put("Business", new ArrayList<>());
745         target.put("Inventory", new ArrayList<>());
746         target.put("Customers", new ArrayList<>());
747         target.put("ServiceSubscriptions", new ArrayList<>());
748         target.put("ServiceSubscription", new ArrayList<>(
749             Arrays.asList("service-type", "temp-ub-sub-account-id", "resource-version")));
750
751         for (int i = 0; i < javaTypeNodes.getLength(); ++i) {
752             XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
753             ArrayList<String> addTypes = new ArrayList<String>();
754             NodeList xmlElementNodes = javaTypeElement.getElementsByTagName("xml-element");
755             String name = javaTypeElement.name();
756             for (int j = 0; j < xmlElementNodes.getLength(); ++j) {
757                 XSDElement xmlElement = new XSDElement((Element) xmlElementNodes.item(j));
758                 if (xmlElement.isStandardType())
759                     addTypes.add(xmlElement.name());
760             }
761             map.put(name, addTypes);
762         }
763         for (String key : map.keySet()) {
764             assertThat(map.get(key), equalTo(target.get(key)));
765         }
766     }
767
768 }