2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Modifications Copyright (c) 2019 Samsung
8 * ================================================================================
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 * ============LICENSE_END=========================================================
22 package org.onap.so.apihandlerinfra;
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.List;
28 import java.util.stream.Collectors;
29 import javax.transaction.Transactional;
30 import javax.ws.rs.GET;
31 import javax.ws.rs.Path;
32 import javax.ws.rs.PathParam;
33 import javax.ws.rs.QueryParam;
34 import javax.ws.rs.core.Response;
35 import org.apache.http.HttpStatus;
36 import org.onap.so.apihandler.common.ErrorNumbers;
37 import org.onap.so.apihandler.common.ResponseBuilder;
38 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
39 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
40 import org.onap.so.apihandlerinfra.workflowspecificationbeans.ActivitySequence;
41 import org.onap.so.apihandlerinfra.workflowspecificationbeans.ArtifactInfo;
42 import org.onap.so.apihandlerinfra.workflowspecificationbeans.Validation;
43 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowInputParameter;
44 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowSpecification;
45 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowSpecificationList;
46 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowSpecifications;
47 import org.onap.so.db.catalog.beans.ActivitySpec;
48 import org.onap.so.db.catalog.beans.ActivitySpecUserParameters;
49 import org.onap.so.db.catalog.beans.UserParameters;
50 import org.onap.so.db.catalog.beans.Workflow;
51 import org.onap.so.db.catalog.beans.WorkflowActivitySpecSequence;
52 import org.onap.so.db.catalog.client.CatalogDbClient;
53 import org.onap.so.logger.ErrorCode;
54 import org.onap.so.logger.MessageEnum;
55 import org.slf4j.Logger;
56 import org.slf4j.LoggerFactory;
57 import org.springframework.beans.factory.annotation.Autowired;
58 import org.springframework.stereotype.Component;
59 import com.fasterxml.jackson.core.JsonProcessingException;
60 import com.fasterxml.jackson.databind.DeserializationFeature;
61 import com.fasterxml.jackson.databind.ObjectMapper;
62 import io.swagger.v3.oas.annotations.OpenAPIDefinition;
63 import io.swagger.v3.oas.annotations.Operation;
64 import io.swagger.v3.oas.annotations.info.Info;
65 import io.swagger.v3.oas.annotations.media.ArraySchema;
66 import io.swagger.v3.oas.annotations.media.Content;
67 import io.swagger.v3.oas.annotations.media.Schema;
68 import io.swagger.v3.oas.annotations.responses.ApiResponse;
70 @Path("onap/so/infra/workflowSpecifications")
71 @OpenAPIDefinition(info = @Info(title = "onap/so/infra/workflowSpecifications",
72 description = "Queries of Workflow Specifications"))
74 public class WorkflowSpecificationsHandler {
77 private ResponseBuilder builder;
80 private CatalogDbClient catalogDbClient;
82 private static Logger logger = LoggerFactory.getLogger(WorkflowSpecificationsHandler.class);
83 private static final String ARTIFACT_TYPE_WORKFLOW = "workflow";
84 private static final String NATIVE_WORKFLOW = "native";
86 @Path("/{version:[vV]1}/workflows")
88 @Operation(description = "Finds Workflow Specifications", responses = @ApiResponse(
89 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
92 public Response queryWorkflowSpecifications(@QueryParam("vnfModelVersionId") String vnfModelVersionId,
93 @PathParam("version") String version) throws Exception {
95 String apiVersion = version.substring(1);
97 ObjectMapper mapper1 = new ObjectMapper();
98 mapper1.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
100 List<Workflow> workflows = catalogDbClient.findWorkflowByModelUUID(vnfModelVersionId);
102 List<Workflow> nativeWorkflows = catalogDbClient.findWorkflowBySource(NATIVE_WORKFLOW);
103 if (nativeWorkflows != null && !nativeWorkflows.isEmpty()) {
104 workflows.addAll(nativeWorkflows);
107 WorkflowSpecifications workflowSpecifications = mapWorkflowsToWorkflowSpecifications(workflows);
111 ObjectMapper mapper = new ObjectMapper();
112 jsonResponse = mapper.writeValueAsString(workflowSpecifications);
113 } catch (JsonProcessingException e) {
114 ErrorLoggerInfo errorLoggerInfo =
115 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
117 ValidateException validateException =
118 new ValidateException.Builder("Mapping of request to JSON object failed : " + e.getMessage(),
119 HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
120 .errorInfo(errorLoggerInfo).build();
121 throw validateException;
124 return builder.buildResponse(HttpStatus.SC_OK, "", jsonResponse, apiVersion);
127 protected WorkflowSpecifications mapWorkflowsToWorkflowSpecifications(List<Workflow> workflows) {
128 if (workflows == null || workflows.isEmpty()) {
131 WorkflowSpecifications workflowSpecifications = new WorkflowSpecifications();
132 List<WorkflowSpecificationList> workflowSpecificationList = new ArrayList<>();
134 for (Workflow workflow : workflows) {
135 WorkflowSpecificationList workflowSpecificationListItem = new WorkflowSpecificationList();
136 WorkflowSpecification workflowSpecification = new WorkflowSpecification();
137 workflowSpecification.setArtifactInfo(buildArtifactInfo(workflow));
138 workflowSpecification.setActivitySequence(buildActivitySequence(workflow));
139 workflowSpecification.setWorkflowInputParameters(buildWorkflowInputParameters(workflow));
140 workflowSpecificationListItem.setWorkflowSpecification(workflowSpecification);
141 workflowSpecificationList.add(workflowSpecificationListItem);
143 workflowSpecifications.setWorkflowSpecificationList(workflowSpecificationList);
144 return workflowSpecifications;
147 private ArtifactInfo buildArtifactInfo(Workflow workflow) {
148 ArtifactInfo artifactInfo = new ArtifactInfo();
149 artifactInfo.setArtifactType(ARTIFACT_TYPE_WORKFLOW);
150 artifactInfo.setArtifactUuid(workflow.getArtifactUUID());
151 artifactInfo.setArtifactName(workflow.getArtifactName());
152 if (workflow.getVersion() != null) {
153 artifactInfo.setArtifactVersion(workflow.getVersion().toString());
155 artifactInfo.setArtifactDescription(workflow.getDescription());
156 artifactInfo.setWorkflowName(workflow.getName());
157 artifactInfo.setOperationName(workflow.getOperationName());
158 artifactInfo.setWorkflowSource(workflow.getSource());
159 artifactInfo.setWorkflowResourceTarget(workflow.getResourceTarget());
163 private List<ActivitySequence> buildActivitySequence(Workflow workflow) {
164 List<WorkflowActivitySpecSequence> workflowActivitySpecSequences = workflow.getWorkflowActivitySpecSequence();
165 if (workflowActivitySpecSequences == null || workflowActivitySpecSequences.isEmpty()) {
168 List<ActivitySequence> activitySequences = new ArrayList<>();
169 for (WorkflowActivitySpecSequence workflowActivitySpecSequence : workflowActivitySpecSequences) {
170 if (workflowActivitySpecSequence != null) {
171 ActivitySpec activitySpec = workflowActivitySpecSequence.getActivitySpec();
172 if (activitySpec != null) {
173 ActivitySequence activitySequence = new ActivitySequence();
174 activitySequence.setName(activitySpec.getName());
175 logger.debug("Adding activity: " + activitySpec.getName());
176 activitySequence.setDescription(activitySpec.getDescription());
177 activitySequences.add(activitySequence);
181 return activitySequences;
184 private List<WorkflowInputParameter> buildWorkflowInputParameters(Workflow workflow) {
185 List<WorkflowActivitySpecSequence> workflowActivitySpecSequences = workflow.getWorkflowActivitySpecSequence();
186 if (workflowActivitySpecSequences == null || workflowActivitySpecSequences.isEmpty()) {
187 return new ArrayList<>();
189 Map<String, WorkflowInputParameter> workflowInputParameterMap = new HashMap<>();
190 for (WorkflowActivitySpecSequence workflowActivitySpecSequence : workflowActivitySpecSequences) {
191 if (workflowActivitySpecSequence != null) {
192 ActivitySpec activitySpec = workflowActivitySpecSequence.getActivitySpec();
193 if (activitySpec != null) {
194 List<ActivitySpecUserParameters> activitySpecUserParameters =
195 activitySpec.getActivitySpecUserParameters();
196 if (activitySpecUserParameters != null && !activitySpecUserParameters.isEmpty()) {
197 for (ActivitySpecUserParameters activitySpecUserParameter : activitySpecUserParameters) {
198 UserParameters userParameter = activitySpecUserParameter.getUserParameters();
199 if (userParameter != null) {
200 WorkflowInputParameter workflowInputParameter =
201 buildWorkflowInputParameter(userParameter);
202 workflowInputParameterMap.put(userParameter.getName(), workflowInputParameter);
210 if (workflowInputParameterMap.size() == 0) {
211 return new ArrayList<>();
213 List<WorkflowInputParameter> workflowInputParameterList =
214 workflowInputParameterMap.values().stream().collect(Collectors.toList());
215 return workflowInputParameterList;
218 private WorkflowInputParameter buildWorkflowInputParameter(UserParameters userParameter) {
219 WorkflowInputParameter workflowInputParameter = new WorkflowInputParameter();
220 workflowInputParameter.setLabel(userParameter.getLabel());
221 workflowInputParameter.setInputType(userParameter.getType());
222 workflowInputParameter.setRequired(userParameter.getIsRequried());
223 workflowInputParameter.setSoFieldName(userParameter.getName());
224 workflowInputParameter.setSoPayloadLocation(userParameter.getPayloadLocation());
225 workflowInputParameter.setValidation(buildValidationList(userParameter));
226 return workflowInputParameter;
229 private List<Validation> buildValidationList(UserParameters userParameter) {
230 List<Validation> validationList = null;
231 if (userParameter.getMaxLength() != null || userParameter.getAllowableChars() != null) {
232 validationList = new ArrayList<>();
233 Validation validation = new Validation();
234 if (userParameter.getMaxLength() != null) {
235 validation.setMaxLength(userParameter.getMaxLength().toString());
237 validation.setAllowableChars(userParameter.getAllowableChars());
238 validationList.add(validation);
240 return validationList;