2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2017 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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
20 * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22 package org.onap.aai.util;
24 import static org.junit.Assert.*;
26 import java.io.StringReader;
28 import javax.xml.XMLConstants;
29 import javax.xml.parsers.DocumentBuilder;
30 import javax.xml.parsers.DocumentBuilderFactory;
32 import org.hamcrest.CoreMatchers;
33 import org.junit.Assert;
34 import org.junit.Before;
35 import org.junit.Rule;
36 import org.junit.Test;
37 import org.junit.runner.RunWith;
39 import org.w3c.dom.Document;
40 import org.w3c.dom.Element;
41 import org.w3c.dom.NodeList;
42 import org.xml.sax.InputSource;
44 import org.onap.aai.introspection.Version;
47 public class GenerateXsdTest {
48 private static final int maxSizeForXml = 20000;
49 private String testXML;
52 public void setUp() throws Exception {
53 //PowerMockito.mockStatic(GenerateXsd.class);
54 StringBuilder sb = new StringBuilder(maxSizeForXml);
56 addRelationshipList(sb);
58 addRelatedToProperty(sb);
59 addRelationshipData(sb);
63 addServiceSubscriptions(sb);
64 addServiceSubscription(sb);
66 testXML = sb.toString();
69 private void addNamespace(StringBuilder sb){
70 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");
71 sb.append("<xml-schema element-form-default=\"QUALIFIED\">\n");
72 sb.append("<xml-ns namespace-uri=\"http://org.onap.aai.inventory/v11\" />\n");
73 sb.append("</xml-schema>\n");
74 sb.append("<java-types>\n");
75 sb.append("<java-type name=\"Inventory\">\n");
76 sb.append("<xml-root-element name=\"inventory\" />\n");
77 sb.append("<java-attributes>\n");
78 sb.append("<xml-element java-attribute=\"business\" name=\"business\" type=\"inventory.aai.onap.org.v11.Business\" />\n");
79 sb.append("</java-attributes>\n");
80 sb.append("</java-type>\n");
83 private void addRelationshipList(StringBuilder sb ) {
84 sb.append("<java-type name=\"RelationshipList\">\n");
85 sb.append("<xml-root-element name=\"relationship-list\" />\n");
86 sb.append("<java-attributes>\n");
87 sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"relationship\" name=\"relationship\" type=\"inventory.aai.onap.org.v11.Relationship\" />/n");
88 sb.append("</java-attributes>\n");
89 sb.append("</java-type>\n");
92 private void addRelationship(StringBuilder sb ) {
93 sb.append("<java-type name=\"Relationship\">\n");
94 sb.append("<xml-root-element name=\"relationship\" />\n");
95 sb.append("<java-attributes>\n");
96 sb.append("<xml-element java-attribute=\"relatedTo\" name=\"related-to\" type=\"java.lang.String\">\n");
97 sb.append("<xml-properties>\n");
98 sb.append("<xml-property name=\"description\" value=\"A keyword provided by A&AI to indicate type of node.\" />\n");
99 sb.append("</xml-properties>\n");
100 sb.append("</xml-element>\n");
101 sb.append("<xml-element java-attribute=\"relatedLink\" name=\"related-link\" type=\"java.lang.String\">\n");
102 sb.append("<xml-properties>\n");
103 sb.append("<xml-property name=\"description\" value=\"URL to the object in A&AI.\" />");
104 sb.append("</xml-properties>\n");
105 sb.append("</xml-element>\n");
106 sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"relationshipData\" name=\"relationship-data\" type=\"inventory.aai.onap.org.v11.RelationshipData\" />\n");
107 sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"relatedToProperty\" name=\"related-to-property\" type=\"inventory.aai.onap.org.v11.RelatedToProperty\" />\n");
108 sb.append("</java-attributes>\n");
109 sb.append("</java-type>\n");
112 private void addRelatedToProperty(StringBuilder sb) {
113 sb.append("<java-type name=\"RelatedToProperty\">\n");
114 sb.append("<xml-root-element name=\"related-to-property\" />\n");
115 sb.append("<java-attributes>\n");
116 sb.append("<xml-element java-attribute=\"propertyKey\" name=\"property-key\" type=\"java.lang.String\">\n");
117 sb.append("<xml-properties>\n");
118 sb.append("<xml-property name=\"description\" value=\"Key part of a key/value pair\" />\n");
119 sb.append("</xml-properties>\n");
120 sb.append("</xml-element>\n");
121 sb.append("<xml-element java-attribute=\"propertyValue\" name=\"property-value\" type=\"java.lang.String\">\n");
122 sb.append("<xml-properties>\n");
123 sb.append("<xml-property name=\"description\" value=\"Value part of a key/value pair\" />\n");
124 sb.append("</xml-properties>\n");
125 sb.append("</xml-element>\n");
126 sb.append("</java-attributes>\n");
127 sb.append("</java-type>\n");
130 private void addRelationshipData(StringBuilder sb){
131 sb.append("<java-type name=\"RelationshipData\">\n");
132 sb.append("<xml-root-element name=\"relationship-data\" />\n");
133 sb.append("<java-attributes>\n");
134 sb.append("<xml-element java-attribute=\"relationshipKey\" name=\"relationship-key\" required=\"true\" type=\"java.lang.String\">\n");
135 sb.append("<xml-properties>\n");
136 sb.append("<xml-property name=\"description\" value=\"A keyword provided by A&AI to indicate an attribute.\" />\n");
137 sb.append("</xml-properties>\n");
138 sb.append("</xml-element>\n");
139 sb.append("<xml-element java-attribute=\"relationshipValue\" name=\"relationship-value\" required=\"true\" type=\"java.lang.String\">\n");
140 sb.append("<xml-properties>\n");
141 sb.append("<xml-property name=\"description\" value=\"Value of the attribute.\" />\n");
142 sb.append("</xml-properties>\n");
143 sb.append("</xml-element>\n");
144 sb.append("</java-attributes>\n");
145 sb.append("</java-type>\n");
148 private void addBusiness(StringBuilder sb){
149 sb.append("<java-type name=\"Business\">\n");
150 sb.append("<xml-properties>\n");
151 sb.append("<xml-property name=\"description\" value=\"Namespace for business related constructs\" />\n");
152 sb.append("</xml-properties>\n");
153 sb.append("<xml-root-element name=\"business\" />\n");
154 sb.append("<java-attributes>\n");
155 sb.append("<xml-element java-attribute=\"customers\" name=\"customers\" type=\"inventory.aai.onap.org.v11.Customers\" />\n");
156 sb.append("</java-attributes>\n");
157 sb.append("</java-type>\n");
160 private void addCustomers(StringBuilder sb){
161 sb.append("<java-type name=\"Customers\">\n");
162 sb.append("<xml-properties>\n");
163 sb.append("<xml-property name=\"description\" value=\"Collection of customer identifiers to provide linkage back to BSS information.\" />\n");
164 sb.append("</xml-properties>\n");
165 sb.append("<xml-root-element name=\"customers\" />\n");
166 sb.append("<java-attributes>\n");
167 sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"customer\" name=\"customer\" type=\"inventory.aai.onap.org.v11.Customer\" />\n");
168 sb.append("</java-attributes>\n");
169 sb.append("<xml-properties>\n");
170 sb.append("<xml-property name=\"maximumDepth\" value=\"0\" />\n");
171 sb.append("</xml-properties>\n");
172 sb.append("</java-type>\n");
175 private void addCustomer(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 ECOMP 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=\"subscriberType\" name=\"subscriber-type\" required=\"true\" type=\"java.lang.String\">\n");
190 sb.append("<xml-properties>\n");
191 sb.append("<xml-property name=\"description\" value=\"Subscriber type, a way to provide VID with only the INFRA customers.\" />\n");
192 sb.append("<xml-property name=\"defaultValue\" value=\"CUST\" />\n");
193 sb.append("</xml-properties>\n");
194 sb.append("</xml-element>\n");
195 sb.append("<xml-element java-attribute=\"resourceVersion\" name=\"resource-version\" type=\"java.lang.String\">\n");
196 sb.append("<xml-properties>\n");
197 sb.append("<xml-property name=\"description\" value=\"Used for optimistic concurrency. Must be empty on create, valid on update and delete.\" />\n");
198 sb.append("</xml-properties>\n");
199 sb.append("</xml-element>\n");
200 sb.append("<xml-element java-attribute=\"serviceSubscriptions\" name=\"service-subscriptions\" type=\"inventory.aai.onap.org.v11.ServiceSubscriptions\" />\n");
201 sb.append("<xml-element java-attribute=\"relationshipList\" name=\"relationship-list\" type=\"inventory.aai.onap.org.v11.RelationshipList\" />\n");
202 sb.append("</java-attributes>\n");
203 sb.append("<xml-properties>\n");
204 sb.append("<xml-property name=\"description\" value=\"customer identifiers to provide linkage back to BSS information.\" />\n");
205 sb.append("<xml-property name=\"nameProps\" value=\"subscriber-name\" />\n");
206 sb.append("<xml-property name=\"indexedProps\" value=\"subscriber-name,global-customer-id,subscriber-type\" />\n");
207 sb.append("<xml-property name=\"searchable\" value=\"global-customer-id,subscriber-name\" />\n");
208 sb.append("<xml-property name=\"uniqueProps\" value=\"global-customer-id\" />\n");
209 sb.append("<xml-property name=\"container\" value=\"customers\" />\n");
210 sb.append("<xml-property name=\"namespace\" value=\"business\" />\n");
211 sb.append("</xml-properties>\n");
212 sb.append("</java-type>\n");
215 private void addServiceSubscriptions(StringBuilder sb){
216 sb.append("<java-type name=\"ServiceSubscriptions\">\n");
217 sb.append("<xml-properties>\n");
218 sb.append("<xml-property name=\"description\" value=\"Collection of objects that group service instances.\" />\n");
219 sb.append("</xml-properties>\n");
220 sb.append("<xml-root-element name=\"service-subscriptions\" />\n");
221 sb.append("<java-attributes>\n");
222 sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"serviceSubscription\" name=\"service-subscription\" type=\"inventory.aai.onap.org.v11.ServiceSubscription\" />\n");
223 sb.append("</java-attributes>\n");
224 sb.append("</java-type>\n");
226 private void addServiceSubscription(StringBuilder sb){
227 sb.append("<java-type name=\"ServiceSubscription\">\n");
228 sb.append("<xml-root-element name=\"service-subscription\" />\n");
229 sb.append("<java-attributes>\n");
230 sb.append("<xml-element java-attribute=\"serviceType\" name=\"service-type\" required=\"true\" type=\"java.lang.String\" xml-key=\"true\">\n");
231 sb.append("<xml-properties>\n");
232 sb.append("<xml-property name=\"description\" value=\"Value defined by orchestration to identify this service across ECOMP.\" />\n");
233 sb.append("</xml-properties>\n");
234 sb.append("</xml-element>\n");
235 sb.append("<xml-element java-attribute=\"tempUbSubAccountId\" name=\"temp-ub-sub-account-id\" type=\"java.lang.String\">\n");
236 sb.append("<xml-properties>\n");
237 sb.append("<xml-property name=\"description\" value=\"This property will be deleted from A&AI in the near future. Only stop gap solution.\" />\n");
238 sb.append("</xml-properties>\n");
239 sb.append("</xml-element>\n");
240 sb.append("<xml-element java-attribute=\"resourceVersion\" name=\"resource-version\" type=\"java.lang.String\">\n");
241 sb.append("<xml-properties>\n");
242 sb.append("<xml-property name=\"description\" value=\"Used for optimistic concurrency. Must be empty on create, valid on update and delete.\" />\n");
243 sb.append("</xml-properties>\n");
244 sb.append("</xml-element>\n");
245 sb.append("<xml-element java-attribute=\"relationshipList\" name=\"relationship-list\" type=\"inventory.aai.onap.org.v11.RelationshipList\" />\n");
246 sb.append("</java-attributes>\n");
247 sb.append("<xml-properties>\n");
248 sb.append("<xml-property name=\"description\" value=\"Object that group service instances.\" />\n");
249 sb.append("<xml-property name=\"indexedProps\" value=\"service-type\" />\n");
250 sb.append("<xml-property name=\"dependentOn\" value=\"customer\" />\n");
251 sb.append("<xml-property name=\"container\" value=\"service-subscriptions\" />\n");
252 sb.append("<xml-property name=\"crossEntityReference\" value=\"service-instance,service-type\" />\n");
253 sb.append("</xml-properties>\n");
254 sb.append("</java-type>\n");
257 private void addEndOfXML(StringBuilder sb){
258 sb.append("</java-types>\n");
259 sb.append("</xml-bindings>\n");
264 public void test_processOxmFile() {
267 GenerateXsd generateXsd = new GenerateXsd();
269 //GenerateXsd generateXsdSpy = PowerMockito.spy(generateXsd);
271 //generateXsdSpy.processOxmFile(null, Version.getLatest(), testXML);
273 String xsdResult = generateXsd.processOxmFile(null, Version.getLatest(), testXML);
275 String relationshipListExpected = " <xs:element name=\"relationship-list\">\n <xs:complexType>\n <xs:sequence>\n <xs:element ref=\"tns:relationship\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n </xs:sequence>\n </xs:complexType>\n </xs:element>";
276 String relatedToPropertyExpected = " <xs:element name=\"related-to-property\">\n <xs:complexType>\n <xs:sequence>\n <xs:element name=\"property-key\" type=\"xs:string\" minOccurs=\"0\">\n <xs:annotation>\r\n <xs:appinfo>\r\n <annox:annotate target=\"field\">@org.onap.aai.annotations.Metadata(description=\"Key part of a key/value pair\")</annox:annotate>\r\n </xs:appinfo>\r\n </xs:annotation>\r\n </xs:element>\n"
277 + " <xs:element name=\"property-value\" type=\"xs:string\" minOccurs=\"0\">\n <xs:annotation>\r\n <xs:appinfo>\r\n <annox:annotate target=\"field\">@org.onap.aai.annotations.Metadata(description=\"Value part of a key/value pair\")</annox:annotate>\r\n </xs:appinfo>\r\n </xs:annotation>\r\n </xs:element>\n </xs:sequence>\n </xs:complexType>\n </xs:element>";
278 assertNotNull(xsdResult);
281 public void test_generateSwaggerFromOxmFile( ) {
284 GenerateXsd generateXsd = new GenerateXsd();
286 String customerOperation = " /business/customers/customer/{global-customer-id}:\n get:\n tags:\n - Business\n summary: returns customer";
287 String relationshipListDefinition = " relationship-list:\n properties:\n relationship:\n type: array\n items: \n $ref: \"#/definitions/relationship\"";
288 String swaggerResult = generateXsd.generateSwaggerFromOxmFile(null, testXML);
289 assertNotNull(swaggerResult);