package org.simpleframework.demo.rest;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.simpleframework.http.Path;
import org.simpleframework.http.Protocol;
import org.simpleframework.http.Request;
import org.simpleframework.http.Response;
import org.simpleframework.http.core.Container;
import org.simpleframework.http.core.ContainerSocketProcessor;
import org.simpleframework.transport.SocketProcessor;
import org.simpleframework.transport.connect.Connection;
import org.simpleframework.transport.connect.SocketConnection;
import com.google.gson.Gson;
public class RequestProcessor {
private final Map<String, RequestRegistration> registrations;
private final SocketProcessor processor;
private final SocketAddress address;
private final Container container;
private final Connection connection;
private final Gson gson;
public RequestProcessor(int port) throws Exception {
this.registrations = new ConcurrentHashMap<String, RequestRegistration>();
this.address = new InetSocketAddress(port);
this.container = new RequestRouter();
this.processor = new ContainerSocketProcessor(container);
this.connection = new SocketConnection(processor);
this.gson = new Gson();
}
public void register(RequestRegistration registration) throws Exception {
String prefix = registration.getPrefix();
RequestRegistration previous = registrations.put(prefix, registration);
if(previous != null) {
throw new IllegalArgumentException("Prefix '" + prefix + "' has already been used");
}
}
public void start() throws Exception {
connection.connect(address);
}
public void stop() throws Exception {
connection.close();
}
private class RequestRouter implements Container {
@Override
public void handle(Request request, Response response) {
try {
Path path = request.getPath();
String normal = path.getPath();
RequestRegistration registration = registrations.get(normal);
RequestHandler handler = registration.getHandler();
Class type = registration.getType();
String content = request.getContent();
Object message = gson.fromJson(content, type);
long time = System.currentTimeMillis();
response.setDate(Protocol.DATE, time);
handler.handle(request, response, message);
response.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
}