Migrate "ms/controllerblueprints" from ccsdk/apps
[ccsdk/cds.git] / ms / controllerblueprints / modules / service / src / main / java / org / onap / ccsdk / apps / controllerblueprints / service / common / SwaggerGenerator.java
1 /*\r
2  *  Copyright © 2017-2018 AT&T Intellectual Property.\r
3  *  Modifications Copyright © 2018 IBM.\r
4  *\r
5  *  Licensed under the Apache License, Version 2.0 (the "License");\r
6  *  you may not use this file except in compliance with the License.\r
7  *  You may obtain a copy of the License at\r
8  *\r
9  *      http://www.apache.org/licenses/LICENSE-2.0\r
10  *\r
11  *  Unless required by applicable law or agreed to in writing, software\r
12  *  distributed under the License is distributed on an "AS IS" BASIS,\r
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14  *  See the License for the specific language governing permissions and\r
15  *  limitations under the License.\r
16  */\r
17 \r
18 package org.onap.ccsdk.apps.controllerblueprints.service.common;\r
19 \r
20 import io.swagger.models.*;\r
21 import io.swagger.models.parameters.BodyParameter;\r
22 import io.swagger.models.parameters.Parameter;\r
23 import io.swagger.models.properties.*;\r
24 import org.apache.commons.collections.MapUtils;\r
25 import org.apache.commons.lang3.BooleanUtils;\r
26 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants;\r
27 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintTypes;\r
28 import org.onap.ccsdk.apps.controllerblueprints.core.data.PropertyDefinition;\r
29 import org.onap.ccsdk.apps.controllerblueprints.core.data.ServiceTemplate;\r
30 \r
31 import java.util.*;\r
32 \r
33 /**\r
34  * SwaggerGenerator.java Purpose: Provide Service to generate service template input schema definition and Sample Json\r
35  * generation.\r
36  *\r
37  * @author Brinda Santh\r
38  * @version 1.0\r
39  */\r
40 @Deprecated\r
41 public class SwaggerGenerator {\r
42 \r
43     private ServiceTemplate serviceTemplate;\r
44     public static final String INPUTS="inputs";\r
45 \r
46     /**\r
47      * This is a SwaggerGenerator constructor\r
48      */\r
49     public SwaggerGenerator(ServiceTemplate serviceTemplate) {\r
50         this.serviceTemplate = serviceTemplate;\r
51     }\r
52 \r
53     /**\r
54      * This is a generateSwagger\r
55      *\r
56      * @return String\r
57      */\r
58     public String generateSwagger() {\r
59         \r
60         Swagger swagger = new Swagger().info(getInfo());\r
61 \r
62         swagger.setPaths(getPaths());\r
63         swagger.setDefinitions(getDefinition());\r
64 \r
65 \r
66         return swagger.toString();\r
67     }\r
68 \r
69     private Info getInfo() {\r
70         Info info = new Info();\r
71         Contact contact = new Contact();\r
72         contact.setName(serviceTemplate.getMetadata().get(BluePrintConstants.METADATA_TEMPLATE_AUTHOR));\r
73         info.setContact(contact);\r
74         info.setTitle(serviceTemplate.getMetadata().get(BluePrintConstants.METADATA_TEMPLATE_NAME));\r
75         info.setDescription(serviceTemplate.getDescription());\r
76         info.setVersion(serviceTemplate.getMetadata().get(BluePrintConstants.METADATA_TEMPLATE_VERSION));\r
77         return info;\r
78     }\r
79 \r
80     private Map<String, Path> getPaths() {\r
81         Map<String, Path> paths = new HashMap<>();\r
82         Path path = new Path();\r
83         Operation post = new Operation();\r
84         post.setOperationId("configure");\r
85         post.setConsumes(Arrays.asList("application/json", "application/xml"));\r
86         post.setProduces(Arrays.asList("application/json", "application/xml"));\r
87         List<Parameter> parameters = new ArrayList<>();\r
88         Parameter in = new BodyParameter().schema(new RefModel("#/definitions/inputs"));\r
89         in.setRequired(true);\r
90         in.setName(INPUTS);\r
91         parameters.add(in);\r
92         post.setParameters(parameters);\r
93 \r
94         Map<String, Response> responses = new HashMap<>();\r
95         Response response = new Response().description("Success");\r
96         responses.put("200", response);\r
97 \r
98         Response failureResponse = new Response().description("Failure");\r
99         responses.put("400", failureResponse);\r
100         post.setResponses(responses);\r
101 \r
102         path.setPost(post);\r
103         paths.put("/operations/config-selfservice-api:configure", path);\r
104         return paths;\r
105     }\r
106 \r
107     private Map<String, Model> getDefinition() {\r
108         Map<String, Model> models = new HashMap<>();\r
109 \r
110         ModelImpl inputmodel = new ModelImpl();\r
111         inputmodel.setTitle(INPUTS);\r
112         serviceTemplate.getTopologyTemplate().getInputs().forEach((propertyName, property) -> {\r
113             Property defProperty = getPropery(propertyName, property);\r
114             inputmodel.property(propertyName, defProperty);\r
115         });\r
116         models.put(INPUTS, inputmodel);\r
117 \r
118         if (MapUtils.isNotEmpty(serviceTemplate.getDataTypes())) {\r
119             serviceTemplate.getDataTypes().forEach((name, dataType) -> {\r
120                 ModelImpl model = new ModelImpl();\r
121                 model.setDescription(dataType.getDescription());\r
122                 if (dataType != null && MapUtils.isNotEmpty(dataType.getProperties())) {\r
123 \r
124                     dataType.getProperties().forEach((propertyName, property) -> {\r
125                         Property defProperty = getPropery(propertyName, property);\r
126                         model.addProperty(propertyName, defProperty);\r
127                     });\r
128                 }\r
129                 models.put(name, model);\r
130             });\r
131         }\r
132         return models;\r
133 \r
134     }\r
135 \r
136     private Property getPropery(String name, PropertyDefinition propertyDefinition) {\r
137         Property defProperty = null;\r
138 \r
139         if (BluePrintTypes.validPrimitiveTypes().contains(propertyDefinition.getType())) {\r
140             if (BluePrintConstants.DATA_TYPE_BOOLEAN.equals(propertyDefinition.getType())) {\r
141                 defProperty = new BooleanProperty();\r
142             } else if (BluePrintConstants.DATA_TYPE_INTEGER.equals(propertyDefinition.getType())) {\r
143                 StringProperty stringProperty = new StringProperty();\r
144                 stringProperty.setType("integer");\r
145                 defProperty = stringProperty;\r
146             } else if (BluePrintConstants.DATA_TYPE_FLOAT.equals(propertyDefinition.getType())) {\r
147                 StringProperty stringProperty = new StringProperty();\r
148                 stringProperty.setFormat("float");\r
149                 defProperty = stringProperty;\r
150             } else if (BluePrintConstants.DATA_TYPE_TIMESTAMP.equals(propertyDefinition.getType())) {\r
151                 DateTimeProperty dateTimeProperty = new DateTimeProperty();\r
152                 dateTimeProperty.setFormat("date-time");\r
153                 defProperty = dateTimeProperty;\r
154             } else {\r
155                 defProperty = new StringProperty();\r
156             }\r
157         } else if (BluePrintTypes.validCollectionTypes().contains(propertyDefinition.getType())) {\r
158             ArrayProperty arrayProperty = new ArrayProperty();\r
159             if (propertyDefinition.getEntrySchema() != null) {\r
160                 String entrySchema = propertyDefinition.getEntrySchema().getType();\r
161                 if (!BluePrintTypes.validPrimitiveTypes().contains(entrySchema)) {\r
162                     Property innerType = new RefProperty("#/definitions/" + entrySchema);\r
163                     arrayProperty.setItems(innerType);\r
164                 } else {\r
165                     Property innerType = new StringProperty();\r
166                     arrayProperty.setItems(innerType);\r
167                 }\r
168                 defProperty = arrayProperty;\r
169             }\r
170 \r
171         } else {\r
172             defProperty = new RefProperty("#/definitions/" + propertyDefinition.getType());\r
173         }\r
174         defProperty.setName(name);\r
175         if (propertyDefinition.getDefaultValue() != null) {\r
176             defProperty.setDefault(String.valueOf(propertyDefinition.getDefaultValue()));\r
177         }\r
178 \r
179         defProperty.setRequired(BooleanUtils.isTrue(propertyDefinition.getRequired()));\r
180         defProperty.setDescription(propertyDefinition.getDescription());\r
181         return defProperty;\r
182     }\r
183 \r
184 \r
185 }\r