/* * Copyright (c) 2015 Felix Husse under MIT License * see LICENSE file */ package de.fatalix.bookery.bl; import de.fatalix.bookery.bl.dao.AppSettingDAO; import de.fatalix.bookery.bl.model.AppUser; import de.fatalix.bookery.bl.model.SettingKey; import de.fatalix.bookery.bl.solr.SolrHandler; import de.fatalix.bookery.solr.model.BookEntry; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.nio.file.Files; import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.ejb.Stateless; import javax.ejb.Timeout; import javax.ejb.Timer; import javax.ejb.TimerConfig; import javax.ejb.TimerService; import javax.inject.Inject; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import org.apache.log4j.Logger; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.common.SolrInputDocument; /** * * @author Fatalix */ @Stateless public class BookeryMailService { @Resource(lookup = "java:/mail/bookeryMail") private Session mailSession; @Resource private TimerService timerService; @Inject private Logger logger; @Inject private SolrHandler solrHandler; @Inject private AppSettingDAO settings; public void scheduleKindleMail(BookEntry book, AppUser user) { Payload payload = new Payload(book, user); TimerConfig timerConfig = new TimerConfig(payload, false); timerService.createSingleActionTimer(100l, timerConfig); } @Timeout public void createKindleMail(Timer timer) { try { Payload payload = (Payload)timer.getInfo(); BookEntry book = payload.getBook(); AppUser user = payload.getUser(); byte[] attachment = solrHandler.getMobiFormat(book.getId()).get(0).getMobi(); //1.Step Check if convert if (attachment == null) { convertEPubToMobi(book); attachment = solrHandler.getMobiFormat(book.getId()).get(0).getMobi(); } //2. Step Send Email String filename = book.getTitle() + "-" + book.getAuthor(); sendKindleMail(user, attachment, filename); } catch (SolrServerException | MessagingException | IOException | InterruptedException ex) { logger.error("failed to create Kindle mail.",ex); } } private void sendKindleMail(AppUser user, byte[] attachment, String filename) throws MessagingException { BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText("Bookery delivery, frei haus!"); BodyPart attachmentPart = new MimeBodyPart(); attachmentPart.setFileName(filename + ".mobi"); attachmentPart.setContent(attachment, "application/octet-stream"); //attachmentPart.setDataHandler(new DataHandler(new ByteArrayDataSource(attachment, "application/x-mobipocket-ebook"))); Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); multipart.addBodyPart(attachmentPart); MimeMessage message = new MimeMessage(mailSession); InternetAddress[] address = {new InternetAddress(user.geteMail())}; message.setRecipients(Message.RecipientType.TO, address); message.setSubject("Bookery delivery"); message.setSentDate(new Date()); message.setContent(multipart); Transport.send(message); } private void convertEPubToMobi(BookEntry book) throws SolrServerException, IOException, InterruptedException { String EBOOK_CONVERT = settings.findByKey(SettingKey.CALIBRE_PATH).getConfigurationValue() + "/ebook-convert"; String filename = book.getTitle() + "-" + book.getAuthor() + ".epub"; byte[] data = solrHandler.getEpubBook(book.getId()).get(0).getEpub(); File epubFile = new File(settings.findByKey(SettingKey.CALIBRE_WORK).getConfigurationValue(), filename); Files.write(epubFile.toPath(), data, StandardOpenOption.CREATE); String mobiBook = epubFile.getAbsolutePath(); mobiBook = mobiBook.substring(0, mobiBook.length() - 4); mobiBook = mobiBook + "mobi"; String[] cmds = {EBOOK_CONVERT, epubFile.getAbsolutePath(), mobiBook}; Process p = Runtime.getRuntime().exec(cmds); p.waitFor(); File mobiFile = new File(mobiBook); byte[] mobiData = Files.readAllBytes(mobiFile.toPath()); updateBookEntry(book.getId(), mobiData); epubFile.delete(); mobiFile.delete(); logger.info("Converted ePub File to Mobi"); } private void updateBookEntry(String bookID, byte[] data) throws SolrServerException, IOException { List<SolrInputDocument> solrDocs = new ArrayList<>(); SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", bookID); Map<String, Object> mobiData = new HashMap<>(); mobiData.put("set", data); doc.addField("mobi", mobiData); solrDocs.add(doc); solrHandler.updateDocument(solrDocs); } public class Payload implements Serializable{ private final BookEntry book; private final AppUser user; public Payload(BookEntry book, AppUser user) { this.book = book; this.user = user; } public BookEntry getBook() { return book; } public AppUser getUser() { return user; } } public void sendTestMail(String receiver) throws AddressException, MessagingException { MimeMessage message = new MimeMessage(mailSession); InternetAddress[] address = {new InternetAddress(receiver)}; message.setRecipients(Message.RecipientType.TO, address); message.setSubject("Test Message"); message.setSentDate(new Date()); message.setText("This message was sent via wildfly!"); Transport.send(message); } }