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