Author: bdonlan
Date: 2005-05-26 20:29:56 -0400 (Thu, 26 May 2005)
New Revision: 736

Modified:
   trunk/clients/Javer2/server.conf
   trunk/clients/Javer2/src/org/haverdev/haver/server/FileUserStore.java
   trunk/clients/Javer2/src/org/haverdev/haver/server/PersistantLobby.java
Log:
* FileUserStore uses atomic renames
* Disable persistantlobby in the default config; it's rather broken as-is.


Modified: trunk/clients/Javer2/server.conf
===================================================================
--- trunk/clients/Javer2/server.conf    2005-05-27 00:03:06 UTC (rev 735)
+++ trunk/clients/Javer2/server.conf    2005-05-27 00:29:56 UTC (rev 736)
@@ -23,11 +23,12 @@
 org.haverdev.haver.server.FileUserStore.path=store
 
 # The lobby implementation.
-# haver.Lobby=org.haverdev.haver.server.DefaultLobby
-haver.Lobby=org.haverdev.haver.server.PersistantLobby
-org.haverdev.haver.server.PersistantLobby.storePath=serverdata.xml.gz
-org.haverdev.haver.server.PersistantLobby.commitInterval=120
+haver.Lobby=org.haverdev.haver.server.DefaultLobby
 
+#haver.Lobby=org.haverdev.haver.server.PersistantLobby
+#org.haverdev.haver.server.PersistantLobby.storePath=serverdata.xml.gz
+#org.haverdev.haver.server.PersistantLobby.commitInterval=120
+
 # State configurations. You can list more than one command handler here and
 # they will be tried in listed order
 haver.state.init=init

Modified: trunk/clients/Javer2/src/org/haverdev/haver/server/FileUserStore.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/FileUserStore.java       
2005-05-27 00:03:06 UTC (rev 735)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/FileUserStore.java       
2005-05-27 00:29:56 UTC (rev 736)
@@ -32,20 +32,20 @@
     }
 
     public synchronized UserEntity getUser(String name) {
-        SoftReference ref = (SoftReference) cache.get(name);
+        SoftReference ref = (SoftReference) cache.get(name.toLowerCase());
         UserEntity user = null;
         if (ref != null)
             user = (UserEntity)ref.get();
         
         if (user == null) {
             try {
-                user = loadUser(name);
+                user = loadUser(name.toLowerCase());
             }
             catch (FileNotFoundException e) {}
             catch (Throwable t) {
                 log.error("While loading user " + name, t);
             }
-            cache.put(name, new SoftReference(user));
+            cache.put(name.toLowerCase(), new SoftReference(user));
         }
         
         if (user == null)
@@ -65,29 +65,33 @@
     synchronized void commitUser(UserEntity who) throws IOException {
         if (busy) return;
         
+        String name = who.getName().toLowerCase();
+        
         if (!who.isPersistant()) {
             if (cache.containsKey(who.getName())) {
-                new File(path + who.getName()).delete();
-                cache.remove(who.getName());
+                new File(path + name).delete();
+                cache.remove(name);
                 return;
             }
         }
         
-        if (!cache.containsKey(who.getName()))
-            cache.put(who.getName(), new SoftReference(who));
-        
-        XMLEncoder e = new XMLEncoder
-                (new BufferedOutputStream
-                (new FileOutputStream
-                (path + who.getName()
-                )));
+        if (!cache.containsKey(name))
+            cache.put(name, new SoftReference(who));
         try {
             busy = true;
+            try { new File(path + "_" + name).delete(); } catch (Throwable t) 
{}
+            XMLEncoder e = new XMLEncoder
+                    (new BufferedOutputStream
+                    (new FileOutputStream
+                    (path + "_" + name
+                    )));
             e.writeObject(who);
+            e.close();
+            new File(path + "_" + name).renameTo(new File(path + name));
         } finally {
+            try { new File(path + "_" + name).delete(); } catch (Throwable t) 
{}
             busy = false;
         }
-        e.close();
     }
     
     synchronized UserEntity loadUser(String who) throws IOException {
@@ -103,6 +107,8 @@
         } finally {
             busy = false;
         }
+        if (!u.getName().toLowerCase().equals(who))
+            throw new IllegalStateException("name mismatch in stored data for 
" + who + " vs " + u.getName());
         return u;
     }
     

Modified: 
trunk/clients/Javer2/src/org/haverdev/haver/server/PersistantLobby.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/PersistantLobby.java     
2005-05-27 00:03:06 UTC (rev 735)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/PersistantLobby.java     
2005-05-27 00:29:56 UTC (rev 736)
@@ -12,6 +12,8 @@
 
 import org.apache.log4j.*;
 
+// XXX: this is something of a hack. Don't use it for now.
+
 /**
  *
  * @author bdonlan
@@ -87,7 +89,7 @@
         logger.debug("Committing...");
         Entity[] everything = getContents();
         for (int i = 0; i < everything.length; i++)
-            if (everything[i].isPersistant())
+            if (everything[i].isPersistant() && 
!everything[i].getNamespace().equals("user"))
                 e.writeObject(everything[i]);
         e.close();
     }


Reply via email to