Author: bdonlan
Date: 2005-05-24 17:42:18 -0400 (Tue, 24 May 2005)
New Revision: 730

Added:
   trunk/clients/Javer2/server.conf
   trunk/clients/Javer2/src/org/haverdev/haver/server/EntityLoader.java
   trunk/clients/Javer2/src/org/haverdev/haver/server/Main.java
   trunk/clients/Javer2/src/org/haverdev/haver/server/Misc.java
   trunk/clients/Javer2/src/org/haverdev/haver/server/StatsBot.java
   
trunk/clients/Javer2/src/org/haverdev/haver/server/exceptions/BadNameException.java
Modified:
   trunk/clients/Javer2/nbproject/project.properties
   trunk/clients/Javer2/src/org/haverdev/haver/server/AcceptLoop.java
   trunk/clients/Javer2/src/org/haverdev/haver/server/UserConnection.java
Log:
Various fixes, plus log4j and beginnings of plugin framework

Modified: trunk/clients/Javer2/nbproject/project.properties
===================================================================
--- trunk/clients/Javer2/nbproject/project.properties   2005-05-24 08:43:02 UTC 
(rev 729)
+++ trunk/clients/Javer2/nbproject/project.properties   2005-05-24 21:42:18 UTC 
(rev 730)
@@ -16,7 +16,8 @@
 dist.jar=${dist.dir}/Javer2.jar
 dist.javadoc.dir=${dist.dir}/javadoc
 jar.compress=false
-javac.classpath=
+javac.classpath=\
+    ${file.reference.log4j.jar}
 # Space-separated list of extra javac options
 javac.compilerargs=
 javac.deprecation=false

Added: trunk/clients/Javer2/server.conf
===================================================================
--- trunk/clients/Javer2/server.conf    2005-05-24 08:43:02 UTC (rev 729)
+++ trunk/clients/Javer2/server.conf    2005-05-24 21:42:18 UTC (rev 730)
@@ -0,0 +1,12 @@
+#Tue May 24 16:20:29 EDT 2005
+haver.ListenPort=7070
+haver.ChatChannels=lobby,conspiracy,haver,creatures
+
+haver.Plugins=org.haverdev.haver.server.EntityLoader
+org.haverdev.haver.server.EntityLoader.entities=&stats
+&stats.class=org.haverdev.haver.server.StatsBot
+
+log4j.rootLogger=DEBUG, __A1
+log4j.appender.__A1=org.apache.log4j.ConsoleAppender
+log4j.appender.__A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.__A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

Modified: trunk/clients/Javer2/src/org/haverdev/haver/server/AcceptLoop.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/AcceptLoop.java  
2005-05-24 08:43:02 UTC (rev 729)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/AcceptLoop.java  
2005-05-24 21:42:18 UTC (rev 730)
@@ -8,6 +8,7 @@
 import java.io.*;
 import java.net.*;
 import java.util.*;
+import org.apache.log4j.Logger;
 
 /**
  *
@@ -16,23 +17,39 @@
 public class AcceptLoop extends Thread {
     
     ServerSocket socket;
+    int port;
     
     /** Creates a new instance of AcceptLoop */
     public AcceptLoop(int port) throws IOException {
-        socket = new ServerSocket(port);
-        setName("Listening socket on port " + port);
+        Logger.getLogger(getClass()).info("Listening on port " + port);
+        this.port = port;
+        try {
+            socket = new ServerSocket(port);
+            setName("Listening socket on port " + port);
+        } catch (IOException e) {
+            Logger.getLogger(getClass()).error(e);
+            throw e;
+        }
     }
     
     public void run() {
+        Logger.getLogger(getClass()).info("Accept loop starts");
         try {
             while (true) {
                 synchronized (socket) {
-                    if (socket.isClosed()) return;
+                    if (socket.isClosed()) {
+                        Logger.getLogger(getClass()).info("Accept loop for " + 
port + " stops");
+                        return;
+                    }
                 }
                 Socket s = socket.accept();
+                Logger.getLogger(getClass()).info(
+                        "Accepted connection from " + Misc.prettySocket(s)
+                        );
                 new UserConnection(s);
             }
         } catch (Throwable t) {
+            Logger.getLogger(getClass()).error(t);
             t.printStackTrace();
         }
     }

Added: trunk/clients/Javer2/src/org/haverdev/haver/server/EntityLoader.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/EntityLoader.java        
2005-05-24 08:43:02 UTC (rev 729)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/EntityLoader.java        
2005-05-24 21:42:18 UTC (rev 730)
@@ -0,0 +1,50 @@
+/*
+ * EntityLoader.java
+ *
+ * Created on May 24, 2005, 5:30 PM
+ */
+
+package org.haverdev.haver.server;
+import org.apache.log4j.Logger;
+import java.lang.reflect.*;
+
+/**
+ *
+ * @author bdonlan
+ */
+public final class EntityLoader {
+    
+    static final Logger log = 
Logger.getLogger("org.haverdev.haver.server.EntityLoader");
+    
+    /** Creates a new instance of EntityLoader */
+    private EntityLoader() {
+    }
+    
+    static final void initEntity(String name) throws Throwable {
+        String clas = System.getProperty(name + ".class");
+        
+        if (clas == null)
+            throw new IllegalArgumentException("Missing " + name + ".class 
property");
+        
+        ClassLoader loader = ClassLoader.getSystemClassLoader();
+        Class theClass = loader.loadClass(clas);
+        Class[] proto = {name.getClass()};
+        Object[] args = {name};
+        Constructor cons = theClass.getConstructor(proto);
+        Object ret = cons.newInstance(args);
+        Lobby.theLobby.register((Entity)ret);
+    }
+    
+    public static final void initPlugin() {
+        String[] entities = 
System.getProperty("org.haverdev.haver.server.EntityLoader.entities").split("[, 
]+");
+        for (int i = 0; i < entities.length; i++) {
+            log.info("Initializing entity " + entities[i] + "...");
+            try {
+                initEntity(entities[i]);
+            } catch (Throwable t) {
+                log.error("When initializing entity " + entities[i], t);
+            }
+        }
+    }
+    
+}


Property changes on: 
trunk/clients/Javer2/src/org/haverdev/haver/server/EntityLoader.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: trunk/clients/Javer2/src/org/haverdev/haver/server/Main.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/Main.java        
2005-05-24 08:43:02 UTC (rev 729)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/Main.java        
2005-05-24 21:42:18 UTC (rev 730)
@@ -0,0 +1,88 @@
+/*
+ * Main.java
+ *
+ * Created on May 24, 2005, 3:42 PM
+ */
+
+package org.haverdev.haver.server;
+import org.apache.log4j.*;
+import java.io.*;
+import java.util.*;
+import java.lang.reflect.*;
+
+/**
+ *
+ * @author bdonlan
+ */
+public final class Main {
+    
+    /** Main is never instantiated */
+    private Main() {
+    }
+    
+    public static final Properties buildDefaults() {
+        Properties defaults = new Properties(System.getProperties());
+        defaults.setProperty("haver.ListenPort", "7070");
+        defaults.setProperty("log4j.rootLogger", "DEBUG, __A1");
+        defaults.setProperty("log4j.appender.__A1", 
"org.apache.log4j.ConsoleAppender");
+        defaults.setProperty("log4j.appender.__A1.layout", 
"org.apache.log4j.PatternLayout");
+        defaults.setProperty(
+                "log4j.appender.__A1.layout.ConversionPattern",
+                "%d [%t] %-5p %c - %m%n");
+        return defaults;
+    }
+    
+    public static final void initPlugin(String what) throws Throwable {
+        ClassLoader loader = ClassLoader.getSystemClassLoader();
+        Class theClass = loader.loadClass(what);
+        Class[] nothing = {};
+        Object[] nothing_o = {};
+        Method m = theClass.getDeclaredMethod("initPlugin", nothing);
+        m.invoke(null, nothing_o);
+     }
+    
+    public static final void main(String[] args) throws Throwable {
+        Properties defaults = buildDefaults();
+        Properties props = new Properties(defaults);
+        if (args.length != 0) {
+            String file = args[0];
+            try {
+                InputStream configfile = new FileInputStream(file);
+                BufferedInputStream buf = new BufferedInputStream(configfile);
+                props.load(buf);
+            } catch (java.io.FileNotFoundException e) {
+                OutputStream configfile = new FileOutputStream(file);
+                defaults.store(configfile, null);
+                return;
+            }
+        }
+        
+        System.setProperties(props);
+        PropertyConfigurator.configure(props);
+        
+        String portStr = props.getProperty("haver.ListenPort", "7070");
+        int port = Integer.decode(portStr).intValue();
+        
+        String channelstr = props.getProperty("haver.ChatChannels", "");
+        String[] channels = channelstr.split("[, ]+");
+        
+        for (int i = 0; i < channels.length; i++)
+            Lobby.theLobby.register(new ChatChannel(channels[i]));
+        if (channels.length == 0)
+            Logger.getRootLogger().warn("No chat channels configured");
+        
+        String[] plugins = props.getProperty("haver.Plugins").split("[, ]+");
+        for (int i = 0; i < plugins.length; i++) {
+            try {
+                Logger.getRootLogger().info("Initializing plugin " + 
plugins[i]);
+                initPlugin(plugins[i]);
+            } catch (Throwable t) {
+                Logger.getRootLogger().error("While initializing plugin " + 
plugins[i], t);
+            }
+        }
+        
+        Logger.getRootLogger().warn("Haver server starts");        
+        new AcceptLoop(port).start();
+    }
+    
+}


Property changes on: 
trunk/clients/Javer2/src/org/haverdev/haver/server/Main.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: trunk/clients/Javer2/src/org/haverdev/haver/server/Misc.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/Misc.java        
2005-05-24 08:43:02 UTC (rev 729)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/Misc.java        
2005-05-24 21:42:18 UTC (rev 730)
@@ -0,0 +1,39 @@
+/*
+ * Misc.java
+ *
+ * Created on May 24, 2005, 4:01 PM
+ */
+
+package org.haverdev.haver.server;
+import java.io.*;
+import java.net.*;
+import java.util.regex.*;
+
+/**
+ *
+ * @author bdonlan
+ */
+public class Misc {
+    
+    public static final String version = "org.haverdev.haver.server/0.01";
+    public static final Pattern ident = Pattern.compile("[a-z][a-z0-9_.'@-]+", 
Pattern.CASE_INSENSITIVE);
+    
+    /** Static methods only */
+    private Misc() {
+    }
+    
+    public static String prettySocket(Socket s) {
+        return s.getInetAddress().toString() + ":" + s.getPort();
+    }
+    
+    public static boolean checkName(String name) {
+        Matcher m = ident.matcher(name);
+        if (!m.matches())
+            return false;
+        if (m.start() != 0)
+            return false;
+        if (m.end() != name.length())
+            return false;
+        return true;
+    }
+}


Property changes on: 
trunk/clients/Javer2/src/org/haverdev/haver/server/Misc.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: trunk/clients/Javer2/src/org/haverdev/haver/server/StatsBot.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/StatsBot.java    
2005-05-24 08:43:02 UTC (rev 729)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/StatsBot.java    
2005-05-24 21:42:18 UTC (rev 730)
@@ -0,0 +1,87 @@
+/*
+ * StatsBot.java
+ *
+ * Created on May 24, 2005, 4:37 PM
+ */
+
+package org.haverdev.haver.server;
+
+/**
+ *
+ * @author bdonlan
+ */
+public class StatsBot implements User {
+    String name;
+    
+    /** Creates a new instance of StatsBot */
+    public StatsBot(String name) {
+        this.name = name;
+    }
+    
+    static String[] formats = { " bytes", " Kbytes", " Mbytes", " Gbytes" };
+    
+    static String formatSize(long s) {
+        int idx = 0;
+        while (s > 2048 && idx < formats.length) {
+            idx++;
+            s /= 1024;
+        }
+        return "" + s + formats[idx];
+    }
+    
+    public void notifyPart(String channel, Entity what) {
+    }
+
+    public void notifyJoin(String channel, Entity what) {
+    }
+
+    public void sendPrivateMessage(String from, String[] args) {
+        User efrom = (User)Lobby.theLobby.lookup("user", from);
+        if (efrom == null)
+            return;
+        Runtime rt = Runtime.getRuntime();
+
+        String[] version = { "say", Misc.version };
+        
+        String jvm =
+                  System.getProperty("java.vm.vendor") + " "
+                + System.getProperty("java.vm.name") + " version "
+                + System.getProperty("java.vm.version");
+        
+        String[] jvm_a = { "say", "JVM: " + jvm };
+        String os =
+                  System.getProperty("os.name") + " "
+                + System.getProperty("os.version") + " on "
+                + System.getProperty("os.arch");
+        String[] osinfo = { "say", "Running on " + os };
+        String[] memstats = { "say",
+                "Memory free/max/total: "
+                + formatSize(rt.freeMemory())  + "/"
+                + formatSize(rt.maxMemory())   + "/"
+                + formatSize(rt.totalMemory()) + "/"
+        };
+        efrom.sendPrivateMessage(name, version);
+        efrom.sendPrivateMessage(name, jvm_a);
+        efrom.sendPrivateMessage(name, osinfo);
+        efrom.sendPrivateMessage(name, memstats);
+
+        
+    }
+
+    public void notifyPublicMessage(String channel, String from, String[] 
args) {
+    }
+
+    public void notifyQuit(String who, String type, String detail) {
+    }
+
+    public String getNamespace() {
+        return "user";
+    }
+
+    public String getName() {
+        return name;
+    }
+    
+    
+    
+}


Property changes on: 
trunk/clients/Javer2/src/org/haverdev/haver/server/StatsBot.java
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: trunk/clients/Javer2/src/org/haverdev/haver/server/UserConnection.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/UserConnection.java      
2005-05-24 08:43:02 UTC (rev 729)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/UserConnection.java      
2005-05-24 21:42:18 UTC (rev 730)
@@ -12,6 +12,7 @@
 import java.net.Socket;
 import java.lang.reflect.*;
 import org.haverdev.haver.server.exceptions.*;
+import org.apache.log4j.Logger;
 
 /**
  *
@@ -19,6 +20,8 @@
  */
 public class UserConnection {
     
+    Logger log = Logger.getLogger(getClass());
+    
     static Timer timer = new Timer(true);
     
     TimerTask pingTimer = null;
@@ -136,7 +139,7 @@
                 inputLoop();
             }
         });
-        readThread.setName("New incoming connection...");
+        readThread.setName(Misc.prettySocket(s));
         readThread.start();
         
         pingTimer = new TimerTask() {
@@ -157,7 +160,7 @@
         timer.schedule(pingTimer, 120 * 1000, 30 * 1000);
     }
     
-    public static final String[] greeting = {"HAVER", 
"org.haverdev.haver.server/0.1"};
+    public static final String[] greeting = {"HAVER", Misc.version};
     
     public void inputLoop() {
         try {
@@ -167,7 +170,7 @@
                     cutConnection("closed", null);
                     return;
                 }
-                System.err.println("C: " + line);
+                log.debug("C: " + line);
                 try {
                     processLine(line);
                 }
@@ -175,7 +178,7 @@
                     sendLine(e.clientReport());
                 }
                 catch (Throwable t) {
-                    t.printStackTrace();
+                    log.warn(t);
                 }
             }
         } catch (IOException e) {
@@ -208,14 +211,14 @@
     }
     
     protected synchronized void ioExcept(IOException e) {
-        e.printStackTrace();
+        log.warn(e);
         cutConnection("error", e.getMessage());
     }
     
     public synchronized void sendLine(String[] args) {
         if (writer == null) return;
         String line = encodeLine(args);
-        System.err.print("S: " + line);
+        log.debug("S: " + line);
         writer.print(line);
         writer.flush();
     }
@@ -353,7 +356,7 @@
                     pe.setCmd(cmd[0]);
                     throw pe;
                 }
-                e.getTargetException().printStackTrace();
+                log.warn(e.getTargetException());
                 throw new InternalCommandException(cmd[0], e);
             } catch (Throwable t) {
                 throw new InternalCommandException(cmd[0], t);
@@ -363,7 +366,7 @@
     
     public class InitContext extends UserCommandReflect {
         public void handle_HAVER(String[] args) {
-            System.err.println("Greeting from client: " + args[1]);
+            log.info("Client identifies itself as " + args[1]);
             sendLine(greeting);
             context = new LoginContext();
         }
@@ -381,12 +384,14 @@
         public void handle_IDENT(String[] args) throws PropagatedException {
             if (Lobby.theLobby.contains("user", args[1]))
                 throw new UserAlreadyExists(args[1]);
-            System.err.println("Hello, " + args[1] + ", nice to meet you.");
+            if (!Misc.checkName(args[1]))
+                throw new BadNameException(args[1]);
+            log.info("User logged in: " + args[1]);
             String[] msg = {"HELLO", args[1]};
             sendLine(msg);
             e = new UserEntity(args[1]);
             context = new NormalContext();
-            readThread.setName("Reader thread for user '" + args[1] + "'");
+            readThread.setName("User " + args[1]);
         }
     }
     

Added: 
trunk/clients/Javer2/src/org/haverdev/haver/server/exceptions/BadNameException.java
===================================================================
--- 
trunk/clients/Javer2/src/org/haverdev/haver/server/exceptions/BadNameException.java
 2005-05-24 08:43:02 UTC (rev 729)
+++ 
trunk/clients/Javer2/src/org/haverdev/haver/server/exceptions/BadNameException.java
 2005-05-24 21:42:18 UTC (rev 730)
@@ -0,0 +1,20 @@
+/*
+ * BadNameException.java
+ *
+ * Created on May 24, 2005, 4:35 PM
+ */
+
+package org.haverdev.haver.server.exceptions;
+
+/**
+ *
+ * @author bdonlan
+ */
+public class BadNameException extends SimplePropagatedException {
+    
+    /** Creates a new instance of BadNameException */
+    public BadNameException(String name) {
+        super("syntax.name", name);
+    }
+    
+}


Property changes on: 
trunk/clients/Javer2/src/org/haverdev/haver/server/exceptions/BadNameException.java
___________________________________________________________________
Name: svn:eol-style
   + native


Reply via email to