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.ConnectionConfiguration.FEATURE_SUPPORT;
14 import org.opendaylight.openflowjava.protocol.api.connection.SwitchConnectionHandler;
15 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;
16 import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
17 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
18 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
19 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
20 import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralDeserializer;
21 import org.opendaylight.openflowjava.protocol.impl.core.TcpHandler;
22 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializationFactory;
23 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;
24 import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializationFactory;
25 import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializerRegistryImpl;
26 import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
27 import org.opendaylight.yangtools.yang.binding.DataObject;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
31 import com.google.common.util.concurrent.ListenableFuture;
32 import com.google.common.util.concurrent.SettableFuture;
35 * Exposed class for server handling
37 * @author michal.polkorab
39 public class SwitchConnectionProviderImpl implements SwitchConnectionProvider {
41 private static final Logger LOGGER = LoggerFactory
42 .getLogger(SwitchConnectionProviderImpl.class);
43 private SwitchConnectionHandler switchConnectionHandler;
44 private ServerFacade serverFacade;
45 private ConnectionConfiguration connConfig;
46 private SerializationFactory serializationFactory;
47 private SerializerRegistry serializerRegistry;
48 private DeserializerRegistry deserializerRegistry;
49 private DeserializationFactory deserializationFactory;
52 public SwitchConnectionProviderImpl() {
53 serializerRegistry = new SerializerRegistryImpl();
54 serializerRegistry.init();
55 serializationFactory = new SerializationFactory();
56 serializationFactory.setSerializerTable(serializerRegistry);
57 deserializerRegistry = new DeserializerRegistryImpl();
58 deserializerRegistry.init();
59 deserializationFactory = new DeserializationFactory();
60 deserializationFactory.setRegistry(deserializerRegistry);
64 public void setConfiguration(ConnectionConfiguration connConfig) {
65 this.connConfig = connConfig;
69 public void setSwitchConnectionHandler(SwitchConnectionHandler switchConnectionHandler) {
70 LOGGER.debug("setSwitchConnectionHandler");
71 this.switchConnectionHandler = switchConnectionHandler;
75 public ListenableFuture<Boolean> shutdown() {
76 LOGGER.debug("Shutdown summoned");
77 //TODO: provide exception in case of: not started, not configured (already stopped)
78 ListenableFuture<Boolean> result = serverFacade.shutdown();
83 public ListenableFuture<Boolean> startup() {
84 LOGGER.debug("Startup summoned");
85 serverFacade = createAndConfigureServer();
87 LOGGER.debug("Starting ..");
88 ListenableFuture<Boolean> result = null;
90 if (serverFacade == null) {
91 throw new IllegalStateException("No server configured");
93 if (serverFacade.getIsOnlineFuture().isDone()) {
94 throw new IllegalStateException("Server already running");
96 if (switchConnectionHandler == null) {
97 throw new IllegalStateException("switchConnectionHandler is not set");
99 new Thread(serverFacade).start();
100 result = serverFacade.getIsOnlineFuture();
101 } catch (Exception e) {
102 SettableFuture<Boolean> exResult = SettableFuture.create();
103 exResult.setException(e);
112 private TcpHandler createAndConfigureServer() {
113 LOGGER.debug("Configuring ..");
114 TcpHandler server = new TcpHandler(connConfig.getAddress(), connConfig.getPort());
115 server.setSwitchConnectionHandler(switchConnectionHandler);
116 server.setSwitchIdleTimeout(connConfig.getSwitchIdleTimeout());
117 boolean tlsSupported = FEATURE_SUPPORT.REQUIRED.equals(connConfig.getTlsSupport());
118 server.setEncryption(tlsSupported);
119 server.setSerializationFactory(serializationFactory);
120 server.setDeserializationFactory(deserializationFactory);
127 public ServerFacade getServerFacade() {
132 public <E extends DataObject> void registerCustomSerializer(MessageTypeKey<E> key,
133 OFSerializer<E> 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 {