Refactor logging to use slf4j
[iotivity.git] / cloud / stack / src / main / java / org / iotivity / cloud / base / server / Server.java
1 /*
2  * //******************************************************************
3  * //
4  * // Copyright 2016 Samsung Electronics All Rights Reserved.
5  * //
6  * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7  * //
8  * // Licensed under the Apache License, Version 2.0 (the "License");
9  * // you may not use this file except in compliance with the License.
10  * // You may obtain a copy of the License at
11  * //
12  * //      http://www.apache.org/licenses/LICENSE-2.0
13  * //
14  * // Unless required by applicable law or agreed to in writing, software
15  * // distributed under the License is distributed on an "AS IS" BASIS,
16  * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * // See the License for the specific language governing permissions and
18  * // limitations under the License.
19  * //
20  * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21  */
22 package org.iotivity.cloud.base.server;
23
24 import java.io.File;
25 import java.net.InetSocketAddress;
26 import java.security.cert.CertificateException;
27 import java.util.ArrayList;
28 import java.util.List;
29
30 import javax.net.ssl.SSLException;
31
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34 import org.iotivity.cloud.base.OICConstants;
35
36 import io.netty.bootstrap.ServerBootstrap;
37 import io.netty.channel.ChannelHandler;
38 import io.netty.channel.ChannelInitializer;
39 import io.netty.channel.ChannelPipeline;
40 import io.netty.channel.EventLoopGroup;
41 import io.netty.channel.nio.NioEventLoopGroup;
42 import io.netty.channel.socket.SocketChannel;
43 import io.netty.channel.socket.nio.NioServerSocketChannel;
44 import io.netty.handler.logging.LogLevel;
45 import io.netty.handler.logging.LoggingHandler;
46 import io.netty.handler.ssl.SslContext;
47 import io.netty.handler.ssl.SslContextBuilder;
48
49 public abstract class Server {
50     Logger            Log                = LoggerFactory.getLogger(Server.class);
51
52     EventLoopGroup    acceptorGroup      = new NioEventLoopGroup(1);
53
54     EventLoopGroup    workerGroup        = new NioEventLoopGroup();
55
56     ServerInitializer mServerInitializer = new ServerInitializer();
57
58     InetSocketAddress mInetSocketAddress = null;
59
60     SslContext        mSslContext        = null;
61
62     private class ServerInitializer extends ChannelInitializer<SocketChannel> {
63         private List<ChannelHandler> additionalHandlers = new ArrayList<>();
64
65         public ServerInitializer() {
66         }
67
68         public void addHandler(ChannelHandler handler) {
69             additionalHandlers.add(handler);
70         }
71
72         @Override
73         public void initChannel(SocketChannel ch) throws Exception {
74             ChannelPipeline p = ch.pipeline();
75
76             if (mSslContext != null) {
77                 p.addLast(mSslContext.newHandler(ch.alloc()));
78             }
79
80             p.addLast(onQueryDefaultHandler());
81
82             for (ChannelHandler handler : additionalHandlers) {
83                 p.addLast(handler);
84             }
85         }
86     }
87
88     public Server(InetSocketAddress inetSocketAddress) {
89         mInetSocketAddress = inetSocketAddress;
90     }
91
92     public void startServer(boolean tlsMode)
93             throws CertificateException, SSLException, InterruptedException {
94
95         try {
96             if (tlsMode)
97                 Log.info("Server starts with TLS!");
98
99             if (tlsMode == true) {
100
101                 File serverCert = new File(OICConstants.CLOUD_CERT_FILE);
102
103                 File serverKey = new File(OICConstants.CLOUD_KEY_FILE);
104
105                 mSslContext = SslContextBuilder.forServer(serverCert, serverKey)
106                         .build();
107             }
108
109             ServerBootstrap b = new ServerBootstrap();
110             b.group(acceptorGroup, workerGroup);
111             b.channel(NioServerSocketChannel.class);
112             b.handler(new LoggingHandler(LogLevel.INFO));
113
114             b.childHandler(mServerInitializer);
115
116             b.bind(mInetSocketAddress).sync();
117         } catch (Exception e) {
118             e.printStackTrace();
119             throw e;
120         } finally {
121         }
122     }
123
124     public void stopServer() throws Exception {
125         acceptorGroup.shutdownGracefully().await();
126         workerGroup.shutdownGracefully().await();
127     }
128
129     public void addHandler(ChannelHandler handler) {
130         mServerInitializer.addHandler(handler);
131     }
132
133     abstract protected ChannelHandler[] onQueryDefaultHandler();
134 }