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