2  * Copyright © 2017-2018 AT&T Intellectual Property.
\r 
   4  * Licensed under the Apache License, Version 2.0 (the "License");
\r 
   5  * you may not use this file except in compliance with the License.
\r 
   6  * You may obtain a copy of the License at
\r 
   8  *     http://www.apache.org/licenses/LICENSE-2.0
\r 
  10  * Unless required by applicable law or agreed to in writing, software
\r 
  11  * distributed under the License is distributed on an "AS IS" BASIS,
\r 
  12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r 
  13  * See the License for the specific language governing permissions and
\r 
  14  * limitations under the License.
\r 
  17 package org.onap.ccsdk.apps.controllerblueprints.service.common;
\r 
  19 import io.swagger.models.*;
\r 
  20 import io.swagger.models.parameters.BodyParameter;
\r 
  21 import io.swagger.models.parameters.Parameter;
\r 
  22 import io.swagger.models.properties.*;
\r 
  23 import io.swagger.util.Json;
\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 
  34  * SwaggerGenerator.java Purpose: Provide Service to generate service template input schema definition and Sample Json
\r 
  37  * @author Brinda Santh
\r 
  41 public class SwaggerGenerator {
\r 
  43     private ServiceTemplate serviceTemplate;
\r 
  46      * This is a SwaggerGenerator constructor
\r 
  48     public SwaggerGenerator(ServiceTemplate serviceTemplate) {
\r 
  49         this.serviceTemplate = serviceTemplate;
\r 
  53      * This is a generateSwagger
\r 
  57     public String generateSwagger() {
\r 
  58         String swaggerContent = null;
\r 
  60         Swagger swagger = new Swagger().info(getInfo());
\r 
  62         swagger.setPaths(getPaths());
\r 
  63         swagger.setDefinitions(getDefinition());
\r 
  66         swaggerContent = Json.pretty(swagger);
\r 
  67         return swaggerContent;
\r 
  70     private Info getInfo() {
\r 
  71         Info info = new Info();
\r 
  72         Contact contact = new Contact();
\r 
  73         contact.setName(serviceTemplate.getMetadata().get(BluePrintConstants.METADATA_TEMPLATE_AUTHOR));
\r 
  74         info.setContact(contact);
\r 
  75         info.setTitle(serviceTemplate.getMetadata().get(BluePrintConstants.METADATA_TEMPLATE_NAME));
\r 
  76         info.setDescription(serviceTemplate.getDescription());
\r 
  77         info.setVersion(serviceTemplate.getMetadata().get(BluePrintConstants.METADATA_TEMPLATE_VERSION));
\r 
  81     private Map<String, Path> getPaths() {
\r 
  82         Map<String, Path> paths = new HashMap<>();
\r 
  83         Path path = new Path();
\r 
  84         Operation post = new Operation();
\r 
  85         post.setOperationId("configure");
\r 
  86         post.setConsumes(Arrays.asList("application/json", "application/xml"));
\r 
  87         post.setProduces(Arrays.asList("application/json", "application/xml"));
\r 
  88         List<Parameter> parameters = new ArrayList<>();
\r 
  89         Parameter in = new BodyParameter().schema(new RefModel("#/definitions/inputs"));
\r 
  90         in.setRequired(true);
\r 
  91         in.setName("inputs");
\r 
  93         post.setParameters(parameters);
\r 
  95         Map<String, Response> responses = new HashMap<>();
\r 
  96         Response response = new Response().description("Success");
\r 
  97         responses.put("200", response);
\r 
  99         Response failureResponse = new Response().description("Failure");
\r 
 100         responses.put("400", failureResponse);
\r 
 101         post.setResponses(responses);
\r 
 103         path.setPost(post);
\r 
 104         paths.put("/operations/config-selfservice-api:configure", path);
\r 
 108     private Map<String, Model> getDefinition() {
\r 
 109         Map<String, Model> models = new HashMap<>();
\r 
 111         ModelImpl inputmodel = new ModelImpl();
\r 
 112         inputmodel.setTitle("inputs");
\r 
 113         serviceTemplate.getTopologyTemplate().getInputs().forEach((propertyName, property) -> {
\r 
 114             Property defProperty = getPropery(propertyName, property);
\r 
 115             inputmodel.property(propertyName, defProperty);
\r 
 117         models.put("inputs", inputmodel);
\r 
 119         if (MapUtils.isNotEmpty(serviceTemplate.getDataTypes())) {
\r 
 120             serviceTemplate.getDataTypes().forEach((name, dataType) -> {
\r 
 121                 ModelImpl model = new ModelImpl();
\r 
 122                 model.setDescription(dataType.getDescription());
\r 
 123                 // model.setType("object");
\r 
 124                 if (dataType != null && MapUtils.isNotEmpty(dataType.getProperties())) {
\r 
 126                     dataType.getProperties().forEach((propertyName, property) -> {
\r 
 127                         Property defProperty = getPropery(propertyName, property);
\r 
 128                         model.addProperty(propertyName, defProperty);
\r 
 131                 models.put(name, model);
\r 
 138     private Property getPropery(String name, PropertyDefinition propertyDefinition) {
\r 
 139         Property defProperty = null;
\r 
 141         if (BluePrintTypes.validPrimitiveTypes().contains(propertyDefinition.getType())) {
\r 
 142             if (BluePrintConstants.DATA_TYPE_BOOLEAN.equals(propertyDefinition.getType())) {
\r 
 143                 defProperty = new BooleanProperty();
\r 
 144             } else if (BluePrintConstants.DATA_TYPE_INTEGER.equals(propertyDefinition.getType())) {
\r 
 145                 StringProperty stringProperty = new StringProperty();
\r 
 146                 stringProperty.setType("integer");
\r 
 147                 defProperty = stringProperty;
\r 
 148             } else if (BluePrintConstants.DATA_TYPE_FLOAT.equals(propertyDefinition.getType())) {
\r 
 149                 StringProperty stringProperty = new StringProperty();
\r 
 150                 stringProperty.setFormat("float");
\r 
 151                 defProperty = stringProperty;
\r 
 152             } else if (BluePrintConstants.DATA_TYPE_TIMESTAMP.equals(propertyDefinition.getType())) {
\r 
 153                 DateTimeProperty dateTimeProperty = new DateTimeProperty();
\r 
 154                 dateTimeProperty.setFormat("date-time");
\r 
 155                 defProperty = dateTimeProperty;
\r 
 157                 defProperty = new StringProperty();
\r 
 159         } else if (BluePrintTypes.validCollectionTypes().contains(propertyDefinition.getType())) {
\r 
 160             ArrayProperty arrayProperty = new ArrayProperty();
\r 
 161             if (propertyDefinition.getEntrySchema() != null) {
\r 
 162                 String entrySchema = propertyDefinition.getEntrySchema().getType();
\r 
 163                 if (!BluePrintTypes.validPrimitiveTypes().contains(entrySchema)) {
\r 
 164                     Property innerType = new RefProperty("#/definitions/" + entrySchema);
\r 
 165                     arrayProperty.setItems(innerType);
\r 
 167                     Property innerType = new StringProperty();
\r 
 168                     arrayProperty.setItems(innerType);
\r 
 170                 defProperty = arrayProperty;
\r 
 174             defProperty = new RefProperty("#/definitions/" + propertyDefinition.getType());
\r 
 176         defProperty.setName(name);
\r 
 177         if (propertyDefinition.getDefaultValue() != null) {
\r 
 178             defProperty.setDefault(String.valueOf(propertyDefinition.getDefaultValue()));
\r 
 181         defProperty.setRequired(BooleanUtils.isTrue(propertyDefinition.getRequired()));
\r 
 182         defProperty.setDescription(propertyDefinition.getDescription());
\r 
 183         return defProperty;
\r