2 * Copyright (c) 2013 Pantheon Technologies 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
10 package org.opendaylight.openflowjava.protocol.impl.connection;
12 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionConfiguration;
13 import org.opendaylight.openflowjava.protocol.api.connection.SwitchConnectionHandler;
14 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
15 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
16 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;
17 import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralDeserializer;
18 import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralSerializer;
19 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
20 import org.opendaylight.openflowjava.protocol.impl.core.PublishingChannelInitializerFactory;
21 import org.opendaylight.openflowjava.protocol.impl.core.TcpHandler;
22 import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializationFactory;
23 import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializerRegistryImpl;
24 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializationFactory;
25 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;
26 import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
30 import com.google.common.util.concurrent.ListenableFuture;
31 import com.google.common.util.concurrent.SettableFuture;
34 * Exposed class for server handling
36 * @author michal.polkorab
38 public class SwitchConnectionProviderImpl implements SwitchConnectionProvider {
40 private static final Logger LOGGER = LoggerFactory
41 .getLogger(SwitchConnectionProviderImpl.class);
42 private SwitchConnectionHandler switchConnectionHandler;
43 private ServerFacade serverFacade;
44 private ConnectionConfiguration connConfig;
45 private SerializationFactory serializationFactory;
46 private SerializerRegistry serializerRegistry;
47 private DeserializerRegistry deserializerRegistry;
48 private DeserializationFactory deserializationFactory;
51 public SwitchConnectionProviderImpl() {
52 serializerRegistry = new SerializerRegistryImpl();
53 serializerRegistry.init();
54 serializationFactory = new SerializationFactory();
55 serializationFactory.setSerializerTable(serializerRegistry);
56 deserializerRegistry = new DeserializerRegistryImpl();
57 deserializerRegistry.init();
58 deserializationFactory = new DeserializationFactory();
59 deserializationFactory.setRegistry(deserializerRegistry);
63 public void setConfiguration(ConnectionConfiguration connConfig) {
64 this.connConfig = connConfig;
68 public void setSwitchConnectionHandler(SwitchConnectionHandler switchConnectionHandler) {
69 LOGGER.debug("setSwitchConnectionHandler");
70 this.switchConnectionHandler = switchConnectionHandler;
74 public ListenableFuture<Boolean> shutdown() {
75 LOGGER.debug("Shutdown summoned");
76 //TODO: provide exception in case of: not started, not configured (already stopped)
77 ListenableFuture<Boolean> result = serverFacade.shutdown();
82 public ListenableFuture<Boolean> startup() {
83 LOGGER.debug("Startup summoned");
84 serverFacade = createAndConfigureServer();
86 LOGGER.debug("Starting ..");
87 ListenableFuture<Boolean> result = null;
89 if (serverFacade == null) {
90 throw new IllegalStateException("No server configured");
92 if (serverFacade.getIsOnlineFuture().isDone()) {
93 throw new IllegalStateException("Server already running");
95 if (switchConnectionHandler == null) {
96 throw new IllegalStateException("switchConnectionHandler is not set");
98 new Thread(serverFacade).start();
99 result = serverFacade.getIsOnlineFuture();
100 } catch (Exception e) {
101 SettableFuture<Boolean> exResult = SettableFuture.create();
102 exResult.setException(e);
111 private TcpHandler createAndConfigureServer() {
112 LOGGER.debug("Configuring ..");
113 TcpHandler server = new TcpHandler(connConfig.getAddress(), connConfig.getPort());
114 PublishingChannelInitializerFactory factory = new PublishingChannelInitializerFactory();
115 factory.setSwitchConnectionHandler(switchConnectionHandler);
116 factory.setSwitchIdleTimeout(connConfig.getSwitchIdleTimeout());
117 factory.setTlsConfig(connConfig.getTlsConfiguration());
118 factory.setSerializationFactory(serializationFactory);
119 factory.setDeserializationFactory(deserializationFactory);
120 server.setChannelInitializer(factory.createPublishingChannelInitializer());
127 public ServerFacade getServerFacade() {
132 public <KEY_TYPE> void registerSerializer(MessageTypeKey<KEY_TYPE> key,
133 OFGeneralSerializer serializer) {
134 serializerRegistry.registerSerializer(key, serializer);
138 public void registerDeserializer(MessageCodeKey key,
139 OFGeneralDeserializer deserializer) {
140 deserializerRegistry.registerDeserializer(key, deserializer);
144 public void close() throws Exception {