diff --git a/problem/pom.xml b/problem/pom.xml
index bc653c8..397a8f4 100644
--- a/problem/pom.xml
+++ b/problem/pom.xml
@@ -43,6 +43,12 @@
${junit-jupiter.version}
test
+
+ org.junit.jupiter
+ junit-jupiter-params
+ ${junit-jupiter.version}
+ test
+
org.hamcrest
java-hamcrest
diff --git a/problem/src/main/java/org/zalando/problem/Status.java b/problem/src/main/java/org/zalando/problem/Status.java
index 23cc6ab..c69e7a8 100644
--- a/problem/src/main/java/org/zalando/problem/Status.java
+++ b/problem/src/main/java/org/zalando/problem/Status.java
@@ -4,6 +4,9 @@
import javax.annotation.Nonnull;
+import java.util.HashMap;
+import java.util.Map;
+
import static org.apiguardian.api.API.Status.MAINTAINED;
/**
@@ -263,11 +266,36 @@ public enum Status implements StatusType {
private final int code;
private final String reason;
+ // Build a HashMap of all status keyed by their codes.
+ // Used in the `ofCode` factory method
+ private static Map allStatusByCode = new HashMap<>();
+ static {
+ for (Status s : Status.values()) {
+ allStatusByCode.put(s.getStatusCode(), s);
+ }
+ }
+
Status(final int statusCode, final String reasonPhrase) {
this.code = statusCode;
this.reason = reasonPhrase;
}
+ /**
+ * Creates a Status instance from the given code.
+ *
+ * @param code the HTTP code as a number
+ * @return the correct enum value for this status code.
+ * @throws IllegalArgumentException if the given code does not correspond to a known HTTP status.
+ */
+ public static Status ofCode(Integer code) {
+ if (allStatusByCode.containsKey(code)) {
+ return allStatusByCode.get(code);
+ }
+ else {
+ throw new IllegalArgumentException("There is no known status for this code (" + code.toString() + ").");
+ }
+ }
+
/**
* Get the associated status code.
*
diff --git a/problem/src/test/java/org/zalando/problem/StatusTest.java b/problem/src/test/java/org/zalando/problem/StatusTest.java
index 3ea505d..455d509 100644
--- a/problem/src/test/java/org/zalando/problem/StatusTest.java
+++ b/problem/src/test/java/org/zalando/problem/StatusTest.java
@@ -1,6 +1,9 @@
package org.zalando.problem;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
import java.util.stream.Stream;
@@ -26,4 +29,25 @@ void shouldHaveMeaningfulToString() {
assertThat(notFound.toString(), equalTo("404 Not Found"));
}
+
+ @ParameterizedTest
+ @CsvSource({
+ "409, Conflict",
+ "404, Not Found",
+ "200, OK",
+ "500, Internal Server Error"
+ })
+ void shouldHaveCorrectValueFromCode(int code, String line) {
+ Status statusFromCode = Status.ofCode(code);
+
+ assertThat(statusFromCode.getStatusCode(), equalTo(code));
+ assertThat(statusFromCode.getReasonPhrase(), equalTo(line));
+ }
+
+ @Test
+ void shouldThrowOnNonExistingCode() {
+ Assertions.assertThrows(IllegalArgumentException.class, () -> {
+ Status.ofCode(111);
+ });
+ }
}