blob: 7d27b9f3689363ffb794ae361f10fa0a4c89a79e [file] [log] [blame]
package org.simpleframework.http.socket;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.Map;
import javax.net.ssl.SSLContext;
import org.simpleframework.common.buffer.Allocator;
import org.simpleframework.common.buffer.ArrayAllocator;
import org.simpleframework.http.Cookie;
import org.simpleframework.http.Request;
import org.simpleframework.http.Response;
import org.simpleframework.http.Status;
import org.simpleframework.http.core.Container;
import org.simpleframework.http.core.ContainerTransportProcessor;
import org.simpleframework.http.socket.service.Router;
import org.simpleframework.http.socket.service.RouterContainer;
import org.simpleframework.http.socket.service.DirectRouter;
import org.simpleframework.transport.TransportProcessor;
import org.simpleframework.transport.TransportSocketProcessor;
import org.simpleframework.transport.SocketProcessor;
import org.simpleframework.transport.Transport;
import org.simpleframework.transport.connect.Connection;
import org.simpleframework.transport.connect.SocketConnection;
import org.simpleframework.transport.trace.TraceAnalyzer;
public class WebSocketChatApplication implements Container, TransportProcessor {
private final WebSocketCertificate certificate;
private final Router negotiator;
private final RouterContainer container;
private final SocketAddress address;
private final Connection connection;
private final TransportProcessor processor;
private final Allocator allocator;
private final SocketProcessor server;
public WebSocketChatApplication(WebSocketChatRoom service, WebSocketCertificate certificate, TraceAnalyzer agent, int port) throws Exception {
this.negotiator = new DirectRouter(service);
this.container = new RouterContainer(this, negotiator, 10);
this.allocator = new ArrayAllocator();
this.processor = new ContainerTransportProcessor(container, allocator, 1);
this.server = new TransportSocketProcessor(this);
this.connection = new SocketConnection(server, agent);
this.address = new InetSocketAddress(port);
this.certificate = certificate;
}
public void connect() throws Exception {
// if(certificate != null) {
// SSLContext context = certificate.getContext();
//
// connection.connect(address, context);
// container.start();
// } else {
connection.connect(address);
// }
}
public void handle(Request req, Response resp) {
System.err.println(req);
if(req.getTarget().equals("/")) {
long time = System.currentTimeMillis();
try {
resp.setDate("Date", time);
resp.setValue("Server", "WebSocketChatApplication/1.0");
resp.setContentType("text/html");
String page = loadPage("WebSocketChatLogin.html");
resp.setDate("Date", time);
resp.setValue("Server", "WebSocketChatApplication/1.0");
resp.setContentType("text/html");
PrintStream out = resp.getPrintStream();
out.println(page);
out.close();
}catch(Exception e) {
e.printStackTrace();
}
} else if(req.getTarget().equals("/login")) {
String user = req.getParameter("user");
long time = System.currentTimeMillis();
try {
resp.setStatus(Status.FOUND);
resp.setValue("Location", "/chat");
resp.setCookie("user", user);
resp.setDate("Date", time);
resp.setValue("Server", "WebSocketChatApplication/1.0");
resp.setContentType("text/html");
resp.close();
}catch(Exception e) {
e.printStackTrace();
}
} else if(req.getTarget().equals("/chat")) {
long time = System.currentTimeMillis();
try {
Cookie user = req.getCookie("user");
String name = user.getValue();
String page = loadPage("WebSocketChatRoom.html");
resp.setDate("Date", time);
resp.setValue("Server", "WebSocketChatApplication/1.0");
resp.setContentType("text/html");
PrintStream out = resp.getPrintStream();
page = page.replaceAll("%1", name);
out.println(page);
out.close();
} catch(Exception e) {
e.printStackTrace();
}
} else if(req.getTarget().equals("/talk")){
long time = System.currentTimeMillis();
try {
container.handle(req, resp);
} catch(Exception e) {
e.printStackTrace();
}
} else {
long time = System.currentTimeMillis();
try {
resp.setCode(404);
resp.setDescription("Not Found");
resp.setDate("Date", time);
resp.setValue("Server", "WebSocketChatApplication/1.0");
resp.setContentType("text/plain");
PrintStream out = resp.getPrintStream();
out.println("Not Found");
out.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
public String loadPage(String name) throws IOException {
InputStream loginPage = WebSocketChatApplication.class.getResourceAsStream(name);
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] chunk = new byte[1024];
int count = 0;
while((count = loginPage.read(chunk)) != -1) {
out.write(chunk, 0, count);
}
out.close();
return out.toString();
}
public void process(Transport transport) throws IOException {
Map map = transport.getAttributes();
map.put(Transport.class, transport);
processor.process(transport);
}
public void stop() throws IOException {
processor.stop();
}
}