package com.psddev.cms.tool; import com.psddev.cms.db.Schedule; import com.psddev.dari.db.ObjectType; import com.psddev.dari.db.Query; import com.psddev.dari.util.AbstractFilter; import com.psddev.dari.util.Settings; import com.psddev.dari.util.Task; import java.io.PrintWriter; import java.io.StringWriter; import java.net.InetAddress; import java.net.UnknownHostException; /** Triggers scheduled events for publishing. */ public class ScheduleFilter extends AbstractFilter { public static final String HOST_SETTING = "brightspot/scheduleHost"; public static final String SCHEDULE_THREAD_NAME = "ScheduleFilter"; public final Task scheduler = new Task() { @Override public void doTask() { if (ObjectType.getInstance(Schedule.class.getName()) == null) { return; } String host = Settings.get(String.class, HOST_SETTING); boolean run; if (host == null) { run = true; } else { try { String hostAddress = InetAddress.getByName(host).getHostAddress(); String localAddress = InetAddress.getLocalHost().getHostAddress(); run = hostAddress != null && hostAddress.equals(localAddress); } catch (UnknownHostException error) { run = false; } } if (!run) { return; } Thread.currentThread().setName(SCHEDULE_THREAD_NAME); for (Schedule schedule : Query .from(Schedule.class) .sortAscending("triggerDate") .master() .noCache() .resolveInvisible() .iterable(0)) { try { schedule.trigger(); } catch (Exception ex1) { try { StringWriter writer = new StringWriter(); ex1.printStackTrace(new PrintWriter(writer)); schedule.getState().put("cms.lastException", writer.toString()); schedule.save(); } catch (Exception ex2) { // Ignore any error caused by trying to save the error // information to the schedule itself. } } } } }; // --- AbstractFilter support --- @Override protected void doInit() { scheduler.scheduleWithFixedDelay(60.0, 60.0); } @Override protected void doDestroy() { scheduler.stop(); } }