da64dc58fb893c4a707e750a710be99fa8ff83f8
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / servlets / ElementServlet.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
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 java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.List;
26 import java.util.Map;
27
28 import javax.inject.Singleton;
29 import javax.servlet.ServletContext;
30 import javax.servlet.http.HttpServletRequest;
31 import javax.ws.rs.Consumes;
32 import javax.ws.rs.DELETE;
33 import javax.ws.rs.GET;
34 import javax.ws.rs.HeaderParam;
35 import javax.ws.rs.POST;
36 import javax.ws.rs.Path;
37 import javax.ws.rs.PathParam;
38 import javax.ws.rs.Produces;
39 import javax.ws.rs.core.Context;
40 import javax.ws.rs.core.MediaType;
41 import javax.ws.rs.core.Response;
42
43 import org.openecomp.sdc.be.components.clean.ComponentsCleanBusinessLogic;
44 import org.openecomp.sdc.be.components.impl.ElementBusinessLogic;
45 import org.openecomp.sdc.be.config.BeEcompErrorManager;
46 import org.openecomp.sdc.be.config.ConfigurationManager;
47 import org.openecomp.sdc.be.dao.api.ActionStatus;
48 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
49 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
50 import org.openecomp.sdc.be.info.ArtifactTypesInfo;
51 import org.openecomp.sdc.be.model.ArtifactType;
52 import org.openecomp.sdc.be.model.Category;
53 import org.openecomp.sdc.be.model.Component;
54 import org.openecomp.sdc.be.model.PropertyScope;
55 import org.openecomp.sdc.be.model.Tag;
56 import org.openecomp.sdc.be.model.User;
57 import org.openecomp.sdc.be.model.category.CategoryDefinition;
58 import org.openecomp.sdc.be.model.category.GroupingDefinition;
59 import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
60 import org.openecomp.sdc.be.ui.model.UiCategories;
61 import org.openecomp.sdc.be.user.UserBusinessLogic;
62 import org.openecomp.sdc.common.api.Constants;
63 import org.openecomp.sdc.common.config.EcompErrorName;
64 import org.openecomp.sdc.exception.ResponseFormat;
65 import org.slf4j.Logger;
66 import org.slf4j.LoggerFactory;
67
68 import com.jcabi.aspects.Loggable;
69 import io.swagger.annotations.Api;
70 import io.swagger.annotations.ApiOperation;
71 import io.swagger.annotations.ApiParam;
72 import io.swagger.annotations.ApiResponse;
73 import io.swagger.annotations.ApiResponses;
74
75 import fj.data.Either;
76
77 @Path("/v1/")
78
79 /****
80  * 
81  * UI oriented servlet - to return elements in specific format UI needs
82  * 
83  *
84  */
85 @Loggable(prepend = true, value = Loggable.DEBUG, trim = false)
86 @Api(value = "Element Servlet", description = "Element Servlet")
87 @Singleton
88 public class ElementServlet extends BeGenericServlet {
89
90         private static Logger log = LoggerFactory.getLogger(ElementServlet.class.getName());
91
92         /*
93          ******************************************************************************
94          * NEW CATEGORIES category / \ subcategory subcategory / grouping
95          ******************************************************************************/
96
97         /*
98          *
99          * 
100          * CATEGORIES
101          */
102         /////////////////////////////////////////////////////////////////////////////////////////////////////
103         // retrieve all component categories
104         @GET
105         @Path("/categories/{componentType}")
106         @Consumes(MediaType.APPLICATION_JSON)
107         @Produces(MediaType.APPLICATION_JSON)
108         @ApiOperation(value = "Retrieve the list of all resource/service/product categories/sub-categories/groupings", httpMethod = "GET", notes = "Retrieve the list of all resource/service/product categories/sub-categories/groupings.", response = Response.class)
109         @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns categories Ok"), @ApiResponse(code = 403, message = "Missing information"), @ApiResponse(code = 400, message = "Invalid component type"),
110                         @ApiResponse(code = 409, message = "Restricted operation"), @ApiResponse(code = 500, message = "Internal Server Error") })
111         public Response getComponentCategories(@ApiParam(value = "allowed values are resources / services/ products", allowableValues = ComponentTypeEnum.RESOURCE_PARAM_NAME + "," + ComponentTypeEnum.SERVICE_PARAM_NAME + ","
112                         + ComponentTypeEnum.PRODUCT_PARAM_NAME, required = true) @PathParam(value = "componentType") final String componentType, @HeaderParam(value = Constants.USER_ID_HEADER) String userId, @Context final HttpServletRequest request) {
113
114                 try {
115                         ElementBusinessLogic elementBL = getElementBL(request.getSession().getServletContext());
116                         Either<List<CategoryDefinition>, ResponseFormat> either = elementBL.getAllCategories(componentType, userId);
117                         if (either.isRight()) {
118                                 log.debug("No categories were found for type {}", componentType);
119                                 return buildErrorResponse(either.right().value());
120                         } else {
121                                 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), either.left().value());
122                         }
123                 } catch (Exception e) {
124                         BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Get Component Categories");
125                         BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get Component Categories");
126                         log.debug("getComponentCategories failed with exception", e);
127                         return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
128                 }
129         }
130         
131         @GET
132         @Path("/categories")
133         @Consumes(MediaType.APPLICATION_JSON)
134         @Produces(MediaType.APPLICATION_JSON)
135         @ApiOperation(value = "Retrieve the all resource, service and product categories", httpMethod = "GET", notes = "Retrieve the all resource, service and product categories", response = Response.class)
136         @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns categories Ok"), @ApiResponse(code = 403, message = "Missing information"),
137                         @ApiResponse(code = 409, message = "Restricted operation"), @ApiResponse(code = 500, message = "Internal Server Error") })
138         public Response getAllCategories(@Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
139
140                 try {
141                         ElementBusinessLogic elementBL = getElementBL(request.getSession().getServletContext());
142                         Either<UiCategories, ResponseFormat> either = elementBL.getAllCategories(userId);
143                         if (either.isRight()) {
144                                 log.debug("No categories were found");
145                                 return buildErrorResponse(either.right().value());
146                         } else {
147                                 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), either.left().value());
148                         }
149                 } catch (Exception e) {
150                         BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Get All Categories");
151                         BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get All Categories");
152                         log.debug("getAllCategories failed with exception", e);
153                         return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
154                 }
155         }
156
157
158         @POST
159         @Path("/category/{componentType}")
160         @Consumes(MediaType.APPLICATION_JSON)
161         @Produces(MediaType.APPLICATION_JSON)
162         @ApiOperation(value = "Create new component category", httpMethod = "POST", notes = "Create new component category")
163         @ApiResponses(value = { @ApiResponse(code = 201, message = "Category created"), @ApiResponse(code = 400, message = "Invalid category data"), @ApiResponse(code = 403, message = "USER_ID header is missing"),
164                         @ApiResponse(code = 409, message = "Category already exists / User not permitted to perform the action"), @ApiResponse(code = 500, message = "General Error") })
165         public Response createComponentCategory(
166                         @ApiParam(value = "allowed values are resources /services / products", allowableValues = ComponentTypeEnum.RESOURCE_PARAM_NAME + "," + ComponentTypeEnum.SERVICE_PARAM_NAME + ","
167                                         + ComponentTypeEnum.PRODUCT_PARAM_NAME, required = true) @PathParam(value = "componentType") final String componentType,
168                         @ApiParam(value = "Category to be created", required = true) String data, @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
169                 try {
170                         ElementBusinessLogic elementBL = getElementBL(request.getSession().getServletContext());
171                         CategoryDefinition category = RepresentationUtils.fromRepresentation(data, CategoryDefinition.class);
172
173                         Either<CategoryDefinition, ResponseFormat> createResourceCategory = elementBL.createCategory(category, componentType, userId);
174                         if (createResourceCategory.isRight()) {
175                                 return buildErrorResponse(createResourceCategory.right().value());
176                         }
177
178                         ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.CREATED);
179                         return buildOkResponse(responseFormat, createResourceCategory.left().value());
180
181                 } catch (Exception e) {
182                         BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Create resource category");
183                         BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Create resource category");
184                         log.debug("createResourceCategory failed with exception", e);
185                         return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
186
187                 }
188         }
189
190         @DELETE
191         @Path("/category/{componentType}/{categoryUniqueId}")
192         @Consumes(MediaType.APPLICATION_JSON)
193         @Produces(MediaType.APPLICATION_JSON)
194         @ApiOperation(value = "Delete component category", httpMethod = "DELETE", notes = "Delete component category", response = Category.class)
195         @ApiResponses(value = { @ApiResponse(code = 204, message = "Category deleted"), @ApiResponse(code = 403, message = "USER_ID header is missing"), @ApiResponse(code = 409, message = "User not permitted to perform the action"),
196                         @ApiResponse(code = 404, message = "Category not found"), @ApiResponse(code = 500, message = "General Error") })
197         public Response deleteComponentCategory(@PathParam(value = "categoryUniqueId") final String categoryUniqueId, @PathParam(value = "componentType") final String componentType, @Context final HttpServletRequest request,
198                         @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
199
200                 try {
201                         ElementBusinessLogic elementBL = getElementBL(request.getSession().getServletContext());
202                         Either<CategoryDefinition, ResponseFormat> createResourceCategory = elementBL.deleteCategory(categoryUniqueId, componentType, userId);
203
204                         if (createResourceCategory.isRight()) {
205                                 return buildErrorResponse(createResourceCategory.right().value());
206                         }
207                         ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.NO_CONTENT);
208                         return buildOkResponse(responseFormat, null);
209
210                 } catch (Exception e) {
211                         BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Create resource category");
212                         BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Create resource category");
213                         log.debug("createResourceCategory failed with exception", e);
214                         return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
215
216                 }
217         }
218
219         /*
220          * 
221          * 
222          * SUBCATEGORIES
223          * 
224          */
225
226         @POST
227         @Path("/category/{componentType}/{categoryId}/subCategory")
228         @Consumes(MediaType.APPLICATION_JSON)
229         @Produces(MediaType.APPLICATION_JSON)
230         @ApiOperation(value = "Create new component sub-category", httpMethod = "POST", notes = "Create new component sub-category for existing category")
231         @ApiResponses(value = { @ApiResponse(code = 201, message = "Subcategory created"), @ApiResponse(code = 400, message = "Invalid subcategory data"), @ApiResponse(code = 403, message = "USER_ID header is missing"),
232                         @ApiResponse(code = 404, message = "Parent category wasn't found"), @ApiResponse(code = 409, message = "Subcategory already exists / User not permitted to perform the action"), @ApiResponse(code = 500, message = "General Error") })
233         public Response createComponentSubCategory(
234                         @ApiParam(value = "allowed values are resources / products", allowableValues = ComponentTypeEnum.RESOURCE_PARAM_NAME + ","
235                                         + ComponentTypeEnum.PRODUCT_PARAM_NAME, required = true) @PathParam(value = "componentType") final String componentType,
236                         @ApiParam(value = "Parent category unique ID", required = true) @PathParam(value = "categoryId") final String categoryId, @ApiParam(value = "Subcategory to be created. \ne.g. {\"name\":\"Resource-subcat\"}", required = true) String data,
237                         @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
238
239                 try {
240                         ElementBusinessLogic elementBL = getElementBL(request.getSession().getServletContext());
241                         SubCategoryDefinition subCategory = RepresentationUtils.fromRepresentation(data, SubCategoryDefinition.class);
242
243                         Either<SubCategoryDefinition, ResponseFormat> createSubcategory = elementBL.createSubCategory(subCategory, componentType, categoryId, userId);
244                         if (createSubcategory.isRight()) {
245                                 return buildErrorResponse(createSubcategory.right().value());
246                         }
247                         ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.CREATED);
248                         return buildOkResponse(responseFormat, createSubcategory.left().value());
249
250                 } catch (Exception e) {
251                         BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Create sub-category");
252                         BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Create sub-category");
253                         log.debug("createComponentSubCategory failed with exception", e);
254                         return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
255
256                 }
257         }
258
259         @DELETE
260         @Path("/category/{componentType}/{categoryUniqueId}/subCategory/{subCategoryUniqueId}")
261         @Consumes(MediaType.APPLICATION_JSON)
262         @Produces(MediaType.APPLICATION_JSON)
263         @ApiOperation(value = "Delete component category", httpMethod = "DELETE", notes = "Delete component category", response = Category.class)
264         @ApiResponses(value = { @ApiResponse(code = 204, message = "Category deleted"), @ApiResponse(code = 403, message = "USER_ID header is missing"), @ApiResponse(code = 409, message = "User not permitted to perform the action"),
265                         @ApiResponse(code = 404, message = "Category not found"), @ApiResponse(code = 500, message = "General Error") })
266         public Response deleteComponentSubCategory(@PathParam(value = "categoryUniqueId") final String categoryUniqueId, @PathParam(value = "subCategoryUniqueId") final String subCategoryUniqueId,
267                         @PathParam(value = "componentType") final String componentType, @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
268
269                 try {
270                         ElementBusinessLogic elementBL = getElementBL(request.getSession().getServletContext());
271                         Either<SubCategoryDefinition, ResponseFormat> deleteSubResourceCategory = elementBL.deleteSubCategory(categoryUniqueId, subCategoryUniqueId, componentType, userId);
272                         if (deleteSubResourceCategory.isRight()) {
273                                 return buildErrorResponse(deleteSubResourceCategory.right().value());
274                         }
275                         ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.NO_CONTENT);
276                         return buildOkResponse(responseFormat, null);
277
278                 } catch (Exception e) {
279                         BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Delete component category");
280                         BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Delete component category");
281                         log.debug("deleteComponentSubCategory failed with exception", e);
282                         return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
283
284                 }
285         }
286
287         /*
288          * GROUPINGS
289          */
290         @POST
291         @Path("/category/{componentType}/{categoryId}/subCategory/{subCategoryId}/grouping")
292         @Consumes(MediaType.APPLICATION_JSON)
293         @Produces(MediaType.APPLICATION_JSON)
294         @ApiOperation(value = "Create new component grouping", httpMethod = "POST", notes = "Create new component grouping for existing sub-category")
295         @ApiResponses(value = { @ApiResponse(code = 201, message = "Grouping created"), @ApiResponse(code = 400, message = "Invalid grouping data"), @ApiResponse(code = 403, message = "USER_ID header is missing"),
296                         @ApiResponse(code = 404, message = "Parent category or subcategory were not found"), @ApiResponse(code = 409, message = "Grouping already exists / User not permitted to perform the action"),
297                         @ApiResponse(code = 500, message = "General Error") })
298         public Response createComponentGrouping(@ApiParam(value = "allowed values are products", allowableValues = ComponentTypeEnum.PRODUCT_PARAM_NAME, required = true) @PathParam(value = "componentType") final String componentType,
299                         @ApiParam(value = "Parent category unique ID", required = true) @PathParam(value = "categoryId") final String grandParentCategoryId,
300                         @ApiParam(value = "Parent sub-category unique ID", required = true) @PathParam(value = "subCategoryId") final String parentSubCategoryId, @ApiParam(value = "Subcategory to be created", required = true) String data,
301                         @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
302                 try {
303                         ElementBusinessLogic elementBL = getElementBL(request.getSession().getServletContext());
304                         GroupingDefinition grouping = RepresentationUtils.fromRepresentation(data, GroupingDefinition.class);
305
306                         Either<GroupingDefinition, ResponseFormat> createGrouping = elementBL.createGrouping(grouping, componentType, grandParentCategoryId, parentSubCategoryId, userId);
307                         if (createGrouping.isRight()) {
308                                 return buildErrorResponse(createGrouping.right().value());
309                         }
310                         ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.CREATED);
311                         return buildOkResponse(responseFormat, createGrouping.left().value());
312
313                 } catch (Exception e) {
314                         BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Create grouping");
315                         BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Create grouping");
316                         log.debug("createComponentGrouping failed with exception", e);
317                         return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
318
319                 }
320         }
321
322         @DELETE
323         @Path("/category/{componentType}/{categoryUniqueId}/subCategory/{subCategoryUniqueId}/grouping/{groupingUniqueId}")
324         @Consumes(MediaType.APPLICATION_JSON)
325         @Produces(MediaType.APPLICATION_JSON)
326         @ApiOperation(value = "Delete component category", httpMethod = "DELETE", notes = "Delete component category", response = Category.class)
327         @ApiResponses(value = { @ApiResponse(code = 204, message = "Category deleted"), @ApiResponse(code = 403, message = "USER_ID header is missing"), @ApiResponse(code = 409, message = "User not permitted to perform the action"),
328                         @ApiResponse(code = 404, message = "Category not found"), @ApiResponse(code = 500, message = "General Error") })
329         public Response deleteComponentGrouping(@PathParam(value = "categoryUniqueId") final String grandParentCategoryUniqueId, @PathParam(value = "subCategoryUniqueId") final String parentSubCategoryUniqueId,
330                         @PathParam(value = "groupingUniqueId") final String groupingUniqueId, @PathParam(value = "componentType") final String componentType, @Context final HttpServletRequest request,
331                         @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
332
333                 try {
334                         ElementBusinessLogic elementBL = getElementBL(request.getSession().getServletContext());
335                         Either<GroupingDefinition, ResponseFormat> deleteGrouping = elementBL.deleteGrouping(grandParentCategoryUniqueId, parentSubCategoryUniqueId, groupingUniqueId, componentType, userId);
336                         if (deleteGrouping.isRight()) {
337                                 return buildErrorResponse(deleteGrouping.right().value());
338                         }
339                         ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.NO_CONTENT);
340                         return buildOkResponse(responseFormat, null);
341
342                 } catch (Exception e) {
343                         BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Delete component grouping");
344                         BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Delete component grouping");
345                         log.debug("deleteGrouping failed with exception", e);
346                         return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
347
348                 }
349         }
350
351         /////////////////////////////////////////////////////////////////////////////////////////////////////
352         // retrieve all tags
353         @GET
354         @Path("/tags")
355         @Consumes(MediaType.APPLICATION_JSON)
356         @Produces(MediaType.APPLICATION_JSON)
357         @ApiOperation(value = "Retrieve all tags", httpMethod = "GET", notes = "Retrieve all tags", response = User.class)
358         @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns tags Ok"), @ApiResponse(code = 404, message = "No tags were found"), @ApiResponse(code = 500, message = "Internal Server Error") })
359         public Response getTags(@Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
360                 String url = request.getMethod() + " " + request.getRequestURI();
361                 log.debug("(getTags) Start handle request of {}", url);
362
363                 try {
364                         ElementBusinessLogic elementBL = getElementBL(request.getSession().getServletContext());
365                         Either<List<Tag>, ActionStatus> either = elementBL.getAllTags(userId);
366                         if (either.isRight() || either.left().value() == null) {
367                                 log.debug("No tags were found");
368                                 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.NO_CONTENT));
369                         } else {
370                                 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), either.left().value());
371                         }
372                 } catch (Exception e) {
373                         BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Get All Tags");
374                         BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get All Tags");
375                         log.debug("getAllTags failed with exception", e);
376                         return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
377                 }
378         }
379
380         /////////////////////////////////////////////////////////////////////////////////////////////////////
381         // retrieve all property scopes
382         @GET
383         @Path("/propertyScopes")
384         @Consumes(MediaType.APPLICATION_JSON)
385         @Produces(MediaType.APPLICATION_JSON)
386         @ApiOperation(value = "Retrieve all propertyScopes", httpMethod = "GET", notes = "Retrieve all propertyScopes", response = User.class)
387         @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns propertyScopes Ok"), @ApiResponse(code = 404, message = "No propertyScopes were found"), @ApiResponse(code = 500, message = "Internal Server Error") })
388         public Response getPropertyScopes(@Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
389                 String url = request.getMethod() + " " + request.getRequestURI();
390                 log.debug("(getPropertyScopes) Start handle request of {}", url);
391
392                 try {
393                         ElementBusinessLogic elementBL = getElementBL(request.getSession().getServletContext());
394                         Either<List<PropertyScope>, ActionStatus> either = elementBL.getAllPropertyScopes(userId);
395                         if (either.isRight() || either.left().value() == null) {
396                                 log.debug("No property scopes were found");
397                                 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.NO_CONTENT));
398                         } else {
399                                 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), either.left().value());
400                         }
401                 } catch (Exception e) {
402                         BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Get Property Scopes Categories");
403                         BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get Property Scopes Categories");
404                         log.debug("getPropertyScopes failed with exception", e);
405                         return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
406                 }
407         }
408
409         /////////////////////////////////////////////////////////////////////////////////////////////////////
410         // retrieve all artifact types
411         @GET
412         @Path("/artifactTypes")
413         @Consumes(MediaType.APPLICATION_JSON)
414         @Produces(MediaType.APPLICATION_JSON)
415         @ApiOperation(value = "Retrieve all artifactTypes", httpMethod = "GET", notes = "Retrieve all artifactTypes", response = User.class)
416         @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns artifactTypes Ok"), @ApiResponse(code = 404, message = "No artifactTypes were found"), @ApiResponse(code = 500, message = "Internal Server Error") })
417         public Response getArtifactTypes(@Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
418                 String url = request.getMethod() + " " + request.getRequestURI();
419                 log.debug("(GET - getArtifactTypes) Start handle request of {}", url);
420
421                 try {
422                         ElementBusinessLogic elementBL = getElementBL(request.getSession().getServletContext());
423                         Either<List<ArtifactType>, ActionStatus> either = elementBL.getAllArtifactTypes(userId);
424                         if (either.isRight() || either.left().value() == null) {
425                                 log.debug("No artifact types were found");
426                                 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.NO_CONTENT));
427                         } else {
428
429                                 Integer defaultHeatTimeout = ConfigurationManager.getConfigurationManager().getConfiguration().getDefaultHeatArtifactTimeoutMinutes();
430                                 ArtifactTypesInfo typesResponse = new ArtifactTypesInfo();
431                                 typesResponse.setArtifactTypes(either.left().value());
432                                 typesResponse.setHeatDefaultTimeout(defaultHeatTimeout);
433
434                                 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), typesResponse);
435                         }
436                 } catch (Exception e) {
437                         BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Get Artifact Types");
438                         BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get Artifact Types");
439                         log.debug("getArtifactTypes failed with exception", e);
440                         return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
441                 }
442         }
443
444         /////////////////////////////////////////////////////////////////////////////////////////////////////
445         // retrieve all artifact types
446         @GET
447         @Path("/configuration/ui")
448         @Consumes(MediaType.APPLICATION_JSON)
449         @Produces(MediaType.APPLICATION_JSON)
450         @ApiOperation(value = "Retrieve all artifactTypes", httpMethod = "GET", notes = "Retrieve all artifactTypes", response = User.class)
451         @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns artifactTypes Ok"), @ApiResponse(code = 404, message = "No artifactTypes were found"), @ApiResponse(code = 500, message = "Internal Server Error") })
452         public Response getConfiguration(@Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
453                 String url = request.getMethod() + " " + request.getRequestURI();
454                 log.debug("(getConfiguration) Start handle request of {}", url);
455
456                 try {
457                         ElementBusinessLogic elementBL = getElementBL(request.getSession().getServletContext());
458                         Either<List<ArtifactType>, ActionStatus> otherEither = elementBL.getAllArtifactTypes(userId);
459                         Either<Integer, ActionStatus> defaultHeatTimeout = elementBL.getDefaultHeatTimeout();
460                         Either<Map<String, Object>, ActionStatus> deploymentEither = elementBL.getAllDeploymentArtifactTypes();
461                         Either<Map<String, String>, ActionStatus> resourceTypesMap = elementBL.getResourceTypesMap();
462
463                         if (otherEither.isRight() || otherEither.left().value() == null) {
464                                 log.debug("No other artifact types were found");
465                                 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.NO_CONTENT));
466                         } else if (deploymentEither.isRight() || deploymentEither.left().value() == null) {
467                                 log.debug("No deployment artifact types were found");
468                                 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.NO_CONTENT));
469                         } else if (defaultHeatTimeout.isRight() || defaultHeatTimeout.left().value() == null) {
470                                 log.debug("heat default timeout was not found");
471                                 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.NO_CONTENT));
472                         } else if (resourceTypesMap.isRight() || resourceTypesMap.left().value() == null) {
473                                 log.debug("No resource types were found");
474                                 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.NO_CONTENT));
475                         } else {
476                                 Map<String, Object> artifacts = new HashMap<String, Object>();
477                                 Map<String, Object> configuration = new HashMap<String, Object>();
478
479                                 artifacts.put("other", otherEither.left().value());
480                                 artifacts.put("deployment", deploymentEither.left().value());
481                                 configuration.put("artifacts", artifacts);
482                                 configuration.put("defaultHeatTimeout", defaultHeatTimeout.left().value());
483                                 configuration.put("componentTypes", elementBL.getAllComponentTypesParamNames());
484                                 configuration.put("roles", elementBL.getAllSupportedRoles());
485                                 configuration.put("resourceTypes", resourceTypesMap.left().value());
486                                 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), configuration);
487                         }
488
489                 } catch (Exception e) {
490                         BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Get Artifact Types");
491                         BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get Artifact Types");
492                         log.debug("getArtifactTypes failed with exception", e);
493                         return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
494                 }
495         }
496
497         /////////////////////////////////////////////////////////////////////////////////////////////////////
498         // retrieve all followed resources and services
499         @GET
500         @Path("/followed")
501         @Consumes(MediaType.APPLICATION_JSON)
502         @Produces(MediaType.APPLICATION_JSON)
503         @ApiOperation(value = "Retrieve all followed", httpMethod = "GET", notes = "Retrieve all followed", response = User.class)
504         @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns followed Ok"), @ApiResponse(code = 404, message = "No followed were found"), @ApiResponse(code = 404, message = "User not found"),
505                         @ApiResponse(code = 500, message = "Internal Server Error") })
506         public Response getFollowedResourcesServices(@Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
507
508                 Response res = null;
509                 User userData = null;
510                 try {
511                         String url = request.getMethod() + " " + request.getRequestURI();
512                         log.debug("Start handle request of {}", url);
513                         UserBusinessLogic userAdminManager = getUserAdminManager(request.getSession().getServletContext());
514
515                         // Getting the user
516                         Either<User, ActionStatus> either = userAdminManager.getUser(userId, false);
517                         if (either.isRight()) {
518                                 // Couldn't find or otherwise fetch the user
519                                 return buildErrorResponse(getComponentsUtils().getResponseFormatByUserId(either.right().value(), userId));
520                         }
521
522                         if (either.left().value() != null) {
523                                 userData = either.left().value();
524                                 Either<Map<String, List<? extends Component>>, ResponseFormat> followedResourcesServices = getElementBL(request.getSession().getServletContext()).getFollowed(userData);
525                                 // res =
526                                 // buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK),
527                                 // followedResourcesServices.left().value());
528                                 if (followedResourcesServices.isRight()) {
529                                         log.debug("failed to get followed resources services ");
530                                         return buildErrorResponse(followedResourcesServices.right().value());
531                                 }
532                                 Object data = RepresentationUtils.toRepresentation(followedResourcesServices.left().value());
533                                 res = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), data);
534                         } else {
535                                 res = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
536                         }
537                 } catch (Exception e) {
538                         BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Get Followed Resources / Services Categories");
539                         BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get Followed Resources / Services Categories");
540                         log.debug("Getting followed resources/services failed with exception", e);
541                         res = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
542                 }
543                 return res;
544         }
545
546         /////////////////////////////////////////////////////////////////////////////////////////////////////
547         // retrieve all certified resources and services and their last version
548         @GET
549         @Path("/screen")
550         @Consumes(MediaType.APPLICATION_JSON)
551         @Produces(MediaType.APPLICATION_JSON)
552         @ApiOperation(value = "Retrieve catalog resources and services", httpMethod = "GET", notes = "Retrieve catalog resources and services", response = User.class)
553         @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns resources and services Ok"), @ApiResponse(code = 404, message = "No resources and services were found"), @ApiResponse(code = 404, message = "User not found"),
554                         @ApiResponse(code = 500, message = "Internal Server Error") })
555         public Response getCatalogComponents(@Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
556
557                 Response res = null;
558                 try {
559                         String url = request.getMethod() + " " + request.getRequestURI();
560                         log.debug("Start handle request of {}", url);
561
562                         Either<Map<String, List<? extends Component>>, ResponseFormat> catalogData = getElementBL(request.getSession().getServletContext()).getCatalogComponents(userId);
563
564                         if (catalogData.isRight()) {
565                                 log.debug("failed to get catalog data");
566                                 return buildErrorResponse(catalogData.right().value());
567                         }
568                         Object data = RepresentationUtils.toRepresentation(catalogData.left().value());
569                         res = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), data);
570
571                 } catch (Exception e) {
572                         BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Get Catalog Components");
573                         BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get Catalog Components");
574                         log.debug("Getting catalog components failed with exception", e);
575                         res = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
576                 }
577                 return res;
578         }
579
580         @DELETE
581         @Path("/inactiveComponents/{componentType}")
582         public Response deleteMarkedResources(@PathParam("componentType") final String componentType, @Context final HttpServletRequest request) {
583
584                 ServletContext context = request.getSession().getServletContext();
585
586                 String url = request.getMethod() + " " + request.getRequestURI();
587                 log.debug("Start handle request of {}", url);
588
589                 // get modifier id
590                 String userId = request.getHeader(Constants.USER_ID_HEADER);
591                 User modifier = new User();
592                 modifier.setUserId(userId);
593                 log.debug("modifier id is {}", userId);
594
595                 Response response = null;
596
597                 NodeTypeEnum nodeType = NodeTypeEnum.getByNameIgnoreCase(componentType);
598                 if (nodeType == null) {
599                         log.info("componentType is not valid: {]", componentType);
600                         return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT));
601                 }
602
603                 List<NodeTypeEnum> componentsList = new ArrayList<NodeTypeEnum>();
604                 componentsList.add(nodeType);
605                 try {
606                         ComponentsCleanBusinessLogic businessLogic = getComponentCleanerBL(context);
607                         Map<NodeTypeEnum, Either<List<String>, ResponseFormat>> cleanComponentsResult = businessLogic.cleanComponents(componentsList);
608                         Either<List<String>, ResponseFormat> cleanResult = cleanComponentsResult.get(nodeType);
609
610                         if (cleanResult.isRight()) {
611                                 log.debug("failed to delete marked components of type {}", nodeType);
612                                 response = buildErrorResponse(cleanResult.right().value());
613                                 return response;
614                         }
615                         response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), cleanResult.left().value());
616                         return response;
617
618                 } catch (Exception e) {
619                         BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeRestApiGeneralError, "Delete Marked Components");
620                         BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Delete Marked Components");
621                         log.debug("delete marked components failed with exception", e);
622                         response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
623                         return response;
624
625                 }
626         }
627
628         @GET
629         @Path("/ecompPortalMenu")
630         @Consumes(MediaType.APPLICATION_JSON)
631         @Produces(MediaType.APPLICATION_JSON)
632         @ApiOperation(value = "Retrieve ecomp portal menu - MOC", httpMethod = "GET", notes = "Retrieve ecomp portal menu", response = User.class)
633         @ApiResponses(value = { @ApiResponse(code = 200, message = "Retrieve ecomp portal menu") })
634         public Response getListOfCsars(@Context final HttpServletRequest request) {
635                 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK),
636                                 "[{\"menuId\":1,\"column\":2,\"text\":\"Design\",\"parentMenuId\":null,\"url\":\"\",\"appid\":null,\"roles\":null,\"children\":[{\"menuId\":11,\"column\":1,\"text\":\"ProductDesign\",\"parentMenuId\":1,\"url\":\"\",\"appid\":null,\"roles\":null},{\"menuId\":12,\"column\":2,\"text\":\"Service\",\"parentMenuId\":1,\"url\":\"\",\"appid\":null,\"roles\":null,\"children\":[{\"menuId\":21,\"column\":1,\"text\":\"ViewPolicies\",\"parentMenuId\":12,\"url\":\"\",\"appid\":null,\"roles\":null,\"children\":[{\"menuId\":90,\"column\":1,\"text\":\"4thLevelApp1aR16\",\"parentMenuId\":21,\"url\":\"http://google.com\",\"appid\":null,\"roles\":null}]},{\"menuId\":22,\"column\":2,\"text\":\"UpdatePolicies\",\"parentMenuId\":12,\"url\":\"\",\"appid\":null,\"roles\":null,\"children\":[{\"menuId\":91,\"column\":1,\"text\":\"4thLevelApp1bR16\",\"parentMenuId\":22,\"url\":\"http://jsonlint.com/\",\"appid\":null,\"roles\":null}]},{\"menuId\":23,\"column\":3,\"text\":\"UpdateRules\",\"parentMenuId\":12,\"url\":\"\",\"appid\":null,\"roles\":null},{\"menuId\":24,\"column\":4,\"text\":\"CreateSignatures?\",\"parentMenuId\":12,\"url\":\"\",\"appid\":null,\"roles\":null},{\"menuId\":25,\"column\":5,\"text\":\"Definedata\",\"parentMenuId\":12,\"url\":\"\",\"appid\":null,\"roles\":null}]}]}]");
637         }
638
639 }