Author: vmassol
Date: 2007-11-24 11:55:02 +0100 (Sat, 24 Nov 2007)
New Revision: 6057
Modified:
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/graphviz/GraphVizMacro.java
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/svg/SVGMacro.java
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/XWikiRadeoxRenderEngine.java
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/XWikiRadeoxRenderer.java
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/filter/XWikiHeadingFilter.java
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/AttachMacro.java
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/FieldMacro.java
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/FormMacro.java
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/ImageMacro.java
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/StyleMacro.java
Log:
XWIKI-1885: Sometimes some Radeox macros fail to render and Radeox filter
exceptions appear in the XWiki logs
My take is that the errors are happening when there are several threads calling
XWikiRadeoxRenderEngine at the same time (note that a new instance of
XWikiRadeoxRenderEngine is created at each render call) . When this happens the
init() method is called. There's a test to check if the filter pipe is
initialized or not but this test isn't thread safe so what happens is that one
thread will start reinitializing the filter pipe. Then the second thread sees a
non null filter pipe and start the rendering. The problem is that the filters
have not finished initializing in the first thread and thus the rendering fails
randomly...
Modified:
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/graphviz/GraphVizMacro.java
===================================================================
---
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/graphviz/GraphVizMacro.java
2007-11-23 21:58:42 UTC (rev 6056)
+++
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/graphviz/GraphVizMacro.java
2007-11-24 10:55:02 UTC (rev 6057)
@@ -43,7 +43,7 @@
RenderContext context = params.getContext();
RenderEngine engine = context.getRenderEngine();
- XWikiContext xcontext = ((XWikiRadeoxRenderEngine)engine).getContext();
+ XWikiContext xcontext =
((XWikiRadeoxRenderEngine)engine).getXWikiContext();
XWiki xwiki = xcontext.getWiki();
GraphVizPlugin plugin = (GraphVizPlugin) xwiki.getPlugin("graphviz",
xcontext);
Modified:
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/svg/SVGMacro.java
===================================================================
---
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/svg/SVGMacro.java
2007-11-23 21:58:42 UTC (rev 6056)
+++
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/svg/SVGMacro.java
2007-11-24 10:55:02 UTC (rev 6057)
@@ -44,7 +44,7 @@
RenderContext context = params.getContext();
RenderEngine engine = context.getRenderEngine();
- XWikiContext xcontext = ((XWikiRadeoxRenderEngine)engine).getContext();
+ XWikiContext xcontext =
((XWikiRadeoxRenderEngine)engine).getXWikiContext();
XWiki xwiki = xcontext.getWiki();
SVGPlugin plugin = (SVGPlugin) xwiki.getPlugin("svg", xcontext);
Modified:
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/XWikiRadeoxRenderEngine.java
===================================================================
---
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/XWikiRadeoxRenderEngine.java
2007-11-23 21:58:42 UTC (rev 6056)
+++
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/XWikiRadeoxRenderEngine.java
2007-11-24 10:55:02 UTC (rev 6057)
@@ -18,8 +18,6 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*
*/
-
-
package com.xpn.xwiki.render;
import com.xpn.xwiki.XWikiContext;
@@ -46,48 +44,48 @@
import java.util.Iterator;
import java.util.List;
+/**
+ * Before this class can be used you need to call setXWikiContext().
+ */
public class XWikiRadeoxRenderEngine extends BaseRenderEngine implements
WikiRenderEngine, ImageRenderEngine {
private static Log log = LogFactory.getLog(XWikiRadeoxRenderEngine.class);
- private XWikiContext context;
+ private XWikiContext xwikiContext;
protected FilterPipe fp;
- public XWikiRadeoxRenderEngine(XWikiContext context) {
- // super();
- this.setContext(context);
- }
-
- public XWikiRadeoxRenderEngine(InitialRenderContext ircontext,
XWikiContext context) {
+ public XWikiRadeoxRenderEngine(InitialRenderContext ircontext) {
super(ircontext);
- this.setContext(context);
+ init();
}
- public XWikiContext getContext() {
- return context;
+ public XWikiContext getXWikiContext() {
+ return this.xwikiContext;
}
- public void setContext(XWikiContext context) {
- this.context = context;
+ public void setXWikiContext(XWikiContext context) {
+ this.xwikiContext = context;
}
- // Overidding to load our own Filter list.
- protected void init() {
- if (null == fp) {
- fp = new FilterPipe(initialContext);
+ /**
+ * We override this method from [EMAIL PROTECTED] BaseRenderEngine} in
order to provide our own initialization of Filters.
+ * In this manner we can load our filter definition from the
+ * META-INF/services/com.xpn.xwiki.render.filter.XWikiFilter file.
+ */
+ protected void init()
+ {
+ fp = new FilterPipe(initialContext);
- Iterator iterator = Service.providers(XWikiFilter.class);
- while (iterator.hasNext()) {
- try {
- Filter filter = (Filter) iterator.next();
- fp.addFilter(filter);
- log.debug("Loaded filter: " + filter.getClass().getName());
- } catch (Exception e) {
- log.warn("BaseRenderEngine: unable to load filter", e);
- }
+ Iterator iterator = Service.providers(XWikiFilter.class);
+ while (iterator.hasNext()) {
+ try {
+ Filter filter = (Filter) iterator.next();
+ fp.addFilter(filter);
+ log.debug("Radeox filter [" + filter.getClass().getName() + "]
loaded");
+ } catch (Exception e) {
+ log.error("Failed to load Radeox filter", e);
}
-
- fp.init();
- //Logger.debug("FilterPipe = "+fp.toString());
}
+
+ fp.init();
}
/**
@@ -100,7 +98,6 @@
* @return result Output with rendered content
*/
public String render(String content, RenderContext context) {
- init();
FilterContext filterContext = new BaseFilterContext();
filterContext.setRenderContext(context);
return fp.filter(content, filterContext);
@@ -117,16 +114,16 @@
* @see org.radeox.api.engine.WikiRenderEngine#exists(String)
*/
public boolean exists(String name) {
- String database = context.getDatabase();
+ String database = getXWikiContext().getDatabase();
try {
int colonIndex = name.indexOf(":");
if (colonIndex!=-1) {
String db = name.substring(0,colonIndex);
name = name.substring(colonIndex + 1);
- context.setDatabase(db);
+ getXWikiContext().setDatabase(db);
}
- XWikiDocument currentdoc = context.getDoc();
+ XWikiDocument currentdoc = getXWikiContext().getDoc();
int qsIndex = name.indexOf("?");
if (qsIndex!=-1) {
@@ -139,7 +136,7 @@
XWikiDocument doc = new XWikiDocument(
(currentdoc!=null) ? currentdoc.getSpace() : "Main",
newname);
- boolean exists = context.getWiki().exists(doc.getFullName(),
context);
+ boolean exists =
getXWikiContext().getWiki().exists(doc.getFullName(), getXWikiContext());
// If the document exists with the spaces and accents converted
then we use this one
if (exists)
@@ -149,13 +146,13 @@
doc = new XWikiDocument(
(currentdoc!=null) ? currentdoc.getSpace() : "Main",
name);
- return context.getWiki().exists(doc.getFullName(), context);
+ return getXWikiContext().getWiki().exists(doc.getFullName(),
getXWikiContext());
}
catch (Exception e) {
e.printStackTrace();
return false;
} finally {
- context.setDatabase(database);
+ getXWikiContext().setDatabase(database);
}
}
@@ -181,8 +178,8 @@
if (name.length() == 0 && anchor != null) {
appendInternalLink(buffer, view, anchor);
} else {
- String database = context.getDatabase();
- XWikiContext context = getContext();
+ String database = getXWikiContext().getDatabase();
+ XWikiContext context = getXWikiContext();
try {
String db = null;
@@ -276,14 +273,14 @@
buffer.append("<span class=\"wikilink\"><a href=\"#");
buffer.append(anchor);
buffer.append("\">");
- if (view.length() == 0) view = Utils.decode(anchor, context);
+ if (view.length() == 0) view = Utils.decode(anchor, getXWikiContext());
buffer.append(cleanText(view));
buffer.append("</a></span>");
}
public void appendCreateLink(StringBuffer buffer, String name, String
view) {
- String database = context.getDatabase();
- XWikiContext context = getContext();
+ String database = getXWikiContext().getDatabase();
+ XWikiContext context = getXWikiContext();
try {
String db = null;
Modified:
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/XWikiRadeoxRenderer.java
===================================================================
---
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/XWikiRadeoxRenderer.java
2007-11-23 21:58:42 UTC (rev 6056)
+++
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/XWikiRadeoxRenderer.java
2007-11-24 10:55:02 UTC (rev 6057)
@@ -37,11 +37,22 @@
public class XWikiRadeoxRenderer implements XWikiRenderer {
private boolean removePre = true;
+ private XWikiRadeoxRenderEngine radeoxEngine;
- public XWikiRadeoxRenderer() {
+ public XWikiRadeoxRenderer()
+ {
+ // This is needed so that our local config is used
+ InitialRenderContext ircontext = new BaseInitialRenderContext();
+ Locale locale = new Locale("xwiki", "xwiki");
+ ircontext.set(RenderContext.INPUT_LOCALE, locale);
+ ircontext.set(RenderContext.OUTPUT_LOCALE, locale);
+ ircontext.setParameters(new HashMap());
+
+ this.radeoxEngine = new XWikiRadeoxRenderEngine(ircontext);
}
public XWikiRadeoxRenderer(boolean removePre) {
+ this();
setRemovePre(removePre);
}
@@ -58,16 +69,10 @@
rcontext.set("xcontext", context);
}
if (rcontext.getRenderEngine()==null) {
- // This is needed so that our local config is used
- InitialRenderContext ircontext = new BaseInitialRenderContext();
- Locale locale = new Locale("xwiki", "xwiki");
- ircontext.set(RenderContext.INPUT_LOCALE, locale);
- ircontext.set(RenderContext.OUTPUT_LOCALE, locale);
- ircontext.setParameters(new HashMap());
+ this.radeoxEngine.setXWikiContext(context);
- XWikiRadeoxRenderEngine radeoxengine = new
XWikiRadeoxRenderEngine(ircontext, context);
- rcontext.setRenderEngine(radeoxengine);
-
+ // Note: Are there any case where we would want to clone the
radeox context?
+ rcontext.setRenderEngine(this.radeoxEngine);
}
String result = rcontext.getRenderEngine().render(content, rcontext);
return preTagSubst.insertNonWikiText(result);
Modified:
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/filter/XWikiHeadingFilter.java
===================================================================
---
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/filter/XWikiHeadingFilter.java
2007-11-23 21:58:42 UTC (rev 6056)
+++
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/filter/XWikiHeadingFilter.java
2007-11-24 10:55:02 UTC (rev 6057)
@@ -84,7 +84,7 @@
RenderContext rcontext = context.getRenderContext();
XWikiContext xcontext =
- ((XWikiRadeoxRenderEngine)
rcontext.getRenderEngine()).getContext();
+ ((XWikiRadeoxRenderEngine)
rcontext.getRenderEngine()).getXWikiContext();
XWikiDocument doc = xcontext.getDoc();
log.debug("Processing '" + text + "'");
Modified:
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/AttachMacro.java
===================================================================
---
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/AttachMacro.java
2007-11-23 21:58:42 UTC (rev 6056)
+++
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/AttachMacro.java
2007-11-24 10:55:02 UTC (rev 6057)
@@ -100,7 +100,7 @@
}
text = Encoder.escape(text);
- XWikiContext xcontext = ((XWikiRadeoxRenderEngine)
engine).getContext();
+ XWikiContext xcontext = ((XWikiRadeoxRenderEngine)
engine).getXWikiContext();
// Get the target document
XWikiDocument doc = null;
Modified:
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/FieldMacro.java
===================================================================
---
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/FieldMacro.java
2007-11-23 21:58:42 UTC (rev 6056)
+++
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/FieldMacro.java
2007-11-24 10:55:02 UTC (rev 6057)
@@ -43,7 +43,7 @@
RenderContext context = params.getContext();
RenderEngine engine = context.getRenderEngine();
- XWikiContext xcontext = ((XWikiRadeoxRenderEngine)engine).getContext();
+ XWikiContext xcontext =
((XWikiRadeoxRenderEngine)engine).getXWikiContext();
XWikiDocument doc = xcontext.getDoc();
String fieldname = params.get("text", 0);
Modified:
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/FormMacro.java
===================================================================
---
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/FormMacro.java
2007-11-23 21:58:42 UTC (rev 6056)
+++
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/FormMacro.java
2007-11-24 10:55:02 UTC (rev 6057)
@@ -42,7 +42,7 @@
RenderContext context = params.getContext();
RenderEngine engine = context.getRenderEngine();
- XWikiContext xcontext = ((XWikiRadeoxRenderEngine)engine).getContext();
+ XWikiContext xcontext =
((XWikiRadeoxRenderEngine)engine).getXWikiContext();
XWikiDocument doc = xcontext.getDoc();
String className = params.get("text", 0);
Modified:
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/ImageMacro.java
===================================================================
---
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/ImageMacro.java
2007-11-23 21:58:42 UTC (rev 6056)
+++
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/ImageMacro.java
2007-11-24 10:55:02 UTC (rev 6057)
@@ -118,7 +118,7 @@
alt = title = img;
}
- XWikiContext xcontext = ((XWikiRadeoxRenderEngine)
engine).getContext();
+ XWikiContext xcontext = ((XWikiRadeoxRenderEngine)
engine).getXWikiContext();
// Get the target document
XWikiDocument doc = null;
Modified:
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/StyleMacro.java
===================================================================
---
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/StyleMacro.java
2007-11-23 21:58:42 UTC (rev 6056)
+++
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/render/macro/StyleMacro.java
2007-11-24 10:55:02 UTC (rev 6057)
@@ -44,7 +44,7 @@
throws IllegalArgumentException, IOException {
RenderContext context = params.getContext();
RenderEngine engine = context.getRenderEngine();
- XWikiContext xcontext = ((XWikiRadeoxRenderEngine)
engine).getContext();
+ XWikiContext xcontext = ((XWikiRadeoxRenderEngine)
engine).getXWikiContext();
String text = params.getContent();
String type = params.get("type");
_______________________________________________
notifications mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/notifications