package au.com.vaadinutils.jasper.scheduler; import java.io.File; import java.io.IOException; import java.sql.Connection; import java.util.Collection; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Map; import javax.mail.internet.AddressException; import org.apache.commons.mail.EmailException; import au.com.vaadinutils.jasper.AttachmentType; import au.com.vaadinutils.jasper.JasperEmailBuilder; import au.com.vaadinutils.jasper.JasperEmailSettings; import au.com.vaadinutils.jasper.JasperManager; import au.com.vaadinutils.jasper.JasperManager.OutputFormat; import au.com.vaadinutils.jasper.RenderedReport; import au.com.vaadinutils.jasper.filter.ReportFilterUIBuilder; import au.com.vaadinutils.jasper.parameter.ReportParameter; import au.com.vaadinutils.jasper.parameter.ReportParameterConstant; import au.com.vaadinutils.jasper.scheduler.entities.ReportEmailRecipient; import au.com.vaadinutils.jasper.ui.CleanupCallback; import au.com.vaadinutils.jasper.ui.JasperReportProperties; import au.com.vaadinutils.jasper.ui.JasperReportPropertiesAlternateFile; import com.google.common.base.Preconditions; public class ReportEmailRunnerImpl implements ReportEmailRunner, JasperReportProperties { private JasperReportProperties jasperReportProperties; private ReportEmailSchedule schedule; // Logger logger = LogManager.getLogger(); @Override public boolean runReport(ReportEmailSchedule schedule, Date scheduledTime, JasperEmailSettings emailSettings) throws InterruptedException, IOException, EmailException, InstantiationException, IllegalAccessException, AddressException, ClassNotFoundException { Preconditions.checkNotNull(schedule.getSendersEmailAddress(),"Missing senders email address."); Preconditions.checkNotNull(schedule.getRecipients(),"Missing recipient email address"); Preconditions.checkArgument(schedule.getRecipients().size()>0,"Missing recipient email address"); Class<? extends JasperReportProperties> jrpClass = schedule.getJasperReportPropertiesClass(); jasperReportProperties = jrpClass.newInstance(); this.schedule = schedule; jasperReportProperties = new JasperReportPropertiesAlternateFile(schedule.getReportTitle(),schedule.getReportFileName(), jasperReportProperties); Collection<ReportParameter<?>> params = buildParams(schedule, scheduledTime, this); JasperManager manager = new JasperManager(this); if (manager.checkQueueSize() > 0) { return false; } JasperEmailBuilder builder = new JasperEmailBuilder(emailSettings); OutputFormat outputFormat = schedule.getOutputFormat(); RenderedReport export = manager.export(outputFormat, params); try { AttachmentType attachementType = outputFormat.getAttachementType(); builder.setFrom(schedule.getSendersEmailAddress().toString()).setSubject(schedule.subject()) .setHtmlBody(schedule.message()) .addAttachement(export.getBodyAsDataSource(schedule.getReportTitle()+attachementType.getFileExtension(), attachementType)); for (ReportEmailRecipient address : schedule.getRecipients()) { switch (address.getVisibility()) { case TO: builder.addTo(address.getEmail()); break; case CC: builder.addCC(address.getEmail()); break; case BCC: builder.addBCC(address.getEmail()); break; } } builder.send(false); } finally { export.close(); } return true; } private Collection<ReportParameter<?>> buildParams(ReportEmailSchedule schedule, Date scheduledTime, JasperReportProperties jasperReportProperties) { Collection<ReportParameter<?>> params = new HashSet<ReportParameter<?>>(); for (ReportEmailParameter param : schedule.getReportParameters()) { ReportParameterConstant<String> parameter = new ReportParameterConstant<String>(param.getName(), param.getValue(), param.getLabel(), param.getDisplayValue()); params.add(parameter); } // set modified date params for (ScheduledDateParameter param : schedule.getDateParameters()) { String start = param.getOffsetType().convertStartDate(param.getStartDate(), scheduledTime, param.getType()); params.add(new ReportParameterConstant<String>(param.getStartName(), start, param.getLabel()+" From", start)); String end = param.getOffsetType().convertEndDate(param.getEndDate(), scheduledTime, param.getType()); params.add(new ReportParameterConstant<String>(param.getEndName(), end,param.getLabel()+" To",end)); } return params; } @Override public Map<String, Object> getCustomReportParameterMap() { return jasperReportProperties.getCustomReportParameterMap(); } @Override public String getReportTitle() { return jasperReportProperties.getReportTitle(); } @Override public String getReportFileName() { return jasperReportProperties.getReportFileName(); } @Override public File getReportFolder() { return jasperReportProperties.getReportFolder(); } @Override public String getHeaderFooterTemplateName() { return jasperReportProperties.getHeaderFooterTemplateName(); } @Override public String getUsername() { return schedule.getSendersUsername(); } @Override public ReportFilterUIBuilder getFilterBuilder() { return jasperReportProperties.getFilterBuilder(); } @Override public List<ReportParameter<?>> prepareData(Collection<ReportParameter<?>> params, String reportFileName, CleanupCallback cleanupCallback) throws Exception { return jasperReportProperties.prepareData(params, reportFileName, cleanupCallback); } @Override public CleanupCallback getCleanupCallback() { return jasperReportProperties.getCleanupCallback(); } @Override public void prepareForOutputFormat(OutputFormat outputFormat) { jasperReportProperties.prepareForOutputFormat(outputFormat); } @Override public void closeDBConnection() { jasperReportProperties.closeDBConnection(); } @Override public void initDBConnection() { jasperReportProperties.initDBConnection(); } @Override public Connection getConnection() { return jasperReportProperties.getConnection(); } @Override public OutputFormat getDefaultFormat() { return jasperReportProperties.getDefaultFormat(); } @Override public String generateDynamicHeaderImage(int pageWidth,int height, String reportTitle) { return jasperReportProperties.generateDynamicHeaderImage(pageWidth,height, reportTitle); } @Override public boolean isDevMode() { return jasperReportProperties.isDevMode(); } @Override public Class<? extends JasperReportProperties> getReportClass() { return jasperReportProperties.getReportClass(); } @Override public String getUserEmailAddress() { try { return schedule.getSendersEmailAddress().toString(); } catch (AddressException e) { throw new RuntimeException(e); } } @Override public Enum<?> getReportIdentifier() { return jasperReportProperties.getReportIdentifier(); } @Override public String getDynamicJrxmlFileName() { return null; } }