Author: bdonlan
Date: 2005-05-23 19:45:35 -0400 (Mon, 23 May 2005)
New Revision: 717
Added:
trunk/clients/Javer2/src/org/haverdev/haver/server/AlreadyThereJoin.java
trunk/clients/Javer2/src/org/haverdev/haver/server/ChannelBase.java
trunk/clients/Javer2/src/org/haverdev/haver/server/InternalCommandException.java
trunk/clients/Javer2/src/org/haverdev/haver/server/NotPresentPart.java
trunk/clients/Javer2/src/org/haverdev/haver/server/PropagatedException.java
trunk/clients/Javer2/src/org/haverdev/haver/server/SimplePropagatedException.java
trunk/clients/Javer2/src/org/haverdev/haver/server/UnknownClientCommandException.java
trunk/clients/Javer2/src/org/haverdev/haver/server/UserAlreadyExists.java
Modified:
trunk/clients/Javer2/src/org/haverdev/haver/server/Channel.java
trunk/clients/Javer2/src/org/haverdev/haver/server/Lobby.java
trunk/clients/Javer2/src/org/haverdev/haver/server/UserConnection.java
Log:
Various refactoring
Added: trunk/clients/Javer2/src/org/haverdev/haver/server/AlreadyThereJoin.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/AlreadyThereJoin.java
2005-05-23 23:14:31 UTC (rev 716)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/AlreadyThereJoin.java
2005-05-23 23:45:35 UTC (rev 717)
@@ -0,0 +1,7 @@
+package org.haverdev.haver.server;
+
+public final class AlreadyThereJoin extends SimplePropagatedException {
+ public AlreadyThereJoin(String name) {
+ super("JOIN", "join.already", name);
+ }
+}
\ No newline at end of file
Property changes on:
trunk/clients/Javer2/src/org/haverdev/haver/server/AlreadyThereJoin.java
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: trunk/clients/Javer2/src/org/haverdev/haver/server/Channel.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/Channel.java
2005-05-23 23:14:31 UTC (rev 716)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/Channel.java
2005-05-23 23:45:35 UTC (rev 717)
@@ -14,6 +14,14 @@
public boolean contains(String namespace, String name);
public boolean contains(Entity what);
+ public void register(Entity e);
+ public void unregister(Entity e);
+
public Entity[] getContents();
public String[] getNames(String namespace);
+
+ public java.util.Set quitListeners();
+ public void distributePublicMessage(Entity from, String[] args);
+ public void distributeJoin(Entity who);
+ public void distributePart(Entity who);
}
Added: trunk/clients/Javer2/src/org/haverdev/haver/server/ChannelBase.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/ChannelBase.java
2005-05-23 23:14:31 UTC (rev 716)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/ChannelBase.java
2005-05-23 23:45:35 UTC (rev 717)
@@ -0,0 +1,86 @@
+/*
+ * Lobby.java
+ *
+ * Created on May 23, 2005, 6:34 PM
+ */
+
+package org.haverdev.haver.server;
+import java.util.*;
+
+/**
+ *
+ * @author bdonlan
+ */
+public abstract class ChannelBase implements Channel {
+
+ HashSet everything = new HashSet();
+ HashMap namespaces = new HashMap();
+
+ public static final String[] emptyArray = {};
+
+ public synchronized String[] getNames(String namespace) {
+ HashMap subset = (HashMap)namespaces.get(namespace.toLowerCase());
+ if (subset == null)
+ return emptyArray;
+ Object[] objs = subset.keySet().toArray();
+ String[] strs = new String[objs.length];
+ for (int i = 0; i < objs.length; i++)
+ strs[i] = (String)objs[i];
+ return strs;
+ }
+
+ public synchronized boolean contains(Entity what) {
+ return everything.contains(what);
+ }
+
+ public String getNamespace() {
+ return "channel";
+ }
+
+ public synchronized Entity[] getContents() {
+ Object[] objs = everything.toArray();
+ Entity[] ents = new Entity[objs.length];
+ for (int i = 0; i < objs.length; i++)
+ ents[i] = (Entity)objs[i];
+ return ents;
+ }
+
+ public synchronized boolean contains(String namespace, String name) {
+ HashMap subset = (HashMap)namespaces.get(namespace.toLowerCase());
+ if (subset == null)
+ return false;
+ return subset.containsKey(name.toLowerCase());
+ }
+
+ public synchronized Entity lookup(String namespace, String name) {
+ HashMap subset = (HashMap)namespaces.get(namespace.toLowerCase());
+ if (subset == null)
+ return null;
+ return (Entity)subset.get(name.toLowerCase());
+ }
+
+ public synchronized void register(Entity e) {
+ String namespace = e.getNamespace().toLowerCase();
+ String name = e.getName().toLowerCase().intern();
+ if (contains(e))
+ return;
+ HashMap subset = (HashMap)namespaces.get(namespace);
+ if (subset == null) {
+ subset = new HashMap();
+ namespaces.put(namespace.intern(), subset);
+ }
+ subset.put(name, e);
+ everything.add(e);
+ }
+
+ public synchronized void unregister(Entity e) {
+ String namespace = e.getNamespace().toLowerCase();
+ String name = e.getName().toLowerCase();
+ if (!contains(e)) return;
+ HashMap subset = (HashMap)namespaces.get(namespace);
+ subset.remove(name);
+ everything.remove(e);
+ }
+
+
+}
Property changes on:
trunk/clients/Javer2/src/org/haverdev/haver/server/ChannelBase.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added:
trunk/clients/Javer2/src/org/haverdev/haver/server/InternalCommandException.java
===================================================================
---
trunk/clients/Javer2/src/org/haverdev/haver/server/InternalCommandException.java
2005-05-23 23:14:31 UTC (rev 716)
+++
trunk/clients/Javer2/src/org/haverdev/haver/server/InternalCommandException.java
2005-05-23 23:45:35 UTC (rev 717)
@@ -0,0 +1,20 @@
+package org.haverdev.haver.server;
+
+public final class InternalCommandException extends PropagatedException {
+ String cmd, reason;
+ public InternalCommandException(String cmd, String reason) {
+ super("Command " + cmd + " failed: " + reason);
+ this.cmd = cmd;
+ this.reason = reason;
+ }
+
+ public InternalCommandException(String cmd, Throwable t) {
+ this(cmd, t.getMessage());
+ initCause(t);
+ }
+
+ public String[] clientReport() {
+ String[] fail = {"FAIL", cmd, "internal.error", "Internal exception: "
+ reason};
+ return fail;
+ }
+}
Property changes on:
trunk/clients/Javer2/src/org/haverdev/haver/server/InternalCommandException.java
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: trunk/clients/Javer2/src/org/haverdev/haver/server/Lobby.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/Lobby.java
2005-05-23 23:14:31 UTC (rev 716)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/Lobby.java
2005-05-23 23:45:35 UTC (rev 717)
@@ -1,7 +1,7 @@
/*
* Lobby.java
*
- * Created on May 23, 2005, 6:34 PM
+ * Created on May 23, 2005, 7:41 PM
*/
package org.haverdev.haver.server;
@@ -11,86 +11,30 @@
*
* @author bdonlan
*/
-public final class Lobby implements Channel {
-
+public final class Lobby extends ChannelBase {
public static final Lobby theLobby = new Lobby();
- HashSet everything = new HashSet();
- HashMap namespaces = new HashMap();
-
/** There can be only one */
private Lobby() {
register(this);
}
-
- public static final String[] emptyArray = {};
- public synchronized String[] getNames(String namespace) {
- HashMap subset = (HashMap)namespaces.get(namespace.toLowerCase());
- if (subset == null)
- return emptyArray;
- Object[] objs = subset.keySet().toArray();
- String[] strs = new String[objs.length];
- for (int i = 0; i < objs.length; i++)
- strs[i] = (String)objs[i];
- return strs;
+ public void distributePart(Entity who) {
}
- public synchronized boolean contains(Entity what) {
- return everything.contains(what);
+ public void distributeJoin(Entity who) {
}
- public String getNamespace() {
- return "channel";
+ public void distributePublicMessage(Entity from, String[] args) {
+ throw new UnsupportedOperationException("&lobby does not support
messaging.");
}
+ public Set quitListeners() {
+ return new HashSet();
+ }
+
public String getName() {
return "&lobby";
}
-
- public synchronized Entity[] getContents() {
- Object[] objs = everything.toArray();
- Entity[] ents = new Entity[objs.length];
- for (int i = 0; i < objs.length; i++)
- ents[i] = (Entity)objs[i];
- return ents;
- }
-
- public synchronized boolean contains(String namespace, String name) {
- HashMap subset = (HashMap)namespaces.get(namespace.toLowerCase());
- if (subset == null)
- return false;
- return subset.containsKey(name.toLowerCase());
- }
-
- public synchronized Entity lookup(String namespace, String name) {
- HashMap subset = (HashMap)namespaces.get(namespace.toLowerCase());
- if (subset == null)
- return null;
- return (Entity)subset.get(name.toLowerCase());
- }
- public synchronized void register(Entity e) {
- String namespace = e.getNamespace().toLowerCase();
- String name = e.getName().toLowerCase().intern();
- if (contains(e))
- return;
- HashMap subset = (HashMap)namespaces.get(namespace);
- if (subset == null) {
- subset = new HashMap();
- namespaces.put(namespace.intern(), subset);
- }
- subset.put(name, e);
- everything.add(e);
- }
-
- public synchronized void unregister(Entity e) {
- String namespace = e.getNamespace().toLowerCase();
- String name = e.getName().toLowerCase();
- if (!contains(e)) return;
- HashMap subset = (HashMap)namespaces.get(namespace);
- subset.remove(name);
- everything.remove(e);
- }
-
}
Added: trunk/clients/Javer2/src/org/haverdev/haver/server/NotPresentPart.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/NotPresentPart.java
2005-05-23 23:14:31 UTC (rev 716)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/NotPresentPart.java
2005-05-23 23:45:35 UTC (rev 717)
@@ -0,0 +1,7 @@
+package org.haverdev.haver.server;
+
+public final class NotPresentPart extends SimplePropagatedException {
+ public NotPresentPart(String name) {
+ super("PART", "part.notthere", name);
+ }
+}
Property changes on:
trunk/clients/Javer2/src/org/haverdev/haver/server/NotPresentPart.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added:
trunk/clients/Javer2/src/org/haverdev/haver/server/PropagatedException.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/PropagatedException.java
2005-05-23 23:14:31 UTC (rev 716)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/PropagatedException.java
2005-05-23 23:45:35 UTC (rev 717)
@@ -0,0 +1,8 @@
+package org.haverdev.haver.server;
+
+public abstract class PropagatedException extends Exception {
+ public abstract String[] clientReport();
+ public PropagatedException(String reason) {
+ super(reason);
+ }
+}
Property changes on:
trunk/clients/Javer2/src/org/haverdev/haver/server/PropagatedException.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added:
trunk/clients/Javer2/src/org/haverdev/haver/server/SimplePropagatedException.java
===================================================================
---
trunk/clients/Javer2/src/org/haverdev/haver/server/SimplePropagatedException.java
2005-05-23 23:14:31 UTC (rev 716)
+++
trunk/clients/Javer2/src/org/haverdev/haver/server/SimplePropagatedException.java
2005-05-23 23:45:35 UTC (rev 717)
@@ -0,0 +1,15 @@
+package org.haverdev.haver.server;
+
+public class SimplePropagatedException extends PropagatedException {
+ String cmd, code;
+ public SimplePropagatedException(String cmd, String code, String detail) {
+ super(detail);
+ this.cmd = cmd;
+ this.code = code;
+ }
+
+ public String[] clientReport() {
+ String[] fail = { "FAIL", cmd, code, this.getMessage() };
+ return fail;
+ }
+}
Property changes on:
trunk/clients/Javer2/src/org/haverdev/haver/server/SimplePropagatedException.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added:
trunk/clients/Javer2/src/org/haverdev/haver/server/UnknownClientCommandException.java
===================================================================
---
trunk/clients/Javer2/src/org/haverdev/haver/server/UnknownClientCommandException.java
2005-05-23 23:14:31 UTC (rev 716)
+++
trunk/clients/Javer2/src/org/haverdev/haver/server/UnknownClientCommandException.java
2005-05-23 23:45:35 UTC (rev 717)
@@ -0,0 +1,14 @@
+package org.haverdev.haver.server;
+
+public final class UnknownClientCommandException extends PropagatedException {
+ String cmd;
+ public UnknownClientCommandException(String[] cmd) {
+ super("Unknown command " + cmd[0]);
+ this.cmd = cmd[0];
+ }
+
+ public String[] clientReport() {
+ String[] fail = {"FAIL", cmd, "unknown.cmd"};
+ return fail;
+ }
+}
Property changes on:
trunk/clients/Javer2/src/org/haverdev/haver/server/UnknownClientCommandException.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: trunk/clients/Javer2/src/org/haverdev/haver/server/UserAlreadyExists.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/UserAlreadyExists.java
2005-05-23 23:14:31 UTC (rev 716)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/UserAlreadyExists.java
2005-05-23 23:45:35 UTC (rev 717)
@@ -0,0 +1,7 @@
+package org.haverdev.haver.server;
+
+public final class UserAlreadyExists extends SimplePropagatedException {
+ public UserAlreadyExists(String name) {
+ super("IDENT", "exists.user", name);
+ }
+}
Property changes on:
trunk/clients/Javer2/src/org/haverdev/haver/server/UserAlreadyExists.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-23 23:14:31 UTC (rev 716)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/UserConnection.java
2005-05-23 23:45:35 UTC (rev 717)
@@ -5,6 +5,7 @@
*/
package org.haverdev.haver.server;
+
import org.haverdev.haver.NonblockingOutputStream;
import java.io.*;
import java.util.*;
@@ -143,7 +144,7 @@
processLine(line);
}
catch (PropagatedException e) {
- e.clientReport();
+ sendLine(e.clientReport());
}
catch (Throwable t) {
t.printStackTrace();
@@ -160,7 +161,7 @@
try { sock.close(); } catch (Throwable t) { }
writer = null;
if (this.e != null)
- Lobby.theLobby.unregister(this.e);
+ this.e.kill();
}
public synchronized void sendLine(String[] args) {
@@ -178,9 +179,11 @@
class UserEntity implements User {
String name;
+ HashSet channels = new HashSet();
UserEntity(String name) {
this.name = name.intern();
+ join(Lobby.theLobby);
}
public void notifyPart(String channel, Entity what) {
@@ -236,67 +239,33 @@
public int hashCode() {
return name.hashCode() ^ "user".hashCode();
}
- }
-
- public abstract class PropagatedException extends Exception {
- public abstract void clientReport();
- public PropagatedException(String reason) {
- super(reason);
- }
- }
-
- public final class UnknownClientCommandException extends
PropagatedException {
- String cmd;
- public UnknownClientCommandException(String[] cmd) {
- super("Unknown command " + cmd[0]);
- this.cmd = cmd[0];
- }
- public void clientReport() {
- String[] fail = {"FAIL", cmd, "unknown.cmd"};
- sendLine(fail);
+ public void kill() {
+ Iterator i = channels.iterator();
+ // XXX
+ while (i.hasNext()) {
+ Channel c = (Channel)i.next();
+ c.unregister(this);
+ }
}
- }
-
- public final class InternalCommandException extends PropagatedException {
- String cmd, reason;
- public InternalCommandException(String cmd, String reason) {
- super("Command " + cmd + " failed: " + reason);
- this.cmd = cmd;
- this.reason = reason;
- }
- public InternalCommandException(String cmd, Throwable t) {
- this(cmd, t.getMessage());
- initCause(t);
+ public synchronized void join(Channel channel) {
+ if (channels.contains(channel)) return;
+ channel.register(this);
+ channel.distributeJoin(this);
+ channels.add(channel);
}
- public void clientReport() {
- String[] fail = {"FAIL", cmd, "internal.error", "Internal
exception: " + reason};
- sendLine(fail);
+ public synchronized void part(Channel channel) {
+ if (!channels.contains(channel)) return;
+ channel.unregister(this);
+ channel.distributePart(this);
+ channels.remove(channel);
}
}
- public class SimplePropagatedException extends PropagatedException {
- String cmd, code;
- public SimplePropagatedException(String cmd, String code, String
detail) {
- super(detail);
- this.cmd = cmd;
- this.code = code;
- }
-
- public void clientReport() {
- String[] fail = { "FAIL", cmd, code, this.getMessage() };
- sendLine(fail);
- }
- }
+
- public final class UserAlreadyExists extends SimplePropagatedException {
- public UserAlreadyExists(String name) {
- super("IDENT", "exists.user", name);
- }
- }
-
public interface UserCommandContext {
public void processCommand(String[] cmd) throws PropagatedException;
}
@@ -351,7 +320,6 @@
String[] msg = {"HELLO", args[1]};
sendLine(msg);
e = new UserEntity(args[1]);
- Lobby.theLobby.register(e);
context = new NormalContext();
}
}
@@ -379,5 +347,24 @@
System.arraycopy(members, 0, response, 3, members.length);
sendLine(response);
}
+
+ public void handle_JOIN(String[] args) throws PropagatedException {
+ String channel = args[1];
+ Channel chan_e = (Channel)Lobby.theLobby.lookup("channel",
channel);
+ // Special case!
+ if (chan_e == Lobby.theLobby)
+ throw new SimplePropagatedException("JOIN", "forbidden",
channel);
+ e.join(chan_e);
+ }
+
+ public void handle_PART(String[] args) throws PropagatedException {
+ String channel = args[1];
+ Channel chan_e = (Channel)Lobby.theLobby.lookup("channel",
channel);
+ // Special case!
+ if (chan_e == Lobby.theLobby)
+ throw new SimplePropagatedException("PART", "forbidden",
channel);
+ e.part(chan_e);
+ }
+
}
}