Add transport-{api,tcp}
[netconf.git] / transport / transport-api / src / main / java / org / opendaylight / netconf / transport / api / AbstractOverlayTransportStack.java
1 /*
2  * Copyright (c) 2022 PANTHEON.tech, s.r.o. 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.netconf.transport.api;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.util.concurrent.Futures;
13 import com.google.common.util.concurrent.ListenableFuture;
14 import com.google.common.util.concurrent.MoreExecutors;
15 import org.eclipse.jdt.annotation.NonNull;
16 import org.opendaylight.yangtools.yang.common.Empty;
17
18 /**
19  * Abstract base class for {@link TransportStack}s overlaid on a different stack.
20  */
21 public abstract class AbstractOverlayTransportStack<C extends TransportChannel> extends AbstractTransportStack<C> {
22     private final @NonNull TransportChannelListener asListener = new TransportChannelListener() {
23         @Override
24         public void onTransportChannelFailed(final Throwable cause) {
25             notifyTransportChannelFailed(cause);
26         }
27
28         @Override
29         public void onTransportChannelEstablished(final TransportChannel channel) {
30             onUnderlayChannelEstablished(channel);
31         }
32     };
33
34     private volatile TransportStack underlay = null;
35
36     protected AbstractOverlayTransportStack(final TransportChannelListener listener) {
37         super(listener);
38     }
39
40     @Override
41     protected final ListenableFuture<Empty> startShutdown() {
42         return underlay.shutdown();
43     }
44
45     protected final @NonNull TransportChannelListener asListener() {
46         return asListener;
47     }
48
49     protected abstract void onUnderlayChannelEstablished(@NonNull TransportChannel underlayChannel);
50
51     final void setUnderlay(final TransportStack underlay) {
52         this.underlay = requireNonNull(underlay);
53     }
54
55     protected static final <T extends AbstractOverlayTransportStack<?>> @NonNull ListenableFuture<T> transformUnderlay(
56             final T stack, final ListenableFuture<? extends TransportStack> tcpFuture) {
57         return Futures.transform(tcpFuture, tcpStack -> {
58             stack.setUnderlay(tcpStack);
59             return stack;
60         }, MoreExecutors.directExecutor());
61     }
62 }