WIP: working on MDMEntityResponse unification for request and response
Signed-off-by: Alexander Nehmer <a.nehmer@science-computing.de>
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogAttributeResource.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogAttributeResource.java
index 33cd403..9f3c14c 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogAttributeResource.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogAttributeResource.java
@@ -19,7 +19,6 @@
import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID2;
import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
import static org.eclipse.mdm.businessobjects.utils.Decomposer.decompose;
-import static org.eclipse.mdm.businessobjects.utils.ServiceUtils.L;
import static org.eclipse.mdm.businessobjects.utils.ServiceUtils.SL;
import javax.ejb.EJB;
@@ -42,7 +41,6 @@
import org.eclipse.mdm.api.dflt.model.CatalogComponent;
import org.eclipse.mdm.businessobjects.entity.MDMEntity;
import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
-import org.eclipse.mdm.businessobjects.entity.MDMRelation;
import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
import org.eclipse.mdm.businessobjects.service.EntityService;
import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
@@ -130,22 +128,12 @@
@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String catCompId,
MDMEntityResponse body) {
return entityService
- .create(sourceName, CatalogAttribute.class, L(
- decompose(body::getData).<MDMEntity>getAt(0).get(MDMEntity::getName),
- entityService.getEnumerationValueSupplier(decompose(body::getData).<MDMEntity>getAt(0)
- .get(MDMEntity::getAttributes) //
- .get(attrs -> attrs.stream()
- .filter(attr -> attr.getName().equals(CatalogAttribute.VATTR_SCALAR_TYPE))
- .findFirst().get().getValue())),
- entityService.find(sourceName, Unit.class,
- // get id of related Unit
- decompose(body::getData).<MDMEntity>getAt(0) //
- .get(e -> e.getRelations().stream() //
- .filter(r -> r.getEntityType().equals(Unit.class.getSimpleName())) //
- .findFirst().get()) //
- .get(MDMRelation::getIds).getValueAt(0)),
- entityService.find(sourceName, CatalogComponent.class, catCompId,
- ServiceUtils.getContextTypeSupplier(contextTypeParam))))
+ .create(sourceName, CatalogAttribute.class,
+ entityService
+ .extractArgumentsFromRequestBody(sourceName, body, List.of("Name", "@ScalarType"),
+ List.of(Unit.class))
+ .append(entityService.find(sourceName, CatalogComponent.class, catCompId,
+ ServiceUtils.getContextTypeSupplier(contextTypeParam))))
.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/MeasurementResource.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/MeasurementResource.java
index ce8357d..d1d7a72 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/MeasurementResource.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/MeasurementResource.java
@@ -17,7 +17,6 @@
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.utils.Decomposer.decompose;
-import static org.eclipse.mdm.businessobjects.utils.ServiceUtils.L;
import static org.eclipse.mdm.businessobjects.utils.ServiceUtils.V;
import javax.ejb.EJB;
@@ -46,7 +45,6 @@
import org.eclipse.mdm.businessobjects.entity.I18NResponse;
import org.eclipse.mdm.businessobjects.entity.MDMEntity;
import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
-import org.eclipse.mdm.businessobjects.entity.MDMRelation;
import org.eclipse.mdm.businessobjects.entity.SearchAttributeResponse;
import org.eclipse.mdm.businessobjects.service.ContextService;
import org.eclipse.mdm.businessobjects.service.EntityFileLink;
@@ -59,9 +57,7 @@
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;
import io.vavr.control.Try;
/**
@@ -180,7 +176,7 @@
@Consumes(MediaType.APPLICATION_JSON)
@Path("/{" + REQUESTPARAM_ID + "}/contexts")
public Response updateContext(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
- @PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) {
+ @PathParam(REQUESTPARAM_ID) String id, ContextResponse body) {
return entityService.find(sourceName, Measurement.class, id)
.map(measurement -> contextService.updateContext(body, measurement)).map(ContextResponse::new)
@@ -223,7 +219,7 @@
@Consumes(MediaType.APPLICATION_JSON)
@Path("/{" + REQUESTPARAM_ID + "}/contexts/unitundertest")
public Response updateContextUUT(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
- @PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) {
+ @PathParam(REQUESTPARAM_ID) String id, ContextResponse body) {
return entityService.find(sourceName, Measurement.class, id)
.map(measurement -> contextService.updateContext(body, measurement, ContextType.UNITUNDERTEST))
@@ -266,7 +262,7 @@
@Consumes(MediaType.APPLICATION_JSON)
@Path("/{" + REQUESTPARAM_ID + "}/contexts/testsequence")
public Response updateContextTSQ(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
- @PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) {
+ @PathParam(REQUESTPARAM_ID) String id, ContextResponse body) {
return entityService.find(sourceName, Measurement.class, id)
.map(measurement -> contextService.updateContext(body, measurement, ContextType.TESTSEQUENCE))
@@ -309,7 +305,7 @@
@Consumes(MediaType.APPLICATION_JSON)
@Path("/{" + REQUESTPARAM_ID + "}/contexts/testequipment")
public Response updateContextTEQ(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
- @PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) {
+ @PathParam(REQUESTPARAM_ID) String id, ContextResponse body) {
return entityService.find(sourceName, Measurement.class, id)
.map(measurement -> contextService.updateContext(body, measurement, ContextType.TESTEQUIPMENT))
@@ -365,23 +361,16 @@
* @return the created {@link Measurement} as {@link Response}.
*/
@POST
- @Operation(summary = "Create a new Measurement", responses = {
+ @Operation(summary = "Create a new Measurement", responses = {
@ApiResponse(description = "The created Measurement", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
@ApiResponse(responseCode = "500", description = "Error") })
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, MDMEntityResponse body) {
- Seq<Value<?>> args = L(decompose(body::getData).<MDMEntity>getAt(0).get(MDMEntity::getName),
- // get PhysDim
- entityService.find(sourceName, TestStep.class,
- // get id of related TestStep
- decompose(body::getData).<MDMEntity>getAt(0) //
- .get(e -> e.getRelations().stream() //
- .filter(r -> r.getEntityType().equals(TestStep.class.getSimpleName())) //
- .findFirst().get()) //
- .get(MDMRelation::getIds).getValueAt(0)),
- V(new ContextRoot[] {}));
- return entityService.create(sourceName, Measurement.class, args)
+ return entityService
+ .create(sourceName, Measurement.class,
+ entityService.extractArgumentsFromRequestBody(sourceName, body, List.of("Name"),
+ List.of(TestStep.class)).append(V(new ContextRoot[] {})))
.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
}
@@ -451,7 +440,7 @@
@Path("/{" + REQUESTPARAM_ID + "}/files/{remotePath}")
public Response streamFileLink(
@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
- @Parameter(description = "ID of the Measurement containing the file link", required = true) @PathParam(REQUESTPARAM_ID) String id,
+ @Parameter(description = "ID of the Measurement containing the file link", required = true) @PathParam(REQUESTPARAM_ID) String id,
@Parameter(description = "The remote path of the file link whose content is to be retrieved", required = true) @PathParam("remotePath") String remotePath) {
return entityService.find(sourceName, Measurement.class, id).map(fa -> new EntityFileLink(fa, remotePath))
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PoolResource.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PoolResource.java
index 27ac6e8..daf75be 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PoolResource.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PoolResource.java
@@ -185,7 +185,8 @@
return entityService
.create(sourceName, Pool.class,
- entityService.extractArgumentsFromRequestBody(sourceName, body, List.of(Project.class)))
+ entityService.extractArgumentsFromRequestBody(sourceName, body, List.of("Name"),
+ List.of(Project.class)))
.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestResource.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestResource.java
index f8c2dd1..16a18e7 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestResource.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestResource.java
@@ -193,7 +193,7 @@
return entityService
.create(sourceName, Test.class,
- entityService.extractArgumentsFromRequestBody(sourceName, body,
+ entityService.extractArgumentsFromRequestBody(sourceName, body, List.of("Name"),
List.of(Pool.class, TemplateTest.class)))
.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestStepResource.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestStepResource.java
index 3cc9254..2b1cc1f 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestStepResource.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestStepResource.java
@@ -176,7 +176,7 @@
@Consumes(MediaType.APPLICATION_JSON)
@Path("/{" + REQUESTPARAM_ID + "}/contexts")
public Response updateContext(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
- @PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) {
+ @PathParam(REQUESTPARAM_ID) String id, ContextResponse body) {
return entityService.find(sourceName, TestStep.class, id)
.map(testStep -> contextService.updateContext(body, testStep)).map(ContextResponse::new)
@@ -218,7 +218,7 @@
@Consumes(MediaType.APPLICATION_JSON)
@Path("/{" + REQUESTPARAM_ID + "}/contexts/unitundertest")
public Response updateContextUUT(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
- @PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) {
+ @PathParam(REQUESTPARAM_ID) String id, ContextResponse body) {
return entityService.find(sourceName, TestStep.class, id)
.map(testStep -> contextService.updateContext(body, testStep, ContextType.UNITUNDERTEST))
@@ -260,7 +260,7 @@
@Consumes(MediaType.APPLICATION_JSON)
@Path("/{" + REQUESTPARAM_ID + "}/contexts/testsequence")
public Response updateContextTSQ(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
- @PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) {
+ @PathParam(REQUESTPARAM_ID) String id, ContextResponse body) {
return entityService.find(sourceName, TestStep.class, id)
.map(testStep -> contextService.updateContext(body, testStep, ContextType.TESTSEQUENCE))
@@ -302,7 +302,7 @@
@Consumes(MediaType.APPLICATION_JSON)
@Path("/{" + REQUESTPARAM_ID + "}/contexts/testequipment")
public Response updateContextTEQ(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
- @PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) {
+ @PathParam(REQUESTPARAM_ID) String id, ContextResponse body) {
return entityService.find(sourceName, TestStep.class, id)
.map(testStep -> contextService.updateContext(body, testStep, ContextType.TESTEQUIPMENT))
@@ -358,17 +358,18 @@
* @return the created {@link TestStep} as {@link Response}.
*/
@POST
- @Operation(summary = "Create a new TestStep", responses = {
+ @Operation(summary = "Create a new TestStep", responses = {
@ApiResponse(description = "The created TestStep", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
@ApiResponse(responseCode = "500", description = "Error") })
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response create(
- @Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName, MDMEntityResponse body) {
+ @Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+ MDMEntityResponse body) {
return entityService
.create(sourceName, TestStep.class,
- entityService.extractArgumentsFromRequestBody(sourceName, body,
+ entityService.extractArgumentsFromRequestBody(sourceName, body, List.of("Name"),
List.of(Test.class, TemplateTestStep.class)))
.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
@@ -391,10 +392,10 @@
@Consumes(MediaType.APPLICATION_JSON)
@Path("/{" + REQUESTPARAM_ID + "}")
public Response patch(
- @Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+ @Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
@Parameter(description = "ID of the TestStep", required = true) @PathParam(REQUESTPARAM_ID) String id,
MDMEntityResponse body) {
-
+
return entityService
.update(sourceName, entityService.find(sourceName, TestStep.class, id),
decompose(body::getData).<MDMEntity>getValueAt(0))
@@ -442,7 +443,7 @@
@Path("/{" + REQUESTPARAM_ID + "}/files/{remotePath}")
public Response streamFileLink(
@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
- @Parameter(description = "ID of the TestStep containing the file link", required = true) @PathParam(REQUESTPARAM_ID) String id,
+ @Parameter(description = "ID of the TestStep containing the file link", required = true) @PathParam(REQUESTPARAM_ID) String id,
@Parameter(description = "The remote path of the file link whose content is to be retrieved", required = true) @PathParam("remotePath") String remotePath) {
return entityService.find(sourceName, TestStep.class, id).map(fa -> new EntityFileLink(fa, remotePath))
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextResponse.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextResponse.java
index bbcbc11..2286e49 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextResponse.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextResponse.java
@@ -63,6 +63,12 @@
}
/**
+ * Default constructor
+ */
+ public ContextResponse() {
+ }
+
+ /**
* returns the context data
*
* @return the context data
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/ContextService.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/ContextService.java
index 9169ac8..954fe6c 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/ContextService.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/ContextService.java
@@ -17,6 +17,7 @@
import static org.eclipse.mdm.businessobjects.control.ContextActivity.CONTEXT_GROUP_MEASURED;
import static org.eclipse.mdm.businessobjects.control.ContextActivity.CONTEXT_GROUP_ORDERED;
+import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.NoSuchElementException;
@@ -25,6 +26,7 @@
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.inject.Inject;
+import javax.ws.rs.BadRequestException;
import org.eclipse.mdm.api.base.Transaction;
import org.eclipse.mdm.api.base.model.ContextComponent;
@@ -39,15 +41,19 @@
import org.eclipse.mdm.api.dflt.model.EntityFactory;
import org.eclipse.mdm.api.dflt.model.TemplateRoot;
import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
-import org.eclipse.mdm.businessobjects.control.ContextActivity;
import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
+import org.eclipse.mdm.businessobjects.entity.ContextCollection;
+import org.eclipse.mdm.businessobjects.entity.ContextResponse;
import org.eclipse.mdm.businessobjects.entity.MDMAttribute;
import org.eclipse.mdm.businessobjects.entity.MDMEntity;
-import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
+import org.eclipse.mdm.businessobjects.utils.Decomposer;
+import org.eclipse.mdm.businessobjects.utils.ISODateDeseralizer;
import org.eclipse.mdm.businessobjects.utils.Serializer;
-import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
import org.eclipse.mdm.connector.boundary.ConnectorService;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
import com.google.common.base.Strings;
import io.vavr.Lazy;
@@ -223,30 +229,42 @@
* all contextTypes.
* @return
*/
- public DescribableContexts updateContext(MDMEntityResponse body, ContextDescribable contextDescribable,
+ public DescribableContexts updateContext(ContextResponse body, ContextDescribable contextDescribable,
ContextType... contextTypes) {
- Try<Map<String, Object>> contextMap = Try.of(() -> body.getData().get(0)).map(this::transformMap);
- DescribableContexts ec = updateContext(getTestStep(contextDescribable), contextMap,
+ ContextCollection contextCollection = Decomposer.decompose(body::getData).<ContextCollection>getValueAt(0);
+
+ DescribableContexts ec = updateContext(getTestStep(contextDescribable), contextCollection,
getContextTypes(contextTypes));
persist(ec);
return ec;
}
- private DescribableContexts updateContext(TestStep testStep, Try<Map<String, Object>> contextMap,
+ private HashMap<String, Object> deserializeRequestBody(String body) {
+ ObjectMapper mapper = new ObjectMapper();
+ SimpleModule simpleModule = new SimpleModule();
+ simpleModule.addDeserializer(Object.class, new ISODateDeseralizer());
+ mapper.registerModule(simpleModule);
+
+ try {
+ return HashMap.ofAll(mapper.readValue(body, new TypeReference<java.util.Map<String, Object>>() {
+ }));
+ } catch (IOException e) {
+ throw new BadRequestException("Body of request could not be deserialized", e);
+ }
+ }
+
+ private DescribableContexts updateContext(TestStep testStep, ContextCollection contextCollection,
ContextType[] contextTypes) {
- Map<ContextType, Object> orderedMap = contextMap.get().get(ContextActivity.CONTEXT_GROUP_ORDERED)
- .map(this::transformMap).getOrElse(HashMap.empty())
- .mapKeys(t -> ServiceUtils.getContextTypeSupplier(t).get())
+
+ Map<ContextType, java.util.List<MDMEntity>> orderedMap = HashMap.ofAll(contextCollection.ordered)
.filterKeys(t -> Arrays.asList(contextTypes).contains(t));
DescribableContexts ec = new DescribableContexts();
ec.setTestStep(testStep);
ec.setOrdered(updateContextDescribableContext(testStep, orderedMap, contextTypes));
- Map<ContextType, Object> measuredMap = contextMap.get().get(ContextActivity.CONTEXT_GROUP_MEASURED)
- .map(this::transformMap).getOrElse(HashMap.empty())
- .mapKeys(t -> ServiceUtils.getContextTypeSupplier(t).get())
+ Map<ContextType, java.util.List<MDMEntity>> measuredMap = HashMap.ofAll(contextCollection.measured)
.filterKeys(t -> Arrays.asList(contextTypes).contains(t));
ec.setMeasurements(getEntityManager(testStep.getSourceName()).loadChildren(testStep, Measurement.class));
@@ -257,7 +275,8 @@
}
private java.util.Map<ContextType, ContextRoot> updateContextDescribableContext(
- ContextDescribable contextDescribable, Map<ContextType, Object> rootMap, ContextType[] contextTypes) {
+ ContextDescribable contextDescribable, Map<ContextType, java.util.List<MDMEntity>> rootMap,
+ ContextType[] contextTypes) {
java.util.Map<ContextType, ContextRoot> existingRootMap = getEntityManager(contextDescribable.getSourceName())
.loadContexts(contextDescribable, contextTypes);
@@ -284,8 +303,8 @@
}
}
- private void updateContextRoot(ContextRoot existingRoot, Object newContextRoot) {
- transformList(newContextRoot).map(this::transformMap).map(this::transformToMDMEntity).forEach(mdmEntity -> {
+ private void updateContextRoot(ContextRoot existingRoot, java.util.List<MDMEntity> newContextRoot) {
+ newContextRoot.forEach(mdmEntity -> {
ContextComponent comp = existingRoot.getContextComponent(mdmEntity.getName())
.orElseGet(() -> getEntityFactory(existingRoot.getSourceName())
.createContextComponent(mdmEntity.getName(), existingRoot));
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/EntityService.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/EntityService.java
index 5b5b03f..317598d 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/EntityService.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/EntityService.java
@@ -461,45 +461,77 @@
}
/**
- * see
- * {@link #extractArgumentsFromRequestBody(String, MDMEntityResponse, boolean, Class...)}
+ * Extract arguments from request defaulting to extract MDMEntity.name see also
+ * {@link #extractArgumentsFromRequestBody(String, MDMEntityResponse, List, List)}
*/
public Seq<Value<?>> extractArgumentsFromRequestBody(String sourceName, MDMEntityResponse body) {
- return extractArgumentsFromRequestBody(sourceName, body, List.empty());
+ return extractArgumentsFromRequestBody(sourceName, body, List.of("Name"), List.empty());
}
/**
* Extract arguments from request body to use for {@link EntityFactory} create
- * methods.
+ * methods. If and argument given by attributeArguments or relationArguments
+ * cannot be found, they are skipped.
*
- * @param sourceName name of the source (MDM {@link Environment}
- * name)
- * @param body deserialized request to extract arguments from
- * @param relatedEntityArguments classes of related entities to extract from
- * request
- * @return the extracted arguments
+ * @param sourceName name of the source (MDM {@link Environment} name)
+ * @param body deserialized request to extract arguments from
+ * @param attributeArguments list of names of attributes to extract values from
+ * @param relationArguments classes of related entities to extract from
+ * @return the extracted arguments as a {@link Seq} of {@link Value}.
*/
public final Seq<Value<?>> extractArgumentsFromRequestBody(String sourceName, MDMEntityResponse body,
- List<Class<? extends Entity>> relatedEntityArguments) {
- List<Try<?>> name;
+ List<String> attributeArguments, List<Class<? extends Entity>> relationArguments) {
+ List<Try<?>> extractedArguments = List.empty();
- // then name attribute can be omitted in some cases
- Try<Decomposer<String>> nameTry = Try
- .of(() -> decompose(body::getData).<MDMEntity>getAt(0).get(MDMEntity::getName));
- if (!nameTry.isFailure()) {
- name = List.of(nameTry.get());
- } else {
- name = List.empty();
+ // if there arguments to be extracted from MDMEntity.attributes
+ if (attributeArguments != null) {
+ // although the name of the entity to be created is an attribute, it could also
+ // be given as MDMEntity.name instead of MDMEntity.attributes("Name")
+ extractedArguments = extractedArguments.appendAll(
+ attributeArguments.filter(attrName -> attrName.equalsIgnoreCase("name")).map(attrName -> Try
+ .of(() -> decompose(body::getData).<MDMEntity>getAt(0).get(MDMEntity::getName)).get()));
+
+ extractedArguments = extractedArguments
+ // ignore name attr if already processed
+ .appendAll(attributeArguments.filter(attrName -> !attrName.equalsIgnoreCase("name"))//
+ .map(attrName -> Try.of(() -> //
+ decompose(body::getData) //
+ .<MDMEntity>getAt(0) //
+ .<MDMAttribute, String>getFiltered(MDMEntity::getAttributes, MDMAttribute::getName,
+ attrName) //
+ .map(attr -> {
+ Object value = attr.getValue().toString();
+ if (attr.getDataType().equals("ENUMERATION")) {
+ value = EnumRegistry.getInstance().get(EnumRegistry.VALUE_TYPE)
+ .valueOf(value.toString());
+ }
+ return value;
+ }).get())));
}
// wrap find in Try to handle non-existing relation (not all entityClasses must
// exist as a relation)
- return relatedEntityArguments.map(clazz -> Try.of(() -> find(sourceName, clazz, //
- decompose(body::getData).<MDMEntity>getAt(0) //
- .<MDMRelation, String>getFiltered(MDMEntity::getRelations, MDMRelation::getEntityType,
- clazz.getSimpleName()) //
- .get(MDMRelation::getIds).getValueAt(0)).get()))
- .foldLeft(name, (l, e) -> l.append(e)).filter(Try::isSuccess).map(Try::toOption);
+ if (relationArguments != null) {
+ extractedArguments = extractedArguments
+ .appendAll(relationArguments.map(clazz -> Try.of(() -> find(sourceName, clazz, //
+ // get IDs of related entities
+ decompose(body::getData).<MDMEntity>getAt(0) //
+ .<MDMRelation, String>getFiltered(MDMEntity::getRelations,
+ MDMRelation::getEntityType, clazz.getSimpleName()) //
+ .get(MDMRelation::getIds).getValueAt(0),
+ // get ContextType; if not present, find() ignores null value
+ Try.of(() -> decompose(body::getData).<MDMEntity>getAt(0) //
+ .<MDMRelation, String>getFiltered(MDMEntity::getRelations,
+ MDMRelation::getEntityType, clazz.getSimpleName()) //
+ .get(MDMRelation::getContextType)).getOrElse((Decomposer<ContextType>) null)) //
+ .get())));
+ }
+
+ // log failures as warnings
+ extractedArguments.filter(Try::isFailure)
+ .forEach(failure -> LOGGER.warn("Argument to extract not found: {}", failure.getCause().getMessage()));
+
+ return extractedArguments.filter(Try::isSuccess).map(Try::toOption);
}
/**
@@ -909,8 +941,7 @@
}
return entityClasses
- .map(clazz -> find(sourceName, clazz,
- requestBody.getStringValueSupplier(clazz.getSimpleName()).get()))
+ .map(clazz -> find(sourceName, clazz, requestBody.getStringValueSupplier(clazz.getSimpleName()).get()))
.foldLeft(name, (l, e) -> l.append(e)).filter(Try::isSuccess).map(Try::toOption);
}
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ISODateDeseralizer.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ISODateDeseralizer.java
index 5c5e691..cfeb3f0 100755
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ISODateDeseralizer.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ISODateDeseralizer.java
@@ -33,7 +33,7 @@
* @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
*
*/
-class ISODateDeseralizer extends UntypedObjectDeserializer {
+public class ISODateDeseralizer extends UntypedObjectDeserializer {
private static final long serialVersionUID = 1L;