b202598653caaef3028d79c937b4c659865e9210
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / connection / SwitchConnectionProviderImpl.java
1 /*
2  * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
3  *
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
7  */
8
9
10 package org.opendaylight.openflowjava.protocol.impl.connection;
11
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;
29
30 import com.google.common.util.concurrent.ListenableFuture;
31 import com.google.common.util.concurrent.SettableFuture;
32
33 /**
34  * Exposed class for server handling
35  * @author mirehak
36  * @author michal.polkorab
37  */
38 public class SwitchConnectionProviderImpl implements SwitchConnectionProvider {
39
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;
49
50     /** Constructor */
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);
60     }
61
62     @Override
63     public void setConfiguration(ConnectionConfiguration connConfig) {
64         this.connConfig = connConfig;
65     }
66
67     @Override
68     public void setSwitchConnectionHandler(SwitchConnectionHandler switchConnectionHandler) {
69         LOGGER.debug("setSwitchConnectionHandler");
70         this.switchConnectionHandler = switchConnectionHandler;
71     }
72
73     @Override
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();
78         return result;
79     }
80
81     @Override
82     public ListenableFuture<Boolean> startup() {
83         LOGGER.debug("Startup summoned");
84         serverFacade = createAndConfigureServer();
85         
86         LOGGER.debug("Starting ..");
87         ListenableFuture<Boolean> result = null;
88         try {
89             if (serverFacade == null) {
90                 throw new IllegalStateException("No server configured");
91             }
92             if (serverFacade.getIsOnlineFuture().isDone()) {
93                 throw new IllegalStateException("Server already running");
94             }
95             if (switchConnectionHandler == null) {
96                 throw new IllegalStateException("switchConnectionHandler is not set");
97             }
98             new Thread(serverFacade).start();
99             result = serverFacade.getIsOnlineFuture();
100         } catch (Exception e) {
101             SettableFuture<Boolean> exResult = SettableFuture.create();
102             exResult.setException(e);
103             result = exResult;
104         }
105         return result;
106     }
107
108     /**
109      * @return
110      */
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());
121         return server;
122     }
123
124     /**
125      * @return servers
126      */
127     public ServerFacade getServerFacade() {
128         return serverFacade;
129     }
130
131     @Override
132     public <KEY_TYPE> void registerSerializer(MessageTypeKey<KEY_TYPE> key,
133             OFGeneralSerializer serializer) {
134         serializerRegistry.registerSerializer(key, serializer);
135     }
136
137     @Override
138     public void registerDeserializer(MessageCodeKey key,
139             OFGeneralDeserializer deserializer) {
140         deserializerRegistry.registerDeserializer(key, deserializer);
141     }
142
143     @Override
144     public void close() throws Exception {
145         shutdown();
146     }
147 }