/******************************************************************************** | |
* Copyright (c) 2015-2019 Contributors to the Eclipse Foundation | |
* | |
* See the NOTICE file(s) distributed with this work for additional | |
* information regarding copyright ownership. | |
* | |
* This program and the accompanying materials are made available under the | |
* terms of the Eclipse Public License v. 2.0 which is available at | |
* http://www.eclipse.org/legal/epl-2.0. | |
* | |
* SPDX-License-Identifier: EPL-2.0 | |
* | |
********************************************************************************/ | |
package org.eclipse.mdm.businessobjects.boundary; | |
import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID; | |
import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME; | |
import static org.eclipse.mdm.businessobjects.service.EntityService.V; | |
import javax.ejb.EJB; | |
import javax.ws.rs.Consumes; | |
import javax.ws.rs.GET; | |
import javax.ws.rs.POST; | |
import javax.ws.rs.Path; | |
import javax.ws.rs.PathParam; | |
import javax.ws.rs.Produces; | |
import javax.ws.rs.core.MediaType; | |
import javax.ws.rs.core.Response; | |
import javax.ws.rs.core.Response.Status; | |
import org.eclipse.mdm.api.base.model.TestStep; | |
import org.eclipse.mdm.api.dflt.model.Classification; | |
import org.eclipse.mdm.api.dflt.model.Domain; | |
import org.eclipse.mdm.api.dflt.model.ProjectDomain; | |
import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse; | |
import org.eclipse.mdm.businessobjects.service.EntityService; | |
import org.eclipse.mdm.businessobjects.utils.ServiceUtils; | |
import io.swagger.v3.oas.annotations.Operation; | |
import io.swagger.v3.oas.annotations.Parameter; | |
import io.swagger.v3.oas.annotations.media.Content; | |
import io.swagger.v3.oas.annotations.media.Schema; | |
import io.swagger.v3.oas.annotations.responses.ApiResponse; | |
import io.swagger.v3.oas.annotations.tags.Tag; | |
import io.vavr.Value; | |
import io.vavr.collection.List; | |
import io.vavr.collection.Seq; | |
/** | |
* @author Alexander Knoblauch | |
* | |
*/ | |
@Tag(name = "Status") | |
@Produces(MediaType.APPLICATION_JSON) | |
@Consumes(MediaType.APPLICATION_JSON) | |
@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/classifications") | |
public class ClassificationResource { | |
@EJB | |
private EntityService entityService; | |
@EJB | |
private ClassificationService classificationService; | |
@Parameter(description = "Name of the MDM datasource", required = true) | |
@PathParam(REQUESTPARAM_SOURCENAME) | |
private String sourceName; | |
/** | |
* delegates the request to the {@link EntityService} | |
* | |
* @param id id of the {@link Classification} | |
* @return the result of the delegated request as {@link Response} | |
*/ | |
@GET | |
@Operation(summary = "Find a Classification by ID", responses = { | |
@ApiResponse(description = "The Classification", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))), | |
@ApiResponse(responseCode = "500", description = "Error") }) | |
@Path("/{" + REQUESTPARAM_ID + "}") | |
public Response findClassification( | |
@Parameter(description = "ID of the Classification", required = true) @PathParam(REQUESTPARAM_ID) String id) { | |
return entityService.find(V(sourceName), Classification.class, V(id)) | |
.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) | |
.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE); | |
} | |
/** | |
* Returns the created/existing {@link Classification}. | |
* | |
* @param body The {@link Classification} to create. | |
* @return the created {@link TestStep} as {@link Response}. | |
*/ | |
@POST | |
@Operation(summary = "Create a new Classification or return a existing Classification which references the same Status, ProjectDomain and Domain.", responses = { | |
@ApiResponse(description = "The created Classification", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))), | |
@ApiResponse(responseCode = "500", description = "Error") }) | |
public Response createOrFind(String body) { | |
Seq<Value<?>> extractRequestBody = entityService.extractRequestBody(body, sourceName, io.vavr.collection.List | |
.of(org.eclipse.mdm.api.dflt.model.Status.class, ProjectDomain.class, Domain.class)); | |
java.util.List<Value<?>> asJavaMutable = extractRequestBody.asJavaMutable(); | |
org.eclipse.mdm.api.dflt.model.Status status = null; | |
ProjectDomain projectDomain = null; | |
Domain domain = null; | |
for (Value<?> v : asJavaMutable) { | |
if (v.get() instanceof org.eclipse.mdm.api.dflt.model.Status) { | |
status = (org.eclipse.mdm.api.dflt.model.Status) v.get(); | |
} else if (v.get() instanceof ProjectDomain) { | |
projectDomain = (ProjectDomain) v.get(); | |
} else if (v.get() instanceof Domain) { | |
domain = (Domain) v.get(); | |
} | |
} | |
Classification classification = classificationService.getClassification(sourceName, status, projectDomain, | |
domain); | |
Response response = null; | |
if (classification == null) { | |
response = entityService | |
.create(V(sourceName), Classification.class, | |
entityService.extractRequestBody(body, sourceName, | |
List.of(Domain.class, ProjectDomain.class, | |
org.eclipse.mdm.api.dflt.model.Status.class))) | |
.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED)) | |
.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE); | |
} else { | |
response = ServiceUtils.buildEntityResponse(classification, Status.OK); | |
} | |
return response; | |
} | |
} |