2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.openecomp.sdc.be.servlets;
23 import fj.data.Either;
24 import io.swagger.annotations.Api;
25 import io.swagger.annotations.ApiOperation;
26 import io.swagger.annotations.ApiParam;
27 import io.swagger.annotations.ApiResponse;
28 import io.swagger.annotations.ApiResponses;
29 import java.util.List;
31 import java.util.stream.Collectors;
32 import javax.inject.Singleton;
33 import javax.servlet.ServletContext;
34 import javax.servlet.http.HttpServletRequest;
35 import javax.servlet.http.HttpSession;
36 import javax.ws.rs.Consumes;
37 import javax.ws.rs.DELETE;
38 import javax.ws.rs.HeaderParam;
39 import javax.ws.rs.POST;
40 import javax.ws.rs.PUT;
41 import javax.ws.rs.Path;
42 import javax.ws.rs.PathParam;
43 import javax.ws.rs.Produces;
44 import javax.ws.rs.core.Context;
45 import javax.ws.rs.core.MediaType;
46 import javax.ws.rs.core.Response;
47 import org.codehaus.jackson.map.ObjectMapper;
48 import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic;
49 import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction;
50 import org.openecomp.sdc.be.config.BeEcompErrorManager;
51 import org.openecomp.sdc.be.dao.api.ActionStatus;
52 import org.openecomp.sdc.be.datamodel.utils.ConstraintConvertor;
53 import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
54 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
55 import org.openecomp.sdc.be.model.User;
56 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
57 import org.openecomp.sdc.be.tosca.utils.NodeFilterConverter;
58 import org.openecomp.sdc.be.ui.model.UIConstraint;
59 import org.openecomp.sdc.be.ui.model.UINodeFilter;
60 import org.openecomp.sdc.common.api.Constants;
61 import org.openecomp.sdc.exception.ResponseFormat;
62 import org.slf4j.Logger;
63 import org.slf4j.LoggerFactory;
65 @Path("/v1/catalog/services/{serviceId}/resourceInstances/{resourceInstanceId}/nodeFilter")
66 @Consumes(MediaType.APPLICATION_JSON)
67 @Produces(MediaType.APPLICATION_JSON)
68 @Api(value = "Service Filter", description = "Service Filter Servlet")
70 public class ServiceFilterServlet extends AbstractValidationsServlet {
72 private static final Logger log = LoggerFactory.getLogger(ServiceFilterServlet.class);
73 private static final String START_HANDLE_REQUEST_OF = "Start handle request of {}";
74 private static final String MODIFIER_ID_IS = "modifier id is {}";
75 private static final String FAILED_TO_UPDATE_OR_CREATE_NODE_FILTER = "failed to update or create node filter";
76 private static final String FAILED_TO_PARSE_SERVICE = "failed to parse service";
77 private static final String NODE_FILTER_CREATION_OR_UPDATE = "Node Filter Creation or update";
78 private static final String CREATE_OR_UPDATE_NODE_FILTER_WITH_AN_ERROR =
79 "create or update node filter with an error";
82 @Consumes(MediaType.APPLICATION_JSON)
83 @Produces(MediaType.APPLICATION_JSON)
85 @ApiOperation(value = "Add Service Filter Constraint", httpMethod = "POST", notes = "Add Service Filter Constraint",
86 response = Response.class)
87 @ApiResponses(value = {@ApiResponse(code = 201, message = "Create Service Filter"),
88 @ApiResponse(code = 403, message = "Restricted operation"),
89 @ApiResponse(code = 400, message = "Invalid content / Missing content")})
90 public Response addServiceFilterConstraint(@ApiParam(value = "Service data", required = true) String data,
91 @ApiParam(value = "Service Id") @PathParam("serviceId") String serviceId,
92 @ApiParam(value = "Resource Instance Id") @PathParam("resourceInstanceId") String ciId,
93 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
95 String url = request.getMethod() + " " + request.getRequestURI();
96 log.debug(START_HANDLE_REQUEST_OF, url);
97 final HttpSession session = request.getSession();
98 ServletContext context = session.getServletContext();
99 User modifier = new User();
100 modifier.setUserId(userId);
101 log.debug(MODIFIER_ID_IS, userId);
106 String serviceIdLower = serviceId.toLowerCase();
107 ServiceBusinessLogic businessLogic = getServiceBL(context);
109 Either<UIConstraint, ResponseFormat> convertResponse = parseToConstraint(data, modifier);
110 if (convertResponse.isRight()) {
111 log.debug(FAILED_TO_PARSE_SERVICE);
112 response = buildErrorResponse(convertResponse.right().value());
115 UIConstraint uiConstraint = convertResponse.left().value();
116 if (uiConstraint == null) {
117 log.debug(FAILED_TO_PARSE_SERVICE);
118 response = buildErrorResponse(convertResponse.right().value());
121 Either<CINodeFilterDataDefinition, ResponseFormat> actionResponse;
122 String constraint = new ConstraintConvertor().convert(uiConstraint);
123 actionResponse = businessLogic
124 .addOrDeleteServiceFilter(serviceIdLower, ciId, NodeFilterConstraintAction.ADD, uiConstraint.getServicePropertyName(),
125 constraint, -1, modifier, true);
127 if (actionResponse.isRight()) {
128 log.debug(FAILED_TO_UPDATE_OR_CREATE_NODE_FILTER);
129 response = buildErrorResponse(actionResponse.right().value());
133 CINodeFilterDataDefinition value = actionResponse.left().value();
134 UINodeFilter nodeFilter = new NodeFilterConverter().convertToUi(value);
135 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), nodeFilter);
137 } catch (Exception e) {
138 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(NODE_FILTER_CREATION_OR_UPDATE);
139 log.debug(CREATE_OR_UPDATE_NODE_FILTER_WITH_AN_ERROR, e);
140 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
147 @Consumes(MediaType.APPLICATION_JSON)
148 @Produces(MediaType.APPLICATION_JSON)
150 @ApiOperation(value = "Update Service Filter Constraint", httpMethod = "PUT",
151 notes = "Update Service Filter Constraint", response = Response.class)
152 @ApiResponses(value = {@ApiResponse(code = 201, message = "Create Service Filter"),
153 @ApiResponse(code = 403, message = "Restricted operation"),
154 @ApiResponse(code = 400, message = "Invalid content / Missing content")})
155 public Response updateServiceFilterConstraint(@ApiParam(value = "Service data", required = true) String data,
156 @ApiParam(value = "Service Id") @PathParam("serviceId") String serviceId,
157 @ApiParam(value = "Resource Instance Id") @PathParam("resourceInstanceId") String ciId,
158 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
159 ServletContext context = request.getSession().getServletContext();
160 String url = request.getMethod() + " " + request.getRequestURI();
161 log.debug(START_HANDLE_REQUEST_OF, url);
163 User modifier = new User();
164 modifier.setUserId(userId);
165 log.debug(MODIFIER_ID_IS, userId);
170 String serviceIdLower = serviceId.toLowerCase();
171 ServiceBusinessLogic businessLogic = getServiceBL(context);
173 Either<List, ResponseFormat> convertResponse = parseToConstraints(data, modifier);
174 if (convertResponse.isRight()) {
175 log.debug(FAILED_TO_PARSE_SERVICE);
176 response = buildErrorResponse(convertResponse.right().value());
179 List<Map<String,String>> uiConstraintsMaps = (List<Map<String,String>>) convertResponse.left().value();
180 if (uiConstraintsMaps == null) {
181 log.debug("failed to parse data");
182 response = buildErrorResponse(convertResponse.right().value());
185 final ObjectMapper objectMapper = new ObjectMapper();
186 List<UIConstraint> uiConstraints = uiConstraintsMaps.stream().map(dataMap -> objectMapper.convertValue(dataMap, UIConstraint.class)).collect(
187 Collectors.toList());
188 if (uiConstraints == null) {
189 log.debug("failed to parse data");
190 response = buildErrorResponse(convertResponse.right().value());
193 Either<CINodeFilterDataDefinition, ResponseFormat> actionResponse;
194 List<String> constraints = new ConstraintConvertor().convertToList(uiConstraints);
195 actionResponse = businessLogic.updateServiceFilter(serviceIdLower, ciId, constraints, modifier, true);
197 if (actionResponse.isRight()) {
198 log.debug(FAILED_TO_UPDATE_OR_CREATE_NODE_FILTER);
199 response = buildErrorResponse(actionResponse.right().value());
203 CINodeFilterDataDefinition value = actionResponse.left().value();
204 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK),
205 new NodeFilterConverter().convertToUi(value));
207 } catch (Exception e) {
208 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(NODE_FILTER_CREATION_OR_UPDATE);
209 log.debug(CREATE_OR_UPDATE_NODE_FILTER_WITH_AN_ERROR, e);
210 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
217 @Consumes(MediaType.APPLICATION_JSON)
218 @Produces(MediaType.APPLICATION_JSON)
219 @Path("/{constraintIndex}")
220 @ApiOperation(value = "Delete Service Filter Constraint", httpMethod = "Delete",
221 notes = "Delete Service Filter Constraint", response = Response.class)
222 @ApiResponses(value = {@ApiResponse(code = 201, message = "Delete Service Filter Constraint"),
223 @ApiResponse(code = 403, message = "Restricted operation"),
224 @ApiResponse(code = 400, message = "Invalid content / Missing content")})
225 public Response deleteServiceFilterConstraint(
226 @ApiParam(value = "Service Id") @PathParam("serviceId") String serviceId,
227 @ApiParam(value = "Resource Instance Id") @PathParam("resourceInstanceId") String ciId,
228 @ApiParam(value = "Constraint Index") @PathParam("constraintIndex") int index,
229 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
230 ServletContext context = request.getSession().getServletContext();
231 String url = request.getMethod() + " " + request.getRequestURI();
232 log.debug(START_HANDLE_REQUEST_OF, url);
234 User modifier = new User();
235 modifier.setUserId(userId);
236 log.debug(MODIFIER_ID_IS, userId);
241 String serviceIdLower = serviceId.toLowerCase();
242 ServiceBusinessLogic businessLogic = getServiceBL(context);
244 Either<CINodeFilterDataDefinition, ResponseFormat> actionResponse;
245 actionResponse = businessLogic
246 .addOrDeleteServiceFilter(serviceIdLower, ciId, NodeFilterConstraintAction.DELETE,
247 null, null, index, modifier, true);
249 if (actionResponse.isRight()) {
251 log.debug(FAILED_TO_UPDATE_OR_CREATE_NODE_FILTER);
252 response = buildErrorResponse(actionResponse.right().value());
256 final CINodeFilterDataDefinition value = actionResponse.left().value();
257 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK),
258 new NodeFilterConverter().convertToUi(value));
260 } catch (Exception e) {
261 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(NODE_FILTER_CREATION_OR_UPDATE);
262 log.debug(CREATE_OR_UPDATE_NODE_FILTER_WITH_AN_ERROR, e);
263 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
269 private Either<UIConstraint, ResponseFormat> parseToConstraint(String serviceJson, User user) {
270 return getComponentsUtils().convertJsonToObjectUsingObjectMapper(serviceJson, user, UIConstraint.class,
271 AuditingActionEnum.CREATE_RESOURCE, ComponentTypeEnum.SERVICE);
274 private Either<List, ResponseFormat> parseToConstraints(String serviceJson, User user) {
275 return getComponentsUtils().convertJsonToObjectUsingObjectMapper(serviceJson, user, List.class,
276 AuditingActionEnum.CREATE_RESOURCE, ComponentTypeEnum.SERVICE);