diff options
author | FrancescoFioraEst <francesco.fiora@est.tech> | 2022-12-01 09:15:22 +0000 |
---|---|---|
committer | FrancescoFioraEst <francesco.fiora@est.tech> | 2022-12-01 10:55:04 +0000 |
commit | b5d62899bf9cfaef5c9dcc49023428bbb12bcc55 (patch) | |
tree | d7325a4df408b39bf7b30789724631efbc738c91 /runtime-acm/src/main/java | |
parent | 7af90cd8fdabdd1c3ae79d3551980016d6b24f7e (diff) |
Refactor POST and PUT Automation Composition
Refactor POST and PUT Automation Composition to handle
a single resource instead of a list.
Issue-ID: POLICY-4470
Change-Id: Ic7025e1eafdd197487bc5268993ec5e3e5520025
Signed-off-by: FrancescoFioraEst <francesco.fiora@est.tech>
Diffstat (limited to 'runtime-acm/src/main/java')
3 files changed, 93 insertions, 173 deletions
diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java index 2601a233b..29b337edd 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java @@ -21,9 +21,7 @@ package org.onap.policy.clamp.acm.runtime.instantiation; -import java.util.ArrayList; import java.util.List; -import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; import javax.ws.rs.core.Response; @@ -44,8 +42,7 @@ import org.onap.policy.clamp.models.acm.utils.AcmUtils; import org.onap.policy.common.parameters.BeanValidationResult; import org.onap.policy.common.parameters.ObjectValidationResult; import org.onap.policy.common.parameters.ValidationStatus; -import org.onap.policy.models.base.PfModelException; -import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; +import org.onap.policy.models.base.PfModelRuntimeException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -65,75 +62,66 @@ public class AutomationCompositionInstantiationProvider { private static final String ENTRY = "entry "; /** - * Create automation compositions. + * Create automation composition. * - * @param automationCompositions the automation composition + * @param automationComposition the automation composition * @return the result of the instantiation operation - * @throws PfModelException on creation errors */ - public InstantiationResponse createAutomationCompositions(AutomationCompositions automationCompositions) - throws PfModelException { - for (AutomationComposition automationComposition : automationCompositions.getAutomationCompositionList()) { - var checkAutomationCompositionOpt = + public InstantiationResponse createAutomationComposition(AutomationComposition automationComposition) { + + var checkAutomationCompositionOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getKey().asIdentifier()); - if (checkAutomationCompositionOpt.isPresent()) { - throw new PfModelException(Response.Status.BAD_REQUEST, + if (checkAutomationCompositionOpt.isPresent()) { + throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, automationComposition.getKey().asIdentifier() + " already defined"); - } } - BeanValidationResult validationResult = validateAutomationCompositions(automationCompositions); + + var validationResult = validateAutomationComposition(automationComposition); if (!validationResult.isValid()) { - throw new PfModelException(Response.Status.BAD_REQUEST, validationResult.getResult()); + throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult()); } - automationCompositionProvider.saveAutomationCompositions(automationCompositions.getAutomationCompositionList()); + automationComposition = automationCompositionProvider.saveAutomationComposition(automationComposition); var response = new InstantiationResponse(); - response.setAffectedAutomationCompositions(automationCompositions.getAutomationCompositionList().stream() - .map(ac -> ac.getKey().asIdentifier()).collect(Collectors.toList())); + response.setAffectedAutomationComposition(automationComposition.getKey().asIdentifier()); return response; } /** - * Update automation compositions. + * Update automation composition. * - * @param automationCompositions the automation composition + * @param automationComposition the automation composition * @return the result of the instantiation operation - * @throws PfModelException on update errors */ - public InstantiationResponse updateAutomationCompositions(AutomationCompositions automationCompositions) - throws PfModelException { - BeanValidationResult validationResult = validateAutomationCompositions(automationCompositions); + public InstantiationResponse updateAutomationComposition(AutomationComposition automationComposition) { + var validationResult = validateAutomationComposition(automationComposition); if (!validationResult.isValid()) { - throw new PfModelException(Response.Status.BAD_REQUEST, validationResult.getResult()); + throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult()); } - automationCompositionProvider.saveAutomationCompositions(automationCompositions.getAutomationCompositionList()); + automationCompositionProvider.saveAutomationComposition(automationComposition); var response = new InstantiationResponse(); - response.setAffectedAutomationCompositions(automationCompositions.getAutomationCompositionList().stream() - .map(ac -> ac.getKey().asIdentifier()).collect(Collectors.toList())); + response.setAffectedAutomationComposition(automationComposition.getKey().asIdentifier()); return response; } /** - * Validate AutomationCompositions. + * Validate AutomationComposition. * - * @param automationCompositions AutomationCompositions to validate + * @param automationComposition AutomationComposition to validate * @return the result of validation - * @throws PfModelException if automationCompositions is not valid */ - private BeanValidationResult validateAutomationCompositions(AutomationCompositions automationCompositions) { - - var result = new BeanValidationResult("AutomationCompositions", automationCompositions); - for (var automationComposition : automationCompositions.getAutomationCompositionList()) { - var serviceTemplate = acDefinitionProvider.findAcDefinition(automationComposition.getCompositionId()); - if (serviceTemplate.isEmpty()) { - result.addResult(new ObjectValidationResult("ServiceTemplate", "", ValidationStatus.INVALID, - "Commissioned automation composition definition not found")); - } else { - result.addResult(AcmUtils.validateAutomationComposition(automationComposition, serviceTemplate.get())); - } + private BeanValidationResult validateAutomationComposition(AutomationComposition automationComposition) { + + var result = new BeanValidationResult("AutomationComposition", automationComposition); + var serviceTemplate = acDefinitionProvider.findAcDefinition(automationComposition.getCompositionId()); + if (serviceTemplate.isEmpty()) { + result.addResult(new ObjectValidationResult("ServiceTemplate", "", ValidationStatus.INVALID, + "Commissioned automation composition definition not found")); + } else { + result.addResult(AcmUtils.validateAutomationComposition(automationComposition, serviceTemplate.get())); } return result; } @@ -144,21 +132,20 @@ public class AutomationCompositionInstantiationProvider { * @param name the name of the automation composition to delete * @param version the version of the automation composition to delete * @return the result of the deletion - * @throws PfModelException on deletion errors */ - public InstantiationResponse deleteAutomationComposition(String name, String version) throws PfModelException { + public InstantiationResponse deleteAutomationComposition(String name, String version) { var automationCompositionOpt = automationCompositionProvider.findAutomationComposition(name, version); if (automationCompositionOpt.isEmpty()) { - throw new PfModelException(Response.Status.NOT_FOUND, "Automation composition not found"); + throw new PfModelRuntimeException(Response.Status.NOT_FOUND, "Automation composition not found"); } var automationComposition = automationCompositionOpt.get(); if (!AutomationCompositionState.UNINITIALISED.equals(automationComposition.getState())) { - throw new PfModelException(Response.Status.BAD_REQUEST, - "Automation composition state is still " + automationComposition.getState()); + throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, + "Automation composition state is still " + automationComposition.getState()); } var response = new InstantiationResponse(); - response.setAffectedAutomationCompositions( - List.of(automationCompositionProvider.deleteAutomationComposition(name, version).getKey().asIdentifier())); + response.setAffectedAutomationComposition( + automationCompositionProvider.deleteAutomationComposition(name, version).getKey().asIdentifier()); return response; } @@ -168,13 +155,12 @@ public class AutomationCompositionInstantiationProvider { * @param name the name of the automation composition to get, null for all automation compositions * @param version the version of the automation composition to get, null for all automation compositions * @return the automation compositions - * @throws PfModelException on errors getting automation compositions */ @Transactional(readOnly = true) - public AutomationCompositions getAutomationCompositions(String name, String version) throws PfModelException { + public AutomationCompositions getAutomationCompositions(String name, String version) { var automationCompositions = new AutomationCompositions(); automationCompositions - .setAutomationCompositionList(automationCompositionProvider.getAutomationCompositions(name, version)); + .setAutomationCompositionList(automationCompositionProvider.getAutomationCompositions(name, version)); return automationCompositions; } @@ -184,76 +170,64 @@ public class AutomationCompositionInstantiationProvider { * * @param command the command to issue to automation compositions * @return the result of the initiation command - * @throws PfModelException on errors setting the ordered state on the automation compositions * @throws AutomationCompositionException on ordered state invalid */ public InstantiationResponse issueAutomationCompositionCommand(InstantiationCommand command) - throws AutomationCompositionException, PfModelException { + throws AutomationCompositionException { if (command.getOrderedState() == null) { throw new AutomationCompositionException(Status.BAD_REQUEST, - "ordered state invalid or not specified on command"); + "ordered state invalid or not specified on command"); } var participants = participantProvider.getParticipants(); if (participants.isEmpty()) { throw new AutomationCompositionException(Status.BAD_REQUEST, "No participants registered"); } - var validationResult = new BeanValidationResult("InstantiationCommand", command); - List<AutomationComposition> automationCompositions = - new ArrayList<>(command.getAutomationCompositionIdentifierList().size()); - for (ToscaConceptIdentifier id : command.getAutomationCompositionIdentifierList()) { - var automationCompositionOpt = automationCompositionProvider.findAutomationComposition(id); - if (automationCompositionOpt.isEmpty()) { - validationResult.addResult("ToscaConceptIdentifier", id, ValidationStatus.INVALID, - "AutomationComposition with id " + id + " not found"); - } else { - var automationComposition = automationCompositionOpt.get(); - automationComposition.setCascadedOrderedState(command.getOrderedState()); - automationCompositions.add(automationComposition); - } - } - if (validationResult.isValid()) { - validationResult = validateIssueAutomationCompositions(automationCompositions, participants); + var automationCompositionOpt = + automationCompositionProvider.findAutomationComposition(command.getAutomationCompositionIdentifier()); + if (automationCompositionOpt.isEmpty()) { + throw new AutomationCompositionException(Response.Status.BAD_REQUEST, + "AutomationComposition with id " + command.getAutomationCompositionIdentifier() + " not found"); } + + var automationComposition = automationCompositionOpt.get(); + var validationResult = validateIssueAutomationComposition(automationComposition, participants); if (!validationResult.isValid()) { - throw new PfModelException(Response.Status.BAD_REQUEST, validationResult.getResult()); + throw new AutomationCompositionException(Response.Status.BAD_REQUEST, validationResult.getResult()); } - automationCompositionProvider.saveAutomationCompositions(automationCompositions); - supervisionHandler.triggerAutomationCompositionSupervision(command.getAutomationCompositionIdentifierList()); + automationComposition.setCascadedOrderedState(command.getOrderedState()); + supervisionHandler.triggerAutomationCompositionSupervision(automationComposition); + automationCompositionProvider.saveAutomationComposition(automationComposition); var response = new InstantiationResponse(); - response.setAffectedAutomationCompositions(command.getAutomationCompositionIdentifierList()); + response.setAffectedAutomationComposition(command.getAutomationCompositionIdentifier()); return response; } - private BeanValidationResult validateIssueAutomationCompositions(List<AutomationComposition> automationCompositions, - List<Participant> participants) { - var result = new BeanValidationResult("AutomationCompositions", automationCompositions); - - Map<ToscaConceptIdentifier, Participant> participantMap = participants.stream() - .collect(Collectors.toMap(participant -> participant.getKey().asIdentifier(), Function.identity())); + private BeanValidationResult validateIssueAutomationComposition(AutomationComposition automationComposition, + List<Participant> participants) { + var result = new BeanValidationResult("AutomationComposition", automationComposition); - for (AutomationComposition automationComposition : automationCompositions) { + var participantMap = participants.stream() + .collect(Collectors.toMap(participant -> participant.getKey().asIdentifier(), Function.identity())); - for (var element : automationComposition.getElements().values()) { + for (var element : automationComposition.getElements().values()) { - var subResult = new BeanValidationResult(ENTRY + element.getDefinition().getName(), element); - Participant p = participantMap.get(element.getParticipantId()); - if (p == null) { - subResult.addResult(new ObjectValidationResult(AUTOMATION_COMPOSITION_NODE_ELEMENT_TYPE, + var subResult = new BeanValidationResult(ENTRY + element.getDefinition().getName(), element); + var p = participantMap.get(element.getParticipantId()); + if (p == null) { + subResult.addResult(new ObjectValidationResult(AUTOMATION_COMPOSITION_NODE_ELEMENT_TYPE, element.getDefinition().getName(), ValidationStatus.INVALID, "Participant with ID " + element.getParticipantId() + " is not registered")); - } else if (!p.getParticipantType().equals(element.getParticipantType())) { - subResult.addResult(new ObjectValidationResult(AUTOMATION_COMPOSITION_NODE_ELEMENT_TYPE, + } else if (!p.getParticipantType().equals(element.getParticipantType())) { + subResult.addResult(new ObjectValidationResult(AUTOMATION_COMPOSITION_NODE_ELEMENT_TYPE, element.getDefinition().getName(), ValidationStatus.INVALID, "Participant with ID " + element.getParticipantType() + " - " + element.getParticipantId() - + " is not registered")); - } - result.addResult(subResult); + + " is not registered")); } - + result.addResult(subResult); } return result; diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/InstantiationController.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/InstantiationController.java index ba00c0ede..d575a690e 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/InstantiationController.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/InstantiationController.java @@ -34,10 +34,10 @@ import lombok.RequiredArgsConstructor; import org.onap.policy.clamp.acm.runtime.instantiation.AutomationCompositionInstantiationProvider; import org.onap.policy.clamp.acm.runtime.main.web.AbstractRestController; import org.onap.policy.clamp.common.acm.exception.AutomationCompositionException; +import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationCommand; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse; -import org.onap.policy.models.base.PfModelException; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; @@ -65,9 +65,8 @@ public class InstantiationController extends AbstractRestController { * Creates a automation composition. * * @param requestId request ID used in ONAP logging - * @param automationCompositions the automation compositions + * @param automationComposition the automation composition * @return a response - * @throws PfModelException on errors creating a automation composition */ // @formatter:off @PostMapping(value = "/instantiation", @@ -116,14 +115,13 @@ public class InstantiationController extends AbstractRestController { } ) // @formatter:on - public ResponseEntity<InstantiationResponse> create( + public ResponseEntity<InstantiationResponse> createCompositionInstance( @RequestHeader(name = REQUEST_ID_NAME, required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, @ApiParam( value = "Entity Body of automation composition", - required = true) @RequestBody AutomationCompositions automationCompositions) - throws PfModelException { + required = true) @RequestBody AutomationComposition automationComposition) { - return ResponseEntity.ok().body(provider.createAutomationCompositions(automationCompositions)); + return ResponseEntity.ok().body(provider.createAutomationComposition(automationComposition)); } /** @@ -133,7 +131,6 @@ public class InstantiationController extends AbstractRestController { * @param name the name of the automation composition to get, null for all automation compositions * @param version the version of the automation composition to get, null for all automation compositions * @return the automation compositions - * @throws PfModelException on errors getting commissioning of automation composition */ // @formatter:off @GetMapping(value = "/instantiation", @@ -172,15 +169,14 @@ public class InstantiationController extends AbstractRestController { } ) // @formatter:on - public ResponseEntity<AutomationCompositions> query( + public ResponseEntity<AutomationCompositions> queryCompositionInstances( @RequestHeader(name = REQUEST_ID_NAME, required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, @ApiParam(value = "Automation composition definition name", required = false) @RequestParam( value = "name", required = false) String name, @ApiParam(value = "Automation composition definition version", required = false) @RequestParam( value = "version", - required = false) String version) - throws PfModelException { + required = false) String version) { return ResponseEntity.ok().body(provider.getAutomationCompositions(name, version)); } @@ -189,9 +185,8 @@ public class InstantiationController extends AbstractRestController { * Updates a automation composition. * * @param requestId request ID used in ONAP logging - * @param automationCompositions the automation compositions + * @param automationComposition the automation composition * @return a response - * @throws PfModelException on errors updating of automation compositions */ // @formatter:off @PutMapping(value = "/instantiation", @@ -240,14 +235,13 @@ public class InstantiationController extends AbstractRestController { } ) // @formatter:on - public ResponseEntity<InstantiationResponse> update( + public ResponseEntity<InstantiationResponse> updateCompositionInstance( @RequestHeader(name = REQUEST_ID_NAME, required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, @ApiParam( value = "Entity Body of Automation Composition", - required = true) @RequestBody AutomationCompositions automationCompositions) - throws PfModelException { + required = true) @RequestBody AutomationComposition automationComposition) { - return ResponseEntity.ok().body(provider.updateAutomationCompositions(automationCompositions)); + return ResponseEntity.ok().body(provider.updateAutomationComposition(automationComposition)); } /** @@ -257,7 +251,6 @@ public class InstantiationController extends AbstractRestController { * @param name the name of the automation composition to delete * @param version the version of the automation composition to delete * @return a response - * @throws PfModelException on errors deleting of automation composition */ // @formatter:off @DeleteMapping(value = "/instantiation", @@ -304,13 +297,12 @@ public class InstantiationController extends AbstractRestController { ) // @formatter:on - public ResponseEntity<InstantiationResponse> delete( + public ResponseEntity<InstantiationResponse> deleteCompositionInstance( @RequestHeader(name = REQUEST_ID_NAME, required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, @ApiParam(value = "Automation composition definition name", required = true) @RequestParam("name") String name, @ApiParam(value = "Automation composition definition version") @RequestParam( value = "version", - required = true) String version) - throws PfModelException { + required = true) String version) { return ResponseEntity.ok().body(provider.deleteAutomationComposition(name, version)); } @@ -321,7 +313,6 @@ public class InstantiationController extends AbstractRestController { * @param requestId request ID used in ONAP logging * @param command the command to issue to automation compositions * @return the automation composition definitions - * @throws PfModelException on errors issuing a command * @throws AutomationCompositionException on errors issuing a command */ // @formatter:off @@ -367,7 +358,7 @@ public class InstantiationController extends AbstractRestController { @ApiParam( value = "Entity Body of automation composition command", required = true) @RequestBody InstantiationCommand command) - throws AutomationCompositionException, PfModelException { + throws AutomationCompositionException { return ResponseEntity.accepted().body(provider.issueAutomationCompositionCommand(command)); } diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java index b01aca5e8..b5d7645da 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java @@ -22,13 +22,11 @@ package org.onap.policy.clamp.acm.runtime.supervision; import io.micrometer.core.annotation.Timed; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; import javax.ws.rs.core.Response; import lombok.AllArgsConstructor; -import org.apache.commons.collections4.CollectionUtils; import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher; import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionUpdatePublisher; import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantDeregisterAckPublisher; @@ -52,7 +50,6 @@ import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvide import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider; import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider; import org.onap.policy.models.base.PfModelException; -import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -88,43 +85,6 @@ public class SupervisionHandler { private final ParticipantUpdatePublisher participantUpdatePublisher; /** - * Supervision trigger called when a command is issued on automation compositions. - * - * <p/> - * Causes supervision to start or continue supervision on the automation compositions in question. - * - * @param automationCompositionIdentifierList the automation compositions for which the supervision command has been - * issued - * @throws AutomationCompositionException on supervision triggering exceptions - */ - public void triggerAutomationCompositionSupervision( - List<ToscaConceptIdentifier> automationCompositionIdentifierList) throws AutomationCompositionException { - - LOGGER.debug("triggering automation composition supervision on automation compositions {}", - automationCompositionIdentifierList); - - if (CollectionUtils.isEmpty(automationCompositionIdentifierList)) { - // This is just to force throwing of the exception in certain circumstances. - exceptionOccured(Response.Status.NOT_ACCEPTABLE, - "The list of automation compositions for supervision is empty"); - } - - for (ToscaConceptIdentifier automationCompositionId : automationCompositionIdentifierList) { - try { - var automationComposition = - automationCompositionProvider.getAutomationComposition(automationCompositionId); - - superviseAutomationComposition(automationComposition); - - automationCompositionProvider.saveAutomationComposition(automationComposition); - } catch (PfModelException pfme) { - throw new AutomationCompositionException(pfme.getErrorResponse().getResponseCode(), pfme.getMessage(), - pfme); - } - } - } - - /** * Handle a ParticipantStatus message from a participant. * * @param participantStatusMessage the ParticipantStatus message received from a participant @@ -268,23 +228,18 @@ public class SupervisionHandler { private void setAcElementStateInDb(AutomationCompositionAck automationCompositionAckMessage) { if (automationCompositionAckMessage.getAutomationCompositionResultMap() != null) { - try { - var automationComposition = automationCompositionProvider - .getAutomationComposition(automationCompositionAckMessage.getAutomationCompositionId()); - if (automationComposition != null) { - var updated = updateState(automationComposition, + var automationComposition = automationCompositionProvider + .findAutomationComposition(automationCompositionAckMessage.getAutomationCompositionId()); + if (automationComposition.isPresent()) { + var updated = updateState(automationComposition.get(), automationCompositionAckMessage.getAutomationCompositionResultMap().entrySet()); - updated |= setPrimed(automationComposition); - if (updated) { - automationCompositionProvider.saveAutomationComposition(automationComposition); - } - } else { - LOGGER.warn("AutomationComposition not found in database {}", - automationCompositionAckMessage.getAutomationCompositionId()); + updated |= setPrimed(automationComposition.get()); + if (updated) { + automationCompositionProvider.saveAutomationComposition(automationComposition.get()); } - } catch (PfModelException pfme) { - LOGGER.warn("Model exception occured with AutomationComposition Id {}", - automationCompositionAckMessage.getAutomationCompositionId()); + } else { + LOGGER.warn("AutomationComposition not found in database {}", + automationCompositionAckMessage.getAutomationCompositionId()); } } } @@ -327,7 +282,7 @@ public class SupervisionHandler { * @param automationComposition the automation composition to supervises * @throws AutomationCompositionException on supervision errors */ - private void superviseAutomationComposition(AutomationComposition automationComposition) + public void triggerAutomationCompositionSupervision(AutomationComposition automationComposition) throws AutomationCompositionException { switch (automationComposition.getOrderedState()) { case UNINITIALISED: |