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

Reply via email to