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