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