Sync up the changes for v15
[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("</java-attributes>\n");
196                 sb.append("<xml-properties>\n");
197                 sb.append("<xml-property name=\"description\" value=\"customer identifiers to provide linkage back to BSS information.\" />\n");
198                 sb.append("<xml-property name=\"nameProps\" value=\"subscriber-name\" />\n");
199                 sb.append("<xml-property name=\"indexedProps\" value=\"subscriber-name,global-customer-id\" />\n");
200                 sb.append("<xml-property name=\"searchable\" value=\"global-customer-id,subscriber-name\" />\n");
201                 sb.append("<xml-property name=\"uniqueProps\" value=\"global-customer-id\" />\n");
202                 sb.append("<xml-property name=\"container\" value=\"customers\" />\n");
203                 sb.append("<xml-property name=\"namespace\" value=\"business\" />\n");
204                 sb.append("</xml-properties>\n");
205                 sb.append("</java-type>\n");            
206         }       
207         
208         private void addCustomerSubscriberType(StringBuilder sb){
209                 sb.append("<java-type name=\"Customer\">\n");
210                 sb.append("<xml-root-element name=\"customer\" />\n");
211                 sb.append("<java-attributes>\n");
212                 sb.append("<xml-element java-attribute=\"subscriberType\" name=\"subscriber-type\" required=\"true\" type=\"java.lang.String\">\n");
213                 sb.append("<xml-properties>\n");
214                 sb.append("<xml-property name=\"description\" value=\"Subscriber type, a way to provide VID with only the INFRA customers.\" />\n");
215                 sb.append("<xml-property name=\"defaultValue\" value=\"CUST\" />\n");
216                 sb.append("</xml-properties>\n");
217                 sb.append("</xml-element>\n");
218                 sb.append("</java-attributes>\n");
219                 sb.append("<xml-properties>\n");
220                 sb.append("<xml-property name=\"indexedProps\" value=\"subscriber-type\" />\n");
221                 sb.append("<xml-property name=\"container\" value=\"customers\" />\n");
222                 sb.append("</xml-properties>\n");
223                 sb.append("</java-type>\n");            
224         }       
225         
226         private void addServiceSubscriptions(StringBuilder sb){
227                 sb.append("<java-type name=\"ServiceSubscriptions\">\n");
228                 sb.append("<xml-properties>\n");
229                 sb.append("<xml-property name=\"description\" value=\"Collection of objects that group service instances.\" />\n");
230                 sb.append("</xml-properties>\n");
231                 sb.append("<xml-root-element name=\"service-subscriptions\" />\n");
232                 sb.append("<java-attributes>\n");
233                 sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"serviceSubscription\" name=\"service-subscription\" type=\"inventory.aai.onap.org.v11.ServiceSubscription\" />\n");
234                 sb.append("</java-attributes>\n");
235                 sb.append("</java-type>\n");
236         }
237         private void addServiceSubscription(StringBuilder sb){
238                 sb.append("<java-type name=\"ServiceSubscription\">\n");
239                 sb.append("<xml-root-element name=\"service-subscription\" />\n");
240                 sb.append("<java-attributes>\n");
241                 sb.append("<xml-element java-attribute=\"serviceType\" name=\"service-type\" required=\"true\" type=\"java.lang.String\" xml-key=\"true\">\n");
242                 sb.append("<xml-properties>\n");
243                 sb.append("<xml-property name=\"description\" value=\"Value defined by orchestration to identify this service.\" />\n");
244                 sb.append("</xml-properties>\n");
245                 sb.append("</xml-element>\n");
246                 sb.append("<xml-element java-attribute=\"tempUbSubAccountId\" name=\"temp-ub-sub-account-id\" type=\"java.lang.String\">\n");
247                 sb.append("<xml-properties>\n");
248                 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");
249                 sb.append("</xml-properties>\n");
250                 sb.append("</xml-element>\n");
251                 sb.append("<xml-element java-attribute=\"resourceVersion\" name=\"resource-version\" type=\"java.lang.String\">\n");
252                 sb.append("<xml-properties>\n");
253                 sb.append("<xml-property name=\"description\" value=\"Used for optimistic concurrency.  Must be empty on create, valid on update and delete.\" />\n");
254                 sb.append("</xml-properties>\n");
255                 sb.append("</xml-element>\n");
256 //                sb.append("<xml-element java-attribute=\"relationshipList\" name=\"relationship-list\" type=\"inventory.aai.onap.org.v11.RelationshipList\" />\n");
257                 sb.append("</java-attributes>\n");
258                 sb.append("<xml-properties>\n");
259                 sb.append("<xml-property name=\"description\" value=\"Object that group service instances.\" />\n");
260                 sb.append("<xml-property name=\"indexedProps\" value=\"service-type\" />\n");
261                 sb.append("<xml-property name=\"dependentOn\" value=\"customer\" />\n");
262                 sb.append("<xml-property name=\"container\" value=\"service-subscriptions\" />\n");
263                 sb.append("<xml-property name=\"crossEntityReference\" value=\"service-instance,service-type\" />\n");
264                 sb.append("</xml-properties>\n");
265                 sb.append("</java-type>\n");
266         }
267         
268         private void addRelationshipList(StringBuilder sb ) {
269                 sb.append("<java-type name=\"RelationshipList\">\n");
270                 sb.append("<xml-root-element name=\"relationship-list\" />\n");
271                 sb.append("<java-attributes>\n");
272                         sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"relationship\" name=\"relationship\" type=\"inventory.aai.onap.org.v11.Relationship\" />/n");
273                 sb.append("</java-attributes>\n");
274         sb.append("</java-type>\n");
275         }
276         
277         private void addRelationship(StringBuilder sb ) {
278                 sb.append("<java-type name=\"Relationship\">\n");
279                 sb.append("<xml-root-element name=\"relationship\" />\n");
280                 sb.append("<java-attributes>\n");
281                 sb.append("<xml-element java-attribute=\"relatedTo\" name=\"related-to\" type=\"java.lang.String\">\n");
282                 sb.append("<xml-properties>\n");
283                 sb.append("<xml-property name=\"description\" value=\"A keyword provided by A&amp;AI to indicate type of node.\" />\n");
284                 sb.append("</xml-properties>\n");
285                 sb.append("</xml-element>\n");
286                 sb.append("<xml-element java-attribute=\"relatedLink\" name=\"related-link\" type=\"java.lang.String\">\n");
287                 sb.append("<xml-properties>\n");
288                 sb.append("<xml-property name=\"description\" value=\"URL to the object in A&amp;AI.\" />");
289                 sb.append("</xml-properties>\n");
290                 sb.append("</xml-element>\n");
291                 sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"relationshipData\" name=\"relationship-data\" type=\"inventory.aai.onap.org.v11.RelationshipData\" />\n");
292                 sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"relatedToProperty\" name=\"related-to-property\" type=\"inventory.aai.onap.org.v11.RelatedToProperty\" />\n");
293                 sb.append("</java-attributes>\n");
294                 sb.append("</java-type>\n");
295         }
296         
297         private void addRelatedToProperty(StringBuilder sb) {
298                 sb.append("<java-type name=\"RelatedToProperty\">\n");
299                 sb.append("<xml-root-element name=\"related-to-property\" />\n");
300                 sb.append("<java-attributes>\n");
301                         sb.append("<xml-element java-attribute=\"propertyKey\" name=\"property-key\" type=\"java.lang.String\">\n");
302                         sb.append("<xml-properties>\n");
303                         sb.append("<xml-property name=\"description\" value=\"Key part of a key/value pair\" />\n");
304                         sb.append("</xml-properties>\n");
305                         sb.append("</xml-element>\n");
306                         sb.append("<xml-element java-attribute=\"propertyValue\" name=\"property-value\" type=\"java.lang.String\">\n");
307                         sb.append("<xml-properties>\n");
308                         sb.append("<xml-property name=\"description\" value=\"Value part of a key/value pair\" />\n");
309                         sb.append("</xml-properties>\n");
310                         sb.append("</xml-element>\n");
311                         sb.append("</java-attributes>\n");
312                         sb.append("</java-type>\n");
313         }
314         
315         private void addRelationshipData(StringBuilder sb){
316                 sb.append("<java-type name=\"RelationshipData\">\n");
317                 sb.append("<xml-root-element name=\"relationship-data\" />\n");
318                 sb.append("<java-attributes>\n");
319                         sb.append("<xml-element java-attribute=\"relationshipKey\" name=\"relationship-key\" required=\"true\" type=\"java.lang.String\">\n");
320                         sb.append("<xml-properties>\n");
321                         sb.append("<xml-property name=\"description\" value=\"A keyword provided by A&amp;AI to indicate an attribute.\" />\n");
322                         sb.append("</xml-properties>\n");
323                         sb.append("</xml-element>\n");
324                         sb.append("<xml-element java-attribute=\"relationshipValue\" name=\"relationship-value\" required=\"true\" type=\"java.lang.String\">\n");
325                         sb.append("<xml-properties>\n");
326                         sb.append("<xml-property name=\"description\" value=\"Value of the attribute.\" />\n");
327                         sb.append("</xml-properties>\n");
328                         sb.append("</xml-element>\n");
329                         sb.append("</java-attributes>\n");
330                         sb.append("</java-type>\n");
331         }
332         
333         
334         private void addEndOfXML(StringBuilder sb){
335                 sb.append("</java-types>\n");
336                 sb.append("</xml-bindings>\n");
337         }
338         
339         public void init() throws ParserConfigurationException, SAXException, IOException, AAIException  {
340                 DocumentBuilder dBuilder = null;
341                 try {   
342                     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
343                     dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
344                     dBuilder = dbFactory.newDocumentBuilder();
345                 } catch (ParserConfigurationException e) {
346                         throw e;
347                 }
348                 try {   
349                         InputSource isInput = new InputSource(new StringReader(testXML));
350                         doc = dBuilder.parse(isInput);
351                 } catch (SAXException e) {
352                         throw e;
353                 } catch (IOException e) {
354                         throw e;
355                 }
356                 
357             NodeList bindingsNodes = doc.getElementsByTagName("xml-bindings");
358                 Element bindingElement;
359                 NodeList javaTypesNodes;
360                 Element javaTypesElement;
361                 
362                 if ( bindingsNodes == null || bindingsNodes.getLength() == 0 ) {
363                         throw new AAIException("OXM file error: missing <binding-nodes> in XML");
364                 }           
365                 
366                 bindingElement = (Element) bindingsNodes.item(0);
367                 javaTypesNodes = bindingElement.getElementsByTagName("java-types");
368                 if ( javaTypesNodes.getLength() < 1 ) {
369                         throw new AAIException("OXM file error: missing <binding-nodes><java-types> in XML");
370                 }
371                 javaTypesElement = (Element) javaTypesNodes.item(0);
372
373                 javaTypeNodes = javaTypesElement.getElementsByTagName("java-type");
374                 if ( javaTypeNodes.getLength() < 1 ) {
375                         throw new AAIException("OXM file error: missing <binding-nodes><java-types><java-type> in XML");
376                 }
377                 logger.debug(testXML);
378         }
379         @Test
380         public void testXSDElement() {
381                 // repeat of testGetIndexedProps() which uses the constructor
382                 ArrayList<String> target = new ArrayList<String>();
383                 target.add("subscriber-name");
384                 target.add("global-customer-id");
385                 target.add("subscriber-type");
386                 target.add("service-type");
387
388                 Vector<String> indexedProps = new Vector<String>();
389                 for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) {
390                         XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
391                         indexedProps.addAll(javaTypeElement.getIndexedProps());
392                 }
393                 assertThat(new ArrayList<>(indexedProps),both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray())));
394         }
395
396         @Test
397         public void testName() {
398                 ArrayList<String> target = new ArrayList<String>();
399                 target.add("ServiceSubscriptions");
400                 target.add("ServiceSubscription");
401                 target.add("Inventory");
402                 target.add("Business");
403                 target.add("Customers");
404                 target.add("Customer");
405                 ArrayList<String> names = new ArrayList<String>();
406                 for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) {
407                         XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
408                         names.add(javaTypeElement.name());
409                 }
410                 logger.debug(String.join("|", names));
411                 assertThat(names,both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray())));
412         }
413
414         @Test
415         public void testGetAddTypes() {
416                 HashMap<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>();
417                 HashMap<String,ArrayList<String>> target = new HashMap<String,ArrayList<String>>();
418                 target.put("Customer", new ArrayList<>(Arrays.asList("ServiceSubscriptions", "RelationshipList")));
419                 target.put("Customer", new ArrayList<>(Arrays.asList("ServiceSubscriptions")));
420                 target.put("Business", new ArrayList<>(Arrays.asList("Customers")));
421                 target.put("Inventory", new ArrayList<>(Arrays.asList("Business")));
422                 target.put("Customers", new ArrayList<>(Arrays.asList("Customer")));
423                 target.put("ServiceSubscription", new ArrayList<>(Arrays.asList("RelationshipList")));
424                 target.put("ServiceSubscription", new ArrayList<>(Arrays.asList()));
425                 target.put("ServiceSubscriptions", new ArrayList<>(Arrays.asList("ServiceSubscription")));
426                 
427                 for ( int i = 0; i < javaTypeNodes.getLength(); ++i ) {
428                         XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
429                         ArrayList<String> addTypes = new ArrayList<String>();
430                         NodeList xmlElementNodes = javaTypeElement.getElementsByTagName("xml-element");
431                         String name=javaTypeElement.name();
432                         for ( int j = 0; j < xmlElementNodes.getLength(); ++j ) {
433                                 XSDElement xmlElement = new XSDElement((Element) xmlElementNodes.item(j));
434                                 addTypes.addAll(xmlElement.getAddTypes("v11"));
435                                 map.put(name,addTypes);
436                         }
437                 }
438                 for(String key : map.keySet()) {
439                         assertThat("Expected for key:"+key, map.get(key),equalTo(target.get(key)));             
440                 }
441         }
442 /*
443         @Test
444         public void testGetRequiredElements() {
445                 HashMap<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>();
446                 ArrayList<String> target = new ArrayList<String>();
447                 target.add("global-customer-id\n");
448                 target.add("subscriber-name\n");
449                 target.add("subscriber-type");
450                 for ( int i = 0; i < javaTypeNodes.getLength(); ++i ) {
451                         XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
452                                 ArrayList<String> requiredItems = new ArrayList<String>();
453                                 String name=javaTypeElement.name();
454                                 requiredItems.addAll(javaTypeElement.getRequiredElements("v11"));
455                                 map.put(name,requiredItems);
456                 }
457                 for(String key : map.keySet()) {
458                         assertThat(map.get(key),equalTo(target));               
459                 }
460         }
461 */
462         @Test
463         public void testGetPathDescriptionProperty() {
464                 ArrayList<String> target = new ArrayList<String>();
465                 target.add("Namespace for business related constructs");
466                 target.add("Collection of customer identifiers to provide linkage back to BSS information.");
467                 target.add("customer identifiers to provide linkage back to BSS information.");
468                 target.add("Collection of objects that group service instances.");
469                 target.add("Object that group service instances.");
470                 List<String> descs = new ArrayList<String>();
471                 for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) {
472                         XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
473                         if(javaTypeElement.getPathDescriptionProperty() != null)
474                                 descs.add(javaTypeElement.getPathDescriptionProperty());
475                 }
476                 logger.debug(String.join("|", descs));
477                 assertThat(new ArrayList<>(descs),both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray())));
478         }
479
480         @Test
481         public void testGetIndexedProps() {
482                 ArrayList<String> target = new ArrayList<String>();
483                 target.add("subscriber-name");
484                 target.add("global-customer-id");
485                 target.add("subscriber-type");
486                 target.add("service-type");
487
488                 Vector<String> indexedProps = new Vector<String>();
489                 for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) {
490                         XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
491                         indexedProps.addAll(javaTypeElement.getIndexedProps());
492                 }
493                 assertThat(new ArrayList<>(indexedProps),both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray())));
494         }
495
496         @Test
497         public void testGetContainerProperty() {
498                 ArrayList<String> target = new ArrayList<String>();
499                 target.add("service-subscriptions");
500                 target.add("customers");
501                 List<String> containers = new ArrayList<String>();
502                 for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) {
503                         XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
504                         if(javaTypeElement.getContainerProperty() != null)
505                                 containers.add(javaTypeElement.getContainerProperty());
506                 }
507                 logger.debug(String.join("|", containers));
508                 assertThat(new ArrayList<>(containers),both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray())));
509         }
510
511         @Test
512         public void testGetQueryParamYAML() {
513                 ArrayList<String> target = new ArrayList<String>();
514                 target.add("        - name: global-customer-id\n          in: query\n          description:\n          required: false\n          type: string\n");
515                 target.add("        - name: subscriber-name\n          in: query\n          description:\n          required: false\n          type: string\n");
516                 target.add("        - name: subscriber-type\n          in: query\n          description:\n          required: false\n          type: string\n");
517                 Vector<String> indexedProps = new Vector<String>();
518                 for ( int i = 0; i < javaTypeNodes.getLength(); ++i ) {
519                         XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
520                         if(javaTypeElement.getContainerProperty() != null) {
521                                 indexedProps.addAll(javaTypeElement.getIndexedProps());
522                                 String container = javaTypeElement.getContainerProperty();
523                                 Vector<String> containerProps = new Vector<String>();
524                                 NodeList xmlElementNodes = javaTypeElement.getElementsByTagName("xml-element");
525                                 for ( int j = 0; j < xmlElementNodes.getLength(); ++j ) {
526                                         XSDElement xmlElement = new XSDElement((Element) xmlElementNodes.item(j));
527                                         if(indexedProps.contains(xmlElement.name()))
528                                                 containerProps.add(xmlElement.getQueryParamYAML());
529                                 }
530                                 GetOperation.addContainerProps(container, containerProps);
531                         }                       
532                 }
533 /*
534                 List<String> queryParams = new ArrayList<String>();
535                 for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) {
536                         XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
537                         if(javaTypeElement.getQueryParamYAML() != null)
538                                 queryParams.add(javaTypeElement.getQueryParamYAML());
539                 }
540 */
541                 assertThat(GetOperation.containers.get("customers"),equalTo( target));
542         }
543
544         @Test
545         public void testGetPathParamYAML() {
546                 ArrayList<String> target = new ArrayList<String>();
547                 target.add("        - name: Inventory\n          in: path\n          description: Inventory\n          required: true\n          example: __INVENTORY__\n");
548                 target.add("        - name: Business\n          in: path\n          description: Business\n          required: true\n          example: __BUSINESS__\n");
549                 target.add("        - name: Customers\n          in: path\n          description: Customers\n          required: true\n          example: __CUSTOMERS__\n");
550                 target.add("        - name: Customer\n          in: path\n          description: Customer\n          required: true\n          example: __CUSTOMER__\n");
551                 target.add("        - name: ServiceSubscriptions\n          in: path\n          description: ServiceSubscriptions\n          required: true\n          example: __SERVICESUBSCRIPTIONS__\n");
552                 target.add("        - name: ServiceSubscription\n          in: path\n          description: ServiceSubscription\n          required: true\n          example: __SERVICESUBSCRIPTION__\n");
553                 List<String> pathParams = new ArrayList<String>();
554                 for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) {
555                         XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
556                         if(javaTypeElement.getPathParamYAML(javaTypeElement.name()) != null)
557                                 pathParams.add(javaTypeElement.getPathParamYAML(javaTypeElement.name()));
558                 }
559                 logger.debug(String.join("|", pathParams));
560                 assertThat(new ArrayList<>(pathParams),both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray())));
561         }
562
563         @Test
564         public void testGetHTMLAnnotation() {
565                 ArrayList<String> target = new ArrayList<String>();
566                 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);
567                 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);
568                 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);
569                 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);
570                 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);
571                 List<String> annotes = new ArrayList<String>();
572                 for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) {
573                         XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
574                         if(StringUtils.isNotEmpty(javaTypeElement.getHTMLAnnotation(javaTypeElement.name(),"")))
575                                 annotes.add(javaTypeElement.getHTMLAnnotation(javaTypeElement.name(), "  "));
576                 }
577                 logger.debug("result:");
578                 logger.debug(String.join("|", annotes));
579                 logger.debug("Expected:");
580                 logger.debug(String.join("|", target));
581                 assertThat(new ArrayList<>(annotes),both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray())));
582
583         }
584
585         @Test
586         public void testGetTypePropertyYAML() {
587                 ArrayList<String> target = new ArrayList<String>();
588                 target.add("      Inventory:\n        type: ");
589                 target.add("      Business:\n        type:         description: Namespace for business related constructs\n");
590                 target.add("      Customers:\n        type:         description: Collection of customer identifiers to provide linkage back to BSS information.\n");
591                 target.add("      Customer:\n        type:         description: customer identifiers to provide linkage back to BSS information.\n");
592                 target.add("      ServiceSubscriptions:\n        type:         description: Collection of objects that group service instances.\n");
593                 target.add("      ServiceSubscription:\n        type:         description: Object that group service instances.\n");
594                 List<String> types = new ArrayList<String>();
595                 for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) {
596                         XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
597                         if(javaTypeElement.getTypePropertyYAML() != null)
598                                 types.add(javaTypeElement.getTypePropertyYAML());
599                 }
600                 assertThat(new ArrayList<>(types),both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray())));
601         }
602
603         @Test
604         public void testIsStandardType() {
605                 HashMap<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>();
606                 HashMap<String,ArrayList<String>> target = new HashMap<String,ArrayList<String>>();
607                 target.put("Customer", new ArrayList<>(Arrays.asList("global-customer-id","subscriber-name", "subscriber-type","resource-version")));
608                 target.put("Business", new ArrayList<>());
609                 target.put("Inventory", new ArrayList<>());
610                 target.put("Customers", new ArrayList<>());
611                 target.put("ServiceSubscriptions", new ArrayList<>());
612                 target.put("ServiceSubscription", new ArrayList<>(Arrays.asList("service-type", "temp-ub-sub-account-id", "resource-version")));
613                 
614                 for ( int i = 0; i < javaTypeNodes.getLength(); ++i ) {
615                         XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i));
616                         ArrayList<String> addTypes = new ArrayList<String>();
617                         NodeList xmlElementNodes = javaTypeElement.getElementsByTagName("xml-element");
618                         String name=javaTypeElement.name();
619                         for ( int j = 0; j < xmlElementNodes.getLength(); ++j ) {
620                                 XSDElement xmlElement = new XSDElement((Element) xmlElementNodes.item(j));
621                                 if(xmlElement.isStandardType())
622                                         addTypes.add(xmlElement.name());                                
623                         }
624                         map.put(name,addTypes);
625                 }
626                 for(String key : map.keySet()) {
627                         assertThat(map.get(key),equalTo(target.get(key)));              
628                 }
629         }
630
631 }