/* * Copyright (c) 2014 Globo.com - ATeam * All rights reserved. * * This source is subject to the Apache License, Version 2.0. * Please see the LICENSE file for more information. * * Authors: See AUTHORS file * * 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 com.globo.galeb.scheduler.impl; import org.vertx.java.core.Handler; import org.vertx.java.core.Vertx; import com.globo.galeb.scheduler.IScheduler; import com.globo.galeb.scheduler.ISchedulerHandler; /** * Class VertxDelayScheduler. * * @author: See AUTHORS file. * @version: 1.0.0, Oct 22, 2014. */ public class VertxDelayScheduler implements IScheduler { /** The vertx. */ private final Vertx vertx; /** The scheduler handler. */ private ISchedulerHandler schedulerHandler = null; /** The period (ms). */ private Long period = -1L; /** The Scheduler id. */ private Long id = 0L; /** The cancel handler. */ private Handler<Void> cancelHandler; /** The cancel failed handler. */ private Handler<Void> cancelFailedHandler; /** * Instantiates a new vertx delay scheduler. * * @param vertx the vertx */ public VertxDelayScheduler(Vertx vertx) { this.vertx = vertx; } /* (non-Javadoc) * @see java.lang.Object#finalize() */ @Override protected void finalize() throws Throwable { if (id!=0L) { vertx.cancelTimer(id); } super.finalize(); } /* (non-Javadoc) * @see com.globo.galeb.scheduler.IScheduler#start() */ @Override public IScheduler start() { if (schedulerHandler!=null && period != -1L) { id = vertx.setTimer(period, new Handler<Long>() { @Override public void handle(Long event) { schedulerHandler.handle(); } }); } return this; } /* (non-Javadoc) * @see com.globo.galeb.scheduler.IScheduler#setHandler(com.globo.galeb.scheduler.ISchedulerHandler) */ @Override public IScheduler setHandler(ISchedulerHandler schedulerHandler) { this.schedulerHandler = schedulerHandler; return this; } /* (non-Javadoc) * @see com.globo.galeb.scheduler.IScheduler#setPeriod(java.lang.Long) */ @Override public IScheduler setPeriod(Long period) { this.period = period; return this; } /* (non-Javadoc) * @see com.globo.galeb.scheduler.IScheduler#cancel() */ @Override public IScheduler cancel() { if (id!=0L) { if (vertx.cancelTimer(id)) { id = 0L; handleCancel(); } else { handleCancelFailed(); } } return this; } /* (non-Javadoc) * @see com.globo.galeb.scheduler.IScheduler#cancelHandler(org.vertx.java.core.Handler) */ @Override public IScheduler cancelHandler(Handler<Void> cancelHandler) { this.cancelHandler = cancelHandler; return this; } /* (non-Javadoc) * @see com.globo.galeb.scheduler.IScheduler#cancelFailedHandler(org.vertx.java.core.Handler) */ @Override public IScheduler cancelFailedHandler(Handler<Void> cancelFailedHandler) { this.cancelFailedHandler = cancelFailedHandler; return this; } /** * Handle cancel. */ private void handleCancel() { if (cancelHandler!=null) { cancelHandler.handle(null); } } /** * Handle cancel failed. */ private void handleCancelFailed() { if (cancelHandler!=null) { cancelFailedHandler.handle(null); } } }