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
_______________________________________________
devs mailing list
devs(a)xwiki.org