r1107 - in xwiki/trunk/src/main/java/com/xpn/xwiki: . notify user/impl/xwiki

Ludovic Dubost ludovic at users.forge.objectweb.org
Mon Jul 31 17:30:24 CEST 2006


Author: ludovic
Date: 2006-07-31 17:30:24 +0200 (Mon, 31 Jul 2006)
New Revision: 1107

Modified:
   xwiki/trunk/src/main/java/com/xpn/xwiki/XWiki.java
   xwiki/trunk/src/main/java/com/xpn/xwiki/notify/XWikiNotificationManager.java
   xwiki/trunk/src/main/java/com/xpn/xwiki/user/impl/xwiki/XWikiGroupServiceImpl.java
Log:
Added synchronized blocks to remove contentions in the engine

Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/XWiki.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/XWiki.java	2006-07-31 09:52:41 UTC (rev 1106)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/XWiki.java	2006-07-31 15:30:24 UTC (rev 1107)
@@ -162,7 +162,7 @@
         return configPath;
     }
 
-    public synchronized static XWiki getMainXWiki(XWikiContext context) throws XWikiException {
+    public static XWiki getMainXWiki(XWikiContext context) throws XWikiException {
         String xwikicfg = null;
         String xwikiname = "xwiki";
         XWiki xwiki = null;
@@ -180,20 +180,22 @@
 
         try {
             xwikicfg = getConfigPath();
-            xwiki = (XWiki) econtext.getAttribute(xwikiname);
-            if (xwiki == null) {
-                InputStream xwikicfgis = null;
+            synchronized (XWiki.class) {
+                xwiki = (XWiki) econtext.getAttribute(xwikiname);
+                if (xwiki == null) {
+                    InputStream xwikicfgis = null;
 
-                // first try to load the file pointed by the given path
-                // if it does not exist, look for it relative to the classpath
-                File f = new File(xwikicfg);
-                if (f.exists()) {
-                    xwikicfgis = new FileInputStream(f);
-                } else {
-                    xwikicfgis = econtext.getResourceAsStream(xwikicfg);
+                    // first try to load the file pointed by the given path
+                    // if it does not exist, look for it relative to the classpath
+                    File f = new File(xwikicfg);
+                    if (f.exists()) {
+                        xwikicfgis = new FileInputStream(f);
+                    } else {
+                        xwikicfgis = econtext.getResourceAsStream(xwikicfg);
+                    }
+                    xwiki = new XWiki(xwikicfgis, context, context.getEngineContext());
+                    econtext.setAttribute(xwikiname, xwiki);
                 }
-                xwiki = new XWiki(xwikicfgis, context, context.getEngineContext());
-                econtext.setAttribute(xwikiname, xwiki);
             }
             context.setWiki(xwiki);
             xwiki.setDatabase(context.getDatabase());
@@ -264,7 +266,7 @@
         return virtualWikiMap;
     }
 
-    public synchronized static XWiki getXWiki(XWikiContext context) throws XWikiException {
+    public static XWiki getXWiki(XWikiContext context) throws XWikiException {
         XWiki xwiki = getMainXWiki(context);
 
         if (xwiki.isVirtual()) {
@@ -308,30 +310,32 @@
                 }
             }
 
-            // Check if this appname exists in the Database
-            String serverwikipage = getServerWikiPage(appname);
-            XWikiDocument doc = xwiki.getDocument(serverwikipage, context);
-            if (doc.isNew()) {
-                throw new XWikiException(XWikiException.MODULE_XWIKI,
-                        XWikiException.ERROR_XWIKI_DOES_NOT_EXIST,
-                        "The wiki " + appname + " does not exist");
-            }
+            synchronized (appname) {
+                // Check if this appname exists in the Database
+                String serverwikipage = getServerWikiPage(appname);
+                XWikiDocument doc = xwiki.getDocument(serverwikipage, context);
+                if (doc.isNew()) {
+                    throw new XWikiException(XWikiException.MODULE_XWIKI,
+                            XWikiException.ERROR_XWIKI_DOES_NOT_EXIST,
+                            "The wiki " + appname + " does not exist");
+                }
 
-            // Set the wiki owner
-            String wikiOwner = doc.getStringValue("XWiki.XWikiServerClass", "owner");
-            if (wikiOwner.indexOf(":") == -1)
-                wikiOwner = xwiki.getDatabase() + ":" + wikiOwner;
-            context.setWikiOwner(wikiOwner);
-            context.setWikiServer(doc);
-            context.setVirtual(true);
-            context.setDatabase(appname);
-            context.setOriginalDatabase(appname);
-            try {
-                // Let's make sure the virtaul wikis are upgraded to the latest database version
-                xwiki.updateDatabase(appname, false, context);
-            } catch (HibernateException e) {
-                // Just to report it
-                e.printStackTrace();
+                // Set the wiki owner
+                String wikiOwner = doc.getStringValue("XWiki.XWikiServerClass", "owner");
+                if (wikiOwner.indexOf(":") == -1)
+                    wikiOwner = xwiki.getDatabase() + ":" + wikiOwner;
+                context.setWikiOwner(wikiOwner);
+                context.setWikiServer(doc);
+                context.setVirtual(true);
+                context.setDatabase(appname);
+                context.setOriginalDatabase(appname);
+                try {
+                    // Let's make sure the virtaul wikis are upgraded to the latest database version
+                    xwiki.updateDatabase(appname, false, context);
+                } catch (HibernateException e) {
+                    // Just to report it
+                    e.printStackTrace();
+                }
             }
         }
         return xwiki;

Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/notify/XWikiNotificationManager.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/notify/XWikiNotificationManager.java	2006-07-31 09:52:41 UTC (rev 1106)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/notify/XWikiNotificationManager.java	2006-07-31 15:30:24 UTC (rev 1107)
@@ -37,33 +37,43 @@
     }
 
     public void addGeneralRule(XWikiNotificationRule rule) {
-        generalrules.add(rule);
+        synchronized (generalrules) {
+            generalrules.add(rule);
+        }
     }
 
     public void removeGeneralRule(XWikiNotificationRule rule) {
-        generalrules.remove(rule);
+        synchronized (generalrules) {
+            generalrules.remove(rule);
+        }
     }
 
     public void addNamedRule(String name, XWikiNotificationRule rule) {
-        Vector vnamedrules = (Vector) namedrules.get(name);
-        if (vnamedrules==null) {
-            vnamedrules = new Vector();
-            namedrules.put(name, vnamedrules);
+        synchronized (namedrules) {
+            Vector vnamedrules = (Vector) namedrules.get(name);
+            if (vnamedrules==null) {
+                vnamedrules = new Vector();
+                namedrules.put(name, vnamedrules);
+            }
+            vnamedrules.add(rule);
         }
-        vnamedrules.add(rule);
     }
 
     public void removeNamedRule(String name) {
-        Vector vnamedrules = (Vector) namedrules.get(name);
-        if (vnamedrules!=null) {
-            vnamedrules.remove(name);
-            if (vnamedrules.size()==0)
-                namedrules.remove(name);
+        synchronized (namedrules) {
+            Vector vnamedrules = (Vector) namedrules.get(name);
+            if (vnamedrules!=null) {
+                vnamedrules.remove(name);
+                if (vnamedrules.size()==0)
+                    namedrules.remove(name);
+            }
         }
     }
 
     public Vector getNamedRules(String name) {
-        return (Vector) namedrules.get(name);
+        synchronized (namedrules) {
+            return (Vector) namedrules.get(name);
+        }
     }
 
     public void verify(XWikiDocument newdoc, XWikiDocument olddoc, int event, XWikiContext context) {
@@ -71,34 +81,57 @@
         newdoc.notify(null, newdoc, olddoc, event, context);
 
         // Call rules explicitely for any actions of this document
+        Vector vnamedrules;
         String name = newdoc.getFullName();
-        Vector vnamedrules = getNamedRules(name);
+        synchronized (namedrules) {
+            vnamedrules = getNamedRules(name);
+            if (vnamedrules!=null)
+             vnamedrules = (Vector) vnamedrules.clone();
+        }
         if (vnamedrules!=null) {
             for (int i=0;i<vnamedrules.size();i++)
                ((XWikiNotificationRule)vnamedrules.get(i)).verify(newdoc, olddoc, context);
         }
 
         name = context.getDatabase() + ":" + newdoc.getFullName();
-        vnamedrules = getNamedRules(name);
+
+        synchronized (namedrules) {
+            vnamedrules = getNamedRules(name);
+            if (vnamedrules!=null)
+             vnamedrules = (Vector) vnamedrules.clone();
+        }
         if (vnamedrules!=null) {
             for (int i=0;i<vnamedrules.size();i++)
                ((XWikiNotificationRule)vnamedrules.get(i)).verify(newdoc, olddoc, context);
         }
 
-        for (int i=0;i<generalrules.size();i++)
-            ((XWikiNotificationRule)generalrules.get(i)).verify(newdoc, olddoc, context);
+        Vector grules;
+        synchronized (generalrules) {
+            grules = (Vector) generalrules.clone();
+        }
+        for (int i=0;i<grules.size();i++)
+            ((XWikiNotificationRule)grules.get(i)).verify(newdoc, olddoc, context);
     }
 
     public void verify(XWikiDocument doc, String action, XWikiContext context) {
         // Call rules explicitely for any actions of this document
+        Vector vnamedrules;
         String name = doc.getFullName();
-        Vector vnamedrules = getNamedRules(name);
+        synchronized (namedrules) {
+            vnamedrules = getNamedRules(name);
+            if (vnamedrules!=null)
+             vnamedrules = (Vector) vnamedrules.clone();
+        }
         if (vnamedrules!=null) {
             for (int i=0;i<vnamedrules.size();i++)
                ((XWikiNotificationRule)vnamedrules.get(i)).verify(doc, action, context);
         }
-        for (int i=0;i<generalrules.size();i++)
-            ((XWikiNotificationRule)generalrules.get(i)).verify(doc, action, context);
+        Vector grules;
+        synchronized (generalrules) {
+            grules = (Vector) generalrules.clone();
+        }
+        for (int i=0;i<grules.size();i++)
+            ((XWikiNotificationRule)grules.get(i)).verify(doc, action, context);
     }
 
 }

Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/user/impl/xwiki/XWikiGroupServiceImpl.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/user/impl/xwiki/XWikiGroupServiceImpl.java	2006-07-31 09:52:41 UTC (rev 1106)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/user/impl/xwiki/XWikiGroupServiceImpl.java	2006-07-31 15:30:24 UTC (rev 1107)
@@ -81,18 +81,21 @@
             String shortname = Util.getName(username);
             String veryshortname = shortname.substring(shortname.indexOf(".") + 1);
             String key = database + ":" + shortname;
-            if (groupCache==null)
-                initCache(context);
-            try {
-                list = (List) groupCache.getFromCache(key);
-            } catch (XWikiCacheNeedsRefreshException e) {
-                list = context.getWiki().getStore().searchDocumentsNames(", BaseObject as obj, StringProperty as prop "
-                        + "where obj.name=" + context.getWiki().getFullNameSQL() + " and obj.className='XWiki.XWikiGroups' "
-                        + "and obj.id = prop.id.id and prop.id.name='member' "
-                        + "and (prop.value='" + Utils.SQLFilter(username)
-                        + "' or prop.value='" + Utils.SQLFilter(shortname) + "' or prop.value='"
-                        + Utils.SQLFilter(veryshortname) + "')", context);
-                groupCache.putInCache(key, list);
+            synchronized (key) {
+                if (groupCache==null)
+                    initCache(context);
+                try {
+                    list = (List) groupCache.getFromCache(key);
+                } catch (XWikiCacheNeedsRefreshException e) {
+                    groupCache.cancelUpdate(key);
+                    list = context.getWiki().getStore().searchDocumentsNames(", BaseObject as obj, StringProperty as prop "
+                            + "where obj.name=" + context.getWiki().getFullNameSQL() + " and obj.className='XWiki.XWikiGroups' "
+                            + "and obj.id = prop.id.id and prop.id.name='member' "
+                            + "and (prop.value='" + Utils.SQLFilter(username)
+                            + "' or prop.value='" + Utils.SQLFilter(shortname) + "' or prop.value='"
+                            + Utils.SQLFilter(veryshortname) + "')", context);
+                    groupCache.putInCache(key, list);
+                }
             }
             return list;
         } finally {
@@ -109,12 +112,14 @@
         String key = database + ":" + shortname;
         if (groupCache==null)
             initCache(context);
-        try {
-            list = (List) groupCache.getFromCache(key);
-        } catch (XWikiCacheNeedsRefreshException e) {
-            list = new ArrayList();
-            groupCache.putInCache(key, list);
-            groupCache.cancelUpdate(key);
+        synchronized (key) {
+            try {
+                list = (List) groupCache.getFromCache(key);
+            } catch (XWikiCacheNeedsRefreshException e) {
+                groupCache.cancelUpdate(key);
+                list = new ArrayList();
+                groupCache.putInCache(key, list);
+            }
         }
         list.add(group);
     }





More information about the Xwiki-notifications mailing list