/**
* This file is part of ObjectFabric (http://objectfabric.org).
*
* ObjectFabric is licensed under the Apache License, Version 2.0, the terms
* of which may be found at http://www.apache.org/licenses/LICENSE-2.0.html.
*
* Copyright ObjectFabric Inc.
*
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
package part04;
import java.io.FileInputStream;
import java.net.InetSocketAddress;
import java.security.KeyStore;
import java.util.concurrent.Executors;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.TrustManagerFactory;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import org.jboss.netty.handler.codec.http.HttpRequestDecoder;
import org.jboss.netty.handler.codec.http.HttpResponseEncoder;
import org.jboss.netty.handler.ssl.SslHandler;
import org.objectfabric.JVMServer;
import org.objectfabric.JVMWorkspace;
import org.objectfabric.Memory;
import org.objectfabric.NettySession;
import org.objectfabric.Server;
import org.objectfabric.Workspace;
public class SchemesServer {
public static void main(String[] args) throws Exception {
/*
* Put a resource in a memory store.
*/
Memory memory = new Memory(false);
Workspace workspace = new JVMWorkspace();
workspace.addURIHandler(memory);
workspace.open("/test").set("data");
workspace.close();
/*
* Use memory store as default handler for all URIs.
*/
final Server resolver = new JVMServer();
resolver.addURIHandler(memory);
/*
* Start a socket server. (C.f. https://netty.io)
*/
ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory( //
Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("objectfabric", new NettySession(resolver));
return pipeline;
}
});
bootstrap.bind(new InetSocketAddress(1850));
System.out.println("Started socket server on port 1850");
/*
* Start a secure socket server.
*/
bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory( //
Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
final SSLContext sslContext = createSSLContext();
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
SSLEngine engine = sslContext.createSSLEngine();
engine.setUseClientMode(false);
pipeline.addLast("ssl", new SslHandler(engine));
pipeline.addLast("objectfabric", new NettySession(resolver));
return pipeline;
}
});
bootstrap.bind(new InetSocketAddress(1853));
System.out.println("Started secure socket server on port 1853");
/*
* Start a WebSocket server.
*/
bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory( //
Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("decoder", new HttpRequestDecoder());
pipeline.addLast("encoder", new HttpResponseEncoder());
pipeline.addLast("objectfabric", new NettySession(resolver));
return pipeline;
}
});
bootstrap.bind(new InetSocketAddress(8888));
System.out.println("Started WebSocket server on port 8888");
/*
* Start a secure WebSocket server.
*/
bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory( //
Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
SSLEngine engine = sslContext.createSSLEngine();
engine.setUseClientMode(false);
pipeline.addLast("ssl", new SslHandler(engine));
pipeline.addLast("decoder", new HttpRequestDecoder());
pipeline.addLast("encoder", new HttpResponseEncoder());
pipeline.addLast("objectfabric", new NettySession(resolver));
return pipeline;
}
});
bootstrap.bind(new InetSocketAddress(8883));
System.out.println("Started secure WebSocket server on port 8883");
}
/**
* Initiates a SSL context from self-signed certificate.
*/
public static SSLContext createSSLContext() throws Exception {
KeyStore ks = KeyStore.getInstance("JKS");
KeyStore ts = KeyStore.getInstance("JKS");
char[] passphrase = "passphrase".toCharArray();
ks.load(new FileInputStream("src/main/java/part04/keystore.jks"), passphrase);
ts.load(new FileInputStream("src/main/java/part04/keystore.jks"), passphrase);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, passphrase);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ts);
SSLContext ssl = SSLContext.getInstance("TLS");
ssl.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
return ssl;
}
}