Extensibility support (deserialization part)
[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.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;
30
31 import com.google.common.util.concurrent.ListenableFuture;
32 import com.google.common.util.concurrent.SettableFuture;
33
34 /**
35  * Exposed class for server handling
36  * @author mirehak
37  * @author michal.polkorab
38  */
39 public class SwitchConnectionProviderImpl implements SwitchConnectionProvider {
40
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;
50
51     /** Constructor */
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);
61     }
62
63     @Override
64     public void setConfiguration(ConnectionConfiguration connConfig) {
65         this.connConfig = connConfig;
66     }
67
68     @Override
69     public void setSwitchConnectionHandler(SwitchConnectionHandler switchConnectionHandler) {
70         LOGGER.debug("setSwitchConnectionHandler");
71         this.switchConnectionHandler = switchConnectionHandler;
72     }
73
74     @Override
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();
79         return result;
80     }
81
82     @Override
83     public ListenableFuture<Boolean> startup() {
84         LOGGER.debug("Startup summoned");
85         serverFacade = createAndConfigureServer();
86         
87         LOGGER.debug("Starting ..");
88         ListenableFuture<Boolean> result = null;
89         try {
90             if (serverFacade == null) {
91                 throw new IllegalStateException("No server configured");
92             }
93             if (serverFacade.getIsOnlineFuture().isDone()) {
94                 throw new IllegalStateException("Server already running");
95             }
96             if (switchConnectionHandler == null) {
97                 throw new IllegalStateException("switchConnectionHandler is not set");
98             }
99             new Thread(serverFacade).start();
100             result = serverFacade.getIsOnlineFuture();
101         } catch (Exception e) {
102             SettableFuture<Boolean> exResult = SettableFuture.create();
103             exResult.setException(e);
104             result = exResult;
105         }
106         return result;
107     }
108
109     /**
110      * @return
111      */
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);
121         return server;
122     }
123
124     /**
125      * @return servers
126      */
127     public ServerFacade getServerFacade() {
128         return serverFacade;
129     }
130
131     @Override
132     public <E extends DataObject> void registerCustomSerializer(MessageTypeKey<E> key,
133             OFSerializer<E> 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 }