2 * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others. All rights reserved.
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
8 package org.opendaylight.netconf.transport.api;
10 import static java.util.Objects.requireNonNull;
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;
19 * Abstract base class for {@link TransportStack}s overlaid on a different stack.
21 public abstract class AbstractOverlayTransportStack<C extends TransportChannel> extends AbstractTransportStack<C> {
22 private final @NonNull TransportChannelListener asListener = new TransportChannelListener() {
24 public void onTransportChannelFailed(final Throwable cause) {
25 notifyTransportChannelFailed(cause);
29 public void onTransportChannelEstablished(final TransportChannel channel) {
30 onUnderlayChannelEstablished(channel);
34 private volatile TransportStack underlay = null;
36 protected AbstractOverlayTransportStack(final TransportChannelListener listener) {
41 protected final ListenableFuture<Empty> startShutdown() {
42 return underlay.shutdown();
45 protected final @NonNull TransportChannelListener asListener() {
49 protected abstract void onUnderlayChannelEstablished(@NonNull TransportChannel underlayChannel);
51 final void setUnderlay(final TransportStack underlay) {
52 this.underlay = requireNonNull(underlay);
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);
60 }, MoreExecutors.directExecutor());