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