Query CatalogDB for WorkflowSpecifications
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / onap / so / apihandlerinfra / WorkflowSpecificationsHandler.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2019 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.so.apihandlerinfra;
21
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.List;
25 import java.util.Map;
26 import java.util.stream.Collectors;
27 import javax.transaction.Transactional;
28 import javax.ws.rs.GET;
29 import javax.ws.rs.Path;
30 import javax.ws.rs.PathParam;
31 import javax.ws.rs.QueryParam;
32 import javax.ws.rs.core.Response;
33 import org.apache.http.HttpStatus;
34 import org.onap.so.apihandler.common.ErrorNumbers;
35 import org.onap.so.apihandler.common.ResponseBuilder;
36 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
37 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
38 import org.onap.so.apihandlerinfra.workflowspecificationbeans.ActivitySequence;
39 import org.onap.so.apihandlerinfra.workflowspecificationbeans.ArtifactInfo;
40 import org.onap.so.apihandlerinfra.workflowspecificationbeans.Validation;
41 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowInputParameter;
42 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowSpecification;
43 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowSpecificationList;
44 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowSpecifications;
45 import org.onap.so.db.catalog.beans.ActivitySpec;
46 import org.onap.so.db.catalog.beans.ActivitySpecUserParameters;
47 import org.onap.so.db.catalog.beans.UserParameters;
48 import org.onap.so.db.catalog.beans.Workflow;
49 import org.onap.so.db.catalog.beans.WorkflowActivitySpecSequence;
50 import org.onap.so.db.catalog.client.CatalogDbClient;
51 import org.onap.so.logger.ErrorCode;
52 import org.onap.so.logger.MessageEnum;
53 import org.springframework.beans.factory.annotation.Autowired;
54 import org.springframework.stereotype.Component;
55 import com.fasterxml.jackson.core.JsonProcessingException;
56 import com.fasterxml.jackson.databind.DeserializationFeature;
57 import com.fasterxml.jackson.databind.ObjectMapper;
58 import io.swagger.annotations.Api;
59 import io.swagger.annotations.ApiOperation;
60
61 @Path("onap/so/infra/workflowSpecifications")
62 @Api(value = "onap/so/infra/workflowSpecifications", description = "Queries of Workflow Specifications")
63 @Component
64 public class WorkflowSpecificationsHandler {
65
66     @Autowired
67     private ResponseBuilder builder;
68
69     @Autowired
70     private CatalogDbClient catalogDbClient;
71
72     private static final String ARTIFACT_TYPE_WORKFLOW = "workflow";
73
74     @Path("/{version:[vV]1}/workflows")
75     @GET
76     @ApiOperation(value = "Finds Workflow Specifications", response = Response.class)
77     @Transactional
78
79     public Response queryWorkflowSpecifications(@QueryParam("vnfModelVersionId") String vnfModelVersionId,
80             @PathParam("version") String version) throws Exception {
81
82         String apiVersion = version.substring(1);
83
84         ObjectMapper mapper1 = new ObjectMapper();
85         mapper1.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
86
87         List<Workflow> workflows = catalogDbClient.findWorkflowByModelUUID(vnfModelVersionId);
88         WorkflowSpecifications workflowSpecifications = mapWorkflowsToWorkflowSpecifications(workflows);
89
90         String jsonResponse = null;
91         try {
92             ObjectMapper mapper = new ObjectMapper();
93             jsonResponse = mapper.writeValueAsString(workflowSpecifications);
94         } catch (JsonProcessingException e) {
95             ErrorLoggerInfo errorLoggerInfo =
96                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
97                             .build();
98             ValidateException validateException =
99                     new ValidateException.Builder("Mapping of request to JSON object failed : " + e.getMessage(),
100                             HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
101                                     .errorInfo(errorLoggerInfo).build();
102             throw validateException;
103         }
104
105         return builder.buildResponse(HttpStatus.SC_OK, "", jsonResponse, apiVersion);
106     }
107
108     protected WorkflowSpecifications mapWorkflowsToWorkflowSpecifications(List<Workflow> workflows) {
109         if (workflows == null || workflows.size() == 0) {
110             return null;
111         }
112         WorkflowSpecifications workflowSpecifications = new WorkflowSpecifications();
113         List<WorkflowSpecificationList> workflowSpecificationList = new ArrayList<WorkflowSpecificationList>();
114
115         for (Workflow workflow : workflows) {
116             WorkflowSpecificationList workflowSpecificationListItem = new WorkflowSpecificationList();
117             WorkflowSpecification workflowSpecification = new WorkflowSpecification();
118             workflowSpecification.setArtifactInfo(buildArtifactInfo(workflow));
119             workflowSpecification.setActivitySequence(buildActivitySequence(workflow));
120             workflowSpecification.setWorkflowInputParameters(buildWorkflowInputParameters(workflow));
121             workflowSpecificationListItem.setWorkflowSpecification(workflowSpecification);
122             workflowSpecificationList.add(workflowSpecificationListItem);
123         }
124         workflowSpecifications.setWorkflowSpecificationList(workflowSpecificationList);
125         return workflowSpecifications;
126     }
127
128     private ArtifactInfo buildArtifactInfo(Workflow workflow) {
129         ArtifactInfo artifactInfo = new ArtifactInfo();
130         artifactInfo.setArtifactType(ARTIFACT_TYPE_WORKFLOW);
131         artifactInfo.setArtifactUuid(workflow.getArtifactUUID());
132         artifactInfo.setArtifactName(workflow.getArtifactName());
133         if (workflow.getVersion() != null) {
134             artifactInfo.setArtifactVersion(workflow.getVersion().toString());
135         }
136         artifactInfo.setArtifactDescription(workflow.getDescription());
137         artifactInfo.setWorkflowName(workflow.getName());
138         artifactInfo.setOperationName(workflow.getOperationName());
139         artifactInfo.setWorkflowSource(workflow.getSource());
140         artifactInfo.setWorkflowResourceTarget(workflow.getResourceTarget());
141         return artifactInfo;
142     }
143
144     private List<ActivitySequence> buildActivitySequence(Workflow workflow) {
145         List<WorkflowActivitySpecSequence> workflowActivitySpecSequences = workflow.getWorkflowActivitySpecSequence();
146         if (workflowActivitySpecSequences == null || workflowActivitySpecSequences.size() == 0) {
147             return null;
148         }
149         List<ActivitySequence> activitySequences = new ArrayList<ActivitySequence>();
150         for (WorkflowActivitySpecSequence workflowActivitySpecSequence : workflowActivitySpecSequences) {
151             if (workflowActivitySpecSequence != null) {
152                 ActivitySpec activitySpec = workflowActivitySpecSequence.getActivitySpec();
153                 if (activitySpec != null) {
154                     ActivitySequence activitySequence = new ActivitySequence();
155                     activitySequence.setName(activitySpec.getName());
156                     activitySequence.setDescription(activitySpec.getDescription());
157                     activitySequences.add(activitySequence);
158                 }
159             }
160         }
161         return activitySequences;
162     }
163
164     private List<WorkflowInputParameter> buildWorkflowInputParameters(Workflow workflow) {
165         List<WorkflowActivitySpecSequence> workflowActivitySpecSequences = workflow.getWorkflowActivitySpecSequence();
166         if (workflowActivitySpecSequences == null || workflowActivitySpecSequences.size() == 0) {
167             return null;
168         }
169         Map<String, WorkflowInputParameter> workflowInputParameterMap = new HashMap<String, WorkflowInputParameter>();
170         for (WorkflowActivitySpecSequence workflowActivitySpecSequence : workflowActivitySpecSequences) {
171             if (workflowActivitySpecSequence != null) {
172                 ActivitySpec activitySpec = workflowActivitySpecSequence.getActivitySpec();
173                 if (activitySpec != null) {
174                     List<ActivitySpecUserParameters> activitySpecUserParameters =
175                             activitySpec.getActivitySpecUserParameters();
176                     if (activitySpecUserParameters != null && activitySpecUserParameters.size() != 0) {
177                         for (ActivitySpecUserParameters activitySpecUserParameter : activitySpecUserParameters) {
178                             UserParameters userParameter = activitySpecUserParameter.getUserParameters();
179                             if (userParameter != null) {
180                                 WorkflowInputParameter workflowInputParameter =
181                                         buildWorkflowInputParameter(userParameter);
182                                 workflowInputParameterMap.put(userParameter.getName(), workflowInputParameter);
183                             }
184                         }
185                     }
186                 }
187             }
188         }
189
190         if (workflowInputParameterMap.size() == 0) {
191             return null;
192         }
193         List<WorkflowInputParameter> workflowInputParameterList =
194                 workflowInputParameterMap.values().stream().collect(Collectors.toList());
195         return workflowInputParameterList;
196     }
197
198     private WorkflowInputParameter buildWorkflowInputParameter(UserParameters userParameter) {
199         WorkflowInputParameter workflowInputParameter = new WorkflowInputParameter();
200         workflowInputParameter.setLabel(userParameter.getLabel());
201         workflowInputParameter.setInputType(userParameter.getType());
202         workflowInputParameter.setRequired(userParameter.getIsRequried());
203         workflowInputParameter.setSoFieldName(userParameter.getName());
204         workflowInputParameter.setSoPayloadLocation(userParameter.getPayloadLocation());
205         workflowInputParameter.setValidation(buildValidationList(userParameter));
206         return workflowInputParameter;
207     }
208
209     private List<Validation> buildValidationList(UserParameters userParameter) {
210         List<Validation> validationList = null;
211         if (userParameter.getMaxLength() != null || userParameter.getAllowableChars() != null) {
212             validationList = new ArrayList<Validation>();
213             Validation validation = new Validation();
214             if (userParameter.getMaxLength() != null) {
215                 validation.setMaxLength(userParameter.getMaxLength().toString());
216             }
217             validation.setAllowableChars(userParameter.getAllowableChars());
218             validationList.add(validation);
219         }
220         return validationList;
221     }
222 }