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