package org.limewire.lifecycle; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import com.google.inject.Inject; class ServiceSchedulerImpl implements ServiceScheduler { private final ServiceRegistry serviceRegistry; @Inject ServiceSchedulerImpl(ServiceRegistry serviceRegistry) { this.serviceRegistry = serviceRegistry; } @Override public StagedRegisterBuilder scheduleAtFixedRate(String commandName, Runnable command, long initialDelay, long period, TimeUnit unit, ScheduledExecutorService service) { return serviceRegistry.register(new ScheduledService(commandName, true, command, initialDelay, period, unit, service)); } @Override public StagedRegisterBuilder scheduleWithFixedDelay(String commandName, Runnable command, long initialDelay, long delay, TimeUnit unit, ScheduledExecutorService service) { return serviceRegistry.register(new ScheduledService(commandName, false, command, initialDelay, delay, unit, service)); } private static class ScheduledService implements Service { private final String commandName; private final boolean fixedRate; private final Runnable command; private final long initialDelay; private final long delayOrPeriod; private final TimeUnit timeUnit; private final ScheduledExecutorService service; private volatile ScheduledFuture<?> future; public ScheduledService(String commandName, boolean fixedRate, Runnable command, long initialDelay, long delayOrPeriod, TimeUnit timeUnit, ScheduledExecutorService service) { this.commandName = commandName; this.fixedRate = fixedRate; this.command = command; this.initialDelay = initialDelay; this.delayOrPeriod = delayOrPeriod; this.timeUnit = timeUnit; this.service = service; } @Override public String getServiceName() { return commandName; } @Override public void initialize() {} @Override public void start() { if(fixedRate) { future = service.scheduleAtFixedRate(command, initialDelay, delayOrPeriod, timeUnit); } else { future = service.scheduleWithFixedDelay(command, initialDelay, delayOrPeriod, timeUnit); } } @Override public void stop() { ScheduledFuture<?> localFuture = future; if(localFuture != null) { localFuture.cancel(false); future = null; } } } }