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=========================================================
20 package org.openecomp.sdc.be.servlets;
22 import com.google.gson.reflect.TypeToken;
23 import com.jcabi.aspects.Loggable;
24 import fj.data.Either;
25 import io.swagger.v3.oas.annotations.Operation;
26 import io.swagger.v3.oas.annotations.Parameter;
27 import io.swagger.v3.oas.annotations.media.ArraySchema;
28 import io.swagger.v3.oas.annotations.media.Content;
29 import io.swagger.v3.oas.annotations.media.Schema;
30 import io.swagger.v3.oas.annotations.responses.ApiResponse;
31 import io.swagger.v3.oas.annotations.servers.Server;
32 import io.swagger.v3.oas.annotations.tags.Tag;
34 import java.io.IOException;
35 import java.util.List;
38 import java.util.function.Supplier;
39 import java.util.stream.Collectors;
40 import javax.inject.Inject;
41 import javax.servlet.http.HttpServletRequest;
42 import javax.ws.rs.Consumes;
43 import javax.ws.rs.HeaderParam;
44 import javax.ws.rs.POST;
45 import javax.ws.rs.Path;
46 import javax.ws.rs.Produces;
47 import javax.ws.rs.core.Context;
48 import javax.ws.rs.core.MediaType;
49 import javax.ws.rs.core.Response;
50 import org.apache.commons.lang3.tuple.ImmutablePair;
51 import org.glassfish.jersey.media.multipart.FormDataParam;
52 import org.openecomp.sdc.be.components.impl.ArtifactTypeImportManager;
53 import org.openecomp.sdc.be.components.impl.CapabilityTypeImportManager;
54 import org.openecomp.sdc.be.components.impl.CategoriesImportManager;
55 import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
56 import org.openecomp.sdc.be.components.impl.DataTypeImportManager;
57 import org.openecomp.sdc.be.components.impl.GroupTypeImportManager;
58 import org.openecomp.sdc.be.components.impl.InterfaceLifecycleTypeImportManager;
59 import org.openecomp.sdc.be.components.impl.PolicyTypeImportManager;
60 import org.openecomp.sdc.be.components.impl.RelationshipTypeImportManager;
61 import org.openecomp.sdc.be.components.impl.ResourceImportManager;
62 import org.openecomp.sdc.be.components.impl.aaf.AafPermission;
63 import org.openecomp.sdc.be.components.impl.aaf.PermissionAllowed;
64 import org.openecomp.sdc.be.components.impl.model.ToscaTypeImportData;
65 import org.openecomp.sdc.be.config.BeEcompErrorManager;
66 import org.openecomp.sdc.be.dao.api.ActionStatus;
67 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
68 import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
69 import org.openecomp.sdc.be.impl.ComponentsUtils;
70 import org.openecomp.sdc.be.impl.ServletUtils;
71 import org.openecomp.sdc.be.model.DataTypeDefinition;
72 import org.openecomp.sdc.be.model.GroupTypeDefinition;
73 import org.openecomp.sdc.be.model.PolicyTypeDefinition;
74 import org.openecomp.sdc.be.model.RelationshipTypeDefinition;
75 import org.openecomp.sdc.be.model.User;
76 import org.openecomp.sdc.be.model.normatives.ToscaTypeMetadata;
77 import org.openecomp.sdc.be.user.UserBusinessLogic;
78 import org.openecomp.sdc.common.api.Constants;
79 import org.openecomp.sdc.common.datastructure.FunctionalInterfaces.ConsumerFourParam;
80 import org.openecomp.sdc.common.datastructure.FunctionalInterfaces.ConsumerTwoParam;
81 import org.openecomp.sdc.common.datastructure.Wrapper;
82 import org.openecomp.sdc.common.log.wrappers.Logger;
83 import org.openecomp.sdc.exception.ResponseFormat;
84 import org.springframework.stereotype.Controller;
86 @Loggable(prepend = true, value = Loggable.DEBUG, trim = false)
87 @Path("/v1/catalog/uploadType")
88 @Consumes(MediaType.MULTIPART_FORM_DATA)
89 @Produces(MediaType.APPLICATION_JSON)
90 @Tag(name = "SDCE-2 APIs")
91 @Server(url = "/sdc2/rest")
93 public class TypesUploadServlet extends AbstractValidationsServlet {
95 private static final String CREATE = "Create ";
96 private static final String START_HANDLE_REQUEST_OF = "Start handle request of {}";
97 private static final String CREATE_FAILED_WITH_EXCEPTION = "create {} failed with exception:";
98 private static final Logger log = Logger.getLogger(TypesUploadServlet.class);
99 private final CapabilityTypeImportManager capabilityTypeImportManager;
100 private final InterfaceLifecycleTypeImportManager interfaceLifecycleTypeImportManager;
101 private final CategoriesImportManager categoriesImportManager;
102 private final DataTypeImportManager dataTypeImportManager;
103 private final GroupTypeImportManager groupTypeImportManager;
104 private final PolicyTypeImportManager policyTypeImportManager;
105 private final RelationshipTypeImportManager relationshipTypeImportManager;
106 private final ArtifactTypeImportManager artifactTypeImportManager;
109 public TypesUploadServlet(UserBusinessLogic userBusinessLogic, ComponentInstanceBusinessLogic componentInstanceBL,
110 ComponentsUtils componentsUtils, ServletUtils servletUtils, ResourceImportManager resourceImportManager,
111 CapabilityTypeImportManager capabilityTypeImportManager,
112 InterfaceLifecycleTypeImportManager interfaceLifecycleTypeImportManager,
113 CategoriesImportManager categoriesImportManager, DataTypeImportManager dataTypeImportManager,
114 GroupTypeImportManager groupTypeImportManager, PolicyTypeImportManager policyTypeImportManager,
115 RelationshipTypeImportManager relationshipTypeImportManager, ArtifactTypeImportManager artifactTypeImportManager) {
116 super(userBusinessLogic, componentInstanceBL, componentsUtils, servletUtils, resourceImportManager);
117 this.capabilityTypeImportManager = capabilityTypeImportManager;
118 this.interfaceLifecycleTypeImportManager = interfaceLifecycleTypeImportManager;
119 this.categoriesImportManager = categoriesImportManager;
120 this.dataTypeImportManager = dataTypeImportManager;
121 this.groupTypeImportManager = groupTypeImportManager;
122 this.policyTypeImportManager = policyTypeImportManager;
123 this.relationshipTypeImportManager = relationshipTypeImportManager;
124 this.artifactTypeImportManager = artifactTypeImportManager;
129 @Operation(description = "Create Capability Type from yaml", method = "POST", summary = "Returns created Capability Type", responses = {
130 @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
131 @ApiResponse(responseCode = "201", description = "Capability Type created"),
132 @ApiResponse(responseCode = "403", description = "Restricted operation"),
133 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
134 @ApiResponse(responseCode = "409", description = "Capability Type already exist")})
135 @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
136 public Response uploadCapabilityType(@Parameter(description = "FileInputStream") @FormDataParam("capabilityTypeZip") File file,
137 @Context final HttpServletRequest request, @HeaderParam("USER_ID") String creator,
138 @Parameter(description = "model") @FormDataParam("model") String modelName,
139 @Parameter(description = "includeToModelImport") @FormDataParam("includeToModelImport") boolean includeToModelDefaultImports) {
140 ConsumerFourParam<Wrapper<Response>, String, String, Boolean> createElementsMethod = (responseWrapper, ymlPayload, model, includeToModelImport) ->
141 createElementsType(responseWrapper, () -> capabilityTypeImportManager.createCapabilityTypes(ymlPayload, modelName,
142 includeToModelDefaultImports));
143 return uploadElementTypeServletLogic(createElementsMethod, file, request, creator, NodeTypeEnum.CapabilityType.name(), modelName,
144 includeToModelDefaultImports);
148 @Path("/relationship")
149 @Operation(description = "Create Relationship Type from yaml", method = "POST", summary = "Returns created Relationship Type", responses = {
150 @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
151 @ApiResponse(responseCode = "201", description = "Relationship Type created"),
152 @ApiResponse(responseCode = "403", description = "Restricted operation"),
153 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
154 @ApiResponse(responseCode = "409", description = "Relationship Type already exist")})
155 @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
156 public Response uploadRelationshipType(@Parameter(description = "FileInputStream") @FormDataParam("relationshipTypeZip") File file,
157 @Context final HttpServletRequest request, @HeaderParam("USER_ID") String creator,
158 @Parameter(description = "model") @FormDataParam("model") String modelName,
159 @Parameter(description = "includeToModelImport") @FormDataParam("includeToModelImport") boolean includeToModelDefaultImports) {
160 return uploadElementTypeServletLogic(
161 this::createRelationshipTypes, file, request, creator, NodeTypeEnum.RelationshipType.getName(), modelName, includeToModelDefaultImports);
165 @Path("/interfaceLifecycle")
166 @Operation(description = "Create Interface Lyfecycle Type from yaml", method = "POST", summary = "Returns created Interface Lifecycle Type", responses = {
167 @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
168 @ApiResponse(responseCode = "201", description = "Interface Lifecycle Type created"),
169 @ApiResponse(responseCode = "403", description = "Restricted operation"),
170 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
171 @ApiResponse(responseCode = "409", description = "Interface Lifecycle Type already exist")})
172 @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
173 public Response uploadInterfaceLifecycleType(@Parameter(description = "FileInputStream") @FormDataParam("interfaceLifecycleTypeZip") File file,
174 @Context final HttpServletRequest request, @HeaderParam("USER_ID") String creator,
175 @Parameter(description = "model") @FormDataParam("model") String modelName,
176 @Parameter(description = "includeToModelImport") @FormDataParam("includeToModelImport") boolean includeToModelDefaultImports) {
177 ConsumerTwoParam<Wrapper<Response>, String> createElementsMethod = (responseWrapper, ymlPayload) ->
178 createElementsType(responseWrapper, () -> interfaceLifecycleTypeImportManager.createLifecycleTypes(ymlPayload, modelName,
179 includeToModelDefaultImports));
180 return uploadElementTypeServletLogic(createElementsMethod, file, request, creator, "Interface Types");
184 @Path("/artifactTypes")
185 @Operation(description = "Create Tosca Artifact types from yaml", method = "POST", summary = "Returns created Tosca artifact types", responses = {
186 @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
187 @ApiResponse(responseCode = "201", description = "Tosca Artifact types created"),
188 @ApiResponse(responseCode = "403", description = "Restricted operation"),
189 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
190 @ApiResponse(responseCode = "409", description = "Tosca Artifact Type already exist")})
191 @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
192 public Response uploadArtifactTypes(@Parameter(description = "Zip file containing a yaml with the TOSCA artifact types definition")
193 @FormDataParam("artifactsZip") File file,
194 @Parameter(description = "model name") @FormDataParam("model") String modelName,
195 @Context final HttpServletRequest request, @HeaderParam("USER_ID") String creator,
196 @Parameter(description = "A flag to add types to the default imports")
197 @FormDataParam("includeToModelImport") boolean includeToModelDefaultImports) {
198 final ConsumerTwoParam<Wrapper<Response>, String> createElementsMethod = (responseWrapper, ymlPayload) ->
199 createElementsType(responseWrapper, () -> artifactTypeImportManager.createArtifactTypes(ymlPayload, modelName, includeToModelDefaultImports));
200 return uploadElementTypeServletLogic(createElementsMethod, file, request, creator, NodeTypeEnum.ArtifactType.getName());
205 @Operation(description = "Create Categories from yaml", method = "POST", summary = "Returns created categories", responses = {
206 @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
207 @ApiResponse(responseCode = "201", description = "Categories created"),
208 @ApiResponse(responseCode = "403", description = "Restricted operation"),
209 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
210 @ApiResponse(responseCode = "409", description = "Category already exist")})
211 @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
212 public Response uploadCategories(@Parameter(description = "FileInputStream") @FormDataParam("categoriesZip") File file,
213 @Context final HttpServletRequest request, @HeaderParam("USER_ID") String creator) {
214 ConsumerTwoParam<Wrapper<Response>, String> createElementsMethod = (responseWrapper, ymlPayload) ->
215 createElementsType(responseWrapper, () -> categoriesImportManager.createCategories(ymlPayload));
216 return uploadElementTypeServletLogic(createElementsMethod, file, request, creator, "categories");
221 @Operation(description = "Create Categories from yaml", method = "POST", summary = "Returns created data types", responses = {
222 @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
223 @ApiResponse(responseCode = "201", description = "Data types created"),
224 @ApiResponse(responseCode = "403", description = "Restricted operation"),
225 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
226 @ApiResponse(responseCode = "409", description = "Data types already exist")})
227 @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
228 public Response uploadDataTypes(@Parameter(description = "FileInputStream") @FormDataParam("dataTypesZip") File file,
229 @Context final HttpServletRequest request, @HeaderParam("USER_ID") String creator,
230 @Parameter(description = "model") @FormDataParam("model") String modelName,
231 @Parameter(description = "includeToModelImport") @FormDataParam("includeToModelImport") boolean includeToModelDefaultImports) {
232 return uploadElementTypeServletLogic(this::createDataTypes, file, request, creator, NodeTypeEnum.DataType.getName(), modelName,
233 includeToModelDefaultImports);
238 @Operation(description = "Create GroupTypes from yaml", method = "POST", summary = "Returns created group types", responses = {
239 @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
240 @ApiResponse(responseCode = "201", description = "group types created"),
241 @ApiResponse(responseCode = "403", description = "Restricted operation"),
242 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
243 @ApiResponse(responseCode = "409", description = "group types already exist")})
244 @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
245 public Response uploadGroupTypes(@Parameter(description = "toscaTypeMetadata") @FormDataParam("toscaTypeMetadata") String toscaTypesMetaData,
246 @Parameter(description = "model") @FormDataParam("model") String modelName,
247 @Parameter(description = "FileInputStream") @FormDataParam("groupTypesZip") File file,
248 @Context final HttpServletRequest request, @HeaderParam("USER_ID") String creator,
249 @Parameter(description = "includeToModelImport") @FormDataParam("includeToModelImport") boolean includeToModelDefaultImports) {
250 Map<String, ToscaTypeMetadata> typesMetadata = getTypesMetadata(toscaTypesMetaData);
251 return uploadTypesWithMetaData(this::createGroupTypes, typesMetadata, file, request, creator, NodeTypeEnum.GroupType.getName(), modelName,
252 includeToModelDefaultImports);
256 @Path("/policytypes")
257 @Operation(description = "Create PolicyTypes from yaml", method = "POST", summary = "Returns created policy types", responses = {
258 @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
259 @ApiResponse(responseCode = "201", description = "policy types created"),
260 @ApiResponse(responseCode = "403", description = "Restricted operation"),
261 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
262 @ApiResponse(responseCode = "409", description = "policy types already exist")})
263 @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
264 public Response uploadPolicyTypes(@Parameter(description = "toscaTypeMetadata") @FormDataParam("toscaTypeMetadata") String toscaTypesMetaData,
265 @Parameter(description = "model") @FormDataParam("model") String modelName,
266 @Parameter(description = "FileInputStream") @FormDataParam("policyTypesZip") File file,
267 @Context final HttpServletRequest request, @HeaderParam("USER_ID") String creator,
268 @Parameter(description = "includeToModelImport") @FormDataParam("includeToModelImport") boolean includeToModelDefaultImports) {
269 Map<String, ToscaTypeMetadata> typesMetadata = getTypesMetadata(toscaTypesMetaData);
270 return uploadTypesWithMetaData(this::createPolicyTypes, typesMetadata, file, request, creator, NodeTypeEnum.PolicyType.getName(), modelName,
271 includeToModelDefaultImports);
274 private Map<String, ToscaTypeMetadata> getTypesMetadata(String toscaTypesMetaData) {
275 return gson.fromJson(toscaTypesMetaData, new TypeToken<Map<String, ToscaTypeMetadata>>() {
279 private Response uploadElementTypeServletLogic(ConsumerTwoParam<Wrapper<Response>, String> createElementsMethod, File file,
280 final HttpServletRequest request, String creator, String elementTypeName) {
282 String userId = initHeaderParam(creator, request, Constants.USER_ID_HEADER);
284 Wrapper<String> yamlStringWrapper = new Wrapper<>();
285 String url = request.getMethod() + " " + request.getRequestURI();
286 log.debug(START_HANDLE_REQUEST_OF, url);
287 Wrapper<Response> responseWrapper = doUploadTypeValidations(request, userId, file);
288 if (responseWrapper.isEmpty()) {
289 fillZipContents(yamlStringWrapper, file);
291 if (responseWrapper.isEmpty()) {
292 createElementsMethod.accept(responseWrapper, yamlStringWrapper.getInnerElement());
294 return responseWrapper.getInnerElement();
295 } catch (Exception e) {
296 log.debug(CREATE_FAILED_WITH_EXCEPTION, elementTypeName, e);
297 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(CREATE + elementTypeName);
298 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
302 private Response uploadElementTypeServletLogic(final ConsumerFourParam<Wrapper<Response>, String, String, Boolean> createElementsMethod,
303 final File file, final HttpServletRequest request, final String creator,
304 final String elementTypeName, final String modelName, final boolean includeToModelDefaultImports) {
306 final String userId = initHeaderParam(creator, request, Constants.USER_ID_HEADER);
308 final Wrapper<String> yamlStringWrapper = new Wrapper<>();
309 final String url = request.getMethod() + " " + request.getRequestURI();
310 log.debug(START_HANDLE_REQUEST_OF, url);
311 final Wrapper<Response> responseWrapper = doUploadTypeValidations(request, userId, file);
312 if (responseWrapper.isEmpty()) {
313 fillZipContents(yamlStringWrapper, file);
315 if (responseWrapper.isEmpty()) {
316 createElementsMethod.accept(responseWrapper, yamlStringWrapper.getInnerElement(), modelName, includeToModelDefaultImports);
318 return responseWrapper.getInnerElement();
319 } catch (final Exception e) {
320 log.debug(CREATE_FAILED_WITH_EXCEPTION, elementTypeName, e);
321 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(CREATE + elementTypeName);
322 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
326 private Wrapper<Response> doUploadTypeValidations(final HttpServletRequest request, String userId, File file) {
327 Wrapper<Response> responseWrapper = new Wrapper<>();
328 Wrapper<User> userWrapper = new Wrapper<>();
329 String url = request.getMethod() + " " + request.getRequestURI();
330 log.debug(START_HANDLE_REQUEST_OF, url);
331 validateUserExist(responseWrapper, userWrapper, userId);
332 if (responseWrapper.isEmpty()) {
333 validateUserRole(responseWrapper, userWrapper.getInnerElement());
335 if (responseWrapper.isEmpty()) {
336 validateDataNotNull(responseWrapper, file);
338 return responseWrapper;
341 private Response uploadTypesWithMetaData(ConsumerFourParam<Wrapper<Response>, ToscaTypeImportData, String, Boolean> createElementsMethod,
342 Map<String, ToscaTypeMetadata> typesMetaData, File file, final HttpServletRequest request,
343 String creator, String elementTypeName, String modelName, final boolean includeToModelDefaultImports) {
345 String userId = initHeaderParam(creator, request, Constants.USER_ID_HEADER);
346 Wrapper<String> yamlStringWrapper = new Wrapper<>();
348 Wrapper<Response> responseWrapper = doUploadTypeValidations(request, userId, file);
349 if (responseWrapper.isEmpty()) {
350 fillZipContents(yamlStringWrapper, file);
352 if (responseWrapper.isEmpty()) {
353 ToscaTypeImportData toscaTypeImportData = new ToscaTypeImportData(yamlStringWrapper.getInnerElement(), typesMetaData);
354 createElementsMethod.accept(responseWrapper, toscaTypeImportData, modelName, includeToModelDefaultImports);
356 return responseWrapper.getInnerElement();
357 } catch (Exception e) {
358 log.debug(CREATE_FAILED_WITH_EXCEPTION, elementTypeName, e);
359 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(CREATE + elementTypeName);
360 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
364 private <T> void createElementsType(Wrapper<Response> responseWrapper, Supplier<Either<T, ResponseFormat>> elementsCreater) {
365 Either<T, ResponseFormat> eitherResult = elementsCreater.get();
366 if (eitherResult.isRight()) {
367 responseWrapper.setInnerElement(buildErrorResponse(eitherResult.right().value()));
370 Response response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.CREATED),
371 RepresentationUtils.toRepresentation(eitherResult.left().value()));
372 responseWrapper.setInnerElement(response);
373 } catch (Exception e) {
374 responseWrapper.setInnerElement(buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR)));
375 log.error("#createElementsType - json serialization failed with error: ", e);
381 private void createDataTypes(Wrapper<Response> responseWrapper, String dataTypesYml, final String modelName,
382 final boolean includeToModelDefaultImports) {
383 final Supplier<Either<List<ImmutablePair<DataTypeDefinition, Boolean>>, ResponseFormat>> generateElementTypeFromYml = () ->
384 dataTypeImportManager.createDataTypes(dataTypesYml, modelName, includeToModelDefaultImports);
385 buildStatusForElementTypeCreate(responseWrapper, generateElementTypeFromYml, ActionStatus.DATA_TYPE_ALREADY_EXIST,
386 NodeTypeEnum.DataType.name());
390 private void createGroupTypes(Wrapper<Response> responseWrapper, ToscaTypeImportData toscaTypeImportData, String modelName,
391 final boolean includeToModelDefaultImports) {
392 final Supplier<Either<List<ImmutablePair<GroupTypeDefinition, Boolean>>, ResponseFormat>> generateElementTypeFromYml = () ->
393 groupTypeImportManager.createGroupTypes(toscaTypeImportData, modelName, includeToModelDefaultImports);
394 buildStatusForElementTypeCreate(responseWrapper, generateElementTypeFromYml, ActionStatus.GROUP_TYPE_ALREADY_EXIST,
395 NodeTypeEnum.GroupType.name());
399 private void createPolicyTypes(Wrapper<Response> responseWrapper, ToscaTypeImportData toscaTypeImportData, String modelName,
400 final boolean includeToModelDefaultImports) {
401 final Supplier<Either<List<ImmutablePair<PolicyTypeDefinition, Boolean>>, ResponseFormat>> generateElementTypeFromYml = () ->
402 policyTypeImportManager.createPolicyTypes(toscaTypeImportData, modelName, includeToModelDefaultImports);
403 buildStatusForElementTypeCreate(responseWrapper, generateElementTypeFromYml, ActionStatus.POLICY_TYPE_ALREADY_EXIST,
404 NodeTypeEnum.PolicyType.name());
408 private <T extends ToscaDataDefinition> void buildStatusForElementTypeCreate(Wrapper<Response> responseWrapper,
409 Supplier<Either<List<ImmutablePair<T, Boolean>>, ResponseFormat>> generateElementTypeFromYml,
410 ActionStatus alreadyExistStatus, String elementTypeName) {
411 Either<List<ImmutablePair<T, Boolean>>, ResponseFormat> eitherResult = generateElementTypeFromYml.get();
412 if (eitherResult.isRight()) {
413 responseWrapper.setInnerElement(buildErrorResponse(eitherResult.right().value()));
417 final List<ImmutablePair<T, Boolean>> list = eitherResult.left().value();
418 ActionStatus status = ActionStatus.OK;
420 // Group result by the right value - true or false.
421 // I.e., get the number of data types which are new and which are old.
422 final Map<Boolean, List<ImmutablePair<T, Boolean>>> collect =
423 list.stream().collect(Collectors.groupingBy(ImmutablePair<T, Boolean>::getRight));
424 if (collect != null) {
425 Set<Boolean> keySet = collect.keySet();
426 if (keySet.size() == 1) {
427 Boolean isNew = keySet.iterator().next();
428 if (Boolean.TRUE.equals(isNew)) {
429 // all data types created at the first time
430 status = ActionStatus.CREATED;
432 // All data types already exists
433 status = alreadyExistStatus;
438 final Object representation = RepresentationUtils.toRepresentation(eitherResult.left().value());
439 responseWrapper.setInnerElement(buildOkResponse(getComponentsUtils().getResponseFormat(status), representation));
440 } catch (IOException e) {
441 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(CREATE + elementTypeName);
442 log.debug("failed to convert {} to json", elementTypeName, e);
443 responseWrapper.setInnerElement(buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR)));
448 // relationship types
449 private void createRelationshipTypes(final Wrapper<Response> responseWrapper,
450 final String relationshipTypesYml,
451 final String modelName,
452 final boolean includeToModelDefaultImports) {
453 final Supplier<Either<List<ImmutablePair<RelationshipTypeDefinition, Boolean>>, ResponseFormat>> generateElementTypeFromYml = () -> relationshipTypeImportManager
454 .createRelationshipTypes(relationshipTypesYml, modelName, includeToModelDefaultImports);
455 buildStatusForElementTypeCreate(responseWrapper, generateElementTypeFromYml, ActionStatus.RELATIONSHIP_TYPE_ALREADY_EXIST,
456 NodeTypeEnum.RelationshipType.name());