11d79b5cd1630a15c7b344dd0a86bf173df40f82
[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 com.google.common.base.Optional;
11 import io.netty.util.HashedWheelTimer;
12 import io.netty.util.Timeout;
13 import io.netty.util.Timer;
14 import io.netty.util.TimerTask;
15 import java.math.BigInteger;
16 import java.util.concurrent.TimeUnit;
17 import org.opendaylight.protocol.pcep.pcc.mock.protocol.PCCDispatcherImpl;
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     private final int disconnectAfter;
24     private final Timer timer = new HashedWheelTimer();
25     private PCCDispatcherImpl pccDispatcher;
26     private final int reconnectAfter;
27     private final Optional<BigInteger> syncOptDBVersion;
28     private final PCCsBuilder pcCsBuilder;
29     private boolean reconnectActive = false;
30
31     public TimerHandler(final PCCsBuilder pcCsBuilder, final Optional<BigInteger> syncOptDBVersion, final int disconnectAfter, final int reconnectAfter) {
32         this.pcCsBuilder = pcCsBuilder;
33         this.syncOptDBVersion = syncOptDBVersion;
34         this.disconnectAfter = disconnectAfter;
35         this.reconnectAfter = reconnectAfter;
36     }
37
38     final class DisconnectTask implements TimerTask {
39         @Override
40         public void run(final Timeout timeout) throws Exception {
41             LOG.debug("Disconnects PCCs, reconnect after {} seconds", reconnectAfter);
42             pccDispatcher.close();
43             if (reconnectAfter > 0) {
44                 timer.newTimeout(new ReconnectTask(), reconnectAfter, TimeUnit.SECONDS);
45             }
46         }
47     }
48
49     final class ReconnectTask implements TimerTask {
50         @Override
51         public void run(final Timeout timeout) throws Exception {
52             LOG.debug("Reconnecting PCCs}");
53             pcCsBuilder.createPCCs(syncOptDBVersion.isPresent() ? syncOptDBVersion.get() : BigInteger.ONE, Optional.<TimerHandler>absent());
54         }
55     }
56
57     protected void createDisconnectTask() {
58         if (this.disconnectAfter > 0 && !reconnectActive && syncOptDBVersion.isPresent()) {
59             timer.newTimeout(new DisconnectTask(), this.disconnectAfter, TimeUnit.SECONDS);
60             reconnectActive = true;
61         }
62     }
63
64     public void setPCCDispatcher(final PCCDispatcherImpl pccDispatcher) {
65         this.pccDispatcher = pccDispatcher;
66     }
67 }