package au.com.vaadinutils.jasper.scheduler; import java.util.Collection; import java.util.Date; import java.util.LinkedList; import java.util.List; import javax.mail.internet.InternetAddress; import javax.persistence.EntityManager; import org.vaadin.dialogs.ConfirmDialog; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Notification; import com.vaadin.ui.Notification.Type; import com.vaadin.ui.TextArea; import com.vaadin.ui.TextField; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import au.com.vaadinutils.dao.EntityManagerProvider; import au.com.vaadinutils.jasper.JasperManager.OutputFormat; import au.com.vaadinutils.jasper.parameter.ReportChooser; import au.com.vaadinutils.jasper.parameter.ReportParameter; import au.com.vaadinutils.jasper.scheduler.entities.DateParameterOffsetType; import au.com.vaadinutils.jasper.scheduler.entities.ReportEmailParameterEntity; import au.com.vaadinutils.jasper.scheduler.entities.ReportEmailRecipient; import au.com.vaadinutils.jasper.scheduler.entities.ReportEmailRecipientVisibility; import au.com.vaadinutils.jasper.scheduler.entities.ReportEmailScheduleEntity; import au.com.vaadinutils.jasper.scheduler.entities.ReportEmailScheduledDateParameter; import au.com.vaadinutils.jasper.scheduler.entities.ReportEmailSender; import au.com.vaadinutils.jasper.scheduler.entities.ScheduleMode; import au.com.vaadinutils.jasper.ui.JasperReportProperties; public class JasperReportEmailWindow extends Window { private static final long serialVersionUID = 1L; private EmailTargetLayout emailTargetLayout; private TextField subject; private TextArea message; public JasperReportEmailWindow(final JasperReportProperties props, final Collection<ReportParameter<?>> params) { try { new InternetAddress(props.getUserEmailAddress()); } catch (Exception e) { Notification.show("Your email address (" + props.getUserEmailAddress() + ") is invalid, go to accounts and fix your email address.", Type.ERROR_MESSAGE); return; } JasperReportProperties temp = props; for (ReportParameter<?> p : params) { if (p instanceof ReportChooser) { ReportChooser chooser = (ReportChooser) p; temp = chooser.getReportProperties(props); } else { if (!p.validate()) { Notification.show("Invalid parameter " + p.getLabel("")); return; } } } final JasperReportProperties reportProperties = temp; // TopVerticalLayout outerLayout = new TopVerticalLayout(); // outerLayout.setSizeFull(); VerticalLayout layout = new VerticalLayout(); layout.setSizeFull(); emailTargetLayout = new EmailTargetLayout(); emailTargetLayout.add(null); layout.addComponent(emailTargetLayout); subject = new TextField("Subject"); subject.setWidth("100%"); layout.addComponent(subject); subject.setValue(reportProperties.getReportTitle() + " report is attached"); subject.setMaxLength(250); message = new TextArea("Message"); message.setValue(reportProperties.getReportTitle() + " report is attached"); message.setSizeFull(); message.setMaxLength(1023); layout.addComponent(message); HorizontalLayout buttonLayout = new HorizontalLayout(); buttonLayout.setSizeFull(); buttonLayout.setHeight("10"); Button send = new Button("Send"); send.addClickListener(new ClickListener() { private static final long serialVersionUID = 1L; @Override public void buttonClick(ClickEvent event) { ReportEmailScheduleEntity schedule = sendEmail(params, reportProperties); if (schedule != null) { JasperReportEmailWindow.this.close(); JasperReportScheudulerService.SELF.reschedule(); Notification.show("Your email has been scheduled for immediate delivery", Type.WARNING_MESSAGE); } } }); buttonLayout.addComponent(send); buttonLayout.setHeight("40"); Button closer = new Button("Close"); closer.addClickListener(new ClickListener() { private static final long serialVersionUID = 1L; @Override public void buttonClick(ClickEvent event) { ConfirmDialog.show(UI.getCurrent(), "No email will be sent if you close this window", new ConfirmDialog.Listener() { private static final long serialVersionUID = 1L; @Override public void onClose(ConfirmDialog arg0) { if (arg0.isConfirmed()) { JasperReportEmailWindow.this.close(); } } }); } }); buttonLayout.addComponent(closer); buttonLayout.setComponentAlignment(closer, Alignment.MIDDLE_RIGHT); layout.addComponent(buttonLayout); this.setWidth("80%"); this.setHeight("80%"); layout.setMargin(true); layout.setSpacing(true); setCaption("Email " + props.getReportTitle()); layout.setExpandRatio(message, 1); this.setClosable(false); this.setContent(layout); setModal(true); // center(); UI.getCurrent().addWindow(this); } private ReportEmailScheduleEntity sendEmail(Collection<ReportParameter<?>> params, JasperReportProperties reportProperties) { String errorMessage = ""; boolean hasValidTargets = false; for (EmailTargetLine target : emailTargetLayout.getTargets()) { if (target.targetAddress.getValue() != null) { if (!target.targetAddress.isValid()) { errorMessage = target.targetAddress.getValue() + " is not a valid email address"; Notification.show(errorMessage, Type.ERROR_MESSAGE); return null; } hasValidTargets = true; } } if (!hasValidTargets) { Notification.show("Set at least one Recipient.", Type.ERROR_MESSAGE); return null; } ReportEmailScheduleEntity schedule = new ReportEmailScheduleEntity(); schedule.setTitle(reportProperties.getReportTitle()); schedule.setReportFilename(reportProperties.getReportFileName()); schedule.setReportTemplateIdentifier(reportProperties.getReportIdentifier()); schedule.setMessage(message.getValue()); schedule.setSubject(subject.getValue()); schedule.setReportClass(reportProperties.getReportClass()); schedule.setScheduleMode(ScheduleMode.ONE_TIME); schedule.setOneTimeRunTime(new Date()); schedule.setEnabled(true); EntityManager entityManager = EntityManagerProvider.getEntityManager(); List<ReportEmailParameterEntity> rparams = new LinkedList<ReportEmailParameterEntity>(); List<ReportEmailScheduledDateParameter> dparams = new LinkedList<ReportEmailScheduledDateParameter>(); for (ReportParameter<?> param : params) { // omit report choosers, as they would complicate and confuse // if (!(param instanceof ReportChooser)) { if (param instanceof ReportChooser) { String[] names = param.getParameterNames().toArray(new String[] {}); // add non date fields ReportEmailParameterEntity rparam = new ReportEmailParameterEntity(); rparam.setName(names[0]); rparam.setValue(param.getValue(names[0]).toString(), param.getDisplayValue(names[0])); rparams.add(rparam); entityManager.persist(rparam); } else if (!param.isDateField()) { String[] names = param.getParameterNames().toArray(new String[] {}); // add non date fields ReportEmailParameterEntity rparam = new ReportEmailParameterEntity(); rparam.setName(names[0]); rparam.setValue(param.getValue(names[0]).toString(), param.getDisplayValue(names[0])); rparams.add(rparam); entityManager.persist(rparam); } else { // add date fields ReportEmailScheduledDateParameter rparam = new ReportEmailScheduledDateParameter(); String[] names = param.getParameterNames().toArray(new String[] {}); rparam.setStartName(names[0]); rparam.setStartDate(param.getStartDate()); rparam.setEndName(names[1]); rparam.setEndDate(param.getEndDate()); rparam.setType(param.getDateParameterType()); rparam.setOffsetType(DateParameterOffsetType.CONSTANT); rparam.setLabel(param.getLabel(names[0])); dparams.add(rparam); entityManager.persist(rparam); } } } schedule.setParameters(rparams); schedule.setDateParameters(dparams); ReportEmailSender reportEmailSender = new ReportEmailSender(); reportEmailSender.setUserName(reportProperties.getUsername()); reportEmailSender.setEmailAddress(reportProperties.getUserEmailAddress()); schedule.setSender(reportEmailSender); entityManager.persist(reportEmailSender); List<ReportEmailRecipient> recips = new LinkedList<ReportEmailRecipient>(); for (EmailTargetLine target : emailTargetLayout.getTargets()) { ReportEmailRecipient recipient = new ReportEmailRecipient(); recipient.setEmail((String) target.targetAddress.getValue()); recipient.setVisibility((ReportEmailRecipientVisibility) target.targetTypeCombo.getValue()); entityManager.persist(recipient); recips.add(recipient); } schedule.setRecipients(recips); schedule.setNextScheduledRunTime(schedule.getScheduleMode().getNextRuntime(schedule, new Date())); schedule.setOutputFormat(OutputFormat.PDF); entityManager.persist(schedule); entityManager.flush(); reportEmailSender = entityManager.merge(reportEmailSender); return schedule; } }