diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/PolicyServiceImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/PolicyServiceImpl.java index d880fe5fcf83f612a633d83575658f67061fab2c..61dfe46abe6db97eb33749ccdd403b3929cf529a 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/PolicyServiceImpl.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/PolicyServiceImpl.java @@ -31,6 +31,8 @@ import java.util.HashMap; import java.util.List; import java.util.Random; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; + import org.etsi.tfs.policy.context.ContextService; import org.etsi.tfs.policy.context.model.ConfigActionEnum; import org.etsi.tfs.policy.context.model.ConfigRule; @@ -42,6 +44,8 @@ import org.etsi.tfs.policy.context.model.ConstraintTypeCustom; import org.etsi.tfs.policy.context.model.ServiceConfig; import org.etsi.tfs.policy.context.model.ServiceId; import org.etsi.tfs.policy.device.DeviceService; +import org.etsi.tfs.policy.exception.ExternalServiceFailureException; +import org.etsi.tfs.policy.exception.NewException; import org.etsi.tfs.policy.model.BooleanOperator; import org.etsi.tfs.policy.model.PolicyRule; import org.etsi.tfs.policy.model.PolicyRuleAction; @@ -143,14 +147,17 @@ public class PolicyServiceImpl implements PolicyService { final var isServiceValid = policyRuleConditionValidator.isServiceIdValid(serviceId, deviceIds); return isServiceValid + .onFailure() + .transform(failure -> new ExternalServiceFailureException(failure.getMessage())) .onItem() .transform( isService -> constructPolicyStateBasedOnCriteria( - isService, serviceId, policyRuleService, policyRuleBasic)); + isService, serviceId, policyRuleService, policyRuleBasic)) + .flatMap(Function.identity()); } - private PolicyRuleState constructPolicyStateBasedOnCriteria( + private Uni<PolicyRuleState> constructPolicyStateBasedOnCriteria( Boolean isService, ServiceId serviceId, PolicyRuleService policyRuleService, @@ -161,7 +168,7 @@ public class PolicyServiceImpl implements PolicyService { new PolicyRuleState( PolicyRuleStateEnum.POLICY_FAILED, String.format(INVALID_MESSAGE, serviceId)); - return policyRuleState; + return Uni.createFrom().item(policyRuleState); } final var policyRuleTypeService = new PolicyRuleTypeService(policyRuleService); @@ -175,24 +182,28 @@ public class PolicyServiceImpl implements PolicyService { String.format( "Invalid PolicyRuleConditions in PolicyRule with ID: %s", policyRuleBasic.getPolicyRuleId())); - return policyRuleState; + return Uni.createFrom().item(policyRuleState); } return setPolicyRuleOnContextAndReturnState(policyRule, policyRuleService, alarmDescriptorList); } - private PolicyRuleState setPolicyRuleOnContextAndReturnState( + private Uni<PolicyRuleState> setPolicyRuleOnContextAndReturnState( PolicyRule policyRule, PolicyRuleService policyRuleService, List<AlarmDescriptor> alarmDescriptorList) { - contextService + return contextService .setPolicyRule(policyRule) - .subscribe() - .with( - policyId -> - startMonitoringBasedOnAlarmDescriptors( - policyId, policyRuleService, alarmDescriptorList)); - return VALIDATED_POLICYRULE_STATE; + .onFailure() + .transform(failure -> new NewException(failure.getMessage())) + .onItem() + .transform( + policyId -> { + startMonitoringBasedOnAlarmDescriptors( + policyId, policyRuleService, alarmDescriptorList); + + return VALIDATED_POLICYRULE_STATE; + }); } private void startMonitoringBasedOnAlarmDescriptors( diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/exception/ExternalServiceFailureException.java b/src/policy/src/main/java/org/etsi/tfs/policy/exception/ExternalServiceFailureException.java new file mode 100644 index 0000000000000000000000000000000000000000..c04156d99f2844a07a6ed0b5b58a2203630546a0 --- /dev/null +++ b/src/policy/src/main/java/org/etsi/tfs/policy/exception/ExternalServiceFailureException.java @@ -0,0 +1,12 @@ +package org.etsi.tfs.policy.exception; + +public class ExternalServiceFailureException extends RuntimeException { + + public ExternalServiceFailureException(String message, Exception e) { + super(message, e); + } + + public ExternalServiceFailureException(String message) { + super(message); + } +} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/exception/GeneralExceptionHandler.java b/src/policy/src/main/java/org/etsi/tfs/policy/exception/GeneralExceptionHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..f6053ade2609609e5c9c3ab9ee324d5240a52fd2 --- /dev/null +++ b/src/policy/src/main/java/org/etsi/tfs/policy/exception/GeneralExceptionHandler.java @@ -0,0 +1,44 @@ +package org.etsi.tfs.policy.exception; + +import io.grpc.Metadata; +import io.grpc.ServerCall; +import io.grpc.Status; +import io.grpc.StatusRuntimeException; +import io.quarkus.grpc.ExceptionHandler; +import io.quarkus.grpc.ExceptionHandlerProvider; +import jakarta.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class GeneralExceptionHandler implements ExceptionHandlerProvider { + @Override + public <ReqT, RespT> ExceptionHandler<ReqT, RespT> createHandler( + ServerCall.Listener<ReqT> listener, ServerCall<ReqT, RespT> serverCall, Metadata metadata) { + return new HelloExceptionHandler<>(listener, serverCall, metadata); + } + + @Override + public Throwable transform(Throwable t) { + if (t instanceof ExternalServiceFailureException) { + return new StatusRuntimeException(Status.INTERNAL.withDescription(t.getMessage())); + }else if (t instanceof NewException) { + return new StatusRuntimeException(Status.UNIMPLEMENTED.withDescription(t.getMessage())); + } else { + return ExceptionHandlerProvider.toStatusException(t, true); + } + } + + private static class HelloExceptionHandler<A, B> extends ExceptionHandler<A, B> { + public HelloExceptionHandler( + ServerCall.Listener<A> listener, ServerCall<A, B> call, Metadata metadata) { + super(listener, call, metadata); + } + + @Override + protected void handleException(Throwable t, ServerCall<A, B> call, Metadata metadata) { + StatusRuntimeException sre = + (StatusRuntimeException) ExceptionHandlerProvider.toStatusException(t, true); + Metadata trailers = sre.getTrailers() != null ? sre.getTrailers() : metadata; + call.close(sre.getStatus(), trailers); + } + } +} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/exception/NewException.java b/src/policy/src/main/java/org/etsi/tfs/policy/exception/NewException.java new file mode 100644 index 0000000000000000000000000000000000000000..96010e9c483b2640bab670bee738ea9d703fabc2 --- /dev/null +++ b/src/policy/src/main/java/org/etsi/tfs/policy/exception/NewException.java @@ -0,0 +1,12 @@ +package org.etsi.tfs.policy.exception; + +public class NewException extends RuntimeException { + + public NewException(String message, Exception e) { + super(message, e); + } + + public NewException(String message) { + super(message); + } +}