[AAI] Remove Robby Maharajh & Harish Kajur as committers
[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 }