/*
* Copyright (c) 2017 Serro LLC. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.schedule;
import org.opendaylight.nic.common.transaction.service.renderer.RendererService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.nic.renderer.api.dataflow.rev170309.dataflows.Dataflow;
import org.opendaylight.yang.gen.v1.urn.opendaylight.nic.renderer.api.delay.config.rev170327.delay.configs.DelayConfig;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
public class ScheduleServiceManager implements ScheduleService {
private class Executor extends TimerTask {
private final Dataflow dataflow;
public Executor(final Dataflow dataflow) {
this.dataflow = dataflow;
}
@Override
public void run() {
if (rendererService != null) {
rendererService.execute(dataflow);
}
}
}
private Map<String, Timer> timers;
private RendererService rendererService;
public ScheduleServiceManager() {
timers = new HashMap<>();
}
@Override
public void scheduleRefresh(final Dataflow dataflow,
final DelayConfig delayConfig) {
final TimeUnit timeUnit = TimeUnit.valueOf(delayConfig.getTimeUnit());
final long delay = timeUnit.toMillis(delayConfig.getDelay());
createSchedule(dataflow, delay, delay);
}
@Override
public void setRendererService(RendererService rendererService) {
this.rendererService = rendererService;
}
@Override
public void start(final Map<Dataflow, DelayConfig> delayConfigByDataflow) {
delayConfigByDataflow.entrySet().forEach(consumer -> {
final Dataflow dataflow = consumer.getKey();
final long creationTime = Long.valueOf(dataflow.getCreationTime());
final DelayConfig delayConfig = consumer.getValue();
final TimeUnit timeUnit = TimeUnit.valueOf(delayConfig.getTimeUnit());
final long delay = timeUnit.toMillis(delayConfig.getDelay());
final long interval = calcInterval(creationTime);
if (interval > 0) {
createSchedule(dataflow, calcInterval(creationTime), delay);
} else {
createSchedule(dataflow, delay, delay);
}
});
}
@Override
public void createSchedule(final Dataflow dataflow,
final long initialDelay,
final long delay) {
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(new Executor(dataflow),
initialDelay,
delay);
timers.put(dataflow.getId().getValue(), timer);
}
private long calcInterval(final long pastDate) {
return System.currentTimeMillis() - pastDate;
}
@Override
public void stop(String id) {
final Timer timerTask = timers.get(id);
if (timerTask != null) {
timers.get(id).cancel();
timers.remove(id);
}
}
@Override
public void stop() {
timers.entrySet().forEach(timer -> timer.getValue().cancel());
}
}