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" + /> attaches; +} \ No newline at end of file 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/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/jms/JmsListener.java b/services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/jms/JmsListener.java index afd56ac..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,12 +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 @@ -30,11 +40,19 @@ 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.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/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..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 @@ -1,15 +1,23 @@ 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.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; @Path("/") public class MailRS { @@ -23,10 +31,24 @@ 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 = new ArrayList<>(); + if (fileDetail.getFileName().isEmpty()) { + attaches = ImmutableList.of(); + } else { + try { + String name = new String(fileDetail.getFileName().getBytes ("iso-8859-1"), "UTF-8"); + attaches = ImmutableList.of(Attachments.getAttach(name, uploadedInputStream)); + } catch (IOException e) { + e.printStackTrace(); + } + } + 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/java/ru/javaops/masterjava/webapp/JmsSendServlet.java b/web/webapp/src/main/java/ru/javaops/masterjava/webapp/JmsSendServlet.java index 8123d9e..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,20 +1,27 @@ package ru.javaops.masterjava.webapp; +import com.google.common.collect.ImmutableMap; import lombok.extern.slf4j.Slf4j; +import ru.javaops.masterjava.service.mail.MailData; 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.HashMap; +import java.util.Map; @WebServlet("/sendJms") @Slf4j +@MultipartConfig public class JmsSendServlet extends HttpServlet { private Connection connection; private Session session; @@ -51,15 +58,28 @@ 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 { - TextMessage testMessage = session.createTextMessage(); - testMessage.setText(subject); - producer.send(testMessage); + HashMap attachMap = new HashMap<>(attaches); + MailData mailData = new MailData(users, subject, body, attachMap); + ObjectMessage om = session.createObjectMessage(); + om.setObject(mailData); + producer.send(om); msg = "Successfully sent message."; log.info(msg); } catch (Exception e) { 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())); 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..ac772cc 100644 --- a/web/webapp/src/main/webapp/WEB-INF/templates/users.html +++ b/web/webapp/src/main/webapp/WEB-INF/templates/users.html @@ -67,10 +67,10 @@ 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'); + form.attr("enctype", 'multipart/form-data'); } }