/***
** @(#) TradeCard.com 1.0
**
** Copyright (c) 2010 TradeCard, Inc. All Rights Reserved.
**
**
** THIS COMPUTER SOFTWARE IS THE PROPERTY OF TradeCard, Inc.
**
** Permission is granted to use this software as specified by the TradeCard
** COMMERCIAL LICENSE AGREEMENT. You may use this software only for
** commercial purposes, as specified in the details of the license.
** TRADECARD SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
** THE LICENSEE AS A RESULT OF USING OR MODIFYING THIS SOFTWARE IN ANY WAY.
**
** YOU MAY NOT DISTRIBUTE ANY SOURCE CODE OR OBJECT CODE FROM THE TradeCard.com
** TOOLKIT AT ANY TIME. VIOLATORS WILL BE PROSECUTED TO THE FULLEST EXTENT
** OF UNITED STATES LAW.
**
** @version 1.0
** @author Copyright (c) 2010 TradeCard, Inc. All Rights Reserved.
**
**/
package com.partydj.io;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.concurrent.*;
import com.partydj.io.servlet.*;
import com.partydj.server.*;
import com.partydj.util.*;
/**
*
**/
public class Http {
public static final String NAME = "http";
public static final String PORT = "port";
protected int port = 80;
private final List<SimpleServlet> servlets;
private static final ExecutorService WORKER_POOL = Executors.newCachedThreadPool(NamedThreadFactory.createDaemonFactory("Http Worker #"));
public static Http create() {
Http http = new Http();
http.init(Config.config());
return http;
}
private Http() {
servlets = new ArrayList();
}
private void init(Config config) {
Integer altPort = config.getIntegerProperty(NAME, PORT);
if (altPort != null) {
this.port = altPort;
}
//File servlet should ALWAYS be last in the servlet list
servlets.add(new PlayerServlet());
servlets.add(new FileServlet());
}
public void start() {
Executors.newSingleThreadExecutor(NamedThreadFactory.createDaemonFactory("Http Acceptor")).execute(new Acceptor());
}
class Acceptor implements Runnable {
@Override public void run() {
ServerSocket socket;
try {
socket = new ServerSocket(port);
} catch (IOException e) {
System.out.println("Unable to open a socket on port "+ port);
e.printStackTrace();
throw new RuntimeException(e);
}
while (true) {
try {
WORKER_POOL.execute(new Worker(socket.accept()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class Worker implements Runnable {
private Socket listener;
private Worker(Socket listener) {
this.listener = listener;
}
@Override public synchronized void run() {
try {
InputStream inStream = listener.getInputStream();
PrintStream outStream = new PrintStream(listener.getOutputStream());
listener.setSoTimeout(0);
listener.setTcpNoDelay(true);
DefaultHttpServletRequest servletRequest = DefaultHttpServletRequest.create(inStream, listener.getInetAddress());
try {
if (servletRequest != null) {
for (SimpleServlet servlet : servlets) {
if (servlet.accept(servletRequest, listener)) {
servlet.handle(servletRequest, outStream, listener);
break;
}
}
}
} finally {
listener.close();
};
} catch (Exception e) {
e.printStackTrace();
}
}
}
}