/*
 * QuartzDemo.java
 *
 * Created on November 24, 2010, 2:10 PM
 */
package com.dhaval.web.vaadin.quartzdemo;

import com.vaadin.Application;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.terminal.Sizeable;
import com.vaadin.ui.*;
import com.vaadin.ui.Button.ClickEvent;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;

/** 
 *
 * @author hsupport
 * @version 
 */
public class QuartzDemo extends Application {

    private Scheduler scheduler;

    @Override
    public void init() {
        final Window mainWindow = new Window("QuartzDemo");

        try{
            scheduler = StdSchedulerFactory.getDefaultScheduler();
        }catch(Exception e){
            e.printStackTrace();
        }

        Button createJob = new Button("Create", new Button.ClickListener() {

            public void buttonClick(ClickEvent event) {

            }
        });

        Button startJob = new Button("Start", new Button.ClickListener() {

            public void buttonClick(ClickEvent event) {
                try{
                    // and start it off
                    scheduler.start();

                    JobDetail job1 = new JobDetail("job1", MyJob.class);

                    Trigger trigger = TriggerUtils.makeSecondlyTrigger(3); // fire every hour
                    trigger.setStartTime(TriggerUtils.getEvenSecondDate(new Date()));  // start on the next even hour
                    trigger.setName("myTrigger");

                    scheduler.scheduleJob(job1, trigger);
                    System.out.println("Job Scheduled: " + job1.getGroup() + ", " + job1.getName());
                }catch(Exception e){
                    mainWindow.showNotification("Error: " + e.getMessage(), Window.Notification.TYPE_ERROR_MESSAGE);
                }
            }
        });

        Button stopJob = new Button("Stop", new Button.ClickListener() {

            public void buttonClick(ClickEvent event) {
                try{
                    scheduler.unscheduleJob("myTrigger", "DEFAULT");
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        });

        Button shutdown = new Button("Stop All", new Button.ClickListener() {

            public void buttonClick(ClickEvent event) {
                try{
                    scheduler.shutdown();
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        });

        SplitPanel jobForm = new SplitPanel(SplitPanel.ORIENTATION_HORIZONTAL);
        jobForm.setSplitPosition(85, Sizeable.UNITS_PERCENTAGE);

        jobForm.setSizeFull();
        Table table = new Table();
        table.setWidth("100%");
        table.setSelectable(true);
        List<MyJob> jobs = new ArrayList<MyJob>();
        jobs.add(new MyJob("Job-1"));
        jobs.add(new MyJob("Job-2"));
        table.setContainerDataSource(new BeanItemContainer(jobs));
        table.setVisibleColumns(new String[]{"jobId", "creationTime", "startTime", "lastExecutionTime","running"});
        jobForm.setFirstComponent(table);

        VerticalLayout buttons = new VerticalLayout();
        buttons.setMargin(true);
        buttons.setSpacing(true);

        createJob.setWidth("100%");
        startJob.setWidth("100%");
        stopJob.setWidth("100%");
        shutdown.setWidth("100%");

        buttons.addComponent(createJob);
        buttons.addComponent(startJob);
        buttons.addComponent(stopJob);
        buttons.addComponent(shutdown);
        jobForm.setSecondComponent(buttons);

        TabSheet jobTabs = new TabSheet();
        jobTabs.setWidth("100%");
        jobTabs.addTab(jobForm, "Job List", null);

        mainWindow.addComponent(jobTabs);
        setMainWindow(mainWindow);
    }

    public static class MyJob implements Job{

        private String jobId;
        private boolean running;
        private Date creationTime;
        private Date startTime;
        private Date lastExecutionTime;

        public MyJob(String jobId) {
            this.jobId = jobId;
        }

        public void setRunning(boolean running) {
            this.running = running;
        }

        public boolean isRunning() {
            return running;
        }

        public String getJobId() {
            return jobId;
        }

        public void setJobId(String jobId) {
            this.jobId = jobId;
        }

        public void execute(JobExecutionContext jec) throws JobExecutionException {
            System.out.println(new Date() + " executing myjob. Next fire time: " + jec.getNextFireTime());
        }

        public Date getLastExecutionTime() {
            return lastExecutionTime;
        }

        public void setLastExecutionTime(Date lastExecutionTime) {
            this.lastExecutionTime = lastExecutionTime;
        }

        public Date getStartTime() {
            return startTime;
        }

        public void setStartTime(Date startTime) {
            this.startTime = startTime;
        }

        public Date getCreationTime() {
            return creationTime;
        }

        public void setCreationTime(Date creationTime) {
            this.creationTime = creationTime;
        }

        
    }
}
