2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.be.externalapi.servlet;
23 import java.io.ByteArrayInputStream;
24 import java.io.InputStream;
25 import java.util.EnumMap;
26 import java.util.HashMap;
29 import javax.inject.Singleton;
30 import javax.servlet.ServletContext;
31 import javax.servlet.http.HttpServletRequest;
32 import javax.ws.rs.DELETE;
33 import javax.ws.rs.GET;
34 import javax.ws.rs.POST;
35 import javax.ws.rs.Path;
36 import javax.ws.rs.PathParam;
37 import javax.ws.rs.Produces;
38 import javax.ws.rs.core.Context;
39 import javax.ws.rs.core.MediaType;
40 import javax.ws.rs.core.Response;
42 import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic;
43 import org.openecomp.sdc.be.config.BeEcompErrorManager;
44 import org.openecomp.sdc.be.dao.api.ActionStatus;
45 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
46 import org.openecomp.sdc.be.model.ArtifactDefinition;
47 import org.openecomp.sdc.be.servlets.BeGenericServlet;
48 import org.openecomp.sdc.be.servlets.RepresentationUtils;
49 import org.openecomp.sdc.common.api.Constants;
50 import org.openecomp.sdc.common.datastructure.AuditingFieldsKeysEnum;
51 import org.openecomp.sdc.common.datastructure.Wrapper;
52 import org.openecomp.sdc.common.util.GeneralUtility;
53 import org.openecomp.sdc.exception.ResponseFormat;
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
57 import com.jcabi.aspects.Loggable;
58 import com.wordnik.swagger.annotations.ApiOperation;
59 import com.wordnik.swagger.annotations.ApiParam;
60 import com.wordnik.swagger.annotations.ApiResponse;
61 import com.wordnik.swagger.annotations.ApiResponses;
63 import fj.data.Either;
66 * This Servlet serves external users operations on artifacts.
71 @Loggable(prepend = true, value = Loggable.DEBUG, trim = false)
74 public class ArtifactExternalServlet extends BeGenericServlet {
77 private HttpServletRequest request;
79 private static Logger log = LoggerFactory.getLogger(ArtifactExternalServlet.class.getName());
82 * Uploads an artifact to resource or service
89 @Path("/{assetType}/{uuid}/artifacts")
90 @Produces(MediaType.APPLICATION_JSON)
91 @ApiOperation(value = "uploads of artifact to a resource or service", httpMethod = "POST", notes = "uploads of artifact to a resource or service", response = Response.class)
92 @ApiResponses(value = { @ApiResponse(code = 200, message = "Artifact uploaded"), @ApiResponse(code = 401, message = "Authorization required"), @ApiResponse(code = 403, message = "Restricted operation"),
93 @ApiResponse(code = 404, message = "Asset not found") })
94 public Response uploadArtifact(@PathParam("assetType") final String assetType, @PathParam("uuid") final String uuid, @ApiParam(value = "json describe the artifact", required = true) String data) {
96 Wrapper<Response> responseWrapper = new Wrapper<>();
97 ResponseFormat responseFormat = null;
98 String instanceIdHeader = request.getHeader(Constants.X_ECOMP_INSTANCE_ID_HEADER);
99 String requestURI = request.getRequestURI();
100 String userId = request.getHeader(Constants.USER_ID_HEADER);
101 String url = request.getMethod() + " " + requestURI;
102 log.debug("Start handle request of {}", url);
103 ComponentTypeEnum componentType = ComponentTypeEnum.findByParamName(assetType);
104 if (componentType == null) {
105 log.debug("uploadArtifact: assetType parameter {} is not valid", assetType);
106 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
107 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
109 EnumMap<AuditingFieldsKeysEnum, Object> additionalParams = new EnumMap<>(AuditingFieldsKeysEnum.class);
111 if (responseWrapper.isEmpty() && (instanceIdHeader == null || instanceIdHeader.isEmpty())) {
112 log.debug("uploadArtifact: Missing X-ECOMP-InstanceID header");
113 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.MISSING_X_ECOMP_INSTANCE_ID);
114 getComponentsUtils().auditExternalUploadArtifact(responseFormat, componentType.getValue(), request, additionalParams);
115 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
117 if (responseWrapper.isEmpty() && (userId == null || userId.isEmpty())) {
118 log.debug("uploadArtifact: Missing USER_ID header");
119 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.COMPONENT_MISSING_CONTACT);
120 getComponentsUtils().auditExternalUploadArtifact(responseFormat, componentType.getValue(), request, additionalParams);
121 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
123 if (responseWrapper.isEmpty()) {
125 ServletContext context = request.getSession().getServletContext();
126 ArtifactsBusinessLogic artifactsLogic = getArtifactBL(context);
127 Either<ArtifactDefinition, ResponseFormat> uploadArtifactEither = artifactsLogic.uploadArtifactToComponentByUUID(data, request, componentType, uuid, additionalParams);
128 if (uploadArtifactEither.isRight()) {
129 log.debug("failed to upload artifact");
130 responseFormat = uploadArtifactEither.right().value();
131 getComponentsUtils().auditExternalUploadArtifact(responseFormat, componentType.getValue(), request, additionalParams);
132 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
134 Object representation = RepresentationUtils.toRepresentation(uploadArtifactEither.left().value());
135 Map<String, String> headers = new HashMap<>();
136 headers.put(Constants.MD5_HEADER, GeneralUtility.calculateMD5ByString((String) representation));
137 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.OK);
138 getComponentsUtils().auditExternalUploadArtifact(responseFormat, componentType.getValue(), request, additionalParams);
139 responseWrapper.setInnerElement(buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), representation, headers));
141 } catch (Exception e) {
142 final String message = "failed to upload artifact to a resource or service";
143 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(message);
144 log.debug(message, e);
145 responseWrapper.setInnerElement(buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR)));
148 return responseWrapper.getInnerElement();
152 * Uploads an artifact to resource instance
156 * @param resourceInstanceName
160 @Path("/{assetType}/{uuid}/resourceInstances/{resourceInstanceName}/artifacts")
161 @Produces(MediaType.APPLICATION_JSON)
162 @ApiOperation(value = "uploads an artifact to a resource instance", httpMethod = "POST", notes = "uploads an artifact to a resource instance", response = Response.class)
163 @ApiResponses(value = { @ApiResponse(code = 200, message = "Artifact uploaded"), @ApiResponse(code = 401, message = "Authorization required"), @ApiResponse(code = 403, message = "Restricted operation"),
164 @ApiResponse(code = 404, message = "Asset not found") })
165 public Response uploadArtifactToInstance(@PathParam("assetType") final String assetType, @PathParam("uuid") final String uuid, @PathParam("resourceInstanceName") final String resourceInstanceName,
166 @ApiParam(value = "json describe the artifact", required = true) String data) {
168 Wrapper<Response> responseWrapper = new Wrapper<>();
169 ResponseFormat responseFormat = null;
170 String instanceIdHeader = request.getHeader(Constants.X_ECOMP_INSTANCE_ID_HEADER);
171 String requestURI = request.getRequestURI();
172 String userId = request.getHeader(Constants.USER_ID_HEADER);
173 String url = request.getMethod() + " " + requestURI;
174 log.debug("Start handle request of {}", url);
175 ComponentTypeEnum componentType = ComponentTypeEnum.findByParamName(assetType);
176 if (componentType == null) {
177 log.debug("uploadArtifact: assetType parameter {} is not valid", assetType);
178 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
179 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
181 EnumMap<AuditingFieldsKeysEnum, Object> additionalParams = new EnumMap<>(AuditingFieldsKeysEnum.class);
183 if (responseWrapper.isEmpty() && (instanceIdHeader == null || instanceIdHeader.isEmpty())) {
184 log.debug("uploadArtifact: Missing X-ECOMP-InstanceID header");
185 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.MISSING_X_ECOMP_INSTANCE_ID);
186 getComponentsUtils().auditExternalUploadArtifact(responseFormat, componentType.getValue(), request, additionalParams);
187 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
189 if (responseWrapper.isEmpty() && (userId == null || userId.isEmpty())) {
190 log.debug("uploadArtifact: Missing USER_ID header");
191 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.COMPONENT_MISSING_CONTACT);
192 getComponentsUtils().auditExternalUploadArtifact(responseFormat, componentType.getValue(), request, additionalParams);
193 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
195 if (responseWrapper.isEmpty()) {
197 ServletContext context = request.getSession().getServletContext();
198 ArtifactsBusinessLogic artifactsLogic = getArtifactBL(context);
199 Either<ArtifactDefinition, ResponseFormat> uploadArtifactEither = artifactsLogic.uploadArtifactToRiByUUID(data, request, componentType, uuid, resourceInstanceName, additionalParams);
200 if (uploadArtifactEither.isRight()) {
201 log.debug("failed to upload artifact");
202 responseFormat = uploadArtifactEither.right().value();
203 getComponentsUtils().auditExternalUploadArtifact(responseFormat, componentType.getValue(), request, additionalParams);
204 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
206 Object representation = RepresentationUtils.toRepresentation(uploadArtifactEither.left().value());
207 Map<String, String> headers = new HashMap<>();
208 headers.put(Constants.MD5_HEADER, GeneralUtility.calculateMD5ByString((String) representation));
209 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.OK);
210 getComponentsUtils().auditExternalUploadArtifact(responseFormat, componentType.getValue(), request, additionalParams);
211 responseWrapper.setInnerElement(buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), representation, headers));
213 } catch (Exception e) {
214 final String message = "failed to upload artifact to a resource instance";
215 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(message);
216 log.debug(message, e);
217 responseWrapper.setInnerElement(buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR)));
220 return responseWrapper.getInnerElement();
224 * updates an artifact on a resource or service
228 * @param artifactUUID
232 @Path("/{assetType}/{uuid}/artifacts/{artifactUUID}")
233 @Produces(MediaType.APPLICATION_JSON)
234 @ApiOperation(value = "updates an artifact on a resource or service", httpMethod = "POST", notes = "uploads of artifact to a resource or service", response = Response.class)
235 @ApiResponses(value = { @ApiResponse(code = 200, message = "Artifact Updated"), @ApiResponse(code = 401, message = "Authorization required"), @ApiResponse(code = 403, message = "Restricted operation"),
236 @ApiResponse(code = 404, message = "Asset not found") })
237 public Response updateArtifact(@PathParam("assetType") final String assetType, @PathParam("uuid") final String uuid, @PathParam("artifactUUID") final String artifactUUID,
238 @ApiParam(value = "json describe the artifact", required = true) String data) {
240 Wrapper<Response> responseWrapper = new Wrapper<>();
241 ResponseFormat responseFormat = null;
242 String instanceIdHeader = request.getHeader(Constants.X_ECOMP_INSTANCE_ID_HEADER);
243 String requestURI = request.getRequestURI();
244 String userId = request.getHeader(Constants.USER_ID_HEADER);
245 String url = request.getMethod() + " " + requestURI;
246 log.debug("Start handle request of {}", url);
247 ComponentTypeEnum componentType = ComponentTypeEnum.findByParamName(assetType);
248 if (componentType == null) {
249 log.debug("updateArtifact: assetType parameter {} is not valid", assetType);
250 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
251 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
253 EnumMap<AuditingFieldsKeysEnum, Object> additionalParams = new EnumMap<>(AuditingFieldsKeysEnum.class);
256 if (responseWrapper.isEmpty() && (instanceIdHeader == null || instanceIdHeader.isEmpty())) {
257 log.debug("updateArtifact: Missing X-ECOMP-InstanceID header");
258 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.MISSING_X_ECOMP_INSTANCE_ID);
259 getComponentsUtils().auditExternalUpdateArtifact(responseFormat, componentType.getValue(), request, additionalParams);
260 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
262 if (responseWrapper.isEmpty() && (userId == null || userId.isEmpty())) {
263 log.debug("updateArtifact: Missing USER_ID header");
264 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.COMPONENT_MISSING_CONTACT);
265 getComponentsUtils().auditExternalUpdateArtifact(responseFormat, componentType.getValue(), request, additionalParams);
266 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
268 if (responseWrapper.isEmpty()) {
270 ServletContext context = request.getSession().getServletContext();
271 ArtifactsBusinessLogic artifactsLogic = getArtifactBL(context);
272 Either<ArtifactDefinition, ResponseFormat> uploadArtifactEither = artifactsLogic.updateArtifactOnComponentByUUID(data, request, componentType, uuid, artifactUUID, additionalParams);
273 if (uploadArtifactEither.isRight()) {
274 log.debug("failed to update artifact");
275 responseFormat = uploadArtifactEither.right().value();
276 getComponentsUtils().auditExternalUpdateArtifact(responseFormat, componentType.getValue(), request, additionalParams);
277 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
279 Object representation = RepresentationUtils.toRepresentation(uploadArtifactEither.left().value());
280 Map<String, String> headers = new HashMap<>();
281 headers.put(Constants.MD5_HEADER, GeneralUtility.calculateMD5ByString((String) representation));
282 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.OK);
283 getComponentsUtils().auditExternalUpdateArtifact(responseFormat, componentType.getValue(), request, additionalParams);
284 responseWrapper.setInnerElement(buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), representation, headers));
286 } catch (Exception e) {
287 final String message = "failed to update artifact on a resource or service";
288 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(message);
289 log.debug(message, e);
290 responseWrapper.setInnerElement(buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR)));
293 return responseWrapper.getInnerElement();
297 * updates an artifact on a resource instance
301 * @param resourceInstanceName
302 * @param artifactUUID
306 @Path("/{assetType}/{uuid}/resourceInstances/{resourceInstanceName}/artifacts/{artifactUUID}")
307 @Produces(MediaType.APPLICATION_JSON)
308 @ApiOperation(value = "updates an artifact on a resource instance", httpMethod = "POST", notes = "uploads of artifact to a resource or service", response = Response.class)
309 @ApiResponses(value = { @ApiResponse(code = 200, message = "Artifact Updated"), @ApiResponse(code = 401, message = "Authorization required"), @ApiResponse(code = 403, message = "Restricted operation"),
310 @ApiResponse(code = 404, message = "Asset not found") })
311 public Response updateArtifactOnResourceInstance(@PathParam("assetType") final String assetType, @PathParam("uuid") final String uuid, @PathParam("resourceInstanceName") final String resourceInstanceName,
312 @PathParam("artifactUUID") final String artifactUUID, @ApiParam(value = "json describe the artifact", required = true) String data) {
314 Wrapper<Response> responseWrapper = new Wrapper<>();
315 ResponseFormat responseFormat = null;
316 String instanceIdHeader = request.getHeader(Constants.X_ECOMP_INSTANCE_ID_HEADER);
317 String requestURI = request.getRequestURI();
318 String userId = request.getHeader(Constants.USER_ID_HEADER);
319 String url = request.getMethod() + " " + requestURI;
320 log.debug("Start handle request of {}", url);
321 ComponentTypeEnum componentType = ComponentTypeEnum.findByParamName(assetType);
322 if (componentType == null) {
323 log.debug("updateArtifactOnResourceInstance: assetType parameter {} is not valid", assetType);
324 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
325 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
327 EnumMap<AuditingFieldsKeysEnum, Object> additionalParams = new EnumMap<>(AuditingFieldsKeysEnum.class);
329 if (responseWrapper.isEmpty() && (instanceIdHeader == null || instanceIdHeader.isEmpty())) {
330 log.debug("updateArtifactOnResourceInstance: Missing X-ECOMP-InstanceID header");
331 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.MISSING_X_ECOMP_INSTANCE_ID);
332 getComponentsUtils().auditExternalUpdateArtifact(responseFormat, componentType.getValue(), request, additionalParams);
333 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
335 if (responseWrapper.isEmpty() && (userId == null || userId.isEmpty())) {
336 log.debug("updateArtifactOnResourceInstance: Missing USER_ID header");
337 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.COMPONENT_MISSING_CONTACT);
338 getComponentsUtils().auditExternalUpdateArtifact(responseFormat, componentType.getValue(), request, additionalParams);
339 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
341 if (responseWrapper.isEmpty()) {
343 ServletContext context = request.getSession().getServletContext();
344 ArtifactsBusinessLogic artifactsLogic = getArtifactBL(context);
345 Either<ArtifactDefinition, ResponseFormat> uploadArtifactEither = artifactsLogic.updateArtifactOnRiByUUID(data, request, componentType, uuid, resourceInstanceName, artifactUUID, additionalParams);
346 if (uploadArtifactEither.isRight()) {
347 log.debug("failed to update artifact");
348 responseFormat = uploadArtifactEither.right().value();
349 getComponentsUtils().auditExternalUpdateArtifact(responseFormat, componentType.getValue(), request, additionalParams);
350 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
352 Object representation = RepresentationUtils.toRepresentation(uploadArtifactEither.left().value());
353 Map<String, String> headers = new HashMap<>();
354 headers.put(Constants.MD5_HEADER, GeneralUtility.calculateMD5ByString((String) representation));
355 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.OK);
356 getComponentsUtils().auditExternalUpdateArtifact(responseFormat, componentType.getValue(), request, additionalParams);
357 responseWrapper.setInnerElement(buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), representation, headers));
359 } catch (Exception e) {
360 final String message = "failed to update artifact on resource instance";
361 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(message);
362 log.debug(message, e);
363 responseWrapper.setInnerElement(buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR)));
366 return responseWrapper.getInnerElement();
370 * deletes an artifact of a resource or service
374 * @param artifactUUID
378 @Path("/{assetType}/{uuid}/artifacts/{artifactUUID}")
379 @Produces(MediaType.APPLICATION_JSON)
380 @ApiOperation(value = "deletes an artifact of a resource or service", httpMethod = "DELETE", notes = "deletes an artifact of a resource or service", response = Response.class)
381 @ApiResponses(value = { @ApiResponse(code = 200, message = "Artifact Deleted"), @ApiResponse(code = 401, message = "Authorization required"), @ApiResponse(code = 403, message = "Restricted operation"),
382 @ApiResponse(code = 404, message = "Asset not found") })
383 public Response deleteArtifact(@PathParam("assetType") final String assetType, @PathParam("uuid") final String uuid, @PathParam("artifactUUID") final String artifactUUID) {
385 Wrapper<Response> responseWrapper = new Wrapper<>();
386 ResponseFormat responseFormat;
387 String instanceIdHeader = request.getHeader(Constants.X_ECOMP_INSTANCE_ID_HEADER);
388 String userId = request.getHeader(Constants.USER_ID_HEADER);
389 String requestURI = request.getRequestURI();
390 String url = request.getMethod() + " " + requestURI;
391 log.debug("Start handle request of {}", url);
393 ComponentTypeEnum componentType = ComponentTypeEnum.findByParamName(assetType);
394 if (componentType == null) {
395 log.debug("deleteArtifact: assetType parameter {} is not valid", assetType);
396 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
397 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
399 EnumMap<AuditingFieldsKeysEnum, Object> additionalParams = new EnumMap<>(AuditingFieldsKeysEnum.class);
401 if (responseWrapper.isEmpty() && (instanceIdHeader == null || instanceIdHeader.isEmpty())) {
402 log.debug("deleteArtifact: Missing X-ECOMP-InstanceID header");
403 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.MISSING_X_ECOMP_INSTANCE_ID);
404 getComponentsUtils().auditExternalDeleteArtifact(responseFormat, componentType.getValue(), request, additionalParams);
405 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
407 if (responseWrapper.isEmpty() && (userId == null || userId.isEmpty())) {
408 log.debug("deleteArtifact: Missing USER_ID header");
409 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.COMPONENT_MISSING_CONTACT);
410 getComponentsUtils().auditExternalDeleteArtifact(responseFormat, componentType.getValue(), request, additionalParams);
411 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
413 if (responseWrapper.isEmpty()) {
415 ServletContext context = request.getSession().getServletContext();
416 ArtifactsBusinessLogic artifactsLogic = getArtifactBL(context);
417 Either<ArtifactDefinition, ResponseFormat> uploadArtifactEither = artifactsLogic.deleteArtifactOnComponentByUUID(request, componentType, uuid, artifactUUID, additionalParams);
418 if (uploadArtifactEither.isRight()) {
419 log.debug("failed to delete artifact");
420 responseFormat = uploadArtifactEither.right().value();
421 getComponentsUtils().auditExternalDeleteArtifact(responseFormat, componentType.getValue(), request, additionalParams);
422 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
424 Object representation = RepresentationUtils.toRepresentation(uploadArtifactEither.left().value());
425 Map<String, String> headers = new HashMap<>();
426 headers.put(Constants.MD5_HEADER, GeneralUtility.calculateMD5ByString((String) representation));
427 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.OK);
428 getComponentsUtils().auditExternalDeleteArtifact(responseFormat, componentType.getValue(), request, additionalParams);
429 responseWrapper.setInnerElement(buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), representation, headers));
431 } catch (Exception e) {
432 final String message = "failed to delete an artifact of a resource or service";
433 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(message);
434 log.debug(message, e);
435 responseWrapper.setInnerElement(buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR)));
438 return responseWrapper.getInnerElement();
442 * deletes an artifact of a resource instance
446 * @param resourceInstanceName
450 @Path("{assetType}/{uuid}/resourceInstances/{resourceInstanceName}/artifacts/{artifactUUID}")
451 @Produces(MediaType.APPLICATION_JSON)
452 @ApiOperation(value = "deletes an artifact of a resource insatnce", httpMethod = "DELETE", notes = "deletes an artifact of a resource insatnce", response = Response.class)
453 @ApiResponses(value = { @ApiResponse(code = 200, message = "Artifact Deleted"), @ApiResponse(code = 401, message = "Authorization required"), @ApiResponse(code = 403, message = "Restricted operation"),
454 @ApiResponse(code = 404, message = "Asset not found") })
455 public Response deleteArtifactOnResourceInstance(@PathParam("assetType") final String assetType, @PathParam("uuid") final String uuid, @PathParam("resourceInstanceName") final String resourceInstanceName,
456 @PathParam("artifactUUID") final String artifactUUID) {
458 Wrapper<Response> responseWrapper = new Wrapper<>();
459 ResponseFormat responseFormat;
460 String instanceIdHeader = request.getHeader(Constants.X_ECOMP_INSTANCE_ID_HEADER);
461 String userId = request.getHeader(Constants.USER_ID_HEADER);
462 String requestURI = request.getRequestURI();
463 String url = request.getMethod() + " " + requestURI;
464 log.debug("Start handle request of {}", url);
466 ComponentTypeEnum componentType = ComponentTypeEnum.findByParamName(assetType);
467 if (componentType == null) {
468 log.debug("deleteArtifactOnResourceInsatnce: assetType parameter {} is not valid", assetType);
469 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
470 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
472 EnumMap<AuditingFieldsKeysEnum, Object> additionalParams = new EnumMap<>(AuditingFieldsKeysEnum.class);
474 if (responseWrapper.isEmpty() && (instanceIdHeader == null || instanceIdHeader.isEmpty())) {
475 log.debug("deleteArtifactOnResourceInsatnce: Missing X-ECOMP-InstanceID header");
476 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.MISSING_X_ECOMP_INSTANCE_ID);
477 getComponentsUtils().auditExternalDeleteArtifact(responseFormat, componentType.getValue(), request, additionalParams);
478 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
480 if (responseWrapper.isEmpty() && (userId == null || userId.isEmpty())) {
481 log.debug("deleteArtifactOnResourceInsatnce: Missing USER_ID header");
482 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.COMPONENT_MISSING_CONTACT);
483 getComponentsUtils().auditExternalDeleteArtifact(responseFormat, componentType.getValue(), request, additionalParams);
484 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
486 if (responseWrapper.isEmpty()) {
488 ServletContext context = request.getSession().getServletContext();
489 ArtifactsBusinessLogic artifactsLogic = getArtifactBL(context);
490 Either<ArtifactDefinition, ResponseFormat> uploadArtifactEither = artifactsLogic.deleteArtifactOnRiByUUID(request, componentType, uuid, resourceInstanceName, artifactUUID, additionalParams);
491 if (uploadArtifactEither.isRight()) {
492 log.debug("failed to delete artifact");
493 responseFormat = uploadArtifactEither.right().value();
494 getComponentsUtils().auditExternalDeleteArtifact(responseFormat, componentType.getValue(), request, additionalParams);
495 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
497 Object representation = RepresentationUtils.toRepresentation(uploadArtifactEither.left().value());
498 Map<String, String> headers = new HashMap<>();
499 headers.put(Constants.MD5_HEADER, GeneralUtility.calculateMD5ByString((String) representation));
500 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.OK);
501 getComponentsUtils().auditExternalDeleteArtifact(responseFormat, componentType.getValue(), request, additionalParams);
502 responseWrapper.setInnerElement(buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), representation, headers));
504 } catch (Exception e) {
505 final String message = "failed to delete an artifact of a resource instance";
506 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(message);
507 log.debug(message, e);
508 responseWrapper.setInnerElement(buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR)));
511 return responseWrapper.getInnerElement();
515 * downloads an artifact of a component (either a service or a resource) by artifactUUID
519 * @param artifactUUID
523 @Path("/{assetType}/{uuid}/artifacts/{artifactUUID}")
524 @Produces(MediaType.APPLICATION_OCTET_STREAM)
525 @ApiOperation(value = "Download component artifact", httpMethod = "GET", notes = "Returns downloaded artifact", response = Response.class)
526 @ApiResponses(value = { @ApiResponse(code = 200, message = "Artifact downloaded"), @ApiResponse(code = 401, message = "Authorization required"), @ApiResponse(code = 403, message = "Restricted operation"),
527 @ApiResponse(code = 404, message = "Artifact not found") })
528 public Response downloadComponentArtifact(
529 @ApiParam(value = "valid values: resources / services", allowableValues = ComponentTypeEnum.RESOURCE_PARAM_NAME + "," + ComponentTypeEnum.SERVICE_PARAM_NAME) @PathParam("assetType") final String assetType,
530 @PathParam("uuid") final String uuid, @PathParam("artifactUUID") final String artifactUUID) {
532 Wrapper<Response> responseWrapper = new Wrapper<>();
533 ResponseFormat responseFormat;
534 String instanceIdHeader = request.getHeader(Constants.X_ECOMP_INSTANCE_ID_HEADER);
535 String requestURI = request.getRequestURI();
536 String url = request.getMethod() + " " + requestURI;
537 log.debug("Start handle request of {}", url);
538 ComponentTypeEnum componentType = ComponentTypeEnum.findByParamName(assetType);
539 if (componentType == null) {
540 log.debug("downloadComponentArtifact: assetType parameter {} is not valid", assetType);
541 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
542 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
544 EnumMap<AuditingFieldsKeysEnum, Object> additionalParam = new EnumMap<>(AuditingFieldsKeysEnum.class);
546 if (responseWrapper.isEmpty() && (instanceIdHeader == null || instanceIdHeader.isEmpty())) {
547 log.debug("downloadComponentArtifact: Missing X-ECOMP-InstanceID header");
548 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.MISSING_X_ECOMP_INSTANCE_ID);
549 getComponentsUtils().auditExternalDownloadArtifact(responseFormat, componentType.getValue(), request, additionalParam);
550 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
552 if (responseWrapper.isEmpty()) {
554 ServletContext context = request.getSession().getServletContext();
555 ArtifactsBusinessLogic artifactsLogic = getArtifactBL(context);
556 Either<byte[], ResponseFormat> downloadComponentArtifactEither = artifactsLogic.downloadComponentArtifactByUUIDs(componentType, uuid, artifactUUID, additionalParam);
557 if (downloadComponentArtifactEither.isRight()) {
558 responseFormat = downloadComponentArtifactEither.right().value();
559 getComponentsUtils().auditExternalDownloadArtifact(responseFormat, componentType.getValue(), request, additionalParam);
560 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
562 byte[] value = downloadComponentArtifactEither.left().value();
563 InputStream is = new ByteArrayInputStream(value);
564 Map<String, String> headers = new HashMap<>();
565 headers.put(Constants.MD5_HEADER, GeneralUtility.calculateMD5ByByteArray(value));
566 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.OK);
567 getComponentsUtils().auditExternalDownloadArtifact(responseFormat, componentType.getValue(), request, additionalParam);
568 responseWrapper.setInnerElement(buildOkResponse(responseFormat, is, headers));
570 } catch (Exception e) {
571 final String message = "failed to download an artifact of a resource or service";
572 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(message);
573 log.debug(message, e);
574 responseWrapper.setInnerElement(buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR)));
577 return responseWrapper.getInnerElement();
581 * downloads an artifact of a resource instance of a component (either a service or a resource) by artifactUUID
585 * @param resourceInstanceName
586 * @param artifactUUID
590 @Path("/{assetType}/{uuid}/resourceInstances/{resourceInstanceName}/artifacts/{artifactUUID}")
591 @Produces(MediaType.APPLICATION_OCTET_STREAM)
592 @ApiOperation(value = "Download resource instance artifact", httpMethod = "GET", notes = "Returns downloaded artifact", response = Response.class)
593 @ApiResponses(value = { @ApiResponse(code = 200, message = "Artifact downloaded"), @ApiResponse(code = 401, message = "Authorization required"), @ApiResponse(code = 403, message = "Restricted operation"),
594 @ApiResponse(code = 404, message = "Artifact not found") })
595 public Response downloadResourceInstanceArtifact(
596 @ApiParam(value = "valid values: resources / services", allowableValues = ComponentTypeEnum.RESOURCE_PARAM_NAME + "," + ComponentTypeEnum.SERVICE_PARAM_NAME) @PathParam("assetType") final String assetType,
597 @PathParam("uuid") final String uuid, @PathParam("resourceInstanceName") final String resourceInstanceName, @PathParam("artifactUUID") final String artifactUUID) {
599 Wrapper<Response> responseWrapper = new Wrapper<>();
600 ResponseFormat responseFormat;
601 String instanceIdHeader = request.getHeader(Constants.X_ECOMP_INSTANCE_ID_HEADER);
602 String requestURI = request.getRequestURI();
603 String url = request.getMethod() + " " + requestURI;
604 log.debug("Start handle request of {}", url);
605 ComponentTypeEnum componentType = ComponentTypeEnum.findByParamName(assetType);
606 if (componentType == null) {
607 log.debug("downloadResourceInstanceArtifact: assetType parameter {} is not valid", assetType);
608 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
609 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
611 EnumMap<AuditingFieldsKeysEnum, Object> additionalParam = new EnumMap<>(AuditingFieldsKeysEnum.class);
613 if (responseWrapper.isEmpty() && (instanceIdHeader == null || instanceIdHeader.isEmpty())) {
614 log.debug("downloadResourceInstanceArtifact: Missing X-ECOMP-InstanceID header");
615 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.MISSING_X_ECOMP_INSTANCE_ID);
616 getComponentsUtils().auditExternalDownloadArtifact(responseFormat, componentType.getValue(), request, additionalParam);
617 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
619 if (responseWrapper.isEmpty()) {
621 ServletContext context = request.getSession().getServletContext();
622 ArtifactsBusinessLogic artifactsLogic = getArtifactBL(context);
623 Either<byte[], ResponseFormat> downloadResourceArtifactEither = artifactsLogic.downloadResourceInstanceArtifactByUUIDs(componentType, uuid, resourceInstanceName, artifactUUID, additionalParam);
624 if (downloadResourceArtifactEither.isRight()) {
625 responseFormat = downloadResourceArtifactEither.right().value();
626 getComponentsUtils().auditExternalDownloadArtifact(responseFormat, componentType.getValue(), request, additionalParam);
627 responseWrapper.setInnerElement(buildErrorResponse(responseFormat));
629 byte[] value = downloadResourceArtifactEither.left().value();
630 InputStream is = new ByteArrayInputStream(value);
631 Map<String, String> headers = new HashMap<>();
632 headers.put(Constants.MD5_HEADER, GeneralUtility.calculateMD5ByByteArray(value));
633 responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.OK);
634 getComponentsUtils().auditExternalDownloadArtifact(responseFormat, componentType.getValue(), request, additionalParam);
635 responseWrapper.setInnerElement(buildOkResponse(responseFormat, is, headers));
637 } catch (Exception e) {
638 final String message = "failed to download an artifact of a resource instance";
639 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(message);
640 log.debug(message, e);
641 responseWrapper.setInnerElement(buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR)));
644 return responseWrapper.getInnerElement();