From 69b53778c9a7a4886dbbe1e7b88d0ce1b1663260 Mon Sep 17 00:00:00 2001 From: Tanechka Date: Thu, 11 May 2017 19:49:11 -0700 Subject: [PATCH 1/5] add attaches for JAX-RS --- services/mail-service/pom.xml | 12 +++++++ .../masterjava/service/mail/rest/MailRS.java | 32 ++++++++++++++++--- .../service/mail/rest/MailRestConfig.java | 2 ++ .../mail-service/src/main/resources/mail.conf | 2 +- .../main/webapp/WEB-INF/templates/users.html | 2 +- 5 files changed, 43 insertions(+), 7 deletions(-) diff --git a/services/mail-service/pom.xml b/services/mail-service/pom.xml index cc2bfd5..9abe32f 100644 --- a/services/mail-service/pom.xml +++ b/services/mail-service/pom.xml @@ -90,6 +90,18 @@ jersey-bean-validation 2.25.1 + + org.glassfish.jersey.media + jersey-media-multipart + 2.25.1 + + + org.jvnet.mimepull + mimepull + + + + org.apache.activemq diff --git a/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/rest/MailRS.java b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/rest/MailRS.java index f212534..025e1c7 100644 --- a/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/rest/MailRS.java +++ b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/rest/MailRS.java @@ -1,15 +1,22 @@ package ru.javaops.masterjava.service.mail.rest; +import com.google.common.collect.ImmutableList; +import org.glassfish.jersey.media.multipart.FormDataContentDisposition; +import org.glassfish.jersey.media.multipart.FormDataParam; import org.hibernate.validator.constraints.NotBlank; +import ru.javaops.masterjava.service.mail.Attach; import ru.javaops.masterjava.service.mail.GroupResult; import ru.javaops.masterjava.service.mail.MailServiceExecutor; import ru.javaops.masterjava.service.mail.MailWSClient; +import ru.javaops.masterjava.service.mail.util.Attachments; import ru.javaops.web.WebStateException; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; -import java.util.Collections; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.util.List; @Path("/") public class MailRS { @@ -23,10 +30,25 @@ public String test() { @POST @Path("send") @Produces(MediaType.APPLICATION_JSON) - public GroupResult send(@NotBlank @FormParam("users") String users, - @FormParam("subject") String subject, - @NotBlank @FormParam("body") String body) throws WebStateException { + @Consumes(MediaType.MULTIPART_FORM_DATA) + public GroupResult send(@NotBlank @FormDataParam("users") String users, + @FormDataParam("subject") String subject, + @NotBlank @FormDataParam("body") String body, + @FormDataParam("attach") InputStream uploadedInputStream, + @FormDataParam("attach") FormDataContentDisposition fileDetail) throws WebStateException { - return MailServiceExecutor.sendBulk(MailWSClient.split(users), subject, body, Collections.emptyList()); + List attaches; + if (uploadedInputStream == null) { + attaches = ImmutableList.of(); + } else { + String name = fileDetail.getFileName(); + try { + name = new String(fileDetail.getFileName().getBytes ("iso-8859-1"), "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + attaches = ImmutableList.of(Attachments.getAttach(name, uploadedInputStream)); + } + return MailServiceExecutor.sendBulk(MailWSClient.split(users), subject, body, attaches); } } \ No newline at end of file diff --git a/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/rest/MailRestConfig.java b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/rest/MailRestConfig.java index 7f8a6aa..0a1fa5c 100644 --- a/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/rest/MailRestConfig.java +++ b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/rest/MailRestConfig.java @@ -1,5 +1,6 @@ package ru.javaops.masterjava.service.mail.rest; +import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.server.ResourceConfig; import org.slf4j.bridge.SLF4JBridgeHandler; @@ -13,5 +14,6 @@ public MailRestConfig() { // http://stackoverflow.com/questions/4121722 SLF4JBridgeHandler.install(); packages("ru.javaops.masterjava.service.mail.rest"); + register(MultiPartFeature.class); } } \ No newline at end of file diff --git a/services/mail-service/src/main/resources/mail.conf b/services/mail-service/src/main/resources/mail.conf index fdc6ca0..305e399 100644 --- a/services/mail-service/src/main/resources/mail.conf +++ b/services/mail-service/src/main/resources/mail.conf @@ -9,4 +9,4 @@ mail { fromName: MasterJava } -include required(file("/apps/masterjava/config/mail.conf")) +include required(file("c:/apps/masterjava/config/mail.conf")) diff --git a/web/webapp/src/main/webapp/WEB-INF/templates/users.html b/web/webapp/src/main/webapp/WEB-INF/templates/users.html index cb3e3b6..5cfd5f8 100644 --- a/web/webapp/src/main/webapp/WEB-INF/templates/users.html +++ b/web/webapp/src/main/webapp/WEB-INF/templates/users.html @@ -67,7 +67,7 @@ form.attr("enctype", 'multipart/form-data'); } else if(transport == 'REST'){ form.attr("action", '/mail/rest/send'); - form.attr("enctype", 'application/x-www-form-urlencoded'); + form.attr("enctype", 'multipart/form-data'); } else { form.attr("action", 'sendJms'); form.attr("enctype", 'application/x-www-form-urlencoded'); From 5a6648e367d802d4b4cc9b8dd699874e45c1b22a Mon Sep 17 00:00:00 2001 From: Tanechka Date: Thu, 11 May 2017 22:57:17 -0700 Subject: [PATCH 2/5] JMS ObjectMessage --- config_templates/context.xml | 4 +++- .../masterjava/service/mail/Addressee.java | 3 ++- .../masterjava/service/mail/MailData.java | 19 +++++++++++++++++++ .../service/mail/jms/JmsListener.java | 11 ++++++----- .../masterjava/webapp/JmsSendServlet.java | 13 ++++++++++--- 5 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/MailData.java diff --git a/config_templates/context.xml b/config_templates/context.xml index c8d390d..238ea89 100644 --- a/config_templates/context.xml +++ b/config_templates/context.xml @@ -52,7 +52,9 @@ factory="org.apache.activemq.jndi.JNDIReferenceFactory" brokerURL="failover:(vm://localhost)" brokerName="LocalActiveMQBroker" - useEmbeddedBroker="true"/> + useEmbeddedBroker="true" + trustAllPackages="true" + /> usersTo; + private String subject; + private String body; +} \ No newline at end of file diff --git a/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/jms/JmsListener.java b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/jms/JmsListener.java index afd56ac..2e96f17 100644 --- a/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/jms/JmsListener.java +++ b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/jms/JmsListener.java @@ -1,6 +1,7 @@ package ru.javaops.masterjava.service.mail.jms; import lombok.extern.slf4j.Slf4j; +import ru.javaops.masterjava.service.mail.MailData; import javax.jms.*; import javax.naming.InitialContext; @@ -30,11 +31,11 @@ public void contextInitialized(ServletContextEvent sce) { try { while (!Thread.interrupted()) { Message m = receiver.receive(); - // TODO implement mail sending - if (m instanceof TextMessage) { - TextMessage tm = (TextMessage) m; - String text = tm.getText(); - log.info(String.format("Received TextMessage with text '%s'.", text)); + if (m instanceof ObjectMessage) { + ObjectMessage om = (ObjectMessage) m; + MailData mailData = (MailData) om.getObject(); + log.info(String.format("Received TextMessage with text '%s' for recipients %s.", + mailData.getBody(), mailData.getUsersTo().toString())); } } } catch (Exception e) { diff --git a/web/webapp/src/main/java/ru/javaops/masterjava/webapp/JmsSendServlet.java b/web/webapp/src/main/java/ru/javaops/masterjava/webapp/JmsSendServlet.java index 8123d9e..027581c 100644 --- a/web/webapp/src/main/java/ru/javaops/masterjava/webapp/JmsSendServlet.java +++ b/web/webapp/src/main/java/ru/javaops/masterjava/webapp/JmsSendServlet.java @@ -1,6 +1,9 @@ package ru.javaops.masterjava.webapp; import lombok.extern.slf4j.Slf4j; +import ru.javaops.masterjava.service.mail.Addressee; +import ru.javaops.masterjava.service.mail.MailData; +import ru.javaops.masterjava.service.mail.MailWSClient; import javax.jms.*; import javax.naming.InitialContext; @@ -12,6 +15,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.IllegalStateException; +import java.util.HashSet; @WebServlet("/sendJms") @Slf4j @@ -57,9 +61,12 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S private synchronized String sendJms(String users, String subject, String body) { String msg; try { - TextMessage testMessage = session.createTextMessage(); - testMessage.setText(subject); - producer.send(testMessage); + HashSet usersTo = new HashSet<>(MailWSClient.split(users)); + MailData mailData = new MailData(usersTo, subject, body); + ObjectMessage om = session.createObjectMessage(); + om.setObject(mailData); + //om.setObject(new String("abc")); + producer.send(om); msg = "Successfully sent message."; log.info(msg); } catch (Exception e) { From 8355f3f310634c53c2352bab44e0d1c5a01c7671 Mon Sep 17 00:00:00 2001 From: Tanechka Date: Fri, 12 May 2017 20:24:22 -0700 Subject: [PATCH 3/5] fix attaches jax-rs --- .../masterjava/service/mail/rest/MailRS.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/rest/MailRS.java b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/rest/MailRS.java index 025e1c7..b2f5805 100644 --- a/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/rest/MailRS.java +++ b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/rest/MailRS.java @@ -14,8 +14,9 @@ import javax.ws.rs.*; import javax.ws.rs.core.MediaType; +import java.io.IOException; import java.io.InputStream; -import java.io.UnsupportedEncodingException; +import java.util.ArrayList; import java.util.List; @Path("/") @@ -37,17 +38,16 @@ public GroupResult send(@NotBlank @FormDataParam("users") String users, @FormDataParam("attach") InputStream uploadedInputStream, @FormDataParam("attach") FormDataContentDisposition fileDetail) throws WebStateException { - List attaches; - if (uploadedInputStream == null) { + List attaches = new ArrayList<>(); + if (fileDetail.getFileName().isEmpty()) { attaches = ImmutableList.of(); } else { - String name = fileDetail.getFileName(); try { - name = new String(fileDetail.getFileName().getBytes ("iso-8859-1"), "UTF-8"); - } catch (UnsupportedEncodingException e) { + String name = new String(fileDetail.getFileName().getBytes ("iso-8859-1"), "UTF-8"); + attaches = ImmutableList.of(Attachments.getAttach(name, uploadedInputStream)); + } catch (IOException e) { e.printStackTrace(); } - attaches = ImmutableList.of(Attachments.getAttach(name, uploadedInputStream)); } return MailServiceExecutor.sendBulk(MailWSClient.split(users), subject, body, attaches); } From 71eeda293fd75628cf0227cfc6f89e1dca8ffd56 Mon Sep 17 00:00:00 2001 From: Tanechka Date: Fri, 12 May 2017 20:25:16 -0700 Subject: [PATCH 4/5] fix attaches jax-rs add --- .../masterjava/service/mail/util/Attachments.java | 15 ++++++++++----- .../ru/javaops/masterjava/webapp/SendServlet.java | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/util/Attachments.java b/services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/util/Attachments.java index b3fd3f4..19ce6f3 100644 --- a/services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/util/Attachments.java +++ b/services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/util/Attachments.java @@ -1,30 +1,35 @@ package ru.javaops.masterjava.service.mail.util; -import lombok.AllArgsConstructor; import org.apache.commons.io.input.CloseShieldInputStream; import ru.javaops.masterjava.service.mail.Attach; import javax.activation.DataHandler; import javax.activation.DataSource; +import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class Attachments { - public static Attach getAttach(String name, InputStream inputStream) { + public static Attach getAttach(String name, InputStream inputStream) throws IOException { return new Attach(name, new DataHandler(new InputStreamDataSource(inputStream))); } // http://stackoverflow.com/questions/2830561/how-to-convert-an-inputstream-to-a-datahandler // http://stackoverflow.com/a/5924019/548473 - @AllArgsConstructor private static class InputStreamDataSource implements DataSource { - private InputStream inputStream; + private BufferedInputStream bufferedInputStream; + + InputStreamDataSource(InputStream inputStream) throws IOException { + this.bufferedInputStream = new BufferedInputStream(inputStream); + this.bufferedInputStream.mark(inputStream.available()+1); + } @Override public InputStream getInputStream() throws IOException { - return new CloseShieldInputStream(inputStream); + bufferedInputStream.reset(); + return new CloseShieldInputStream(bufferedInputStream); } @Override diff --git a/web/webapp/src/main/java/ru/javaops/masterjava/webapp/SendServlet.java b/web/webapp/src/main/java/ru/javaops/masterjava/webapp/SendServlet.java index 8d05792..4ae82d6 100644 --- a/web/webapp/src/main/java/ru/javaops/masterjava/webapp/SendServlet.java +++ b/web/webapp/src/main/java/ru/javaops/masterjava/webapp/SendServlet.java @@ -31,7 +31,7 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S String body = req.getParameter("body"); List attaches; Part filePart = req.getPart("attach"); - if (filePart == null) { + if (filePart.getSize() == 0) { attaches = ImmutableList.of(); } else { attaches = ImmutableList.of(Attachments.getAttach(filePart.getSubmittedFileName(), filePart.getInputStream())); From eb9ad1e62a913952e7463ec352d9917f0125cd74 Mon Sep 17 00:00:00 2001 From: Tanechka Date: Sat, 13 May 2017 12:52:54 -0700 Subject: [PATCH 5/5] jms+attaches --- .../masterjava/service/mail/Addressee.java | 3 +- .../masterjava/service/mail/MailData.java | 5 ++-- .../service/mail/jms/JmsListener.java | 19 +++++++++++- .../masterjava/webapp/JmsSendServlet.java | 29 ++++++++++++++----- .../main/webapp/WEB-INF/templates/users.html | 2 +- 5 files changed, 44 insertions(+), 14 deletions(-) diff --git a/services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/Addressee.java b/services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/Addressee.java index b3426af..babe171 100644 --- a/services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/Addressee.java +++ b/services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/Addressee.java @@ -8,13 +8,12 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlValue; -import java.io.Serializable; @Getter @AllArgsConstructor @NoArgsConstructor @XmlAccessorType(XmlAccessType.FIELD) -public class Addressee implements Serializable{ +public class Addressee { @XmlAttribute private String email; @XmlValue diff --git a/services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/MailData.java b/services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/MailData.java index 703c980..14ef915 100644 --- a/services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/MailData.java +++ b/services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/MailData.java @@ -4,7 +4,7 @@ import lombok.Data; import java.io.Serializable; -import java.util.HashSet; +import java.util.HashMap; /** * Created by val on 2017-05-11. @@ -13,7 +13,8 @@ @AllArgsConstructor public class MailData implements Serializable { private static final long serialVersionUID = 1L; - private HashSet usersTo; + private String users; private String subject; private String body; + private HashMap attaches; } \ No newline at end of file diff --git a/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/jms/JmsListener.java b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/jms/JmsListener.java index 2e96f17..2e61132 100644 --- a/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/jms/JmsListener.java +++ b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/jms/JmsListener.java @@ -1,13 +1,22 @@ package ru.javaops.masterjava.service.mail.jms; +import com.google.common.collect.ImmutableList; import lombok.extern.slf4j.Slf4j; +import ru.javaops.masterjava.service.mail.Attach; import ru.javaops.masterjava.service.mail.MailData; +import ru.javaops.masterjava.service.mail.MailServiceExecutor; +import ru.javaops.masterjava.service.mail.MailWSClient; +import ru.javaops.masterjava.service.mail.util.Attachments; import javax.jms.*; import javax.naming.InitialContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; +import java.io.ByteArrayInputStream; +import java.util.Iterator; +import java.util.List; +import java.util.Map; @WebListener @Slf4j @@ -35,7 +44,15 @@ public void contextInitialized(ServletContextEvent sce) { ObjectMessage om = (ObjectMessage) m; MailData mailData = (MailData) om.getObject(); log.info(String.format("Received TextMessage with text '%s' for recipients %s.", - mailData.getBody(), mailData.getUsersTo().toString())); + mailData.getBody(), mailData.getUsers())); + + List attaches = ImmutableList.of(); + Iterator> iterator = mailData.getAttaches().entrySet().iterator(); + if (iterator.hasNext()) { + Map.Entry next = iterator.next(); + attaches = ImmutableList.of(Attachments.getAttach(next.getKey(), new ByteArrayInputStream(next.getValue()))); + } + MailServiceExecutor.sendBulk(MailWSClient.split(mailData.getUsers()), mailData.getSubject(), mailData.getBody(), attaches); } } } catch (Exception e) { diff --git a/web/webapp/src/main/java/ru/javaops/masterjava/webapp/JmsSendServlet.java b/web/webapp/src/main/java/ru/javaops/masterjava/webapp/JmsSendServlet.java index 027581c..7a9110a 100644 --- a/web/webapp/src/main/java/ru/javaops/masterjava/webapp/JmsSendServlet.java +++ b/web/webapp/src/main/java/ru/javaops/masterjava/webapp/JmsSendServlet.java @@ -1,24 +1,27 @@ package ru.javaops.masterjava.webapp; +import com.google.common.collect.ImmutableMap; import lombok.extern.slf4j.Slf4j; -import ru.javaops.masterjava.service.mail.Addressee; import ru.javaops.masterjava.service.mail.MailData; -import ru.javaops.masterjava.service.mail.MailWSClient; import javax.jms.*; import javax.naming.InitialContext; import javax.servlet.ServletConfig; import javax.servlet.ServletException; +import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.Part; import java.io.IOException; import java.lang.IllegalStateException; -import java.util.HashSet; +import java.util.HashMap; +import java.util.Map; @WebServlet("/sendJms") @Slf4j +@MultipartConfig public class JmsSendServlet extends HttpServlet { private Connection connection; private Session session; @@ -55,17 +58,27 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S String users = req.getParameter("users"); String subject = req.getParameter("subject"); String body = req.getParameter("body"); - resp.getWriter().write(sendJms(users, subject, body)); + + Map attaches; + Part filePart = req.getPart("attach"); + if (filePart.getSize() == 0) { + attaches = ImmutableMap.of(); + } else { + byte[] toAttach = new byte[filePart.getInputStream().available()]; + filePart.getInputStream().read(toAttach); + attaches = ImmutableMap.of(filePart.getSubmittedFileName(), toAttach); + + } + resp.getWriter().write(sendJms(users, subject, body, attaches)); } - private synchronized String sendJms(String users, String subject, String body) { + private synchronized String sendJms(String users, String subject, String body, Map attaches) { String msg; try { - HashSet usersTo = new HashSet<>(MailWSClient.split(users)); - MailData mailData = new MailData(usersTo, subject, body); + HashMap attachMap = new HashMap<>(attaches); + MailData mailData = new MailData(users, subject, body, attachMap); ObjectMessage om = session.createObjectMessage(); om.setObject(mailData); - //om.setObject(new String("abc")); producer.send(om); msg = "Successfully sent message."; log.info(msg); diff --git a/web/webapp/src/main/webapp/WEB-INF/templates/users.html b/web/webapp/src/main/webapp/WEB-INF/templates/users.html index 5cfd5f8..ac772cc 100644 --- a/web/webapp/src/main/webapp/WEB-INF/templates/users.html +++ b/web/webapp/src/main/webapp/WEB-INF/templates/users.html @@ -70,7 +70,7 @@ form.attr("enctype", 'multipart/form-data'); } else { form.attr("action", 'sendJms'); - form.attr("enctype", 'application/x-www-form-urlencoded'); + form.attr("enctype", 'multipart/form-data'); } }