/* * Copyright 2012 Research Studios Austria Forschungsges.m.b.H. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package won.bot.framework.bot.base; import org.springframework.scheduling.Trigger; import java.util.concurrent.ScheduledFuture; /** * Bot base class that expects a trigger to be injected that will cause the act() method to be called according to the trigger's specification. */ public abstract class TriggeredBot extends ScheduledActionBot { private Trigger trigger; private ScheduledFuture scheduledExecution; @Override protected void doInitialize() { doInitializeCustom(); if (trigger != null) { this.scheduledExecution = getTaskScheduler().schedule(new Runnable() { @Override public void run() { try { logger.debug("TRIGGER FIRE"); TriggeredBot.this.act(); } catch (Exception e) { logger.warn("caught exception during triggered execution of act()", e); } } }, trigger); } else { logger.info("This bot will not fire the ActEvent because no trigger was configured."); } } /** * Returns true if the trigger won't cause any more executions (and none are currently running). * @return */ protected boolean isTriggerDone(){ return this.scheduledExecution.isDone(); } /** * Override this method to do initialization work. */ protected abstract void doInitializeCustom(); @Override protected void doShutdown() { logger.info("bot is shutting down"); this.scheduledExecution.cancel(true); doShutdownCustom(); } /** * Override this method to do shutdown work. */ protected abstract void doShutdownCustom(); /** * Overrides the inherited method so as to also cancel the trigger when * indicating that the bot's work is done. */ @Override protected void workIsDone() { logger.info("triggered bot signalling workIsDone"); this.cancelTrigger(); super.workIsDone(); } protected void cancelTrigger() { logger.info("canceling trigger"); scheduledExecution.cancel(true); } protected ScheduledFuture getScheduledExecution() { return scheduledExecution; } public void setTrigger(final Trigger trigger) { this.trigger = trigger; } }