/
codebase/src/net/sourceforge/pain/admin/console/command/
codebase/src/net/sourceforge/pain/data/role/
codebase/src/net/sourceforge/pain/network/console/telnet/
codebase/src/net/sourceforge/pain/network/guitool/
codebase/src/net/sourceforge/pain/plugin/
codebase/src/net/sourceforge/pain/util/
db/src/net/sourceforge/pain/util/
gui/
gui/lib/
gui/src/net/sourceforge/pain/tools/guitool/dbbrowse/
gui/src/net/sourceforge/pain/tools/guitool/dialog/
gui/src/net/sourceforge/pain/tools/guitool/menu/
gui/src/net/sourceforge/pain/tools/guitool/resources/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/explorer/
mudlibs/tinylib/
mudlibs/tinylib/area/
mudlibs/tinylib/etc/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/affect/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/prototype/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/trigger/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/affect/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/deploy/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/guitool/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/guitool/event/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/fn/util/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/trigger/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/trigger/impl/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/command/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/reset/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/shutdown/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/social/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/util/
tests/
tests/src/
tests/src/net/sourceforge/pain/db/data/
package net.sourceforge.pain.network.guitool;

import net.sourceforge.pain.util.*;

import java.net.*;
import java.util.*;

public final class GuiToolServer implements Runnable {

    private ServerSocket serverSocket;
    private int port;
    private Set connections = Collections.synchronizedSet(new HashSet());
    private boolean started;
    GuiToolSessionManager sm = null;

    public GuiToolServer(GuiToolSessionManager sm, int port) {
        Log.info("GuiToolServer  created");
        this.sm = sm;
        this.port = port;
        Thread worker = new Thread(this);
        worker.setDaemon(true);
        worker.start();
    }

    public void run() {
        started = true;
        work();
    }

    public void work() {
        try {
            Log.info("GTS:creating server socket on port:" + port);
            serverSocket = new ServerSocket(port, 50, InetAddress.getByName("127.0.0.1"));
            serverSocket.setSoTimeout(0);
            Log.info("GTS:Server Initialised. listening...");
            do {
                try {
                    Socket socket = serverSocket.accept();
                    Log.debug("GTS:connection accepted[" + connections.size() + "]:" + socket.getInetAddress());
                    GuiToolConnection con = new GuiToolConnection(this, socket);
                    sm.onConnect(con);
                    connections.add(con);
                    Thread worker = new Thread(con);
                    worker.start();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } while (started);
        } catch (Exception e) {
            Log.error(e);
        }
    }

    protected void onClose(GuiToolConnection con) {
        Log.debug("GTS:closing connection:[" + connections.size() + "]" + con.socket.getInetAddress());
        connections.remove(con);
        sm.onDisconnect(con);
    }

    public void stop() {
        started = false;
    }


}