Skip to content

Commit 507a765

Browse files
committed
11_2_HW10_JMS_attach
1 parent 58aea65 commit 507a765

File tree

9 files changed

+144
-109
lines changed

9 files changed

+144
-109
lines changed

services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/MailWSClient.java

-8
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package ru.javaops.masterjava.service.mail;
22

3-
import com.google.common.base.Splitter;
4-
import com.google.common.collect.ImmutableSet;
5-
import com.google.common.collect.Iterables;
63
import com.google.common.io.Resources;
74
import lombok.extern.slf4j.Slf4j;
85
import ru.javaops.masterjava.web.WebStateException;
@@ -44,11 +41,6 @@ private static MailService getPort() {
4441
return WS_CLIENT.getPort(new MTOMFeature(1024));
4542
}
4643

47-
public static Set<Addressee> split(String addressees) {
48-
Iterable<String> split = Splitter.on(',').trimResults().omitEmptyStrings().split(addressees);
49-
return ImmutableSet.copyOf(Iterables.transform(split, Addressee::new));
50-
}
51-
5244
public static WsClient.HostConfig getHostConfig() {
5345
return WS_CLIENT.getHostConfig();
5446
}

services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/util/Attachments.java

-47
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package ru.javaops.masterjava.service.mail.util;
2+
3+
import com.google.common.base.Splitter;
4+
import com.google.common.collect.ImmutableSet;
5+
import com.google.common.collect.Iterables;
6+
import com.sun.istack.NotNull;
7+
import lombok.AllArgsConstructor;
8+
import lombok.Data;
9+
import org.apache.commons.io.IOUtils;
10+
import org.apache.commons.io.input.CloseShieldInputStream;
11+
import ru.javaops.masterjava.service.mail.Addressee;
12+
import ru.javaops.masterjava.service.mail.Attachment;
13+
14+
import javax.activation.DataHandler;
15+
import javax.activation.DataSource;
16+
import java.io.*;
17+
import java.util.Set;
18+
19+
public class MailUtils {
20+
21+
public static Set<Addressee> split(String addressees) {
22+
Iterable<String> split = Splitter.on(',').trimResults().omitEmptyStrings().split(addressees);
23+
return ImmutableSet.copyOf(Iterables.transform(split, Addressee::new));
24+
}
25+
26+
@Data
27+
@AllArgsConstructor
28+
public static class MailObject implements Serializable {
29+
private @NotNull String users;
30+
private String subject;
31+
private @NotNull String body;
32+
private String attachName;
33+
private byte[] attachData;
34+
}
35+
36+
public static MailObject getMailObject(String users, String subject, String body, String name, InputStream is) {
37+
try {
38+
return new MailObject(users, subject, body, name, is == null ? null : IOUtils.toByteArray(is));
39+
} catch (IOException e) {
40+
throw new IllegalStateException(e);
41+
}
42+
}
43+
44+
public static Attachment getAttachment(String name, byte[] attachData) {
45+
return new Attachment(name, new DataHandler((ProxyDataSource) () -> new ByteArrayInputStream(attachData)));
46+
}
47+
48+
public static Attachment getAttachment(String name, InputStream inputStream) {
49+
// http://stackoverflow.com/questions/2830561/how-to-convert-an-inputstream-to-a-datahandler
50+
// http://stackoverflow.com/a/5924019/548473
51+
return new Attachment(name, new DataHandler((ProxyDataSource) () -> new CloseShieldInputStream(inputStream)));
52+
}
53+
54+
public interface ProxyDataSource extends DataSource {
55+
@Override
56+
default OutputStream getOutputStream() throws IOException {
57+
throw new UnsupportedOperationException("Not implemented");
58+
}
59+
60+
@Override
61+
default String getContentType() {
62+
return "application/octet-stream";
63+
}
64+
65+
@Override
66+
default String getName() {
67+
return "";
68+
}
69+
}
70+
}

services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/MailServiceExecutor.java

+17
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package ru.javaops.masterjava.service.mail;
22

3+
import com.google.common.collect.ImmutableList;
34
import lombok.extern.slf4j.Slf4j;
45
import one.util.streamex.StreamEx;
56
import ru.javaops.masterjava.ExceptionType;
7+
import ru.javaops.masterjava.service.mail.util.MailUtils;
8+
import ru.javaops.masterjava.service.mail.util.MailUtils.MailObject;
69
import ru.javaops.masterjava.web.WebStateException;
710
import ru.javaops.masterjava.web.WsClient;
811

@@ -69,4 +72,18 @@ private void cancel(String cause, Throwable t) throws WebStateException {
6972
}
7073
}.call();
7174
}
75+
76+
public static void sendAsync(MailObject mailObject) {
77+
Set<Addressee> addressees = MailUtils.split(mailObject.getUsers());
78+
addressees.forEach(addressee ->
79+
mailExecutor.submit(() -> {
80+
try {
81+
MailSender.sendTo(addressee, mailObject.getSubject(), mailObject.getBody(),
82+
ImmutableList.of(MailUtils.getAttachment(mailObject.getAttachName(), mailObject.getAttachData())));
83+
} catch (WebStateException e) {
84+
// already logged
85+
}
86+
})
87+
);
88+
}
7289
}

services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/listeners/JmsMailListener.java

+11-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package ru.javaops.masterjava.service.mail.listeners;
22

33
import lombok.extern.slf4j.Slf4j;
4+
import org.apache.activemq.ActiveMQConnectionFactory;
5+
import ru.javaops.masterjava.service.mail.MailServiceExecutor;
6+
import ru.javaops.masterjava.service.mail.util.MailUtils;
47

58
import javax.jms.*;
69
import javax.naming.InitialContext;
@@ -18,8 +21,9 @@ public class JmsMailListener implements ServletContextListener {
1821
public void contextInitialized(ServletContextEvent sce) {
1922
try {
2023
InitialContext initCtx = new InitialContext();
21-
QueueConnectionFactory connectionFactory =
22-
(QueueConnectionFactory) initCtx.lookup("java:comp/env/jms/ConnectionFactory");
24+
ActiveMQConnectionFactory connectionFactory =
25+
(ActiveMQConnectionFactory) initCtx.lookup("java:comp/env/jms/ConnectionFactory");
26+
connectionFactory.setTrustAllPackages(true);
2327
connection = connectionFactory.createQueueConnection();
2428
QueueSession queueSession = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
2529
Queue queue = (Queue) initCtx.lookup("java:comp/env/jms/queue/MailQueue");
@@ -30,11 +34,11 @@ public void contextInitialized(ServletContextEvent sce) {
3034
try {
3135
while (!Thread.interrupted()) {
3236
Message m = receiver.receive();
33-
// TODO implement mail sending
34-
if (m instanceof TextMessage) {
35-
TextMessage tm = (TextMessage) m;
36-
String text = tm.getText();
37-
log.info("Received TextMessage with text '{}'", text);
37+
if (m instanceof ObjectMessage) {
38+
ObjectMessage om = (ObjectMessage) m;
39+
MailUtils.MailObject mailObject = (MailUtils.MailObject) om.getObject();
40+
log.info("Received MailObject {}", mailObject);
41+
MailServiceExecutor.sendAsync(mailObject);
3842
}
3943
}
4044
} catch (Exception e) {

services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/rest/MailRS.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99
import ru.javaops.masterjava.service.mail.Attachment;
1010
import ru.javaops.masterjava.service.mail.GroupResult;
1111
import ru.javaops.masterjava.service.mail.MailServiceExecutor;
12-
import ru.javaops.masterjava.service.mail.MailWSClient;
13-
import ru.javaops.masterjava.service.mail.util.Attachments;
12+
import ru.javaops.masterjava.service.mail.util.MailUtils;
1413
import ru.javaops.masterjava.web.WebStateException;
1514

1615
import javax.activation.DataHandler;
@@ -47,11 +46,11 @@ public GroupResult send(@NotBlank @FormDataParam("users") String users,
4746
String utf8name = new String(attachName.getBytes("ISO8859_1"), "UTF-8");
4847
BodyPartEntity bodyPartEntity = ((BodyPartEntity) attachBodyPart.getEntity());
4948

50-
attachments = ImmutableList.of(new Attachment(utf8name, new DataHandler((Attachments.ProxyDataSource) bodyPartEntity::getInputStream)));
49+
attachments = ImmutableList.of(new Attachment(utf8name, new DataHandler((MailUtils.ProxyDataSource) bodyPartEntity::getInputStream)));
5150
} catch (UnsupportedEncodingException e) {
5251
throw new IllegalStateException(e);
5352
}
5453
}
55-
return MailServiceExecutor.sendBulk(MailWSClient.split(users), subject, body, attachments);
54+
return MailServiceExecutor.sendBulk(MailUtils.split(users), subject, body, attachments);
5655
}
5756
}

web/webapp/src/main/java/ru/javaops/masterjava/webapp/JmsSendServlet.java

+20-9
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
11
package ru.javaops.masterjava.webapp;
22

33
import lombok.extern.slf4j.Slf4j;
4+
import ru.javaops.masterjava.service.mail.util.MailUtils;
5+
import ru.javaops.masterjava.service.mail.util.MailUtils.MailObject;
46

57
import javax.jms.*;
68
import javax.naming.InitialContext;
79
import javax.servlet.ServletConfig;
810
import javax.servlet.ServletException;
11+
import javax.servlet.annotation.MultipartConfig;
912
import javax.servlet.annotation.WebServlet;
1013
import javax.servlet.http.HttpServlet;
1114
import javax.servlet.http.HttpServletRequest;
1215
import javax.servlet.http.HttpServletResponse;
16+
import javax.servlet.http.Part;
1317
import java.io.IOException;
1418
import java.lang.IllegalStateException;
1519

1620
@WebServlet("/sendJms")
1721
@Slf4j
22+
@MultipartConfig
1823
public class JmsSendServlet extends HttpServlet {
1924
private Connection connection;
2025
private Session session;
@@ -46,16 +51,22 @@ public void destroy() {
4651
}
4752

4853
@Override
49-
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
54+
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
5055
String result;
5156
try {
5257
log.info("Start sending");
5358
req.setCharacterEncoding("UTF-8");
5459
resp.setCharacterEncoding("UTF-8");
55-
String users = req.getParameter("users");
56-
String subject = req.getParameter("subject");
57-
String body = req.getParameter("body");
58-
result = sendJms(users, subject, body);
60+
Part filePart = req.getPart("attach");
61+
62+
MailObject mailObject = MailUtils.getMailObject(
63+
req.getParameter("users"),
64+
req.getParameter("subject"),
65+
req.getParameter("body"),
66+
filePart == null ? null : filePart.getSubmittedFileName(),
67+
filePart == null ? null : filePart.getInputStream());
68+
69+
result = sendJms(mailObject);
5970
log.info("Processing finished with result: {}", result);
6071
} catch (Exception e) {
6172
log.error("Processing failed", e);
@@ -64,10 +75,10 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S
6475
resp.getWriter().write(result);
6576
}
6677

67-
private synchronized String sendJms(String users, String subject, String body) throws JMSException {
68-
TextMessage testMessage = session.createTextMessage();
69-
testMessage.setText(subject);
70-
producer.send(testMessage);
78+
private synchronized String sendJms(MailObject mailObject) throws JMSException {
79+
ObjectMessage om = session.createObjectMessage();
80+
om.setObject(mailObject);
81+
producer.send(om);
7182
return "Successfully sent JMS message";
7283
}
7384
}

web/webapp/src/main/java/ru/javaops/masterjava/webapp/SoapSendServlet.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
import lombok.extern.slf4j.Slf4j;
55
import ru.javaops.masterjava.service.mail.GroupResult;
66
import ru.javaops.masterjava.service.mail.MailWSClient;
7-
import ru.javaops.masterjava.service.mail.util.Attachments;
7+
import ru.javaops.masterjava.service.mail.util.MailUtils;
88

9-
import javax.servlet.ServletException;
109
import javax.servlet.annotation.MultipartConfig;
1110
import javax.servlet.annotation.WebServlet;
1211
import javax.servlet.http.HttpServlet;
@@ -20,7 +19,7 @@
2019
@MultipartConfig
2120
public class SoapSendServlet extends HttpServlet {
2221
@Override
23-
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
22+
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
2423
String result;
2524
try {
2625
log.info("Start sending");
@@ -30,9 +29,9 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S
3029
String subject = req.getParameter("subject");
3130
String body = req.getParameter("body");
3231
Part filePart = req.getPart("attach");
33-
GroupResult groupResult = MailWSClient.sendBulk(MailWSClient.split(users), subject, body,
32+
GroupResult groupResult = MailWSClient.sendBulk(MailUtils.split(users), subject, body,
3433
filePart == null ? null :
35-
ImmutableList.of(Attachments.getAttachment(filePart.getSubmittedFileName(), filePart.getInputStream())));
34+
ImmutableList.of(MailUtils.getAttachment(filePart.getSubmittedFileName(), filePart.getInputStream())));
3635
result = groupResult.toString();
3736
log.info("Processing finished with result: {}", result);
3837
} catch (Exception e) {

0 commit comments

Comments
 (0)