From 258f02f96a98430fd9045cc2162283b90eb2939f Mon Sep 17 00:00:00 2001
From: Emmanuel Bruno <emmanuel.bruno@univ-tln.fr>
Date: Tue, 2 Feb 2021 21:31:47 +0100
Subject: [PATCH] fixes exec.

---
 pom.xml                                       |  6 ++---
 .../jaxrs/resources/BiblioResource.java       |  9 +++++++
 .../bruno/samples/jaxrs/status/Status.java    | 20 ++++++++++++++
 .../samples/jaxrs/status/StatusFilter.java    | 27 +++++++++++++++++++
 4 files changed, 58 insertions(+), 4 deletions(-)
 create mode 100644 src/main/java/fr/univtln/bruno/samples/jaxrs/status/Status.java
 create mode 100644 src/main/java/fr/univtln/bruno/samples/jaxrs/status/StatusFilter.java

diff --git a/pom.xml b/pom.xml
index 23f8e12..99e295d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -105,9 +105,6 @@
             <version>3.11</version>
             <scope>test</scope>
         </dependency>
-
-
-
     </dependencies>
     <build>
         <plugins>
@@ -134,7 +131,7 @@
                     </execution>
                 </executions>
                 <configuration>
-                    <mainClass>fr.univtln.bruno.samples.jaxrs.server.BiblioServer</mainClass>
+                    <mainClass>${main.class}</mainClass>
                 </configuration>
             </plugin>
 
@@ -329,5 +326,6 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <sonar.coverage.jacoco.xmlReportPaths>target/site/jacoco-merged-coverage-report/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
+        <main.class>fr.univtln.bruno.samples.jaxrs.server.BiblioServer</main.class>
     </properties>
 </project>
diff --git a/src/main/java/fr/univtln/bruno/samples/jaxrs/resources/BiblioResource.java b/src/main/java/fr/univtln/bruno/samples/jaxrs/resources/BiblioResource.java
index fcaa931..c827b4e 100644
--- a/src/main/java/fr/univtln/bruno/samples/jaxrs/resources/BiblioResource.java
+++ b/src/main/java/fr/univtln/bruno/samples/jaxrs/resources/BiblioResource.java
@@ -5,6 +5,7 @@ import fr.univtln.bruno.samples.jaxrs.exceptions.IllegalArgumentException;
 import fr.univtln.bruno.samples.jaxrs.exceptions.NotFoundException;
 import fr.univtln.bruno.samples.jaxrs.model.BiblioModel;
 import fr.univtln.bruno.samples.jaxrs.model.BiblioModel.Auteur;
+import fr.univtln.bruno.samples.jaxrs.status.Status;
 import jakarta.ws.rs.*;
 import jakarta.ws.rs.core.MediaType;
 
@@ -38,7 +39,15 @@ public class BiblioResource {
         return modeleBibliotheque.updateAuteur(id, auteur);
     }
 
+    /**
+     * Status annotation is a trick to fine tune 2XX status codes (see the status package).
+     *
+     * @param auteur
+     * @return
+     * @throws IllegalArgumentException
+     */
     @POST
+    @Status(Status.CREATED)
     @Path("auteurs")
     @Consumes(MediaType.APPLICATION_JSON)
     public Auteur ajouterAuteur(Auteur auteur) throws IllegalArgumentException {
diff --git a/src/main/java/fr/univtln/bruno/samples/jaxrs/status/Status.java b/src/main/java/fr/univtln/bruno/samples/jaxrs/status/Status.java
new file mode 100644
index 0000000..1b45ac4
--- /dev/null
+++ b/src/main/java/fr/univtln/bruno/samples/jaxrs/status/Status.java
@@ -0,0 +1,20 @@
+package fr.univtln.bruno.samples.jaxrs.status;
+
+import jakarta.ws.rs.NameBinding;
+import jakarta.ws.rs.core.Response;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+
+@NameBinding
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Status {
+    int CREATED = 201;
+    int ACCEPTED = 202;
+    int NO_CONTENT = 204;
+    int RESET_CONTENT = 205;
+    int PARTIAL_CONTENT = 206;
+
+    int value();
+}
\ No newline at end of file
diff --git a/src/main/java/fr/univtln/bruno/samples/jaxrs/status/StatusFilter.java b/src/main/java/fr/univtln/bruno/samples/jaxrs/status/StatusFilter.java
new file mode 100644
index 0000000..a7e3e04
--- /dev/null
+++ b/src/main/java/fr/univtln/bruno/samples/jaxrs/status/StatusFilter.java
@@ -0,0 +1,27 @@
+package fr.univtln.bruno.samples.jaxrs.status;
+
+import jakarta.ws.rs.container.ContainerRequestContext;
+import jakarta.ws.rs.container.ContainerResponseContext;
+import jakarta.ws.rs.container.ContainerResponseFilter;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.ext.Provider;
+
+import java.io.IOException;
+import java.lang.annotation.Annotation;
+
+@Provider
+public class StatusFilter implements ContainerResponseFilter {
+
+    @Override
+    public void filter(ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext) throws IOException {
+        if (containerResponseContext.getStatus() == Response.Status.OK.getStatusCode()) {
+            for (Annotation annotation : containerResponseContext.getEntityAnnotations()) {
+                if (annotation instanceof Status) {
+                    containerResponseContext.setStatus(((Status) annotation).value());
+                    break;
+                }
+            }
+        }
+    }
+
+}
\ No newline at end of file
-- 
GitLab