added newVersion endpoint for TplTestStep and TplTest 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/ResourceConstants.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ResourceConstants.java index 8ad824f..b6d8b4a 100644 --- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ResourceConstants.java +++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ResourceConstants.java
@@ -50,6 +50,11 @@ public static final String REQUESTPARAM_ID = "ID"; /** + * Parameter holding the {@link Entity}s name in the URI path + */ + public static final String REQUESTPARAM_NAME = "NAME"; + + /** * Parameter holding an additional {@link Entity}s id in the URI path, e.g. for * a {@link TemplateComponent} when {@link REQUESTPARAM_ID} holds the id of the * {@link TemplateRoot}.
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateRootResource.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateRootResource.java index 2d02130..9f86259 100644 --- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateRootResource.java +++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateRootResource.java
@@ -41,7 +41,7 @@ import org.eclipse.mdm.businessobjects.entity.MDMEntityAction; import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse; import org.eclipse.mdm.businessobjects.entity.SearchAttribute; -import org.eclipse.mdm.businessobjects.service.TemplateRootService; +import org.eclipse.mdm.businessobjects.service.TemplateService; import org.eclipse.mdm.businessobjects.utils.ServiceUtils; import io.swagger.v3.oas.annotations.tags.Tag; @@ -57,7 +57,7 @@ public class TemplateRootResource { @EJB - private TemplateRootService tplRootService; + private TemplateService tplService; /** * Returns the found {@link TemplateRoot}. @@ -73,7 +73,7 @@ @Path("/{" + REQUESTPARAM_ID + "}") public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String id) { - return tplRootService + return tplService .find(sourceName, TemplateRoot.class, id, ServiceUtils.getContextTypeSupplier(contextTypeParam)) .map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) // .recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) // @@ -92,7 +92,7 @@ @Produces(MediaType.APPLICATION_JSON) public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @QueryParam("filter") String filter) { - return tplRootService + return tplService .findAll(sourceName, TemplateRoot.class, filter, ServiceUtils.getContextTypeSupplier(contextTypeParam)) .map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) // .recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) // @@ -110,7 +110,7 @@ @Consumes(MediaType.APPLICATION_JSON) public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, MDMEntityResponse body) { - return tplRootService + return tplService .create(sourceName, TemplateRoot.class, L(ServiceUtils.getContextTypeSupplier(contextTypeParam), decompose(body::getData).<MDMEntity>getAt(0).get(MDMEntity::getName))) @@ -135,9 +135,9 @@ public Response patch(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) { - return tplRootService + return tplService .update(sourceName, - tplRootService.find(sourceName, TemplateRoot.class, id, + tplService.find(sourceName, TemplateRoot.class, id, ServiceUtils.getContextTypeSupplier(contextTypeParam)), decompose(body::getData).<MDMEntity>getValueAt(0)) .map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) // @@ -156,9 +156,9 @@ @Path("/{" + REQUESTPARAM_ID + "}") public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String id) { - return tplRootService + return tplService .delete(sourceName, - tplRootService.find(sourceName, TemplateRoot.class, id, + tplService.find(sourceName, TemplateRoot.class, id, ServiceUtils.getContextTypeSupplier(contextTypeParam))) .map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) // .recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) // @@ -187,7 +187,7 @@ .entity(String.format("Given action '%s' is not supported", entityAction.getType().name())).build(); } - return tplRootService.createNewVersion(sourceName, ServiceUtils.getContextTypeSupplier(contextTypeParam), id) + return tplService.createTplRootVersion(sourceName, ServiceUtils.getContextTypeSupplier(contextTypeParam), id) .map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED)) // .recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) // .getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE); @@ -204,7 +204,7 @@ @Produces(MediaType.APPLICATION_JSON) @Path("/searchattributes") public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) { - return ServiceUtils.buildSearchAttributesResponse(sourceName, TemplateRoot.class, tplRootService); + return ServiceUtils.buildSearchAttributesResponse(sourceName, TemplateRoot.class, tplService); } /** @@ -218,6 +218,6 @@ @Produces(MediaType.APPLICATION_JSON) @Path("/localizations") public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) { - return ServiceUtils.buildLocalizationResponse(sourceName, TemplateRoot.class, tplRootService); + return ServiceUtils.buildLocalizationResponse(sourceName, TemplateRoot.class, tplService); } } \ No newline at end of file
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestResource.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestResource.java index 9a26798..b82debd 100644 --- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestResource.java +++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestResource.java
@@ -15,6 +15,7 @@ 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_NAME; 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; @@ -33,11 +34,13 @@ import javax.ws.rs.core.Response.Status; import org.eclipse.mdm.api.base.model.Environment; +import org.eclipse.mdm.api.dflt.model.TemplateRoot; import org.eclipse.mdm.api.dflt.model.TemplateTest; +import org.eclipse.mdm.api.dflt.model.TemplateTestStep; import org.eclipse.mdm.businessobjects.entity.MDMEntity; import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse; import org.eclipse.mdm.businessobjects.entity.SearchAttribute; -import org.eclipse.mdm.businessobjects.service.EntityService; +import org.eclipse.mdm.businessobjects.service.TemplateService; import org.eclipse.mdm.businessobjects.utils.ServiceUtils; import io.swagger.v3.oas.annotations.tags.Tag; @@ -53,7 +56,7 @@ public class TemplateTestResource { @EJB - private EntityService entityService; + private TemplateService tplService; /** * Returns the found {@link TemplateTest}. @@ -66,7 +69,7 @@ @Produces(MediaType.APPLICATION_JSON) @Path("/{" + REQUESTPARAM_ID + "}") public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id) { - return entityService.find(sourceName, TemplateTest.class, id) + return tplService.find(sourceName, TemplateTest.class, id) .map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) // .recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) // .getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE); @@ -83,7 +86,7 @@ @Produces(MediaType.APPLICATION_JSON) public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @QueryParam("filter") String filter) { - return entityService.findAll(sourceName, TemplateTest.class, filter) + return tplService.findAll(sourceName, TemplateTest.class, filter) .map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) // .recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) // .getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE); @@ -99,7 +102,7 @@ @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, MDMEntityResponse body) { - return entityService + return tplService .create(sourceName, TemplateTest.class, L(decompose(body::getData).<MDMEntity>getAt(0).get(MDMEntity::getName))) .map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED)) @@ -122,8 +125,7 @@ @Path("/{" + REQUESTPARAM_ID + "}") public Response patch(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) { - return entityService - .update(sourceName, entityService.find(sourceName, TemplateTest.class, id), + return tplService.update(sourceName, tplService.find(sourceName, TemplateTest.class, id), decompose(body::getData).<MDMEntity>getValueAt(0)) .map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) // .recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) // @@ -131,6 +133,27 @@ } /** + * Creates new version of given {@link TemplateTestStep}. + * + * @param sourceName name of the source (MDM {@link Environment} name) + * @param id the identifier of the {@link TemplateRoot} to create new + * version of + * @return a new version of given {@link TemplateTestStep} + */ + @POST + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + @Path("/{" + REQUESTPARAM_NAME + "}/versions") + public Response createNewVersion(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, + @PathParam(REQUESTPARAM_NAME) String name) { + + return tplService.createTplTestVersion(sourceName, name) + .map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED)) // + .recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) // + .getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE); + } + + /** * Deletes and returns the deleted {@link TemplateTest}. * * @param id The identifier of the {@link TemplateTest} to delete. @@ -141,7 +164,7 @@ @Path("/{" + REQUESTPARAM_ID + "}") public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id) { - return entityService.delete(sourceName, entityService.find(sourceName, TemplateTest.class, id)) + return tplService.delete(sourceName, tplService.find(sourceName, TemplateTest.class, id)) .map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) // .recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) // .getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE); @@ -157,7 +180,7 @@ @Produces(MediaType.APPLICATION_JSON) @Path("/searchattributes") public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) { - return ServiceUtils.buildSearchAttributesResponse(sourceName, TemplateTest.class, entityService); + return ServiceUtils.buildSearchAttributesResponse(sourceName, TemplateTest.class, tplService); } /** @@ -170,6 +193,6 @@ @Produces(MediaType.APPLICATION_JSON) @Path("/localizations") public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) { - return ServiceUtils.buildLocalizationResponse(sourceName, TemplateTest.class, entityService); + return ServiceUtils.buildLocalizationResponse(sourceName, TemplateTest.class, tplService); } } \ No newline at end of file
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestStepResource.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestStepResource.java index 413e10d..664d566 100644 --- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestStepResource.java +++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestStepResource.java
@@ -15,6 +15,7 @@ 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_NAME; 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; @@ -34,11 +35,12 @@ import org.eclipse.mdm.api.base.model.ContextType; import org.eclipse.mdm.api.base.model.Environment; +import org.eclipse.mdm.api.dflt.model.TemplateRoot; import org.eclipse.mdm.api.dflt.model.TemplateTestStep; import org.eclipse.mdm.businessobjects.entity.MDMEntity; import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse; import org.eclipse.mdm.businessobjects.entity.SearchAttribute; -import org.eclipse.mdm.businessobjects.service.EntityService; +import org.eclipse.mdm.businessobjects.service.TemplateService; import org.eclipse.mdm.businessobjects.utils.ServiceUtils; import io.swagger.v3.oas.annotations.tags.Tag; @@ -54,7 +56,7 @@ public class TemplateTestStepResource { @EJB - private EntityService entityService; + private TemplateService tplService; /** * Returns the found {@link TemplateTestStep}. @@ -69,7 +71,7 @@ @Produces(MediaType.APPLICATION_JSON) @Path("/{" + REQUESTPARAM_ID + "}") public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id) { - return entityService.find(sourceName, TemplateTestStep.class, id) + return tplService.find(sourceName, TemplateTestStep.class, id) .map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) // .recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) // .getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE); @@ -89,7 +91,7 @@ @Produces(MediaType.APPLICATION_JSON) public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @QueryParam("filter") String filter) { - return entityService.findAll(sourceName, TemplateTestStep.class, filter) + return tplService.findAll(sourceName, TemplateTestStep.class, filter) .map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) // .recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) // .getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE); @@ -105,7 +107,7 @@ @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, MDMEntityResponse body) { - return entityService + return tplService .create(sourceName, TemplateTestStep.class, L(decompose(body::getData).<MDMEntity>getAt(0).get(MDMEntity::getName))) .map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED)) // @@ -128,8 +130,7 @@ @Path("/{" + REQUESTPARAM_ID + "}") public Response patch(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) { - return entityService - .update(sourceName, entityService.find(sourceName, TemplateTestStep.class, id), + return tplService.update(sourceName, tplService.find(sourceName, TemplateTestStep.class, id), decompose(body::getData).<MDMEntity>getValueAt(0)) .map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) // .recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) // @@ -137,6 +138,27 @@ } /** + * Creates new version of given {@link TemplateTestStep}. + * + * @param sourceName name of the source (MDM {@link Environment} name) + * @param id the identifier of the {@link TemplateRoot} to create new + * version of + * @return a new version of given {@link TemplateTestStep} + */ + @POST + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + @Path("/{" + REQUESTPARAM_NAME + "}/versions") + public Response createNewVersion(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, + @PathParam(REQUESTPARAM_NAME) String name) { + + return tplService.createTplTestStepVersion(sourceName, name) + .map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED)) // + .recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) // + .getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE); + } + + /** * Deletes and returns the deleted {@link TemplateTestStep}. * * @param id The identifier of the {@link TemplateTestStep} to delete. @@ -147,7 +169,7 @@ @Path("/{" + REQUESTPARAM_ID + "}") public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id) { - return entityService.delete(sourceName, entityService.find(sourceName, TemplateTestStep.class, id)) + return tplService.delete(sourceName, tplService.find(sourceName, TemplateTestStep.class, id)) .map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) // .recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) // .getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE); @@ -163,7 +185,7 @@ @Produces(MediaType.APPLICATION_JSON) @Path("/searchattributes") public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) { - return ServiceUtils.buildSearchAttributesResponse(sourceName, TemplateTestStep.class, entityService); + return ServiceUtils.buildSearchAttributesResponse(sourceName, TemplateTestStep.class, tplService); } /** @@ -176,6 +198,6 @@ @Produces(MediaType.APPLICATION_JSON) @Path("/localizations") public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) { - return ServiceUtils.buildLocalizationResponse(sourceName, TemplateTestStep.class, entityService); + return ServiceUtils.buildLocalizationResponse(sourceName, TemplateTestStep.class, tplService); } } \ No newline at end of file
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/TemplateRootService.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/TemplateService.java similarity index 61% rename from org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/TemplateRootService.java rename to org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/TemplateService.java index d06c762..a218aca 100644 --- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/TemplateRootService.java +++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/TemplateService.java
@@ -34,6 +34,11 @@ import org.eclipse.mdm.api.dflt.model.TemplateComponent; import org.eclipse.mdm.api.dflt.model.TemplateRoot; import org.eclipse.mdm.api.dflt.model.TemplateSensor; +import org.eclipse.mdm.api.dflt.model.TemplateTest; +import org.eclipse.mdm.api.dflt.model.TemplateTestStep; +import org.eclipse.mdm.api.dflt.model.TemplateTestStepUsage; +import org.eclipse.mdm.businessobjects.utils.EntityNotFoundException; +import org.eclipse.mdm.businessobjects.utils.EntityNotFoundException.Type; import io.vavr.Tuple; import io.vavr.Value; @@ -43,28 +48,129 @@ * {@link TemplateRoot} service handling corresponding operations * * @author Philipp Schweinbenz, science+computing AG Tuebingen (Atos SE) + * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE) * */ @Stateless -public class TemplateRootService extends EntityService { +public class TemplateService extends EntityService { /** - * Create new version of {@link TemplateRoot} with given id + * Create new version of {@link TemplateTest} with given name. The link linked + * {@link TemplateTestStep}s are copied. + * + * @param sourceNameSupplier a {@link Value} with the source name (MDM + * {@link Environment} name) + * @param name name of entity to create new version of + * @return new version of the {@link TemplateTestStep} with the given name + */ + @SuppressWarnings("unchecked") + public <T extends Entity> Try<T> createTplTestVersion(String sourceName, String name) { + return Try.of(() -> { + List<TemplateTest> tplTests = getEntityManager(sourceName) + .mapTry(em -> em.loadAll(TemplateTest.class, name)).get(); + if (tplTests.isEmpty()) { + throw new EntityNotFoundException(TemplateTestStep.class, name, Type.NAME); + } + + ApplicationContext appContext = connectorService.getContextByName(sourceName); + EntityFactory entityFactory = appContext.getEntityFactory().get(); + EntityManager entityManager = appContext.getEntityManager().get(); + + // get latest version + Comparator<TemplateTest> versionComparator = Comparator.comparing(TemplateTest::getVersion); + TemplateTest latestTplTest = tplTests.stream().max(versionComparator).get(); + + TemplateTest newTplTest = entityFactory.createTemplateTest(latestTplTest.getName()); + newTplTest.setVersion(latestTplTest.getVersion() + 1); + + Set<Entity> entities = (Set<Entity>) DataAccessHelper.execute(entityManager, + Tuple.of(newTplTest, DataAccessHelper.CREATE)); + + // set TplTestSteps as in latestVersion + for (TemplateTestStepUsage tplTestStepUsage : latestTplTest.getTemplateTestStepUsages()) { + TemplateTestStepUsage newUsage = entityFactory.createTemplateTestStepUsage(tplTestStepUsage.getName(), + newTplTest, tplTestStepUsage.getTemplateTestStep()); + DataAccessHelper.execute(entityManager, Tuple.of(newUsage, DataAccessHelper.CREATE)); + } + + return (T) entities.toArray()[0]; + }); + } + + /** + * Create new version of {@link TemplateTestStep} with given name. The linked + * TplRoots are copied from the given {@link TemplateTestStep} + * + * @param sourceNameSupplier a {@link Value} with the source name (MDM + * {@link Environment} name) + * @param name name of entity to create new version of + * @return new version of the {@link TemplateTestStep} with the given name + */ + @SuppressWarnings("unchecked") + public <T extends Entity> Try<T> createTplTestStepVersion(String sourceName, String name) { + return Try.of(() -> { + List<TemplateTestStep> tplTestSteps = getEntityManager(sourceName) + .mapTry(em -> em.loadAll(TemplateTestStep.class, name)).get(); + if (tplTestSteps.isEmpty()) { + throw new EntityNotFoundException(TemplateTestStep.class, name, Type.NAME); + } + TemplateTestStep givenTplTestStep = tplTestSteps.get(0); + ApplicationContext appContext = connectorService.getContextByName(sourceName); + TemplateTestStep newTplTestStep = copyTplTestStep(appContext.getEntityFactory().get(), + appContext.getEntityManager().get(), givenTplTestStep); + Set<Entity> entities = (Set<Entity>) DataAccessHelper.execute(getEntityManager(sourceName).get(), + Tuple.of(newTplTestStep, DataAccessHelper.CREATE)); + + return (T) entities.toArray()[0]; + }); + } + + /** + * Create a copy of a given {@link TemplateTestStep} and set version to latest + + * 1 + * + * @param entityFactory {@link EntityFactory} to create new + * {@link TemplateTestStep} + * @param entityManager {@link EntityManager} to get last version of given + * {@link TemplateTestStep} + * @param givenTplTestStep {@link TemplateTestStep} to create new version of + * @return copy of the given {@link TemplateTestStep} + */ + private TemplateTestStep copyTplTestStep(EntityFactory entityFactory, EntityManager entityManager, + TemplateTestStep givenTplTestStep) { + + TemplateTestStep newTemplateTestStep = entityFactory.createTemplateTestStep(givenTplTestStep.getName()); + Comparator<TemplateTestStep> versionComparator = Comparator.comparing(TemplateTestStep::getVersion); + Optional<Integer> latestVersion = entityManager.loadAll(TemplateTestStep.class, newTemplateTestStep.getName()) + .stream().max(versionComparator).map(TemplateTestStep::getVersion); + if (latestVersion.isPresent()) { + newTemplateTestStep.setVersion(latestVersion.get() + 1); + } + + for (TemplateRoot tplRoot : givenTplTestStep.getTemplateRoots()) { + newTemplateTestStep.setTemplateRoot(tplRoot); + } + + return newTemplateTestStep; + } + + /** + * * Create new version of {@link TemplateRoot} with given id * * @param sourceNameSupplier a {@link Value} with the source name (MDM * {@link Environment} name) * @param contextTypeSupplier a {@link Value} with the contextType of entity to * create new version of. * @param id id of entity to create new version of - * @return + * @return new version of the {@link TemplateRoot} with the given id */ @SuppressWarnings("unchecked") - public <T extends Entity> Try<T> createNewVersion(String sourceName, Value<ContextType> contextTypeSupplier, + public <T extends Entity> Try<T> createTplRootVersion(String sourceName, Value<ContextType> contextTypeSupplier, String id) { return Try.of(() -> { TemplateRoot givenTplRoot = find(sourceName, TemplateRoot.class, id, contextTypeSupplier).get(); ApplicationContext appContext = connectorService.getContextByName(sourceName); - TemplateRoot newTplRoot = createNewTplRootVersion(appContext.getEntityFactory().get(), + TemplateRoot newTplRoot = copyTplRoot(appContext.getEntityFactory().get(), appContext.getEntityManager().get(), givenTplRoot); Set<Entity> entities = (Set<Entity>) DataAccessHelper.execute(getEntityManager(sourceName).get(), Tuple.of(newTplRoot, DataAccessHelper.CREATE)); @@ -74,7 +180,7 @@ } /** - * Create new version of given {@link TemplateRoot} + * Create a copy of a given {@link TemplateRoot} and set version to latest + 1 * * @param entityFactory {@link EntityFactory} to create new {@link TemplateRoot} * @param entityManager {@link EntityManager} to get last version of given @@ -82,7 +188,7 @@ * @param givenTplRoot {@link TemplateRoot} to create new version of * @return */ - private TemplateRoot createNewTplRootVersion(EntityFactory entityFactory, EntityManager entityManager, + private TemplateRoot copyTplRoot(EntityFactory entityFactory, EntityManager entityManager, TemplateRoot givenTplRoot) { TemplateRoot newTemplateRoot = entityFactory.createTemplateRoot(givenTplRoot.getContextType(), givenTplRoot.getName()); @@ -112,24 +218,6 @@ } /** - * Copy given {@link TemplateAttribute}s into given {@link TemplateComponent} - * - * @param entityFactory {@link EntityFactory} to create new entities - * @param tplComp {@link TemplateComponent} into given - * {@link TemplateAttribute}s shall be copied - * @param givenTplAttrs {@link TemplateAttribute}s which shall be copied - */ - private void copyTplAttrs(EntityFactory entityFactory, TemplateComponent tplComp, - List<TemplateAttribute> givenTplAttrs) { - for (TemplateAttribute tplAttr : givenTplAttrs) { - TemplateAttribute newTplAttr = tplComp.getTemplateAttributes().stream() - .filter(ta -> ta.getName().equals(tplAttr.getName())).findFirst() - .orElseGet(() -> entityFactory.createTemplateAttribute(tplAttr.getName(), tplComp)); - mergeEntities(tplAttr, newTplAttr, Entity.ATTR_NAME, Entity.ATTR_MIMETYPE); - } - } - - /** * Copy given child {@link TemplateComponent}s into given * {@link TemplateComponent} * @@ -153,6 +241,24 @@ } /** + * Copy given {@link TemplateAttribute}s into given {@link TemplateComponent} + * + * @param entityFactory {@link EntityFactory} to create new entities + * @param tplComp {@link TemplateComponent} into given + * {@link TemplateAttribute}s shall be copied + * @param givenTplAttrs {@link TemplateAttribute}s which shall be copied + */ + private void copyTplAttrs(EntityFactory entityFactory, TemplateComponent tplComp, + List<TemplateAttribute> givenTplAttrs) { + for (TemplateAttribute tplAttr : givenTplAttrs) { + TemplateAttribute newTplAttr = tplComp.getTemplateAttributes().stream() + .filter(ta -> ta.getName().equals(tplAttr.getName())).findFirst() + .orElseGet(() -> entityFactory.createTemplateAttribute(tplAttr.getName(), tplComp)); + mergeEntities(tplAttr, newTplAttr, Entity.ATTR_NAME, Entity.ATTR_MIMETYPE); + } + } + + /** * Copy given {@link TemplateSeonsor}s into given {@link TemplateComponent} * * @param entityFactory {@link EntityFactory} to create new entities
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/EntityNotFoundException.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/EntityNotFoundException.java index 5a5ca75..7ec5115 100755 --- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/EntityNotFoundException.java +++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/EntityNotFoundException.java
@@ -26,6 +26,10 @@ private static final long serialVersionUID = 6862157710262117670L; + public enum Type { + ID, NAME; + } + /** * Default constructor with causing exception * @@ -41,9 +45,21 @@ * Default constructor without causing exception * * @param entityClass Class of entity that could not be found + * @param identifier identifier of entity (either {@link Type.id} or + * {@link Type.name} that could not be found + * @param type type of identifier + */ + public EntityNotFoundException(Class<? extends Entity> entityClass, String identifier, Type type) { + super(entityClass.getSimpleName() + " with " + type.toString() + " " + identifier + " not found."); + } + + /** + * Default constructor without causing exception + * + * @param entityClass Class of entity that could not be found * @param id id of entity that could not be found */ public EntityNotFoundException(Class<? extends Entity> entityClass, String id) { - super(entityClass.getSimpleName() + " with ID " + id + " not found."); + this(entityClass, id, Type.ID); } }