Extracted (De)SerializerExtensionProvider interfaces from SwitchConnectionProvider
[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.api.keys.MatchEntryDeserializerKey;
21 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;
22 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionDeserializerKey;
23 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionSerializerKey;
24 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterDeserializerKey;
25 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterInstructionDeserializerKey;
26 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterInstructionSerializerKey;
27 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterSerializerKey;
28 import org.opendaylight.openflowjava.protocol.impl.core.PublishingChannelInitializerFactory;
29 import org.opendaylight.openflowjava.protocol.impl.core.TcpHandler;
30 import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializationFactory;
31 import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializerRegistryImpl;
32 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializationFactory;
33 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;
34 import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39
40 import com.google.common.util.concurrent.ListenableFuture;
41 import com.google.common.util.concurrent.SettableFuture;
42
43 /**
44  * Exposed class for server handling
45  * @author mirehak
46  * @author michal.polkorab
47  */
48 public class SwitchConnectionProviderImpl implements SwitchConnectionProvider {
49
50     private static final Logger LOGGER = LoggerFactory
51             .getLogger(SwitchConnectionProviderImpl.class);
52     private SwitchConnectionHandler switchConnectionHandler;
53     private ServerFacade serverFacade;
54     private ConnectionConfiguration connConfig;
55     private SerializationFactory serializationFactory;
56     private SerializerRegistry serializerRegistry;
57     private DeserializerRegistry deserializerRegistry;
58     private DeserializationFactory deserializationFactory;
59
60     /** Constructor */
61     public SwitchConnectionProviderImpl() {
62         serializerRegistry = new SerializerRegistryImpl();
63         serializerRegistry.init();
64         serializationFactory = new SerializationFactory();
65         serializationFactory.setSerializerTable(serializerRegistry);
66         deserializerRegistry = new DeserializerRegistryImpl();
67         deserializerRegistry.init();
68         deserializationFactory = new DeserializationFactory();
69         deserializationFactory.setRegistry(deserializerRegistry);
70     }
71
72     @Override
73     public void setConfiguration(ConnectionConfiguration connConfig) {
74         this.connConfig = connConfig;
75     }
76
77     @Override
78     public void setSwitchConnectionHandler(SwitchConnectionHandler switchConnectionHandler) {
79         LOGGER.debug("setSwitchConnectionHandler");
80         this.switchConnectionHandler = switchConnectionHandler;
81     }
82
83     @Override
84     public ListenableFuture<Boolean> shutdown() {
85         LOGGER.debug("Shutdown summoned");
86         //TODO: provide exception in case of: not started, not configured (already stopped)
87         ListenableFuture<Boolean> result = serverFacade.shutdown();
88         return result;
89     }
90
91     @Override
92     public ListenableFuture<Boolean> startup() {
93         LOGGER.debug("Startup summoned");
94         serverFacade = createAndConfigureServer();
95         
96         LOGGER.debug("Starting ..");
97         ListenableFuture<Boolean> result = null;
98         try {
99             if (serverFacade == null) {
100                 throw new IllegalStateException("No server configured");
101             }
102             if (serverFacade.getIsOnlineFuture().isDone()) {
103                 throw new IllegalStateException("Server already running");
104             }
105             if (switchConnectionHandler == null) {
106                 throw new IllegalStateException("switchConnectionHandler is not set");
107             }
108             new Thread(serverFacade).start();
109             result = serverFacade.getIsOnlineFuture();
110         } catch (Exception e) {
111             SettableFuture<Boolean> exResult = SettableFuture.create();
112             exResult.setException(e);
113             result = exResult;
114         }
115         return result;
116     }
117
118     /**
119      * @return
120      */
121     private TcpHandler createAndConfigureServer() {
122         LOGGER.debug("Configuring ..");
123         TcpHandler server = new TcpHandler(connConfig.getAddress(), connConfig.getPort());
124         PublishingChannelInitializerFactory factory = new PublishingChannelInitializerFactory();
125         factory.setSwitchConnectionHandler(switchConnectionHandler);
126         factory.setSwitchIdleTimeout(connConfig.getSwitchIdleTimeout());
127         factory.setTlsConfig(connConfig.getTlsConfiguration());
128         factory.setSerializationFactory(serializationFactory);
129         factory.setDeserializationFactory(deserializationFactory);
130         server.setChannelInitializer(factory.createPublishingChannelInitializer());
131         return server;
132     }
133
134     /**
135      * @return servers
136      */
137     public ServerFacade getServerFacade() {
138         return serverFacade;
139     }
140
141     @Override
142     public void close() throws Exception {
143         shutdown();
144     }
145
146     @Override
147     public boolean unregisterSerializer(ExperimenterSerializerKey key) {
148         return serializerRegistry.unregisterSerializer((MessageTypeKey<?>) key);
149     }
150
151     @Override
152     public boolean unregisterDeserializer(ExperimenterDeserializerKey key) {
153         return deserializerRegistry.unregisterDeserializer((MessageCodeKey) key);
154     }
155
156     @Override
157     public void registerActionSerializer(ExperimenterActionSerializerKey key,
158             OFGeneralSerializer serializer) {
159         serializerRegistry.registerSerializer(key, serializer);
160     }
161
162     @Override
163     public void registerActionDeserializer(ExperimenterActionDeserializerKey key,
164             OFGeneralDeserializer deserializer) {
165         deserializerRegistry.registerDeserializer(key, deserializer);
166     }
167
168     @Override
169     public void registerInstructionSerializer(ExperimenterInstructionSerializerKey key,
170             OFGeneralSerializer serializer) {
171         serializerRegistry.registerSerializer(key, serializer);
172     }
173
174     @Override
175     public void registerInstructionDeserializer(ExperimenterInstructionDeserializerKey key,
176             OFGeneralDeserializer deserializer) {
177         deserializerRegistry.registerDeserializer(key, deserializer);
178     }
179
180     @Override
181     public <OXM_CLASS extends OxmClassBase, OXM_TYPE extends MatchField> void registerMatchEntrySerializer(MatchEntrySerializerKey<OXM_CLASS, OXM_TYPE> key,
182             OFGeneralSerializer serializer) {
183         serializerRegistry.registerSerializer(key, serializer);
184     }
185
186     @Override
187     public void registerMatchEntryDeserializer(MatchEntryDeserializerKey key,
188             OFGeneralDeserializer deserializer) {
189         deserializerRegistry.registerDeserializer(key, deserializer);
190     }
191 }