BUG-55: make sure session initialization asynchronous 18/918/2
authorRobert Varga <rovarga@cisco.com>
Mon, 19 Aug 2013 16:16:28 +0000 (18:16 +0200)
committerRobert Varga <rovarga@cisco.com>
Tue, 20 Aug 2013 05:25:25 +0000 (07:25 +0200)
Change-Id: I0b7c06fa13a127e183e5c81d0a8097d96bcac173
Signed-off-by: Robert Varga <rovarga@cisco.com>
15 files changed:
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPDispatcherImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionFactory.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/BGPDispatcher.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BGPImplTest.java
framework/src/main/java/org/opendaylight/protocol/framework/Dispatcher.java
framework/src/main/java/org/opendaylight/protocol/framework/DispatcherImpl.java
framework/src/main/java/org/opendaylight/protocol/framework/ProtocolServer.java
framework/src/main/java/org/opendaylight/protocol/framework/ProtocolSessionFactory.java
framework/src/test/java/org/opendaylight/protocol/framework/ServerTest.java
framework/src/test/java/org/opendaylight/protocol/framework/SimpleSessionFactory.java
pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPDispatcher.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/PCEPDispatcherImpl.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/PCEPSessionFactoryImpl.java
pcep/testtool/src/main/java/org/opendaylight/protocol/pcep/testtool/Main.java

index a48a36219a2c199bb2d4d855c4fde50d947dd14d..337de66de06b2a25451686af30f9c52c90c2b26e 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.protocol.bgp.rib.impl;
 
+import io.netty.util.concurrent.Future;
+
 import java.io.Closeable;
 import java.io.IOException;
 
@@ -28,8 +30,8 @@ public final class BGPDispatcherImpl implements BGPDispatcher, Closeable {
        }
 
        @Override
-       public BGPSession createClient(final BGPConnection connection, final ProtocolMessageFactory parser) throws IOException {
-               return (BGPSession) this.dispatcher.createClient(connection, new BGPSessionFactory(parser));
+       public Future<? extends BGPSession> createClient(final BGPConnection connection, final ProtocolMessageFactory parser) throws IOException {
+               return this.dispatcher.createClient(connection, new BGPSessionFactory(parser));
        }
 
        public Dispatcher getDispatcher() {
index db32b0d614e4d7118636303d591052d15f9c0cbc..b95854bb85fbb80fa280ae7e987f690ab36622a5 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.protocol.bgp.rib.impl;
 import java.io.Closeable;
 import java.io.IOException;
 import java.net.InetSocketAddress;
+import java.util.concurrent.ExecutionException;
 
 import org.opendaylight.protocol.bgp.parser.BGPSession;
 import org.opendaylight.protocol.bgp.parser.BGPSessionListener;
@@ -19,6 +20,8 @@ import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionProposalChecker;
 import org.opendaylight.protocol.concepts.ListenerRegistration;
 import org.opendaylight.protocol.framework.ProtocolMessageFactory;
 
+import com.google.common.base.Preconditions;
+
 /**
  * Implementation of {@link BGP}.
  */
@@ -60,10 +63,10 @@ public class BGPImpl implements BGP, Closeable {
 
        public BGPImpl(final BGPDispatcher dispatcher, final ProtocolMessageFactory parser, final InetSocketAddress address,
                        final BGPSessionProposal proposal, final BGPSessionProposalChecker checker) throws IOException {
-               this.dispatcher = dispatcher;
-               this.parser = parser;
-               this.address = address;
-               this.proposal = proposal;
+               this.dispatcher = Preconditions.checkNotNull(dispatcher);
+               this.parser = Preconditions.checkNotNull(parser);
+               this.address = Preconditions.checkNotNull(address);
+               this.proposal = Preconditions.checkNotNull(proposal);
                this.checker = checker;
        }
 
@@ -71,9 +74,14 @@ public class BGPImpl implements BGP, Closeable {
         * {@inheritDoc}
         */
        @Override
-       public ListenerRegistration<BGPSessionListener> registerUpdateListener(final BGPSessionListener listener) throws IOException {
-               final BGPSession session = this.dispatcher.createClient(
-                               new BGPConnectionImpl(this.address, listener, this.proposal.getProposal(), this.checker), this.parser);
+       public BGPListenerRegistration registerUpdateListener(final BGPSessionListener listener) throws IOException {
+               final BGPSession session;
+               try {
+                       session = this.dispatcher.createClient(
+                                       new BGPConnectionImpl(this.address, listener, this.proposal.getProposal(), this.checker), this.parser).get();
+               } catch (InterruptedException | ExecutionException e) {
+                       throw new IOException("Failed to connect to peer", e);
+               }
                return new BGPListenerRegistration(listener, session);
        }
 
index e3f3fa9ccaa1eb067313456a5318a9231a759f9f..18b979e2260d150c104b27858fcc5a3ea547ce00 100644 (file)
@@ -14,14 +14,13 @@ import java.util.Timer;
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPConnection;
 import org.opendaylight.protocol.framework.ProtocolConnection;
 import org.opendaylight.protocol.framework.ProtocolMessageFactory;
-import org.opendaylight.protocol.framework.ProtocolSession;
 import org.opendaylight.protocol.framework.ProtocolSessionFactory;
 import org.opendaylight.protocol.framework.SessionParent;
 
 /**
  *
  */
-public final class BGPSessionFactory implements ProtocolSessionFactory {
+public final class BGPSessionFactory implements ProtocolSessionFactory<BGPSessionImpl> {
 
        private final ProtocolMessageFactory parser;
 
@@ -30,7 +29,7 @@ public final class BGPSessionFactory implements ProtocolSessionFactory {
        }
 
        @Override
-       public ProtocolSession getProtocolSession(final SessionParent parent, final Timer timer, final ProtocolConnection connection,
+       public BGPSessionImpl getProtocolSession(final SessionParent parent, final Timer timer, final ProtocolConnection connection,
                        final int sessionId, final ChannelHandlerContext ctx) {
                return new BGPSessionImpl(parent, timer, (BGPConnection) connection, sessionId, this.parser, ctx);
        }
index 325fb892cc42ee619af8bc51872728cab4fa6b2d..6755f392db6fe32ede5df9d91ec9431d61c4fa62 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.protocol.bgp.rib.impl.spi;
 
+import io.netty.util.concurrent.Future;
+
 import java.io.IOException;
 
 import org.opendaylight.protocol.bgp.parser.BGPSession;
@@ -25,5 +27,5 @@ public interface BGPDispatcher {
         * @return client session
         * @throws IOException
         */
-       BGPSession createClient(BGPConnection connection, ProtocolMessageFactory parser) throws IOException;
+       Future<? extends BGPSession> createClient(BGPConnection connection, ProtocolMessageFactory parser) throws IOException;
 }
index 37b7504098a2bee522d2d4ea9fb971ed4e129023..648c7efc7fb17b8b32544028990194e053d55951 100644 (file)
@@ -10,8 +10,10 @@ package org.opendaylight.protocol.bgp.rib.impl;
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.doReturn;
+import io.netty.util.concurrent.Future;
 
-import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.util.Collections;
 
 import org.junit.After;
@@ -20,6 +22,7 @@ import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.opendaylight.protocol.bgp.parser.BGPParameter;
+import org.opendaylight.protocol.bgp.parser.BGPSession;
 import org.opendaylight.protocol.bgp.rib.impl.BGPImpl.BGPListenerRegistration;
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPConnection;
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
@@ -38,20 +41,25 @@ public class BGPImplTest {
        @Mock
        private ProtocolMessageFactory parser;
 
+       @Mock
+       private Future<BGPSession> future;
+
        private BGPImpl bgp;
 
        @Before
-       public void setUp() throws IOException {
+       public void setUp() throws Exception {
                MockitoAnnotations.initMocks(this);
                doReturn("").when(this.parser).toString();
-               doReturn(null).when(this.disp).createClient(any(BGPConnection.class), any(ProtocolMessageFactory.class));
+
+               doReturn(null).when(this.future).get();
+               doReturn(future).when(this.disp).createClient(any(BGPConnection.class), any(ProtocolMessageFactory.class));
        }
 
        @Test
-       public void testBgpImpl() throws IOException {
+       public void testBgpImpl() throws Exception {
                doReturn(new BGPSessionPreferences(null, 0, null, Collections.<BGPParameter> emptyList())).when(this.prop).getProposal();
-               this.bgp = new BGPImpl(this.disp, this.parser, null, this.prop, null);
-               final BGPListenerRegistration reg = (BGPListenerRegistration) this.bgp.registerUpdateListener(new SimpleSessionListener());
+               this.bgp = new BGPImpl(this.disp, this.parser, new InetSocketAddress(InetAddress.getLoopbackAddress(), 2000), this.prop, null);
+               final BGPListenerRegistration reg = this.bgp.registerUpdateListener(new SimpleSessionListener());
                assertEquals(SimpleSessionListener.class, reg.getListener().getClass());
        }
 
index 2825d319c6dc5d1caf1dc3a3d264c66011094ba5..c17ab8854f3a42df5df632a4f7f5fe68b5ce9504 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.protocol.framework;
 
+import io.netty.util.concurrent.Future;
+
 import java.io.IOException;
 import java.net.InetSocketAddress;
 
@@ -23,8 +25,8 @@ public interface Dispatcher {
         * 
         * @return instance of ProtocolServer
         */
-       public ProtocolServer createServer(final InetSocketAddress address, final ProtocolConnectionFactory connectionFactory,
-                       final ProtocolSessionFactory sfactory) throws IOException;
+       public Future<ProtocolServer> createServer(final InetSocketAddress address, final ProtocolConnectionFactory connectionFactory,
+                       final ProtocolSessionFactory<?> sfactory) throws IOException;
 
        /**
         * Creates a client.
@@ -35,5 +37,5 @@ public interface Dispatcher {
         * 
         * @return session associated with this client
         */
-       public ProtocolSession createClient(final ProtocolConnection connection, final ProtocolSessionFactory sfactory) throws IOException;
+       public <T extends ProtocolSession> Future<T> createClient(final ProtocolConnection connection, final ProtocolSessionFactory<T> sfactory) throws IOException;
 }
index b4e2622cf6a67dd37d1fcf106dac6b04a471d641..b647b938f9869381855cf1d58ed01dc7d0e8c896 100644 (file)
@@ -21,12 +21,12 @@ import io.netty.channel.socket.SocketChannel;
 import io.netty.channel.socket.nio.NioServerSocketChannel;
 import io.netty.channel.socket.nio.NioSocketChannel;
 import io.netty.util.concurrent.DefaultPromise;
+import io.netty.util.concurrent.Future;
 
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.util.Map;
 import java.util.Timer;
-import java.util.concurrent.ExecutionException;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -67,15 +67,15 @@ public final class DispatcherImpl implements Dispatcher, SessionParent {
 
        }
 
-       final class ClientChannelInitializer extends ChannelInitializer<SocketChannel> {
+       final class ClientChannelInitializer<T extends ProtocolSession> extends ChannelInitializer<SocketChannel> {
 
-               private final ProtocolSessionFactory sfactory;
+               private final ProtocolSessionFactory<T> sfactory;
 
                private final ProtocolConnection connection;
 
-               private ProtocolSession session;
+               private T session;
 
-               public ClientChannelInitializer(final ProtocolConnection connection, final ProtocolSessionFactory sfactory) {
+               public ClientChannelInitializer(final ProtocolConnection connection, final ProtocolSessionFactory<T> sfactory) {
                        this.connection = connection;
                        this.sfactory = sfactory;
                }
@@ -92,13 +92,27 @@ public final class DispatcherImpl implements Dispatcher, SessionParent {
                        ch.pipeline().addAfter("inbound", "encoder", factory.getEncoder());
                }
 
-               public ProtocolSession getSession() {
+               public T getSession() {
                        return this.session;
                }
+       }
+
+       static final class ProtocolServerPromise extends DefaultPromise<ProtocolServer> {
+               private final ChannelFuture cf;
+
+               ProtocolServerPromise(final ChannelFuture cf) {
+                       super();
+                       this.cf = cf;
+               }
 
+               @Override
+               public synchronized boolean cancel(final boolean mayInterruptIfRunning) {
+                       this.cf.cancel(mayInterruptIfRunning);
+                       return super.cancel(mayInterruptIfRunning);
+               }
        }
 
-       static final class ProtocolSessionPromise extends DefaultPromise<ProtocolSession> {
+       static final class ProtocolSessionPromise<T extends ProtocolSession> extends DefaultPromise<T> {
                private final ChannelFuture cf;
 
                ProtocolSessionPromise(final ChannelFuture cf) {
@@ -140,8 +154,8 @@ public final class DispatcherImpl implements Dispatcher, SessionParent {
        }
 
        @Override
-       public ProtocolServer createServer(final InetSocketAddress address, final ProtocolConnectionFactory connectionFactory,
-                       final ProtocolSessionFactory sessionFactory) {
+       public Future<ProtocolServer> createServer(final InetSocketAddress address, final ProtocolConnectionFactory connectionFactory,
+                       final ProtocolSessionFactory<?> sessionFactory) {
                final ProtocolServer server = new ProtocolServer(address, connectionFactory, sessionFactory, this);
                final ServerBootstrap b = new ServerBootstrap();
                b.group(this.bossGroup, this.workerGroup);
@@ -152,27 +166,48 @@ public final class DispatcherImpl implements Dispatcher, SessionParent {
 
                // Bind and start to accept incoming connections.
                final ChannelFuture f = b.bind(address);
-               this.serverSessions.put(server, f.channel());
+               final ProtocolServerPromise p = new ProtocolServerPromise(f);
+
+               f.addListener(new ChannelFutureListener() {
+                       @Override
+                       public void operationComplete(final ChannelFuture cf) {
+                               if (cf.isSuccess()) {
+                                       p.setSuccess(server);
+                                       synchronized (serverSessions) {
+                                               serverSessions.put(server, cf.channel());
+                                       }
+                                       return;
+                               } else if (cf.isCancelled()) {
+                                       p.cancel(false);
+                               } else
+                                       p.setFailure(cf.cause());
+                       }
+               });
+
                logger.debug("Created server {}.", server);
-               return server;
+               return p;
        }
 
        @Override
-       public ProtocolSession createClient(final ProtocolConnection connection, final ProtocolSessionFactory sfactory) {
+       public <T extends ProtocolSession> Future<T> createClient(final ProtocolConnection connection, final ProtocolSessionFactory<T> sfactory) {
                final Bootstrap b = new Bootstrap();
                b.group(this.workerGroup);
                b.channel(NioSocketChannel.class);
                b.option(ChannelOption.SO_KEEPALIVE, true);
-               final ClientChannelInitializer init = new ClientChannelInitializer(connection, sfactory);
+               final ClientChannelInitializer<T> init = new ClientChannelInitializer<T>(connection, sfactory);
                b.handler(init);
                final ChannelFuture f = b.connect(connection.getPeerAddress());
-               final ProtocolSessionPromise p = new ProtocolSessionPromise(f);
+               final ProtocolSessionPromise<T> p = new ProtocolSessionPromise<T>(f);
 
                f.addListener(new ChannelFutureListener() {
                        @Override
                        public void operationComplete(final ChannelFuture cf) {
                                if (cf.isSuccess()) {
-                                       p.setSuccess(init.getSession());
+                                       final T s = init.getSession();
+                                       p.setSuccess(s);
+                                       synchronized (clientSessions) {
+                                               clientSessions.put(s, cf.channel());
+                                       }
                                        return;
                                } else if (cf.isCancelled()) {
                                        p.cancel(false);
@@ -180,15 +215,9 @@ public final class DispatcherImpl implements Dispatcher, SessionParent {
                                        p.setFailure(cf.cause());
                        }
                });
-               ProtocolSession s = null;
-               try {
-                       s = p.get();
-                       this.clientSessions.put(p.get(), f.channel());
-               } catch (InterruptedException | ExecutionException e) {
-                       logger.warn("Client not created. Exception {}.", e.getMessage(), e);
-               }
+
                logger.debug("Client created.");
-               return s;
+               return p;
        }
 
        @Override
@@ -199,18 +228,22 @@ public final class DispatcherImpl implements Dispatcher, SessionParent {
 
        @Override
        public void onSessionClosed(final ProtocolSession session) {
-               logger.trace("Removing client session: {}", session);
-               final Channel ch = this.clientSessions.get(session);
-               ch.close();
-               this.clientSessions.remove(session);
-               logger.debug("Removed client session: {}", session.toString());
+               synchronized (clientSessions) {
+                       logger.trace("Removing client session: {}", session);
+                       final Channel ch = this.clientSessions.get(session);
+                       ch.close();
+                       this.clientSessions.remove(session);
+                       logger.debug("Removed client session: {}", session.toString());
+               }
        }
 
        void onServerClosed(final ProtocolServer server) {
-               logger.trace("Removing server session: {}", server);
-               final Channel ch = this.serverSessions.get(server);
-               ch.close();
-               this.clientSessions.remove(server);
-               logger.debug("Removed server session: {}", server.toString());
+               synchronized (serverSessions) {
+                       logger.trace("Removing server session: {}", server);
+                       final Channel ch = this.serverSessions.get(server);
+                       ch.close();
+                       this.clientSessions.remove(server);
+                       logger.debug("Removed server session: {}", server.toString());
+               }
        }
 }
index b7bca4bd080c3ab3b2e7180b97f40c430cf9c69a..0069b60f18d861cf0942de08f06aff844ce49bbe 100644 (file)
@@ -37,7 +37,7 @@ public final class ProtocolServer implements SessionParent {
        private final InetSocketAddress serverAddress;
 
        private final ProtocolConnectionFactory connectionFactory;
-       private final ProtocolSessionFactory sessionFactory;
+       private final ProtocolSessionFactory<?> sessionFactory;
 
        /**
         * Maps clients of this server to their address. The client is represented as PCEP session. Used BiMap for
@@ -58,7 +58,7 @@ public final class ProtocolServer implements SessionParent {
         * @param sessionFactory factory for sessions
         */
        public ProtocolServer(final InetSocketAddress address, final ProtocolConnectionFactory connectionFactory,
-                       final ProtocolSessionFactory sessionFactory, final Dispatcher parent) {
+                       final ProtocolSessionFactory<?> sessionFactory, final Dispatcher parent) {
                this.serverAddress = address;
                this.sessions = HashBiMap.create();
                this.connectionFactory = connectionFactory;
index c5dcbc3f4d418abd1393cf6ca1fc4adf3167800b..682793f3aca98beae590aaab877a7062afb9a7ce 100644 (file)
@@ -14,7 +14,7 @@ import java.util.Timer;
 /**
  * Factory for generating Protocol Sessions. This class should be extended to return protocol specific session.
  */
-public interface ProtocolSessionFactory {
+public interface ProtocolSessionFactory<T extends ProtocolSession> {
 
        /**
         * Creates and returns protocol specific session.
@@ -25,6 +25,6 @@ public interface ProtocolSessionFactory {
         * @param sessionId session identifier
         * @return new session
         */
-       public ProtocolSession getProtocolSession(SessionParent dispatcher, Timer timer, ProtocolConnection connection, int sessionId,
+       public T getProtocolSession(SessionParent dispatcher, Timer timer, ProtocolConnection connection, int sessionId,
                        ChannelHandlerContext ctx);
 }
index 18efc51d0aba56d8950782b991d791054205cdc0..db11695b6bd841cd3ee6b35a0a166c559812da6d 100644 (file)
@@ -8,8 +8,10 @@
 package org.opendaylight.protocol.framework;
 
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.io.IOException;
+import java.net.ConnectException;
 import java.net.InetSocketAddress;
 import java.util.concurrent.ExecutionException;
 
@@ -60,7 +62,7 @@ public class ServerTest {
                                        }
                                };
                        }
-               }, new SimpleSessionFactory(MAX_MSGSIZE));
+               }, new SimpleSessionFactory(MAX_MSGSIZE)).get();
 
                this.clientDispatcher = new DispatcherImpl(new MessageFactory());
 
@@ -84,7 +86,7 @@ public class ServerTest {
                        public SessionListener getListener() {
                                return ServerTest.this.pce;
                        }
-               }, new SimpleSessionFactory(MAX_MSGSIZE));
+               }, new SimpleSessionFactory(MAX_MSGSIZE)).get();
 
                final int maxAttempts = 1000;
                int attempts = 0;
@@ -96,43 +98,39 @@ public class ServerTest {
                assertTrue(this.pce.up);
        }
 
-       @Test
-       public void testConnectionFailed() throws IOException, InterruptedException, ExecutionException {
+       public void testConnectionFailed() throws IOException, InterruptedException {
                this.dispatcher = new DispatcherImpl(new MessageFactory());
                this.clientDispatcher = new DispatcherImpl(new MessageFactory());
                final SimpleSessionListener listener = new SimpleSessionListener();
 
-               final ProtocolSession session = this.clientDispatcher.createClient(new ProtocolConnection() {
-                       @Override
-                       public SessionPreferencesChecker getProposalChecker() {
-                               return new SimpleSessionProposalChecker();
-                       }
-
-                       @Override
-                       public SessionPreferences getProposal() {
-                               return new SimpleSessionPreferences();
-                       }
-
-                       @Override
-                       public InetSocketAddress getPeerAddress() {
-                               return ServerTest.this.serverAddress;
-                       }
-
-                       @Override
-                       public SessionListener getListener() {
-                               return listener;
-                       }
-               }, new SimpleSessionFactory(MAX_MSGSIZE));
-               if (session == null)
-                       listener.failed = true;
-               final int maxAttempts = 100;
-               int attempts = 0;
-               synchronized (listener) {
-                       while (!listener.failed && ++attempts < maxAttempts) {
-                               listener.wait(100);
-                       }
+               try {
+                       final ProtocolSession session = this.clientDispatcher.createClient(new ProtocolConnection() {
+                               @Override
+                               public SessionPreferencesChecker getProposalChecker() {
+                                       return new SimpleSessionProposalChecker();
+                               }
+
+                               @Override
+                               public SessionPreferences getProposal() {
+                                       return new SimpleSessionPreferences();
+                               }
+
+                               @Override
+                               public InetSocketAddress getPeerAddress() {
+                                       return ServerTest.this.serverAddress;
+                               }
+
+                               @Override
+                               public SessionListener getListener() {
+                                       return listener;
+                               }
+                       }, new SimpleSessionFactory(MAX_MSGSIZE)).get();
+
+                       fail("Connection succeeded unexpectedly");
+               } catch (ExecutionException e) {
+                       assertTrue(listener.failed);
+                       assertTrue(e.getCause() instanceof ConnectException);
                }
-               assertTrue(listener.failed);
        }
 
        @After
index 7d7f5fa692845f44e4d3354e3773c962da0e7278..f944ae478ded0fd537b41d02a5b9b0a64d9416ae 100644 (file)
@@ -11,7 +11,7 @@ import io.netty.channel.ChannelHandlerContext;
 
 import java.util.Timer;
 
-public final class SimpleSessionFactory implements ProtocolSessionFactory {
+public final class SimpleSessionFactory implements ProtocolSessionFactory<SimpleSession> {
        private final int maximumMessageSize;
 
        public SimpleSessionFactory(final int maximumMessageSize) {
@@ -19,7 +19,7 @@ public final class SimpleSessionFactory implements ProtocolSessionFactory {
        }
 
        @Override
-       public ProtocolSession getProtocolSession(final SessionParent parent, final Timer timer, final ProtocolConnection connection,
+       public SimpleSession getProtocolSession(final SessionParent parent, final Timer timer, final ProtocolConnection connection,
                        final int sessionId, final ChannelHandlerContext ctx) {
                return new SimpleSession(connection, parent, this.maximumMessageSize);
        }
index ff1f1ec322874ef834ab49aaf943e5516d98eee2..cafda339b3d0fa85a251a5a03710e9efe0588003 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.protocol.pcep;
 
+import io.netty.util.concurrent.Future;
+
 import java.io.IOException;
 import java.net.InetSocketAddress;
 
@@ -26,7 +28,7 @@ public interface PCEPDispatcher {
         * @return instance of PCEPServer
         * @throws IOException if some IO error occurred
         */
-       public ProtocolServer createServer(final InetSocketAddress address, final PCEPConnectionFactory connectionFactory) throws IOException;
+       public Future<ProtocolServer> createServer(final InetSocketAddress address, final PCEPConnectionFactory connectionFactory) throws IOException;
 
        /**
         * Creates a client. Needs to be started via the start method.
@@ -37,7 +39,7 @@ public interface PCEPDispatcher {
         * @return session associated with this client.
         * @throws IOException if some IO error occurred
         */
-       public PCEPSession createClient(PCEPConnection connection) throws IOException;
+       public Future<? extends PCEPSession> createClient(PCEPConnection connection) throws IOException;
 
        /**
         * Sets the limit of maximum unknown messages per minute. If not set by the user, default is 5 messages/minute.
index 715e153bae5dce004b86cdfe8865ce1c36f3cf86..dab566be4fab74a474c5a17404baedc3ba6258ba 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.protocol.pcep.impl;
 
+import io.netty.util.concurrent.Future;
+
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.util.concurrent.ExecutionException;
@@ -47,7 +49,7 @@ public class PCEPDispatcherImpl implements PCEPDispatcher {
        }
 
        @Override
-       public ProtocolServer createServer(final InetSocketAddress address, final PCEPConnectionFactory connectionFactory) throws IOException {
+       public Future<ProtocolServer> createServer(final InetSocketAddress address, final PCEPConnectionFactory connectionFactory) throws IOException {
                connectionFactory.setProposal(this.proposalFactory, address, 0);
                return this.dispatcher.createServer(address, connectionFactory, new PCEPSessionFactoryImpl(this.maxUnknownMessages));
        }
@@ -59,8 +61,8 @@ public class PCEPDispatcherImpl implements PCEPDispatcher {
         * @throws InterruptedException
         */
        @Override
-       public PCEPSession createClient(final PCEPConnection connection) throws IOException {
-               return (PCEPSession) this.dispatcher.createClient(connection, new PCEPSessionFactoryImpl(this.maxUnknownMessages));
+       public Future<? extends PCEPSession> createClient(final PCEPConnection connection) throws IOException {
+               return this.dispatcher.createClient(connection, new PCEPSessionFactoryImpl(this.maxUnknownMessages));
        }
 
        @Override
index 984ef3a03123b3847abe0cc50a7639ffb36d82d8..eb73f5bd13cf38d3c5ccedba88e590f18281415e 100644 (file)
@@ -12,12 +12,11 @@ import io.netty.channel.ChannelHandlerContext;
 import java.util.Timer;
 
 import org.opendaylight.protocol.framework.ProtocolConnection;
-import org.opendaylight.protocol.framework.ProtocolSession;
 import org.opendaylight.protocol.framework.ProtocolSessionFactory;
 import org.opendaylight.protocol.framework.SessionParent;
 import org.opendaylight.protocol.pcep.PCEPConnection;
 
-public class PCEPSessionFactoryImpl implements ProtocolSessionFactory {
+public class PCEPSessionFactoryImpl implements ProtocolSessionFactory<PCEPSessionImpl> {
 
        private final int maxUnknownMessages;
 
@@ -26,7 +25,7 @@ public class PCEPSessionFactoryImpl implements ProtocolSessionFactory {
        }
 
        @Override
-       public ProtocolSession getProtocolSession(final SessionParent parent, final Timer timer, final ProtocolConnection connection,
+       public PCEPSessionImpl getProtocolSession(final SessionParent parent, final Timer timer, final ProtocolConnection connection,
                        final int sessionId, final ChannelHandlerContext ctx) {
                return new PCEPSessionImpl(parent, timer, (PCEPConnection) connection, new PCEPMessageFactory(), this.maxUnknownMessages, sessionId, ctx);
        }
index 8790a4809bc35b1847d70057b5a5e277c7c3ab35..2a10628ac587a842d45eda352c5881306eb2065c 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.protocol.pcep.testtool;
 
-import java.io.IOException;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 
@@ -66,7 +65,7 @@ public class Main {
 
                        "With no parameters, this help is printed.";
 
-       public static void main(final String[] args) throws IOException {
+       public static void main(final String[] args) throws Exception {
                if (args.length == 0 || (args.length == 1 && args[0].equalsIgnoreCase("--help"))) {
                        System.out.println(Main.usage);
                        return;
@@ -146,7 +145,7 @@ public class Main {
                                @Override
                                public void setProposal(final PCEPSessionProposalFactory proposals, final InetSocketAddress address, final int sessionId) {
                                }
-                       });
+                       }).get();
 
                        // try {
                        // Thread.sleep(10000);