Hi Anca,
Be very very careful with ThreadLocal. It's very easy to make mistakes
and cause memory leaks. Actually I think you may have introduced one
already ;) (please do some web research on ThreadLocal you'll see it
has some caveats and they must absolutely be freed when the thread
exits).
I believe this needs to be discussed more to ensure it's the right way
and doesn't cause pbs.
Also we already have an ExecutionContext so I'm not sure why we need
this.
Can you please explain?
Thanks
-Vincent
On Oct 1, 2009, at 10:13 AM, lucaa (SVN) wrote:
Author: lucaa
Date: 2009-10-01 10:13:20 +0200 (Thu, 01 Oct 2009)
New Revision: 24158
Modified:
platform/web/trunk/gwt/src/main/java/com/xpn/xwiki/gwt/api/server/
XWikiServiceImpl.java
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/
server/DefaultWysiwygService.java
Log:
XWIKI-4411: XWikiServiceImpl's xwiki context is not handled threadsafe
* handled the prepared context in a ThreadLocal member.
Modified: platform/web/trunk/gwt/src/main/java/com/xpn/xwiki/gwt/api/
server/XWikiServiceImpl.java
===================================================================
--- platform/web/trunk/gwt/src/main/java/com/xpn/xwiki/gwt/api/
server/XWikiServiceImpl.java 2009-09-30 21:49:09 UTC (rev 24157)
+++ platform/web/trunk/gwt/src/main/java/com/xpn/xwiki/gwt/api/
server/XWikiServiceImpl.java 2009-10-01 08:13:20 UTC (rev 24158)
@@ -66,7 +66,7 @@
{
private static final Log LOG = LogFactory.getLog(XWiki.class);
- private XWikiContext context;
+ private ThreadLocal<XWikiContext> context;
/**
* We override the default processCall method in order to
provide XWiki initialization before
@@ -131,7 +131,7 @@
}
context.put("ajax", new Boolean(true));
- this.context = context;
+ this.context.set(context);
}
private void initializeContainerComponent(XWikiContext context)
@@ -168,7 +168,7 @@
protected XWikiContext getXWikiContext()
{
- return this.context;
+ return this.context.get();
}
protected XWikiGWTException getXWikiGWTException(Exception e) {
Modified: platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/
wysiwyg/server/DefaultWysiwygService.java
===================================================================
--- platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/
server/DefaultWysiwygService.java 2009-09-30 21:49:09 UTC (rev 24157)
+++ platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/
server/DefaultWysiwygService.java 2009-10-01 08:13:20 UTC (rev 24158)
@@ -302,14 +302,8 @@
getXWikiContext().setDatabase(wikiName);
}
spaceNamesList =
getXWikiContext().getWiki().getSpaces(getXWikiContext());
- // get the blacklisted spaces from the session as
they've been set in xwikivars.vm, when the page edited
- // with this wysiwyg was loaded
- // TODO: remove this when the public API will exclude
them by default, or they'll be set in the config
- List<String> blacklistedSpaces =
- (ArrayList<String>)
getThreadLocalRequest
().getSession().getAttribute("blacklistedSpaces");
- if (blacklistedSpaces != null &&
blacklistedSpaces.size() > 0) {
- spaceNamesList.removeAll(blacklistedSpaces);
- }
+ // remove the blacklisted spaces from the all spaces list
+ spaceNamesList.removeAll(getBlackListedSpaces());
Collections.sort(spaceNamesList);
} catch (XWikiException e) {
e.printStackTrace();
@@ -322,6 +316,26 @@
}
/**
+ * Helper function to retrieve the blacklisted spaces in this
session, as they've been set in xwikivars.vm, when the
+ * page edited with this wysiwyg was loaded. <br />
+ * TODO: remove this when the public API will exclude them by
default, or they'll be set in the config.
+ *
+ * @return the list of blacklisted spaces from the session
+ */
+ @SuppressWarnings("unchecked")
+ private List<String> getBlackListedSpaces()
+ {
+ // get the blacklisted spaces from the session
+ List<String> blacklistedSpaces =
+ (ArrayList<String>)
getThreadLocalRequest
().getSession().getAttribute("blacklistedSpaces");
+ // always return a list, even if blacklisted spaces
variable wasn't set
+ if (blacklistedSpaces == null) {
+ blacklistedSpaces = new ArrayList<String>();
+ }
+ return blacklistedSpaces;
+ }
+
+ /**
* {@inheritDoc}
*
* @see WysiwygService#getPageNames(String, String)
@@ -379,12 +393,31 @@
throws XWikiGWTException
{
try {
+ String quote = "'";
+ String doubleQuote = "''";
// FIXME: this fullname comparison with the keyword does
not contain the wiki name
- String escapedKeyword = keyword.replaceAll("'",
"''").toLowerCase();
+ String escapedKeyword = keyword.replaceAll(quote,
doubleQuote).toLowerCase();
+ // add condition for the doc to not be in the list of
blacklisted spaces.
+ // TODO: might be a pb with scalability of this
+ String noBlacklistedSpaces = "";
+ List<String> blackListedSpaces = getBlackListedSpaces();
+ if (!blackListedSpaces.isEmpty()) {
+ StringBuffer spacesList = new StringBuffer();
+ for (String bSpace : blackListedSpaces) {
+ if (spacesList.length() > 0) {
+ spacesList.append(", ");
+ }
+ spacesList.append(quote);
+ spacesList.append(bSpace.replaceAll(quote,
doubleQuote));
+ spacesList.append(quote);
+ }
+ noBlacklistedSpaces = "doc.web not in (" +
spacesList.toString() + ")";
+ }
List<XWikiDocument> docs =
getXWikiContext().getWiki().search(
- "select distinct doc from XWikiDocument as doc
where lower(doc.title) like '%" + escapedKeyword
- + "%' or lower(doc.fullName) like '%" +
escapedKeyword + "%'", count, start, getXWikiContext());
+ "select distinct doc from XWikiDocument as doc
where " + noBlacklistedSpaces
+ + " and (lower(doc.title) like '%" +
escapedKeyword + "%' or lower(doc.fullName) like '%"
+ + escapedKeyword + "%')", count, start,
getXWikiContext());
return prepareDocumentResultsList(docs);
} catch (XWikiException e) {
throw getXWikiGWTException(e);
@@ -406,7 +439,7 @@
for (XWikiDocument doc : docs) {
com.xpn.xwiki.gwt.api.client.Document xwikiDoc = new
com.xpn.xwiki.gwt.api.client.Document();
xwikiDoc.setFullName(doc.getFullName());
-
xwikiDoc.setTitle(doc.getDisplayTitle(getXWikiContext()));
+
xwikiDoc.setTitle(doc.getRenderedTitle(Syntax.XHTML_1_0,
getXWikiContext()));
// FIXME: shouldn't use upload URL here, but since we
don't want to add a new field...
xwikiDoc.setUploadURL(doc.getURL(VIEW_ACTION,
getXWikiContext()));
results.add(xwikiDoc);
_______________________________________________
notifications mailing list
notifications(a)xwiki.org
http://lists.xwiki.org/mailman/listinfo/notifications