package org.simpleframework.http.socket.table;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.Map;
import org.simpleframework.common.buffer.Allocator;
import org.simpleframework.common.buffer.ArrayAllocator;
import org.simpleframework.http.Path;
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 WebSocketTableUpdaterApplication implements Container, TransportProcessor {
private final String ROOT_PATH = "C:\\Work\\development\\github\\simpleframework\\simple\\simple-http\\src\\test\\java\\org\\simpleframework\\http\\socket\\table";
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 WebSocketTableUpdaterApplication(WebSocketTableUpdater handler, TraceAnalyzer agent, int port) throws Exception {
this.negotiator = new DirectRouter(handler);
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);
}
public void connect() throws IOException {
connection.connect(address);
}
public void handle(Request req, Response resp) {
Path path = req.getPath();
String normal = path.getPath();
System.err.println(req);
if(req.getTarget().equals("/login")) {
String user = req.getParameter("user");
long time = System.currentTimeMillis();
try {
resp.setStatus(Status.FOUND);
resp.setValue("Location", "/table");
resp.setCookie("user", user);
resp.setDate("Date", time);
resp.setValue("Server", "WebSocketTableApplication/1.0");
resp.setContentType("text/html");
resp.close();
}catch(Exception e) {
e.printStackTrace();
}
} else if(req.getTarget().equals("/update")){
long time = System.currentTimeMillis();
try {
container.handle(req, resp);
} catch(Exception e) {
e.printStackTrace();
}
} else {
long time = System.currentTimeMillis();
try {
byte[] page = loadPage(normal);
resp.setDate("Date", time);
resp.setValue("Server", "WebSocketTableApplication/1.0");
if(normal.endsWith(".html")) {
resp.setContentType("text/html");
} else if(normal.endsWith(".css")) {
resp.setContentType("text/css");
} else if(normal.endsWith(".js")) {
resp.setContentType("text/javascript");
} else if(normal.endsWith(".png")) {
resp.setContentType("image/png");
} else {
resp.setContentType("text/plain");
}
OutputStream out = resp.getOutputStream();
out.write(page);
out.close();
}catch(Exception e) {
e.printStackTrace();
try {
resp.setCode(404);
resp.setDescription("Not Found");
resp.setDate("Date", time);
resp.setValue("Server", "WebSocketTableApplication/1.0");
resp.setContentType("text/plain");
PrintStream out = resp.getPrintStream();
e.printStackTrace(out);
out.close();
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
}
public byte[] loadPage(String name) throws IOException {
InputStream loginPage = new FileInputStream(new File(ROOT_PATH, 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.toByteArray();
}
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();
}
}