From 16433abe101cc6034011815f109037bb43d976af Mon Sep 17 00:00:00 2001 From: Mark Swatosh Date: Tue, 21 Nov 2023 15:56:00 -0600 Subject: [PATCH] Changing Rank to Enum --- README.md | 2 +- pom.xml | 7 +++++ .../sample/application/CrewMember.java | 9 +++--- .../sample/application/CrewMembers.java | 2 +- .../sample/application/CrewService.java | 4 +-- .../openliberty/sample/application/Rank.java | 31 +++++++++++++++++++ .../sample/application/RankDeserializer.java | 18 +++++++++++ .../openliberty/sample/it/CrewServiceIT.java | 3 +- 8 files changed, 67 insertions(+), 9 deletions(-) create mode 100644 src/main/java/io/openliberty/sample/application/Rank.java create mode 100644 src/main/java/io/openliberty/sample/application/RankDeserializer.java diff --git a/README.md b/README.md index 9efb648..37a248d 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ The first endpoint persists a **CrewMember** in the database by calling `crewMem public String add(CrewMember crewMember) { //... - //Jakarta Bean Validation + //Jakarta Validation //... crewMembers.save(crewMember); diff --git a/pom.xml b/pom.xml index 2fac351..8693a56 100644 --- a/pom.xml +++ b/pom.xml @@ -60,12 +60,19 @@ 2.1.3 provided + + jakarta.json.bind + jakarta.json.bind-api + 3.0.0 + provided + com.ibm.websphere.appserver.api com.ibm.websphere.appserver.api.passwordUtil [1.0.21,) provided + org.junit.jupiter junit-jupiter diff --git a/src/main/java/io/openliberty/sample/application/CrewMember.java b/src/main/java/io/openliberty/sample/application/CrewMember.java index f6d3c82..63e97b5 100644 --- a/src/main/java/io/openliberty/sample/application/CrewMember.java +++ b/src/main/java/io/openliberty/sample/application/CrewMember.java @@ -14,6 +14,7 @@ import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Pattern; @Entity @@ -22,8 +23,8 @@ public class CrewMember { @NotEmpty(message = "All crew members must have a name!") private String name; - @Pattern(regexp = "(Captain|Officer|Engineer)", message = "Crew member must be one of the listed ranks!") - private String rank; + @NotNull(message = "Crew member must be one of the listed ranks!") + private Rank rank; @Id @Pattern(regexp = "^\\d+$", message = "ID Number must be a non-negative integer!") @@ -37,11 +38,11 @@ public void setName(String name) { this.name = name; } - public String getRank() { + public Rank getRank() { return rank; } - public void setRank(String rank) { + public void setRank(Rank rank) { this.rank = rank; } diff --git a/src/main/java/io/openliberty/sample/application/CrewMembers.java b/src/main/java/io/openliberty/sample/application/CrewMembers.java index 22b31ca..38d3b88 100644 --- a/src/main/java/io/openliberty/sample/application/CrewMembers.java +++ b/src/main/java/io/openliberty/sample/application/CrewMembers.java @@ -10,7 +10,7 @@ @Repository public interface CrewMembers extends BasicRepository { - List findByRank(String rank); + List findByRank(Rank rank); @OrderBy("name") Stream findAll(); diff --git a/src/main/java/io/openliberty/sample/application/CrewService.java b/src/main/java/io/openliberty/sample/application/CrewService.java index 74bb8ae..d37226c 100755 --- a/src/main/java/io/openliberty/sample/application/CrewService.java +++ b/src/main/java/io/openliberty/sample/application/CrewService.java @@ -71,7 +71,7 @@ public String retrieve() { JsonObject json = Json.createObjectBuilder() .add("Name", c.getName()) .add("CrewID", c.getCrewID()) - .add("Rank",c.getRank()).build(); + .add("Rank",c.getRank().toString()).build(); jab.add(json); }); @@ -82,7 +82,7 @@ public String retrieve() { @Path("/rank/{rank}") public String retrieveByRank(@PathParam("rank") String rank) { JsonArrayBuilder jab = Json.createArrayBuilder(); - for (CrewMember c : crewMembers.findByRank(rank)) { + for (CrewMember c : crewMembers.findByRank(Rank.fromString(rank))) { JsonObject json = Json.createObjectBuilder() .add("Name", c.getName()) .add("CrewID", c.getCrewID()).build(); diff --git a/src/main/java/io/openliberty/sample/application/Rank.java b/src/main/java/io/openliberty/sample/application/Rank.java new file mode 100644 index 0000000..97ed967 --- /dev/null +++ b/src/main/java/io/openliberty/sample/application/Rank.java @@ -0,0 +1,31 @@ +package io.openliberty.sample.application; + +import jakarta.json.bind.annotation.JsonbTypeDeserializer; + +@JsonbTypeDeserializer(RankDeserializer.class) +public enum Rank { + CAPTAIN("Captain"), + OFFICER("Officer"), + ENGINEER("Engineer"); + + private final String formatted; + + Rank(String s) { + formatted = s; + } + + public static Rank fromString(String s) { + for (Rank r : values()) { + if (r.formatted.equals(s)) { + return r; + } + } + return null; + } + + @Override + public String toString() { + return formatted; + } + +} diff --git a/src/main/java/io/openliberty/sample/application/RankDeserializer.java b/src/main/java/io/openliberty/sample/application/RankDeserializer.java new file mode 100644 index 0000000..c23184a --- /dev/null +++ b/src/main/java/io/openliberty/sample/application/RankDeserializer.java @@ -0,0 +1,18 @@ +package io.openliberty.sample.application; + +import java.lang.reflect.Type; + +import jakarta.json.bind.serializer.DeserializationContext; +import jakarta.json.bind.serializer.JsonbDeserializer; +import jakarta.json.stream.JsonParser; + + +public class RankDeserializer implements JsonbDeserializer { + + @Override + public Rank deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) { + String name = parser.getValue().toString().replaceAll("\"", ""); //TODO update app so we don't need to remove "" + return Rank.fromString(name); + } + +} diff --git a/src/test/java/io/openliberty/sample/it/CrewServiceIT.java b/src/test/java/io/openliberty/sample/it/CrewServiceIT.java index 46e58d4..f8946dc 100644 --- a/src/test/java/io/openliberty/sample/it/CrewServiceIT.java +++ b/src/test/java/io/openliberty/sample/it/CrewServiceIT.java @@ -27,7 +27,6 @@ import jakarta.json.Json; import jakarta.json.JsonArray; import jakarta.json.JsonObject; -import jakarta.json.JsonObjectBuilder; import jakarta.json.JsonReader; import jakarta.json.JsonValue; import jakarta.ws.rs.client.Client; @@ -53,6 +52,8 @@ public static void init() { public void setup() { client = ClientBuilder.newClient(); assumeTrue(isPostgresAvailable(), "Postgres is not Available"); + response = client.target(baseURL + "db/crew/it").request().post(Entity.json("{\"name\":\"Mark\",\"rank\":\"Captain\",\"crewID\":\"75\"}")); + assertEquals(200, response.getStatus(), "output: " + response.readEntity(String.class)); response = client.target(baseURL + "db/crew/").request().delete(); //Delete All before each test assertEquals(204, response.getStatus(), "output: " + response.readEntity(String.class)); }