Added oparent to sdc main
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / servlets / ServiceFilterServlet.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
21 package org.openecomp.sdc.be.servlets;
22
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;
30 import java.util.Map;
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;
64
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")
69 @Singleton
70 public class ServiceFilterServlet extends AbstractValidationsServlet {
71
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";
80
81     @POST
82     @Consumes(MediaType.APPLICATION_JSON)
83     @Produces(MediaType.APPLICATION_JSON)
84     @Path("/")
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) {
94
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);
102
103         Response response;
104
105         try {
106             String serviceIdLower = serviceId.toLowerCase();
107             ServiceBusinessLogic businessLogic = getServiceBL(context);
108
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());
113                 return response;
114             }
115             UIConstraint uiConstraint = convertResponse.left().value();
116             if (uiConstraint == null) {
117                 log.debug(FAILED_TO_PARSE_SERVICE);
118                 response = buildErrorResponse(convertResponse.right().value());
119                 return response;
120             }
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);
126
127             if (actionResponse.isRight()) {
128                 log.debug(FAILED_TO_UPDATE_OR_CREATE_NODE_FILTER);
129                 response = buildErrorResponse(actionResponse.right().value());
130                 return response;
131             }
132
133             CINodeFilterDataDefinition value = actionResponse.left().value();
134             UINodeFilter nodeFilter = new NodeFilterConverter().convertToUi(value);
135             return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), nodeFilter);
136
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));
141             return response;
142
143         }
144     }
145
146     @PUT
147     @Consumes(MediaType.APPLICATION_JSON)
148     @Produces(MediaType.APPLICATION_JSON)
149     @Path("/")
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);
162
163         User modifier = new User();
164         modifier.setUserId(userId);
165         log.debug(MODIFIER_ID_IS, userId);
166
167         Response response;
168
169         try {
170             String serviceIdLower = serviceId.toLowerCase();
171             ServiceBusinessLogic businessLogic = getServiceBL(context);
172
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());
177                 return response;
178             }
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());
183                 return response;
184             }
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());
191                 return response;
192             }
193             Either<CINodeFilterDataDefinition, ResponseFormat> actionResponse;
194             List<String> constraints = new ConstraintConvertor().convertToList(uiConstraints);
195             actionResponse = businessLogic.updateServiceFilter(serviceIdLower, ciId, constraints, modifier, true);
196
197             if (actionResponse.isRight()) {
198                 log.debug(FAILED_TO_UPDATE_OR_CREATE_NODE_FILTER);
199                 response = buildErrorResponse(actionResponse.right().value());
200                 return response;
201             }
202
203             CINodeFilterDataDefinition value = actionResponse.left().value();
204             return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK),
205                     new NodeFilterConverter().convertToUi(value));
206
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));
211             return response;
212
213         }
214     }
215
216     @DELETE
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);
233
234         User modifier = new User();
235         modifier.setUserId(userId);
236         log.debug(MODIFIER_ID_IS, userId);
237
238         Response response;
239
240         try {
241             String serviceIdLower = serviceId.toLowerCase();
242             ServiceBusinessLogic businessLogic = getServiceBL(context);
243
244             Either<CINodeFilterDataDefinition, ResponseFormat> actionResponse;
245             actionResponse = businessLogic
246                                      .addOrDeleteServiceFilter(serviceIdLower, ciId, NodeFilterConstraintAction.DELETE,
247                                              null, null,  index, modifier, true);
248
249             if (actionResponse.isRight()) {
250
251                 log.debug(FAILED_TO_UPDATE_OR_CREATE_NODE_FILTER);
252                 response = buildErrorResponse(actionResponse.right().value());
253                 return response;
254             }
255
256             final CINodeFilterDataDefinition value = actionResponse.left().value();
257             return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK),
258                     new NodeFilterConverter().convertToUi(value));
259
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));
264             return response;
265
266         }
267     }
268
269     private Either<UIConstraint, ResponseFormat> parseToConstraint(String serviceJson, User user) {
270         return getComponentsUtils().convertJsonToObjectUsingObjectMapper(serviceJson, user, UIConstraint.class,
271                 AuditingActionEnum.CREATE_RESOURCE, ComponentTypeEnum.SERVICE);
272     }
273
274     private Either<List, ResponseFormat> parseToConstraints(String serviceJson, User user) {
275         return getComponentsUtils().convertJsonToObjectUsingObjectMapper(serviceJson, user, List.class,
276                 AuditingActionEnum.CREATE_RESOURCE, ComponentTypeEnum.SERVICE);
277     }
278 }