001: /*
002: * This file or a portion of this file is licensed under the terms of
003: * the Globus Toolkit Public License, found in file GTPL, or at
004: * http://www.globus.org/toolkit/download/license.html. This notice must
005: * appear in redistributions of this file, with or without modification.
006: *
007: * Redistributions of this Software, with or without modification, must
008: * reproduce the GTPL in: (1) the Software, or (2) the Documentation or
009: * some other similar material which is provided with the Software (if
010: * any).
011: *
012: * Copyright 1999-2004 University of Chicago and The University of
013: * Southern California. All rights reserved.
014: */
015: package org.griphyn.vdl.invocation;
016:
017: import java.net.*;
018: import java.io.*;
019: import java.util.Date;
020: import org.apache.log4j.*;
021:
022: public class SimpleServerThread extends Thread {
023: private String m_remote = null;
024: private Socket m_socket = null;
025: private SimpleServer m_server = null;
026: private static Logger c_logger = null;
027:
028: static int c_count = 0;
029: static int c_cdone = 0;
030:
031: public void log(Level l, String msg) {
032: c_logger.log(l, m_remote + ": " + msg);
033: }
034:
035: public SimpleServerThread(SimpleServer me, Socket socket) {
036: super ("SimpleServerThread#" + ++c_count);
037: this .m_server = me;
038: this .m_socket = socket;
039: if (c_logger == null) {
040: // Singleton-like init
041: c_logger = Logger.getLogger(SimpleServerThread.class);
042: c_logger.setLevel(Level.DEBUG);
043: c_logger.addAppender(new ConsoleAppender(new PatternLayout(
044: "%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t] %m%n")));
045: c_logger.setAdditivity(false);
046: }
047:
048: InetSocketAddress remote = (InetSocketAddress) m_socket
049: .getRemoteSocketAddress();
050: this .m_remote = remote.getAddress().getHostAddress() + ":"
051: + remote.getPort();
052: }
053:
054: public void run() {
055: String line = null;
056: log(Level.INFO, "starting");
057:
058: try {
059: PrintWriter out = new PrintWriter(m_socket
060: .getOutputStream(), true);
061: BufferedReader in = new BufferedReader(
062: new InputStreamReader(m_socket.getInputStream()));
063:
064: while ((line = in.readLine()) != null) {
065: if (c_logger.isDebugEnabled())
066: log(Level.DEBUG, "received >>" + line + "<<");
067: if (line.startsWith("PARSE")) {
068: // request to parse a given file
069:
070: String[] request = line.split("[ \t]", 3);
071: if (request.length != 3) {
072: out.println("400 Illegal request format");
073: continue;
074: }
075:
076: if (!request[2].equals("ECP/1.0")) {
077: out.println("501 Unrecognized version");
078: continue;
079: }
080:
081: int result = m_server.checkFile(request[1]);
082: out.println("300 Result code " + result);
083:
084: } else if (line.equals("QUIT")) {
085: // done
086: out.println("200 Good-bye");
087: break;
088: } else if (line.equals("SHUTDOWN")) {
089: out.println("200 Shutting down server, good-bye");
090: SimpleServer.setTerminate(true);
091: m_server.m_server.close(); // close server socket
092: break;
093: } else {
094: // illegal request
095: out.println("500 Illegal request");
096: break;
097: }
098: }
099:
100: out.close();
101: in.close();
102:
103: m_socket.close();
104: synchronized (m_server) {
105: ++c_cdone;
106: m_server.notifyAll();
107: }
108: log(Level.INFO, "finished [" + c_count + ":" + c_cdone
109: + "]");
110: } catch (IOException e) {
111: log(Level.WARN, "I/O error: " + e.getMessage());
112: }
113: }
114: }
|