diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatus.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatus.java index 116ad2f68ff4170d6bf46f93b675d9259fa4d2a2..6239dd78e801cc195f325181558763dae2e7a660 100644 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatus.java +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatus.java @@ -1,10 +1,15 @@ package de.ozgcloud.apilib.common.command; +import java.util.HashSet; import java.util.Set; +import org.apache.commons.lang3.StringUtils; + import de.ozgcloud.common.datatype.StringBasedValue; import lombok.EqualsAndHashCode; +import lombok.extern.log4j.Log4j2; +@Log4j2 @EqualsAndHashCode(callSuper = true) public class OzgCloudCommandStatus extends StringBasedValue { @@ -14,14 +19,24 @@ public class OzgCloudCommandStatus extends StringBasedValue { public static final OzgCloudCommandStatus REVOKE_PENDING = new OzgCloudCommandStatus("REVOKE_PENDING"); public static final OzgCloudCommandStatus REVOKED = new OzgCloudCommandStatus("REVOKED"); + private static final Set<OzgCloudCommandStatus> ALL_STATES = new HashSet<>(Set.of(PENDING, FINISHED, ERROR, REVOKE_PENDING, REVOKED)); private static final Set<OzgCloudCommandStatus> FINAL_STATES = Set.of(FINISHED, ERROR, REVOKED); OzgCloudCommandStatus(String status) { super(status); } - public static OzgCloudCommandStatus from(String status) { - return new OzgCloudCommandStatus(status); + public static OzgCloudCommandStatus from(String statusString) { + return ALL_STATES.stream() + .filter(status -> StringUtils.equals(statusString, status.toString())).findAny() + .orElseGet(() -> unknownStatus(statusString)); + } + + private static OzgCloudCommandStatus unknownStatus(String statusString) { + LOG.warn("Unknown status string given: {}", statusString); + var newStatus = new OzgCloudCommandStatus(statusString); + ALL_STATES.add(newStatus); + return newStatus; } public boolean isFinalState() { diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandService.java index 42ca9bbf70f581d9bbb1a9398b80ed6eba5f0a92..a1a7a5a8ed6a19edfb5d6667acd4554089197d5d 100644 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandService.java +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandService.java @@ -64,7 +64,7 @@ public class GrpcOzgCloudCommandService implements OzgCloudCommandService { } void verifyCommand(OzgCloudCommand command) { - if (command.getStatus() == OzgCloudCommandStatus.ERROR) { + if (OzgCloudCommandStatus.ERROR.equals(command.getStatus())) { throw new TechnicalException("Command (id=%s) failed: %s".formatted(command.getId(), command.getErrorMessage())); } } diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatusTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatusTest.java new file mode 100644 index 0000000000000000000000000000000000000000..14ef4c1ffd07b005ffe490d78beece0dd105cf3d --- /dev/null +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatusTest.java @@ -0,0 +1,45 @@ +package de.ozgcloud.apilib.common.command; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +class OzgCloudCommandStatusTest { + + @Nested + class From { + + @Test + void shouldReturnSameInstance() { + OzgCloudCommandStatus result = OzgCloudCommandStatus.from("ERROR"); + + assertThat(OzgCloudCommandStatus.ERROR).isSameAs(result); + } + + @ParameterizedTest + @ValueSource(strings = { "PENDING", "FINISHED", "ERROR", "REVOKE_PENDING", "REVOKED" }) + void shouldReturnSameInstance(String status) { + OzgCloudCommandStatus result = OzgCloudCommandStatus.from(status); + + assertThat(result).isSameAs(OzgCloudCommandStatus.from(status)); + } + + @Test + void shouldAllowUnkownStatusString() { + var result = OzgCloudCommandStatus.from("SOMETHING_NEW"); + + assertThat(result).isNotNull(); + } + + @Test + void shouldLearnNewStatus() { + var result = OzgCloudCommandStatus.from("SOMETHING_NEW"); + + assertThat(result).isSameAs(OzgCloudCommandStatus.from("SOMETHING_NEW")); + } + } + +} diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandServiceTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandServiceTest.java index 3bd0589814294aec800d3157c4acf933094d2c03..fa820c62f6acbc2d40e755a9b08a61b309c68b31 100644 --- a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandServiceTest.java +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandServiceTest.java @@ -124,7 +124,7 @@ class GrpcOzgCloudCommandServiceTest { @Test void shouldThrowException() { - var command = OzgCloudCommandTestFactory.createBuilder().status(OzgCloudCommandStatus.ERROR).build(); + var command = OzgCloudCommandTestFactory.createBuilder().status(OzgCloudCommandStatus.from("ERROR")).build(); assertThrows(TechnicalException.class, () -> service.verifyCommand(command)); }