2 * Copyright © 2016-2018 European Support Limited
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.openecomp.sdc.be.servlets;
19 import com.jcabi.aspects.Loggable;
20 import fj.data.Either;
21 import io.swagger.annotations.Api;
22 import io.swagger.annotations.ApiOperation;
23 import io.swagger.annotations.ApiParam;
24 import io.swagger.annotations.ApiResponse;
25 import io.swagger.annotations.ApiResponses;
26 import org.openecomp.sdc.be.components.impl.RequirementBusinessLogic;
27 import org.openecomp.sdc.be.config.BeEcompErrorManager;
28 import org.openecomp.sdc.be.dao.api.ActionStatus;
29 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
30 import org.openecomp.sdc.be.model.RequirementDefinition;
31 import org.openecomp.sdc.be.model.User;
32 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
33 import org.openecomp.sdc.be.ui.model.UiComponentDataTransfer;
34 import org.openecomp.sdc.common.api.Constants;
35 import org.openecomp.sdc.common.log.wrappers.Logger;
36 import org.openecomp.sdc.exception.ResponseFormat;
38 import javax.inject.Singleton;
39 import javax.servlet.ServletContext;
40 import javax.servlet.http.HttpServletRequest;
41 import javax.ws.rs.Consumes;
42 import javax.ws.rs.DELETE;
43 import javax.ws.rs.GET;
44 import javax.ws.rs.HeaderParam;
45 import javax.ws.rs.POST;
46 import javax.ws.rs.PUT;
47 import javax.ws.rs.Path;
48 import javax.ws.rs.PathParam;
49 import javax.ws.rs.Produces;
50 import javax.ws.rs.core.Context;
51 import javax.ws.rs.core.MediaType;
52 import javax.ws.rs.core.Response;
53 import java.util.List;
54 import java.util.Optional;
56 @Loggable(prepend = true, value = Loggable.DEBUG, trim = false)
58 @Consumes(MediaType.APPLICATION_JSON)
59 @Produces(MediaType.APPLICATION_JSON)
60 @Api(value = "Requirement Servlet", description = "Requirement Servlet")
62 public class RequirementServlet extends AbstractValidationsServlet {
63 private static final Logger LOGGER = Logger.getLogger(RequirementServlet.class);
66 @Consumes(MediaType.APPLICATION_JSON)
67 @Produces(MediaType.APPLICATION_JSON)
68 @Path("/resources/{resourceId}/requirements")
69 @ApiOperation(value = "Create requirements on resource", httpMethod = "POST",
70 notes = "Create requirements on resource", response = Response.class)
71 @ApiResponses(value = {@ApiResponse(code = 201, message = "Create requirements"),
72 @ApiResponse(code = 403, message = "Restricted operation"),
73 @ApiResponse(code = 400, message = "Invalid content / Missing content"),
74 @ApiResponse(code = 409, message = "requirement already exist")})
75 public Response createRequirementsOnResource(
76 @ApiParam(value = "Requirement to create", required = true) String data,
77 @ApiParam(value = "Resource Id") @PathParam("resourceId") String resourceId,
78 @Context final HttpServletRequest request,
79 @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
80 return createOrUpdate(data, "resources" , resourceId, request,
81 userId, false, "createRequirements");
86 @Consumes(MediaType.APPLICATION_JSON)
87 @Produces(MediaType.APPLICATION_JSON)
88 @Path("/resources/{resourceId}/requirements")
89 @ApiOperation(value = "Update Requirements on resource", httpMethod = "PUT",
90 notes = "Update Requirements on resource", response = RequirementDefinition.class)
91 @ApiResponses(value = {@ApiResponse(code = 201, message = "Update Requirements"),
92 @ApiResponse(code = 403, message = "Restricted operation"),
93 @ApiResponse(code = 400, message = "Invalid content / Missing content")})
94 public Response updateRequirementsOnResource(
95 @ApiParam(value = "Requirements to update", required = true) String data,
96 @ApiParam(value = "Component Id") @PathParam("resourceId") String resourceId,
97 @Context final HttpServletRequest request,
98 @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
99 return createOrUpdate(data, "resources", resourceId, request,
100 userId, true, "updateRequirements");
104 @Consumes(MediaType.APPLICATION_JSON)
105 @Produces(MediaType.APPLICATION_JSON)
106 @Path("/resources/{resourceId}/requirements/{requirementId}")
107 @ApiOperation(value = "Get Requirement from resource", httpMethod = "GET",
108 notes = "GET Requirement from resource", response = RequirementDefinition.class)
109 @ApiResponses(value = {@ApiResponse(code = 201, message = "GET requirement"),
110 @ApiResponse(code = 403, message = "Restricted operation"),
111 @ApiResponse(code = 400, message = "Invalid content / Missing content")})
112 public Response getRequirementsFromResource(
113 @ApiParam(value = "Resource Id") @PathParam("resourceId") String resourceId,
114 @ApiParam(value = "Requirement Id") @PathParam("requirementId") String requirementId,
115 @Context final HttpServletRequest request,
116 @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
118 return get(requirementId, resourceId, request, userId);
122 @Consumes(MediaType.APPLICATION_JSON)
123 @Produces(MediaType.APPLICATION_JSON)
124 @Path("/resources/{resourceId}/requirements/{requirementId}")
125 @ApiOperation(value = "Delete requirements from resource", httpMethod = "DELETE",
126 notes = "Delete requirements from resource", response = RequirementDefinition.class)
127 @ApiResponses(value = {@ApiResponse(code = 201, message = "Delete requirement"),
128 @ApiResponse(code = 403, message = "Restricted operation"),
129 @ApiResponse(code = 400, message = "Invalid content / Missing content")})
130 public Response deleteRequirementsFromResource(
131 @ApiParam(value = "Resource Id") @PathParam("resourceId") String resourceId,
132 @ApiParam(value = "requirement Id") @PathParam("requirementId") String requirementId,
133 @Context final HttpServletRequest request,
134 @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
135 return delete(requirementId, resourceId, request, userId);
139 @Consumes(MediaType.APPLICATION_JSON)
140 @Produces(MediaType.APPLICATION_JSON)
141 @Path("/services/{serviceId}/requirements")
142 @ApiOperation(value = "Create requirements on service", httpMethod = "POST",
143 notes = "Create requirements on service", response = Response.class)
144 @ApiResponses(value = {@ApiResponse(code = 201, message = "Create Requirements"),
145 @ApiResponse(code = 403, message = "Restricted operation"),
146 @ApiResponse(code = 400, message = "Invalid content / Missing content"),
147 @ApiResponse(code = 409, message = "Requirement already exist")})
148 public Response createRequirementsOnService(
149 @ApiParam(value = "Requirements to create", required = true) String data,
150 @ApiParam(value = "Service Id") @PathParam("serviceId") String serviceId,
151 @Context final HttpServletRequest request,
152 @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
153 return createOrUpdate(data, "services" , serviceId, request, userId,
154 false , "createRequirements");
159 @Consumes(MediaType.APPLICATION_JSON)
160 @Produces(MediaType.APPLICATION_JSON)
161 @Path("/services/{serviceId}/requirements")
162 @ApiOperation(value = "Update requirements on service", httpMethod = "PUT",
163 notes = "Update requirements on service", response = RequirementDefinition.class)
164 @ApiResponses(value = {@ApiResponse(code = 201, message = "Update requirements"),
165 @ApiResponse(code = 403, message = "Restricted operation"),
166 @ApiResponse(code = 400, message = "Invalid content / Missing content")})
167 public Response updateRequirementsOnService(
168 @ApiParam(value = "Requirements to update", required = true) String data,
169 @ApiParam(value = "Component Id") @PathParam("serviceId") String serviceId,
170 @Context final HttpServletRequest request,
171 @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
172 return createOrUpdate(data, "services", serviceId, request, userId,
173 true, "updateRequirements");
177 @Consumes(MediaType.APPLICATION_JSON)
178 @Produces(MediaType.APPLICATION_JSON)
179 @Path("/services/{serviceId}/requirements/{requirementId}")
180 @ApiOperation(value = "Get requirement from service", httpMethod = "GET",
181 notes = "GET requirement from service", response = RequirementDefinition.class)
182 @ApiResponses(value = {@ApiResponse(code = 201, message = "GET Requirements"),
183 @ApiResponse(code = 403, message = "Restricted operation"),
184 @ApiResponse(code = 400, message = "Invalid content / Missing content")})
185 public Response getRequirementsOnService(
186 @ApiParam(value = "Service Id") @PathParam("serviceId") String serviceId,
187 @ApiParam(value = "Requirement Id") @PathParam("requirementId") String requirementId,
188 @Context final HttpServletRequest request,
189 @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
191 return get(requirementId, serviceId, request, userId);
196 @Consumes(MediaType.APPLICATION_JSON)
197 @Produces(MediaType.APPLICATION_JSON)
198 @Path("/services/{serviceId}/requirements/{requirementId}")
199 @ApiOperation(value = "Delete requirement from service", httpMethod = "DELETE",
200 notes = "Delete requirement from service", response = RequirementDefinition.class)
201 @ApiResponses(value = {@ApiResponse(code = 201, message = "Delete Requirements"),
202 @ApiResponse(code = 403, message = "Restricted operation"),
203 @ApiResponse(code = 400, message = "Invalid content / Missing content")})
204 public Response deleteRequirementsOnService(
205 @ApiParam(value = "Service Id") @PathParam("serviceId") String serviceId,
206 @ApiParam(value = "Requirement Id") @PathParam("requirementId") String requirementId,
207 @Context final HttpServletRequest request,
208 @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
209 return delete(requirementId, serviceId, request, userId);
213 private Response createOrUpdate (String data, String componentType, String componentId,
214 HttpServletRequest request, String userId,
215 boolean isUpdate, String errorContext) {
216 ServletContext context = request.getSession().getServletContext();
217 String url = request.getMethod() + " " + request.getRequestURI();
219 User modifier = new User();
220 modifier.setUserId(userId);
221 LOGGER.debug("Start create or update request of {} with modifier id {}", url, userId);
224 String componentIdLower = componentId.toLowerCase();
225 RequirementBusinessLogic businessLogic = getRequirementBL(context);
227 Either<List<RequirementDefinition>, ResponseFormat> mappedRequirementDataEither =
228 getMappedRequirementData(data, modifier, ComponentTypeEnum.findByParamName(componentType));
229 if(mappedRequirementDataEither.isRight()) {
230 LOGGER.error("Failed to create or update requirements");
231 return buildErrorResponse(mappedRequirementDataEither.right().value());
233 List<RequirementDefinition> mappedRequirementData = mappedRequirementDataEither.left().value();
234 Either<List<RequirementDefinition>, ResponseFormat> actionResponse;
236 actionResponse = businessLogic.updateRequirements(componentIdLower, mappedRequirementData, modifier,
239 actionResponse = businessLogic.createRequirements(componentIdLower, mappedRequirementData, modifier,
243 if (actionResponse.isRight()) {
244 LOGGER.error("Failed to create or update requirements");
245 return buildErrorResponse(actionResponse.right().value());
248 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK),
249 actionResponse.left().value());
250 } catch (Exception e) {
251 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("requirements create or update");
252 LOGGER.error("Failed to create or update requirements with an error", e);
253 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
257 private Response get (String requirementIdToGet, String componentId,
258 HttpServletRequest request, String userId){
259 ServletContext context = request.getSession().getServletContext();
260 String url = request.getMethod() + " " + request.getRequestURI();
262 User modifier = new User();
263 modifier.setUserId(userId);
264 LOGGER.debug("Start get request of {} with modifier id {}", url, userId);
267 String componentIdLower = componentId.toLowerCase();
268 RequirementBusinessLogic businessLogic = getRequirementBL(context);
270 Either<RequirementDefinition, ResponseFormat> actionResponse = businessLogic
271 .getRequirement(componentIdLower, requirementIdToGet, modifier, true);
272 if (actionResponse.isRight()) {
273 LOGGER.error("failed to get requirements");
274 return buildErrorResponse(actionResponse.right().value());
276 Object result = RepresentationUtils.toFilteredRepresentation(actionResponse.left().value());
277 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), result);
278 } catch (Exception e) {
279 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get requirements");
280 LOGGER.error("get requirements failed with exception", e);
281 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
285 private Response delete (String requirementId, String componentId, HttpServletRequest
286 request, String userId){
288 ServletContext context = request.getSession().getServletContext();
289 String url = request.getMethod() + " " + request.getRequestURI();
291 User modifier = new User();
292 modifier.setUserId(userId);
293 LOGGER.debug("Start delete request of {} with modifier id {}", url, userId);
296 String componentIdLower = componentId.toLowerCase();
297 RequirementBusinessLogic businessLogic = getRequirementBL(context);
299 Either<RequirementDefinition, ResponseFormat> actionResponse = businessLogic
300 .deleteRequirement(componentIdLower, requirementId, modifier, true);
301 if (actionResponse.isRight()) {
302 LOGGER.error("failed to delete requirements");
303 return buildErrorResponse(actionResponse.right().value());
305 Object result = RepresentationUtils.toRepresentation(actionResponse.left().value());
306 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), result);
307 } catch (Exception e) {
308 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Delete requirements");
309 LOGGER.error("Delete requirements failed with an error", e);
310 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
314 private Either<List<RequirementDefinition>, ResponseFormat> getMappedRequirementData(String inputJson, User user,
315 ComponentTypeEnum componentTypeEnum){
316 Either<UiComponentDataTransfer, ResponseFormat> mappedData = getComponentsUtils()
317 .convertJsonToObjectUsingObjectMapper(inputJson, user, UiComponentDataTransfer.class,
318 AuditingActionEnum.CREATE_RESOURCE, componentTypeEnum);
319 Optional<List<RequirementDefinition>> requirementDefinitionList = mappedData.left().value()
320 .getRequirements().values().stream().findFirst();
321 return requirementDefinitionList.<Either<List<RequirementDefinition>, ResponseFormat>>
322 map(Either::left).orElseGet(() -> Either.right(getComponentsUtils()
323 .getResponseFormat(ActionStatus.GENERAL_ERROR)));