diff --git a/pom.xml b/pom.xml index dffeda1..607b42f 100644 --- a/pom.xml +++ b/pom.xml @@ -9,10 +9,11 @@ UTF-8 - 8 - 8 - 2.28 - 2.9.6 + 11 + 11 + 3.0.4 + 20210307 + 5.0.0 @@ -31,11 +32,12 @@ + + - javax.servlet - javax.servlet-api - 4.0.1 - provided + jakarta.servlet + jakarta.servlet-api + ${servlet.api.version} @@ -67,30 +69,51 @@ org.glassfish.jersey.media jersey-media-sse + + org.glassfish.jersey.media + jersey-media-jaxb + + + + + + + org.json + json + ${org.json.version} + - javax.xml.bind - jaxb-api - 2.2.11 - - - com.sun.xml.bind - jaxb-core - 2.2.11 - - - com.sun.xml.bind - jaxb-impl - 2.2.11 - - - javax.activation - activation - 1.1.1 - - + jakarta.xml.bind + jakarta.xml.bind-api + 3.0.1 + + + com.sun.xml.bind + jaxb-impl + 3.0.1 + runtime + + + + + org.eclipse.persistence + org.eclipse.persistence.moxy + 3.0.0 + + + + + + org.apache.maven.plugins + maven-war-plugin + 3.3.1 + + + + \ No newline at end of file diff --git a/src/main/java/fr/istic/chat/message/Message.java b/src/main/java/fr/istic/chat/message/Message.java new file mode 100644 index 0000000..2adf067 --- /dev/null +++ b/src/main/java/fr/istic/chat/message/Message.java @@ -0,0 +1,41 @@ +package fr.istic.chat.message; + +import jakarta.xml.bind.annotation.XmlRootElement; + + +public class Message { + + private Long id; + private String content; + private String date; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + @Override + public String toString() { + return id + ":" + date + ">" + content; + } + +} \ No newline at end of file diff --git a/src/main/java/fr/istic/chat/message/MessageList.java b/src/main/java/fr/istic/chat/message/MessageList.java new file mode 100644 index 0000000..dfd1b2e --- /dev/null +++ b/src/main/java/fr/istic/chat/message/MessageList.java @@ -0,0 +1,86 @@ +package fr.istic.chat.message; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MessageList { + + private static MessageList INSTANCE = new MessageList(); + + public static final MessageList getInstance() { + return INSTANCE; + } + + private static long CURRENT_ID = 0; + + private synchronized static Long getNextID() { + return CURRENT_ID++; + } + + public synchronized static Long getHighestID() { + return CURRENT_ID; + } + + /* L'utilisation d'un bloc static est une très mauvaise idée de façon générale. + * Ce code est appelé au chargement de la classe par le Classloader + * On l'utilise ici pour remplir les messages : + */ + static { + + Message m = new Message(); + m.setContent("ceci est un test"); + INSTANCE.createMessage(m); + + m = new Message(); + m.setContent("test 2"); + INSTANCE.createMessage(m); + + m = new Message(); + m.setContent("test 3"); + INSTANCE.createMessage(m); + + } + + private Map messagesMap = new HashMap(); + + public synchronized Message createMessage(Message message) { + message.setId(getNextID()); + message.setDate(new Date().toString()); + messagesMap.put(message.getId(), message); + return message; + } + + public synchronized Message getMessage(Long id) { + return messagesMap.get(id); + } + + public synchronized void delMessage(Long id) { + messagesMap.remove(id); + } + + public synchronized List getMessages() { + return new ArrayList(messagesMap.values()); + } + + public synchronized List getMessagesBetween(Long id1, Long id2) { + List messages = new ArrayList(); + for (Long i = id1; i <= id2; i++) { + messages.add(messagesMap.get(i)); + } + return messages; + } + + public synchronized List getMessagesAfter(Long id1) { + List messages = new ArrayList(); + for (Long i = id1; i <= getHighestID(); i++) { + if (messagesMap.containsKey(i)) { + messages.add(messagesMap.get(i)); + } + } + return messages; + } + +} \ No newline at end of file diff --git a/src/main/java/fr/istic/rest/Hello.java b/src/main/java/fr/istic/rest/Hello.java index 357ee9d..7c08fd0 100644 --- a/src/main/java/fr/istic/rest/Hello.java +++ b/src/main/java/fr/istic/rest/Hello.java @@ -1,11 +1,11 @@ package fr.istic.rest; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.xml.bind.annotation.XmlRootElement; @Path("/hello") public class Hello { @@ -18,7 +18,7 @@ public class Hello { @Path("/{name}") @GET - @Produces(MediaType.APPLICATION_JSON) + @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) public Message getDescription(@PathParam("name") String name) { Message m = new Message(); m.name = name; diff --git a/src/main/java/fr/istic/rest/MessageRessource.java b/src/main/java/fr/istic/rest/MessageRessource.java new file mode 100644 index 0000000..120e5d1 --- /dev/null +++ b/src/main/java/fr/istic/rest/MessageRessource.java @@ -0,0 +1,26 @@ +package fr.istic.rest; + +import java.util.List; + +import fr.istic.chat.message.Message; +import fr.istic.chat.message.MessageList; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.xml.bind.JAXBElement; + +public class MessageRessource { + + @Path("/after/{id}") + @GET + @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) + public List getMessagesAfter(@PathParam("id") Long id){ + System.out.println("message after" + id); + return MessageList.getInstance().getMessagesAfter(id); + } + +} diff --git a/src/main/java/fr/istic/servlet/HelloServlet.java b/src/main/java/fr/istic/servlet/HelloServlet.java index 8247cdd..04056cc 100644 --- a/src/main/java/fr/istic/servlet/HelloServlet.java +++ b/src/main/java/fr/istic/servlet/HelloServlet.java @@ -3,15 +3,15 @@ package fr.istic.servlet; import java.io.IOException; import java.io.PrintWriter; -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.core.MediaType; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.core.MediaType; +import jakarta.xml.bind.annotation.XmlRootElement; @WebServlet("/client") public class HelloServlet extends HttpServlet { @@ -30,10 +30,6 @@ public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - // Ceci n'est utile que pour JAXB 2.3.1 et disparaitra plus tard : - System.setProperty("com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", - "true"); - PrintWriter out = resp.getWriter(); resp.setContentType("text/plain"); try { diff --git a/src/main/java/test/TestApi.java b/src/main/java/test/TestApi.java new file mode 100644 index 0000000..661e040 --- /dev/null +++ b/src/main/java/test/TestApi.java @@ -0,0 +1,42 @@ +package test; + + +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.xml.bind.annotation.XmlRootElement; + +public class TestApi { + + //TODO : Adapter l'URL en fonction de votre resource : + public static final String URL = "http://localhost:8080/pr.tp.services/api"; + + @XmlRootElement(name="message") + public static class ChatMessage { + public Long id; + public String content; + public String date; + @Override + public String toString() { + return id + ":" + content+ " at "+ date; + } + } + + public static void main(String[] args) { + Client client = ClientBuilder.newClient(); + + //Post a message : + ChatMessage m = new ChatMessage(); + m.content="test"; + Response response = client.target(URL).path("messages").request(MediaType.APPLICATION_JSON_TYPE).post(Entity.entity(m, MediaType.APPLICATION_XML)); + System.out.println("Response "+ response.getStatus()); + + //Get all the messages + ChatMessage[] messages = client.target(URL).path("messages").request(MediaType.APPLICATION_JSON_TYPE).get(ChatMessage[].class); + for (ChatMessage chatMessage : messages) { + System.out.println(chatMessage); + } + } +} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 6905f59..3a78c27 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -1,10 +1,7 @@ - + Jersey Web Application org.glassfish.jersey.servlet.ServletContainer