2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 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;
25 import javax.inject.Singleton;
26 import javax.servlet.ServletContext;
27 import javax.servlet.http.HttpServletRequest;
28 import javax.ws.rs.Consumes;
29 import javax.ws.rs.DELETE;
30 import javax.ws.rs.GET;
31 import javax.ws.rs.HeaderParam;
32 import javax.ws.rs.POST;
33 import javax.ws.rs.PUT;
34 import javax.ws.rs.Path;
35 import javax.ws.rs.PathParam;
36 import javax.ws.rs.Produces;
37 import javax.ws.rs.core.Context;
38 import javax.ws.rs.core.MediaType;
39 import javax.ws.rs.core.Response;
41 import org.openecomp.sdc.be.components.impl.ProductBusinessLogic;
42 import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic;
43 import org.openecomp.sdc.be.config.BeEcompErrorManager;
44 import org.openecomp.sdc.be.dao.api.ActionStatus;
45 import org.openecomp.sdc.be.model.Product;
46 import org.openecomp.sdc.be.model.User;
47 import org.openecomp.sdc.common.api.Constants;
48 import org.openecomp.sdc.common.config.EcompErrorName;
49 import org.openecomp.sdc.exception.ResponseFormat;
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
53 import com.jcabi.aspects.Loggable;
54 import com.wordnik.swagger.annotations.Api;
55 import com.wordnik.swagger.annotations.ApiOperation;
56 import com.wordnik.swagger.annotations.ApiParam;
57 import com.wordnik.swagger.annotations.ApiResponse;
58 import com.wordnik.swagger.annotations.ApiResponses;
60 import fj.data.Either;
62 @Loggable(prepend = true, value = Loggable.DEBUG, trim = false)
64 @Api(value = "Product Catalog", description = "Product Servlet")
66 public class ProductServlet extends BeGenericServlet {
67 private static Logger log = LoggerFactory.getLogger(ProductServlet.class.getName());
71 @Consumes(MediaType.APPLICATION_JSON)
72 @Produces(MediaType.APPLICATION_JSON)
73 @ApiOperation(value = "Create product", httpMethod = "POST", notes = "Returns created product", response = Product.class)
74 @ApiResponses(value = { @ApiResponse(code = 201, message = "Product created"), @ApiResponse(code = 403, message = "Restricted operation / Empty USER_ID header"), @ApiResponse(code = 400, message = "Invalid/missing content"),
75 @ApiResponse(code = 409, message = "Product already exists / User not found / Wrong user role") })
76 public Response createProduct(@ApiParam(value = "Product object to be created", required = true) String data, @Context final HttpServletRequest request,
77 @HeaderParam(value = Constants.USER_ID_HEADER) @ApiParam(value = "USER_ID of product strategist user", required = true) String userId) {
79 ServletContext context = request.getSession().getServletContext();
80 String url = request.getMethod() + " " + request.getRequestURI();
81 log.debug("Start handle request of {}", url);
83 User modifier = new User();
84 modifier.setUserId(userId);
85 log.debug("modifier id is {}", userId);
87 Response response = null;
89 ProductBusinessLogic businessLogic = getProductBL(context);
90 Product product = RepresentationUtils.fromRepresentation(data, Product.class);
91 Either<Product, ResponseFormat> actionResponse = businessLogic.createProduct(product, modifier);
93 if (actionResponse.isRight()) {
94 log.debug("Failed to create product");
95 response = buildErrorResponse(actionResponse.right().value());
99 Object result = RepresentationUtils.toRepresentation(actionResponse.left().value());
100 response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.CREATED), result);
103 } catch (Throwable e) {
104 BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Create Product");
105 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Create Product");
106 log.debug("create product failed with error ", e);
107 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
113 @Path("/products/{productId}")
114 @Consumes(MediaType.APPLICATION_JSON)
115 @Produces(MediaType.APPLICATION_JSON)
116 @ApiOperation(value = "Retrieve product", httpMethod = "GET", notes = "Returns product according to productId", response = Product.class)
117 @ApiResponses(value = { @ApiResponse(code = 200, message = "Product found"), @ApiResponse(code = 403, message = "Missing information"), @ApiResponse(code = 409, message = "Restricted operation"),
118 @ApiResponse(code = 500, message = "Internal Server Error"), @ApiResponse(code = 404, message = "Product not found"), })
119 public Response getProductById(@PathParam("productId") final String productId, @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
121 ServletContext context = request.getSession().getServletContext();
122 String url = request.getMethod() + " " + request.getRequestURI();
123 log.debug("Start handle request of {}", url);
125 User modifier = new User();
126 modifier.setUserId(userId);
127 log.debug("modifier id is {}", userId);
129 Response response = null;
132 ProductBusinessLogic businessLogic = getProductBL(context);
133 log.trace("get product with id {}", productId);
134 Either<Product, ResponseFormat> actionResponse = businessLogic.getProduct(productId, modifier);
136 if (actionResponse.isRight()) {
137 log.debug("Failed to get product");
138 response = buildErrorResponse(actionResponse.right().value());
142 Object product = RepresentationUtils.toRepresentation(actionResponse.left().value());
143 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), product);
145 } catch (Throwable e) {
146 BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Get Product");
147 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get Product");
148 log.debug("get product failed with error ", e);
149 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
155 @Path("/products/productName/{productName}/productVersion/{productVersion}")
156 @Consumes(MediaType.APPLICATION_JSON)
157 @Produces(MediaType.APPLICATION_JSON)
158 @ApiOperation(value = "Retrieve Service", httpMethod = "GET", notes = "Returns product according to name and version", response = Product.class)
159 @ApiResponses(value = { @ApiResponse(code = 200, message = "Product found"), @ApiResponse(code = 403, message = "Restricted operation"), @ApiResponse(code = 404, message = "Product not found") })
160 public Response getServiceByNameAndVersion(@PathParam("productName") final String productName, @PathParam("productVersion") final String productVersion, @Context final HttpServletRequest request,
161 @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
163 ServletContext context = request.getSession().getServletContext();
165 User modifier = new User();
166 modifier.setUserId(userId);
167 log.debug("modifier id is {}", userId);
169 Response response = null;
171 ProductBusinessLogic businessLogic = getProductBL(context);
172 Either<Product, ResponseFormat> actionResponse = businessLogic.getProductByNameAndVersion(productName, productVersion, userId);
174 if (actionResponse.isRight()) {
175 response = buildErrorResponse(actionResponse.right().value());
179 Product product = actionResponse.left().value();
180 Object result = RepresentationUtils.toRepresentation(product);
182 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), result);
184 } catch (Exception e) {
185 BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Get product by name and version");
186 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get product by name and version");
187 log.debug("get product failed with exception", e);
188 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
194 @Path("/products/{productId}")
195 public Response deleteProduct(@PathParam("productId") final String productId, @Context final HttpServletRequest request) {
197 ServletContext context = request.getSession().getServletContext();
199 String url = request.getMethod() + " " + request.getRequestURI();
200 log.debug("Start handle request of {}", url);
203 String userId = request.getHeader(Constants.USER_ID_HEADER);
204 User modifier = new User();
205 modifier.setUserId(userId);
206 log.debug("modifier id is {}", userId);
208 Response response = null;
211 ProductBusinessLogic businessLogic = getProductBL(context);
212 log.trace("delete product with id {}", productId);
213 Either<Product, ResponseFormat> actionResponse = businessLogic.deleteProduct(productId, modifier);
215 if (actionResponse.isRight()) {
216 log.debug("Failed to delete product");
217 response = buildErrorResponse(actionResponse.right().value());
221 Object product = RepresentationUtils.toRepresentation(actionResponse.left().value());
222 response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), product);
225 } catch (Throwable e) {
226 BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Delete Resource");
227 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Delete Resource");
228 log.debug("delete resource failed with error ", e);
229 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
236 @Path("/products/{productId}/metadata")
237 @Consumes(MediaType.APPLICATION_JSON)
238 @Produces(MediaType.APPLICATION_JSON)
239 @ApiOperation(value = "Update Product Metadata", httpMethod = "PUT", notes = "Returns updated product", response = Product.class)
240 @ApiResponses(value = { @ApiResponse(code = 200, message = "Product Updated"), @ApiResponse(code = 403, message = "Restricted operation"), @ApiResponse(code = 400, message = "Invalid content / Missing content") })
241 public Response updateProductMetadata(@PathParam("productId") final String productId, @ApiParam(value = "Product object to be Updated", required = true) String data, @Context final HttpServletRequest request,
242 @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
244 ServletContext context = request.getSession().getServletContext();
245 String url = request.getMethod() + " " + request.getRequestURI();
246 log.debug("Start handle request of {}", url);
248 User modifier = new User();
249 modifier.setUserId(userId);
250 log.debug("modifier id is {}", userId);
251 Response response = null;
254 String productIdLower = productId.toLowerCase();
255 ProductBusinessLogic businessLogic = getProductBL(context);
256 Product updatedProduct = RepresentationUtils.fromRepresentation(data, Product.class);
257 Either<Product, ResponseFormat> actionResponse = businessLogic.updateProductMetadata(productIdLower, updatedProduct, modifier);
259 if (actionResponse.isRight()) {
260 log.debug("failed to update product");
261 response = buildErrorResponse(actionResponse.right().value());
265 Product product = actionResponse.left().value();
266 Object result = RepresentationUtils.toRepresentation(product);
267 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), result);
269 } catch (Exception e) {
270 BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Update Product Metadata");
271 log.debug("update product metadata failed with exception", e);
272 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
278 @Path("/products/validate-name/{productName}")
279 @Consumes(MediaType.APPLICATION_JSON)
280 @Produces(MediaType.APPLICATION_JSON)
281 @ApiOperation(value = "validate product name", httpMethod = "GET", notes = "checks if the chosen product name is available ", response = Response.class)
282 @ApiResponses(value = { @ApiResponse(code = 200, message = "Service found"), @ApiResponse(code = 403, message = "Restricted operation") })
283 public Response validateServiceName(@PathParam("productName") final String productName, @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
284 ServletContext context = request.getSession().getServletContext();
285 String url = request.getMethod() + " " + request.getRequestURI();
286 log.debug("Start handle request of {}", url);
288 User modifier = new User();
289 modifier.setUserId(userId);
290 log.debug("modifier id is {}", userId);
291 Response response = null;
293 ProductBusinessLogic businessLogic = getProductBL(context);
295 Either<Map<String, Boolean>, ResponseFormat> actionResponse = businessLogic.validateProductNameExists(productName, userId);
297 if (actionResponse.isRight()) {
298 log.debug("failed to get validate service name");
299 response = buildErrorResponse(actionResponse.right().value());
302 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), actionResponse.left().value());
303 } catch (Exception e) {
304 BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Validate Service Name");
305 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Validate Product Name");
306 log.debug("validate product name failed with exception", e);
307 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));