2 * Copyright (c) 2014 Cisco Systems, Inc. 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.bgpcep.tcpmd5.nio;
10 import java.io.IOException;
11 import java.net.ProtocolFamily;
12 import java.nio.channels.DatagramChannel;
13 import java.nio.channels.Pipe;
14 import java.nio.channels.ServerSocketChannel;
15 import java.nio.channels.SocketChannel;
16 import java.nio.channels.spi.AbstractSelector;
17 import java.nio.channels.spi.SelectorProvider;
19 import java.util.WeakHashMap;
21 import org.opendaylight.bgpcep.tcpmd5.KeyAccessFactory;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
25 import com.google.common.base.Preconditions;
27 public final class MD5SelectorProvider extends SelectorProvider {
28 private static final Logger LOG = LoggerFactory.getLogger(MD5SelectorProvider.class);
29 private static final Map<SelectorProvider, MD5SelectorProvider> INSTANCES = new WeakHashMap<>();
30 private final KeyAccessFactory keyAccessFactory;
31 private final SelectorProvider delegate;
33 private MD5SelectorProvider(final KeyAccessFactory keyAccessFactory, final SelectorProvider delegate) {
34 this.keyAccessFactory = Preconditions.checkNotNull(keyAccessFactory);
35 this.delegate = Preconditions.checkNotNull(delegate);
38 public static synchronized MD5SelectorProvider getInstance(final KeyAccessFactory keyAccessFactory, final SelectorProvider provider) {
39 MD5SelectorProvider ret = INSTANCES.get(provider);
41 ret = new MD5SelectorProvider(keyAccessFactory, provider);
42 LOG.debug("Created new provider instance {} for delegate {}", ret, provider);
43 INSTANCES.put(provider, ret);
49 public static MD5SelectorProvider getInstance(final KeyAccessFactory keyAccessFactory) {
50 return getInstance(keyAccessFactory, provider());
54 public DatagramChannel openDatagramChannel() throws IOException {
55 throw new UnsupportedOperationException("Datagram channels are not supported");
59 public DatagramChannel openDatagramChannel(final ProtocolFamily family) throws IOException {
60 throw new UnsupportedOperationException("Datagram channels are not supported");
64 public Pipe openPipe() throws IOException {
65 throw new UnsupportedOperationException("Pipes are not supported");
69 public AbstractSelector openSelector() throws IOException {
70 final AbstractSelector s = delegate.openSelector();
71 final AbstractSelector ret = new SelectorFacade(delegate, s);
73 LOG.debug("Opened facade {} for selector {}", ret, s);
78 public MD5ServerSocketChannel openServerSocketChannel() throws IOException {
79 final ServerSocketChannel ch = delegate.openServerSocketChannel();
80 final MD5ServerSocketChannel ret = new MD5ServerSocketChannel(ch, keyAccessFactory);
82 LOG.debug("Created facade {} for server channel {}", ret, ch);
87 public MD5SocketChannel openSocketChannel() throws IOException {
88 final SocketChannel ch = delegate.openSocketChannel();
89 final MD5SocketChannel ret = new MD5SocketChannel(ch, keyAccessFactory);
91 LOG.debug("Created facade {} for channel {}", ret, ch);