Bump upstreams
[bgpcep.git] / pcep / pcc-mock / src / main / java / org / opendaylight / protocol / pcep / pcc / mock / TimerHandler.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.protocol.pcep.pcc.mock;
9
10 import io.netty.util.HashedWheelTimer;
11 import io.netty.util.Timeout;
12 import io.netty.util.Timer;
13 import io.netty.util.TimerTask;
14 import java.util.Optional;
15 import java.util.concurrent.TimeUnit;
16 import org.opendaylight.protocol.pcep.pcc.mock.protocol.PCCDispatcherImpl;
17 import org.opendaylight.yangtools.yang.common.Uint64;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
20
21 public class TimerHandler {
22     private static final Logger LOG = LoggerFactory.getLogger(TimerHandler.class);
23
24     private final Timer timer = new HashedWheelTimer();
25     private final int disconnectAfter;
26     private final int reconnectAfter;
27     private final Optional<Uint64> syncOptDBVersion;
28     private final PCCsBuilder pcCsBuilder;
29
30     private PCCDispatcherImpl pccDispatcher = null;
31     private boolean reconnectActive = false;
32
33     public TimerHandler(final PCCsBuilder pcCsBuilder, final Optional<Uint64> syncOptDBVersion,
34             final int disconnectAfter, final int reconnectAfter) {
35         this.pcCsBuilder = pcCsBuilder;
36         this.syncOptDBVersion = syncOptDBVersion;
37         this.disconnectAfter = disconnectAfter;
38         this.reconnectAfter = reconnectAfter;
39     }
40
41     final class DisconnectTask implements TimerTask {
42         @Override
43         public void run(final Timeout timeout) {
44             LOG.debug("Disconnects PCCs, reconnect after {} seconds", reconnectAfter);
45             pccDispatcher.close();
46             if (reconnectAfter > 0) {
47                 timer.newTimeout(new ReconnectTask(), reconnectAfter, TimeUnit.SECONDS);
48             }
49         }
50     }
51
52     final class ReconnectTask implements TimerTask {
53         @Override
54         public void run(final Timeout timeout) {
55             LOG.debug("Reconnecting PCCs}");
56             pcCsBuilder.createPCCs(syncOptDBVersion.orElse(Uint64.ONE), Optional.empty());
57         }
58     }
59
60     protected void createDisconnectTask() {
61         if (disconnectAfter > 0 && !reconnectActive && syncOptDBVersion.isPresent()) {
62             timer.newTimeout(new DisconnectTask(), disconnectAfter, TimeUnit.SECONDS);
63             reconnectActive = true;
64         }
65     }
66
67     public void setPCCDispatcher(final PCCDispatcherImpl dispatcher) {
68         pccDispatcher = dispatcher;
69     }
70 }