package cn.aprilsoft.TinyAppServer.processor;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import cn.aprilsoft.TinyAppServer.configuare.sceurity.UrlSecurityUtil;
import cn.aprilsoft.TinyAppServer.exception.ClientAbortException;
import cn.aprilsoft.TinyAppServer.exception.HttpException;
import cn.aprilsoft.TinyAppServer.exception.ServerException;
import cn.aprilsoft.TinyAppServer.reqNrep.Request;
import cn.aprilsoft.TinyAppServer.reqNrep.RequestUtil;
import cn.aprilsoft.TinyAppServer.reqNrep.Response;
import cn.aprilsoft.TinyAppServer.reqNrep.ResponseUtil;
import cn.aprilsoft.conf4j.Conf4j;
public class MainProcessor {
private static final Logger log = Logger.getLogger(MainProcessor.class);
private final List<ProcessorInfo> processors = new ArrayList<ProcessorInfo>();
public MainProcessor() {
List<String> procs = Conf4j.getSemicolonSplitedTrimProperties(MainProcessor.class, "processors");
for (int i = 0; i < procs.size(); i++) {
String proc = procs.get(i);
String[] proca = proc.split(",");
String filter = proca[0].trim();
String procn = proca[1].trim();
try {
Processor processor = (Processor) Class.forName(procn).newInstance();
processor.init();
processors.add(new ProcessorInfo(filter, processor));
} catch (Exception e) {
throw new ServerException(e);
}
}
}
public void process(Socket in) {
try {
boolean processed = false;
Request request = RequestUtil.createRequest(in);
Response response = ResponseUtil.createResponse(in);
String url = request.getUrl();
// url security check
UrlSecurityUtil.checkUrlUpFolder(url);
if (url != null) {
for (int i = 0; i < processors.size(); i++) {
ProcessorInfo processorInfo = processors.get(i);
if (isFilterMatch(url, processorInfo)) {
processorInfo.getProcessor().process(request, response);
processed = true;
break;
}
}
}
if (!processed) {
log.warn("Not processed url:'" + request.getUrl() + "'.");
}
} catch (ClientAbortException e) {
log.info("Client abort connection.");
} catch (SocketException e) {
log.info("Client abort connection.");
} catch (IOException e) {
throw new HttpException(e);
}
}
private static boolean isFilterMatch(String url, ProcessorInfo processorInfo) {
return processorInfo.getPattern().matcher(url).matches();
}
}