You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jspwiki.apache.org by ju...@apache.org on 2017/08/22 18:13:04 UTC
[08/10] jspwiki git commit: RenderingManager is now capable of
returning a custom renderer for WYSIWYG editing
RenderingManager is now capable of returning a custom renderer for WYSIWYG editing
Project: http://git-wip-us.apache.org/repos/asf/jspwiki/repo
Commit: http://git-wip-us.apache.org/repos/asf/jspwiki/commit/d813d92b
Tree: http://git-wip-us.apache.org/repos/asf/jspwiki/tree/d813d92b
Diff: http://git-wip-us.apache.org/repos/asf/jspwiki/diff/d813d92b
Branch: refs/heads/master
Commit: d813d92b3ce29f4d04d1c331fa59cbeb21f6d778
Parents: f31265a
Author: juanpablo <ju...@apache.org>
Authored: Tue Aug 22 20:09:39 2017 +0200
Committer: juanpablo <ju...@apache.org>
Committed: Tue Aug 22 20:09:39 2017 +0200
----------------------------------------------------------------------
.../apache/wiki/render/RenderingManager.java | 110 +++++++++++++------
1 file changed, 76 insertions(+), 34 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jspwiki/blob/d813d92b/jspwiki-war/src/main/java/org/apache/wiki/render/RenderingManager.java
----------------------------------------------------------------------
diff --git a/jspwiki-war/src/main/java/org/apache/wiki/render/RenderingManager.java b/jspwiki-war/src/main/java/org/apache/wiki/render/RenderingManager.java
index af3cbd6..466961a 100644
--- a/jspwiki-war/src/main/java/org/apache/wiki/render/RenderingManager.java
+++ b/jspwiki-war/src/main/java/org/apache/wiki/render/RenderingManager.java
@@ -25,10 +25,6 @@ import java.util.Collection;
import java.util.Iterator;
import java.util.Properties;
-import net.sf.ehcache.Cache;
-import net.sf.ehcache.CacheManager;
-import net.sf.ehcache.Element;
-
import org.apache.log4j.Logger;
import org.apache.wiki.PageManager;
import org.apache.wiki.WikiContext;
@@ -44,6 +40,10 @@ import org.apache.wiki.parser.MarkupParser;
import org.apache.wiki.parser.WikiDocument;
import org.apache.wiki.util.ClassUtil;
+import net.sf.ehcache.Cache;
+import net.sf.ehcache.CacheManager;
+import net.sf.ehcache.Element;
+
/**
* This class provides a facade towards the differing rendering routines. You should
@@ -69,10 +69,11 @@ public class RenderingManager implements WikiEventListener, InternalModule
private CacheManager m_cacheManager = CacheManager.getInstance();
/** The capacity of the caches, if you want something else, tweak ehcache.xml. */
- private static final int DEFAULT_CACHESIZE = 1000;
- private static final String VERSION_DELIMITER = "::";
- private static final String PROP_PARSER = "jspwiki.renderingManager.markupParser";
- private static final String PROP_RENDERER = "jspwiki.renderingManager.renderer";
+ private static final int DEFAULT_CACHESIZE = 1000;
+ private static final String VERSION_DELIMITER = "::";
+ private static final String PROP_PARSER = "jspwiki.renderingManager.markupParser";
+ private static final String PROP_RENDERER = "jspwiki.renderingManager.renderer";
+ private static final String PROP_WYSIWYG_RENDERER = "jspwiki.renderingManager.renderer.wysiwyg";
/** The name of the default renderer. */
public static final String DEFAULT_PARSER = JSPWikiMarkupParser.class.getName();
@@ -80,6 +81,9 @@ public class RenderingManager implements WikiEventListener, InternalModule
/** The name of the default renderer. */
public static final String DEFAULT_RENDERER = XHTMLRenderer.class.getName();
+ /** The name of the default WYSIWYG renderer. */
+ public static final String DEFAULT_WYSIWYG_RENDERER = WysiwygEditingRenderer.class.getName();
+
/** Stores the WikiDocuments that have been cached. */
private Cache m_documentCache;
@@ -87,6 +91,7 @@ public class RenderingManager implements WikiEventListener, InternalModule
public static final String DOCUMENTCACHE_NAME = "jspwiki.renderingCache";
private Constructor< ? > m_rendererConstructor;
+ private Constructor< ? > m_rendererWysiwygConstructor;
private String m_markupParserClass = DEFAULT_PARSER;
/**
@@ -137,26 +142,34 @@ public class RenderingManager implements WikiEventListener, InternalModule
}
}
- String renderImplName = properties.getProperty( PROP_RENDERER, DEFAULT_RENDERER );
+ final String renderImplName = properties.getProperty( PROP_RENDERER, DEFAULT_RENDERER );
+ final String renderWysiwygImplName = properties.getProperty( PROP_WYSIWYG_RENDERER, DEFAULT_WYSIWYG_RENDERER );
- Class< ? >[] rendererParams = { WikiContext.class, WikiDocument.class };
+ final Class< ? >[] rendererParams = { WikiContext.class, WikiDocument.class };
+ m_rendererConstructor = initRenderer( renderImplName, rendererParams );
+ m_rendererWysiwygConstructor = initRenderer( renderWysiwygImplName, rendererParams );
+
+ log.info( "Rendering content with " + renderImplName + "." );
+
+ WikiEventUtils.addWikiEventListener(m_engine, WikiPageEvent.POST_SAVE_BEGIN, this);
+ }
+
+ private Constructor< ? > initRenderer( final String renderImplName, final Class< ? >[] rendererParams ) throws WikiException {
+ Constructor< ? > c = null;
try {
- Class< ? > c = Class.forName( renderImplName );
- m_rendererConstructor = c.getConstructor( rendererParams );
- } catch( ClassNotFoundException e ) {
+ final Class< ? > clazz = Class.forName( renderImplName );
+ c = clazz.getConstructor( rendererParams );
+ } catch( final ClassNotFoundException e ) {
log.error( "Unable to find WikiRenderer implementation " + renderImplName );
- } catch( SecurityException e ) {
+ } catch( final SecurityException e ) {
log.error( "Unable to access the WikiRenderer(WikiContext,WikiDocument) constructor for " + renderImplName );
- } catch( NoSuchMethodException e ) {
+ } catch( final NoSuchMethodException e ) {
log.error( "Unable to locate the WikiRenderer(WikiContext,WikiDocument) constructor for " + renderImplName );
}
-
- if( m_rendererConstructor == null ) {
+ if( c == null ) {
throw new WikiException( "Failed to get WikiRenderer '" + renderImplName + "'." );
}
- log.info( "Rendering content with " + renderImplName + "." );
-
- WikiEventUtils.addWikiEventListener(m_engine, WikiPageEvent.POST_SAVE_BEGIN, this);
+ return c;
}
/**
@@ -236,7 +249,19 @@ public class RenderingManager implements WikiEventListener, InternalModule
*/
public String getHTML( WikiContext context, WikiDocument doc ) throws IOException
{
- WikiRenderer rend = getRenderer( context, doc );
+ final Boolean wysiwygVariable = ( Boolean )context.getVariable( WYSIWYG_EDITOR_MODE );
+ final boolean wysiwygEditorMode;
+ if( wysiwygVariable != null ) {
+ wysiwygEditorMode = wysiwygVariable.booleanValue();
+ } else {
+ wysiwygEditorMode = false;
+ }
+ WikiRenderer rend;
+ if( wysiwygEditorMode ) {
+ rend = getWysiwygRenderer( context, doc );
+ } else {
+ rend = getRenderer( context, doc );
+ }
return rend.getString();
}
@@ -250,17 +275,33 @@ public class RenderingManager implements WikiEventListener, InternalModule
* @param doc The document to render
* @return A WikiRenderer for this document, or null, if no such renderer could be instantiated.
*/
- public WikiRenderer getRenderer( WikiContext context, WikiDocument doc )
- {
- Object[] params = { context, doc };
- WikiRenderer rval = null;
+ public WikiRenderer getRenderer( WikiContext context, WikiDocument doc ) {
+ final Object[] params = { context, doc };
+ return getRenderer( params, m_rendererConstructor );
+ }
- try
- {
- rval = (WikiRenderer)m_rendererConstructor.newInstance( params );
- }
- catch( Exception e )
- {
+ /**
+ * Returns a WikiRenderer instance meant for WYSIWYG editing, initialized with the given
+ * context and doc. The object is an WysiwygEditingRenderer, unless overridden
+ * in jspwiki.properties with PROP_WYSIWYG_RENDERER.
+ *
+ * @param context The WikiContext
+ * @param doc The document to render
+ * @return A WikiRenderer instance meant for WYSIWYG editing, for this document, or null, if
+ * no such renderer could be instantiated.
+ */
+ public WikiRenderer getWysiwygRenderer( WikiContext context, WikiDocument doc ) {
+ final Object[] params = { context, doc };
+ return getRenderer( params, m_rendererWysiwygConstructor );
+ }
+
+ @SuppressWarnings("unchecked")
+ private < T extends WikiRenderer > T getRenderer( Object[] params, Constructor<?> rendererConstructor ) {
+ T rval = null;
+
+ try {
+ rval = (T)rendererConstructor.newInstance( params );
+ } catch( final Exception e ) {
log.error( "Unable to create WikiRenderer", e );
}
return rval;
@@ -299,22 +340,23 @@ public class RenderingManager implements WikiEventListener, InternalModule
* @see org.apache.wiki.event.WikiEventListener#actionPerformed(org.apache.wiki.event.WikiEvent)
* @param event {@inheritDoc}
*/
+ @Override
public void actionPerformed(WikiEvent event) {
if (m_useCache) {
if ((event instanceof WikiPageEvent) && (event.getType() == WikiPageEvent.POST_SAVE_BEGIN)) {
if (m_documentCache != null) {
String pageName = ((WikiPageEvent) event).getPageName();
m_documentCache.remove(pageName);
- Collection referringPages = m_engine.getReferenceManager().findReferrers(pageName);
+ Collection<String> referringPages = m_engine.getReferenceManager().findReferrers(pageName);
//
// Flush also those pages that refer to this page (if an nonexistent page
// appears; we need to flush the HTML that refers to the now-existent page
//
if (referringPages != null) {
- Iterator i = referringPages.iterator();
+ Iterator<String> i = referringPages.iterator();
while (i.hasNext()) {
- String page = (String) i.next();
+ String page = i.next();
if (log.isDebugEnabled()) log.debug("Flushing " + page);
m_documentCache.remove(page);
}