package com.ifsoft.jmxweb.plugin; import com.itextpdf.text.*; import com.itextpdf.text.pdf.PdfWriter; import com.itextpdf.text.pdf.PdfPTable; import com.owlike.genson.Genson; import javax.activation.DataHandler; import javax.mail.*; import javax.mail.internet.*; import javax.mail.util.ByteArrayDataSource; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.*; import java.util.Date; import java.security.Security; import org.jivesoftware.openfire.admin.DefaultAdminProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xmpp.packet.JID; import org.jivesoftware.openfire.user.User; import org.jivesoftware.openfire.user.UserManager; import org.jivesoftware.util.*; /** * This class creates a pdf attachment to be sent via email. * **/ public class EmailSenderUtility{ private static Logger Log = LoggerFactory.getLogger("JmxWebPlugin:EmailSenderUtility"); private static final String SSL_FACTORY = "org.jivesoftware.util.SimpleSSLSocketFactory"; public void sendEmail() { ByteArrayOutputStream outputStream = null; try { String host = JiveGlobals.getProperty("mail.smtp.host", "localhost"); String port = JiveGlobals.getProperty("mail.smtp.port", "25"); String username = JiveGlobals.getProperty("mail.smtp.username"); String password = JiveGlobals.getProperty("mail.smtp.password"); String debugEnabled = JiveGlobals.getProperty("mail.debug"); boolean sslEnabled = JiveGlobals.getBooleanProperty("mail.smtp.ssl", true); Properties props = new Properties(); props.put("mail.smtp.host", host); props.put("mail.smtp.auth", port); props.setProperty("mail.smtp.sendpartial", "true"); props.setProperty("mail.debug", debugEnabled); if (sslEnabled) { // Register with security provider. Security.setProperty("ssl.SocketFactory.provider", SSL_FACTORY); props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY); props.setProperty("mail.smtp.socketFactory.fallback", "true"); } if (username != null) { props.put("mail.smtp.auth", "true"); } Session session = Session.getInstance(props); outputStream = new ByteArrayOutputStream(); createPdfAttachment(outputStream); byte[] bytes = outputStream.toByteArray(); ByteArrayDataSource dataSource = new ByteArrayDataSource(bytes, "application/pdf"); MimeBodyPart pdfBodyPart = new MimeBodyPart(); pdfBodyPart.setDataHandler(new DataHandler(dataSource)); pdfBodyPart.setFileName("ResultSummary.pdf"); MimeMultipart multipart= new MimeMultipart(); multipart.addBodyPart(pdfBodyPart); MimeMessage msg = new MimeMessage(session); DefaultAdminProvider defaultAdminProvider= new DefaultAdminProvider(); java.util.List<JID> adminList=defaultAdminProvider.getAdmins(); java.util.List<String> adminListEmails=new ArrayList<String>(); UserManager manager = UserManager.getInstance(); Log.info("Number of Admins " +adminList.size()); for(int i = 0; i < adminList.size(); i++) { User user; try { user = manager.getUser(adminList.get(i).getNode().toString()); Log.info("Admin Emails: " +user.getEmail()); adminListEmails.add(user.getEmail()); } catch (Exception ex) { continue; } } // java.util.List<String> recipientsList=Arrays.asList("", "", ""); InternetAddress[] recipients = new InternetAddress[adminListEmails.size()]; for (int i = 0; i < adminListEmails.size(); i++) { recipients[i] = new InternetAddress(adminListEmails.get(i).toString()); } msg.setFrom(new InternetAddress("no-reply@openfire.org", "Openfire Admin")); msg.setRecipients(javax.mail.Message.RecipientType.TO,recipients); msg.setSubject("MONITORING REPORT - " + new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new Date())); msg.setContent(multipart); if (username != null) { URLName url = new URLName("smtp", host, Integer.parseInt(port), "", username, password); Transport transport = new com.sun.mail.smtp.SMTPTransport(session, url); transport.connect(host, Integer.parseInt(port), username, password); transport.sendMessage(msg, msg.getRecipients(MimeMessage.RecipientType.TO)); } else Transport.send(msg); } catch (Exception e) { e.printStackTrace(); System.out.println("Could not send email"); } } public void createPdfAttachment(OutputStream outputStream) throws Exception { Document document = new Document(); PdfWriter.getInstance(document, outputStream); document.open(); document.addTitle("Monitoring Report"); document.addSubject("PDF Document"); document.addKeywords("iText, email"); document.addAuthor("JMX"); document.addCreator("JMX"); Timestamp stamp = new Timestamp(System.currentTimeMillis()); Date date = new Date(stamp.getTime()); //Make the Get call to get the data from Jolokia endpoint. HttpClient httpClient = new HttpClient(); String monData = httpClient.getMemoryData(); Log.info("Monitoring Data JSON:"+monData); //Converting json string to java object for easy manipulation. Map outNode = new Genson().deserialize(monData, Map.class); Map requestNode = (Map) outNode.get("request"); Map valueNode = (Map) outNode.get("value"); HashMap<String,String> monitoringData = new HashMap<String,String>(); monitoringData.put("Current Date",date.toString()); monitoringData.put("Report Date",outNode.get("timestamp").toString()); monitoringData.put("Maximum Heap Memory",valueNode.get("max").toString()); monitoringData.put("Committed Heap Memory",valueNode.get("committed").toString()); monitoringData.put("Init Heap Memory",valueNode.get("init").toString()); monitoringData.put("Used Heap Memory",valueNode.get("used").toString()); Font boldFont = new Font(Font.FontFamily.TIMES_ROMAN, 18, Font.BOLD); PdfPTable table = new PdfPTable(2); table.setSpacingBefore(5); table.addCell(new Phrase("Monitor", boldFont )); table.addCell(new Phrase("Value", boldFont )); for (Map.Entry<String, String> entry : monitoringData.entrySet()) { table.addCell(entry.getKey()); System.out.println(entry.getKey()); if (entry.getValue()!="" && entry.getValue()!=null) { table.addCell(entry.getValue()); System.out.println(entry.getValue()); } else{ table.addCell("NOT AVAILABLE"); } } table.setHorizontalAlignment(Element.ALIGN_CENTER); document.add(table); document.close(); } }