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);
+        }        
+        
     }
 }


Reply via email to