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 2014/06/22 20:45:33 UTC

svn commit: r1604637 - in /jspwiki/trunk: ./ jspwiki-war/src/main/java/org/apache/wiki/ jspwiki-war/src/main/java/org/apache/wiki/plugin/ jspwiki-war/src/main/java/org/apache/wiki/ui/admin/beans/ jspwiki-war/src/main/java/org/apache/wiki/util/ jspwiki-...

Author: juanpablo
Date: Sun Jun 22 18:45:32 2014
New Revision: 1604637

URL: http://svn.apache.org/r1604637
Log:
 * 2.10.2-svn-3

 * Fixed JSPWIKI-847 - Recent Changes Plugin breaks markup if generates an empty table, reported by Dave Koelmeyer

Modified:
    jspwiki/trunk/ChangeLog
    jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/Release.java
    jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/plugin/RecentChangesPlugin.java
    jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/ui/admin/beans/PluginBean.java
    jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/util/XhtmlUtil.java
    jspwiki/trunk/jspwiki-war/src/test/java/org/apache/wiki/plugin/RecentChangesPluginTest.java

Modified: jspwiki/trunk/ChangeLog
URL: http://svn.apache.org/viewvc/jspwiki/trunk/ChangeLog?rev=1604637&r1=1604636&r2=1604637&view=diff
==============================================================================
--- jspwiki/trunk/ChangeLog (original)
+++ jspwiki/trunk/ChangeLog Sun Jun 22 18:45:32 2014
@@ -1,3 +1,9 @@
+2014-06-23  Juan Pablo Santos (juanpablo AT apache DOT org)
+
+       * 2.10.2-svn-3
+
+       * Fixed JSPWIKI-847 - Recent Changes Plugin breaks markup if generates an empty table, reported by Dave Koelmeyer
+       
 2014-06-05  Juan Pablo Santos (juanpablo AT apache DOT org)
 
        * 2.10.2-svn-2

Modified: jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/Release.java
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/Release.java?rev=1604637&r1=1604636&r2=1604637&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/Release.java (original)
+++ jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/Release.java Sun Jun 22 18:45:32 2014
@@ -72,7 +72,7 @@ public final class Release {
      *  <p>
      *  If the build identifier is empty, it is not added.
      */
-    public static final String     BUILD         = "2";
+    public static final String     BUILD         = "3";
     
     /**
      *  This is the generic version string you should use when printing out the version.  It is of 

Modified: jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/plugin/RecentChangesPlugin.java
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/plugin/RecentChangesPlugin.java?rev=1604637&r1=1604636&r2=1604637&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/plugin/RecentChangesPlugin.java (original)
+++ jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/plugin/RecentChangesPlugin.java Sun Jun 22 18:45:32 2014
@@ -27,6 +27,7 @@ import java.util.GregorianCalendar;
 import java.util.Iterator;
 import java.util.Map;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.apache.wiki.WikiContext;
 import org.apache.wiki.WikiEngine;
@@ -42,6 +43,7 @@ import org.apache.wiki.util.XHTML;
 import org.apache.wiki.util.XhtmlUtil;
 import org.jdom2.Element;
 
+
 /**
  *  Returns the Recent Changes in the wiki being a date-sorted list of page names.
  *
@@ -55,7 +57,7 @@ import org.jdom2.Element;
  */
 public class RecentChangesPlugin extends AbstractReferralPlugin implements WikiPlugin {
 	
-    private static final Logger log = Logger.getLogger(RecentChangesPlugin.class);
+    private static final Logger log = Logger.getLogger( RecentChangesPlugin.class );
     
     /** Parameter name for the separator format.  Value is <tt>{@value}</tt>. */
     public static final String PARAM_FORMAT      = "format";
@@ -74,9 +76,7 @@ public class RecentChangesPlugin extends
      * {@inheritDoc}
      */
     @SuppressWarnings("unchecked")
-    public String execute( WikiContext context, Map<String, String> params )
-        throws PluginException
-    {
+    public String execute( WikiContext context, Map<String, String> params ) throws PluginException {
         int since = TextUtil.parseIntParameter( params.get( "since" ), DEFAULT_DAYS );
         String   spacing  = "4";
         boolean  showAuthor = true;
@@ -88,8 +88,7 @@ public class RecentChangesPlugin extends
         //
         //  Which format we want to see?
         //
-        if( "compact".equals( params.get(PARAM_FORMAT) ) )
-        {
+        if( "compact".equals( params.get(PARAM_FORMAT) ) ) {
             spacing  = "0";
             showAuthor = false;
             showChangenote = false;
@@ -102,125 +101,107 @@ public class RecentChangesPlugin extends
         log.debug("Calculating recent changes from "+sincedate.getTime());
 
         // FIXME: Should really have a since date on the getRecentChanges method.
-        Collection<WikiPage> changes = engine.getRecentChanges();
+        Collection< WikiPage > changes = engine.getRecentChanges();
         super.initialize( context, params );
         changes = super.filterCollection(changes);
         
-        if ( changes != null )
-        {
-            Date olddate   = new Date(0);
+        if ( changes != null ) {
+            Date olddate = new Date( 0 );
 
             DateFormat fmt = getDateFormat( context, params );
             DateFormat tfmt = getTimeFormat( context, params );
 
-            Element rt = XhtmlUtil.element(XHTML.table);
-            rt.setAttribute(XHTML.ATTR_class,"recentchanges");
-            rt.setAttribute(XHTML.ATTR_cellpadding,spacing);
+            Element rt = XhtmlUtil.element( XHTML.table );
+            rt.setAttribute( XHTML.ATTR_class, "recentchanges" );
+            rt.setAttribute( XHTML.ATTR_cellpadding, spacing );
         
-            for( Iterator<WikiPage> i = changes.iterator(); i.hasNext(); )
-            {
-                WikiPage pageref = (WikiPage) i.next();
-
+            for( Iterator< WikiPage > i = changes.iterator(); i.hasNext(); ) {
+                WikiPage pageref = i.next();
                 Date lastmod = pageref.getLastModified();
 
-                if( lastmod.before( sincedate.getTime() ) )
-                {
+                if( lastmod.before( sincedate.getTime() ) ) {
                     break;
                 }
                 
-                if( !isSameDay( lastmod, olddate ) )
-                {
-                    Element row = XhtmlUtil.element(XHTML.tr);
-                    Element col = XhtmlUtil.element(XHTML.td);
-                    col.setAttribute(XHTML.ATTR_colspan,tablewidth);
-                    col.setAttribute(XHTML.ATTR_class,"date");                    
-                    col.addContent(XhtmlUtil.element(XHTML.b,fmt.format(lastmod)));
-                    
-                    rt.addContent(row);
-                    row.addContent(col);                    
+                if( !isSameDay( lastmod, olddate ) ) {
+                    Element row = XhtmlUtil.element( XHTML.tr );
+                    Element col = XhtmlUtil.element( XHTML.td );
+                    col.setAttribute( XHTML.ATTR_colspan, tablewidth );
+                    col.setAttribute( XHTML.ATTR_class, "date" );
+                    col.addContent( XhtmlUtil.element( XHTML.b, fmt.format( lastmod ) ) );
+
+                    rt.addContent( row );
+                    row.addContent( col );
                     olddate = lastmod;
                 }
 
                 String href = context.getURL( pageref instanceof Attachment ? WikiContext.ATTACH : WikiContext.VIEW, 
                                               pageref.getName() ) ;
-                
-                Element link = XhtmlUtil.link(href,engine.beautifyTitle(pageref.getName()));
-                
-                Element row = XhtmlUtil.element(XHTML.tr);
-                Element col = XhtmlUtil.element(XHTML.td);
-                col.setAttribute(XHTML.ATTR_width,"30%");
-                col.addContent(link);
+
+                Element link = XhtmlUtil.link( href, engine.beautifyTitle( pageref.getName() ) );
+
+                Element row = XhtmlUtil.element( XHTML.tr );
+                Element col = XhtmlUtil.element( XHTML.td );
+                col.setAttribute( XHTML.ATTR_width, "30%" );
+                col.addContent( link );
                 
                 //
                 //  Add the direct link to the attachment info.
                 //
-                if( pageref instanceof Attachment )
-                {
-                    link = XhtmlUtil.link(context.getURL(WikiContext.INFO,pageref.getName()),null);
-                    link.setAttribute(XHTML.ATTR_class,"infolink");
-                    
-                    Element img = XhtmlUtil.img(context.getURL(WikiContext.NONE,"images/attachment_small.png"),null);
-                    link.addContent(img);
-                    
-                    col.addContent(link);
-                }
-
-                
-                row.addContent(col);
-                rt.addContent(row);
-                
-                if( pageref instanceof Attachment )
-                {
-                    Element td = XhtmlUtil.element(XHTML.td,tfmt.format(lastmod));
-                    td.setAttribute(XHTML.ATTR_class,"lastchange");
-                    row.addContent(td);
-                }
-                else
-                {
-                    Element infocol = XhtmlUtil.element(XHTML.td);
-                    infocol.setAttribute(XHTML.ATTR_class,"lastchange");
-                    infocol.addContent(XhtmlUtil.link(context.getURL(WikiContext.DIFF, pageref.getName(), "r1=-1"),tfmt.format(lastmod)));
-                    row.addContent(infocol);
+                if( pageref instanceof Attachment ) {
+                    link = XhtmlUtil.link( context.getURL( WikiContext.INFO, pageref.getName() ), null );
+                    link.setAttribute( XHTML.ATTR_class, "infolink" );
+
+                    Element img = XhtmlUtil.img( context.getURL( WikiContext.NONE, "images/attachment_small.png" ), null );
+                    link.addContent( img );
+
+                    col.addContent( link );
+                }
+
+                row.addContent( col );
+                rt.addContent( row );
+                
+                if( pageref instanceof Attachment ) {
+                    Element td = XhtmlUtil.element( XHTML.td, tfmt.format( lastmod ) );
+                    td.setAttribute( XHTML.ATTR_class, "lastchange" );
+                    row.addContent( td );
+                } else {
+                    Element infocol = XhtmlUtil.element( XHTML.td );
+                    infocol.setAttribute( XHTML.ATTR_class, "lastchange" );
+                    infocol.addContent( XhtmlUtil.link( context.getURL( WikiContext.DIFF, pageref.getName(), "r1=-1" ), tfmt.format( lastmod ) ) );
+                    row.addContent( infocol );
                 }
 
                 //
                 //  Display author information.
                 //
 
-                if( showAuthor )
-                {
+                if( showAuthor ) {
                     String author = pageref.getAuthor();
 
-                    Element authorinfo = XhtmlUtil.element(XHTML.td);
-                    authorinfo.setAttribute(XHTML.ATTR_class,"author");
+                    Element authorinfo = XhtmlUtil.element( XHTML.td );
+                    authorinfo.setAttribute( XHTML.ATTR_class, "author" );
                     
-                    if( author != null )
-                    {
-                        if( engine.pageExists(author) )
-                        {
-                            authorinfo.addContent(XhtmlUtil.link(context.getURL(WikiContext.VIEW, author),author));
+                    if( author != null ) {
+                        if( engine.pageExists( author ) ) {
+                            authorinfo.addContent( XhtmlUtil.link( context.getURL( WikiContext.VIEW, author ), author ) );
+                        } else {
+                            authorinfo.addContent( author );
                         }
-                        else
-                        {
-                            authorinfo.addContent(author);
-                        }
-                    }
-                    else
-                    {
+                    } else {
                         authorinfo.addContent( Preferences.getBundle( context, InternationalizationManager.CORE_BUNDLE )
                                                           .getString( "common.unknownauthor" ) );
                     }
 
-                    row.addContent(authorinfo);
+                    row.addContent( authorinfo );
                 }
 
                 // Change note
-                if( showChangenote )
-                {
-                    String changenote = (String)pageref.getAttribute(WikiPage.CHANGENOTE);
-                    Element td_changenote = XhtmlUtil.element(XHTML.td,changenote);
-                    td_changenote.setAttribute(XHTML.ATTR_class,"changenote");
-                    row.addContent(td_changenote);
+                if( showChangenote ) {
+                    String changenote = ( String )pageref.getAttribute( WikiPage.CHANGENOTE );
+                    Element td_changenote = XhtmlUtil.element( XHTML.td, changenote );
+                    td_changenote.setAttribute( XHTML.ATTR_class, "changenote" );
+                    row.addContent( td_changenote );
                 }
                 
                 //  Revert note
@@ -231,19 +212,18 @@ public class RecentChangesPlugin extends
                 }
  */
             }
-            return XhtmlUtil.serialize(rt,true);
-        }        
+            return XhtmlUtil.serialize( rt, XhtmlUtil.EXPAND_EMPTY_NODES );
+        }
         return "";
     }
 
     
-    private boolean isSameDay( Date a, Date b )
-    {
-        Calendar aa = Calendar.getInstance(); aa.setTime(a);
-        Calendar bb = Calendar.getInstance(); bb.setTime(b);
+    private boolean isSameDay( Date a, Date b ) {
+        Calendar aa = Calendar.getInstance(); aa.setTime( a );
+        Calendar bb = Calendar.getInstance(); bb.setTime( b );
 
         return aa.get( Calendar.YEAR ) == bb.get( Calendar.YEAR ) 
-                && aa.get( Calendar.DAY_OF_YEAR ) == bb.get( Calendar.DAY_OF_YEAR );
+            && aa.get( Calendar.DAY_OF_YEAR ) == bb.get( Calendar.DAY_OF_YEAR );
     }
     
 
@@ -251,36 +231,29 @@ public class RecentChangesPlugin extends
     // locale, but that is at odds with the 1st version of this plugin. We seek to preserve the
     // behaviour of that first version, so to get the default format, the user must explicitly do
     // something like: dateFormat='' timeformat='' which is a odd, but probably okay.
-    private DateFormat getTimeFormat( WikiContext context, Map<String, String> params )
-    {
-        String formatString = get(params, DEFAULT_TIME_FORMAT, PARAM_TIME_FORMAT);
+    private DateFormat getTimeFormat( WikiContext context, Map<String, String> params ) {
+        String formatString = get( params, DEFAULT_TIME_FORMAT, PARAM_TIME_FORMAT );
 
-        if ("".equals(formatString.trim()))
+        if( StringUtils.isBlank( formatString ) ) {
             return Preferences.getDateFormat( context, TimeFormat.TIME );
+        }
 
-        return new SimpleDateFormat(formatString);
+        return new SimpleDateFormat( formatString );
     }
 
-
-
-    private DateFormat getDateFormat( WikiContext context, Map<String, String> params )
-    {
-        String formatString = get(params, DEFAULT_DATE_FORMAT, PARAM_DATE_FORMAT);
-
-        if( formatString.trim().equals("") )
-        {
+    private DateFormat getDateFormat( WikiContext context, Map< String, String > params ) {
+        String formatString = get( params, DEFAULT_DATE_FORMAT, PARAM_DATE_FORMAT );
+        
+        if( StringUtils.isBlank( formatString ) ) {
             return Preferences.getDateFormat( context, TimeFormat.DATE );
         }
 
         return new SimpleDateFormat( formatString );
     }
-
-
-    private String get( Map<String, String> params, String defaultValue, String paramName )
-    {
-        String value = params.get(paramName);
+    
+    private String get( Map< String, String > params, String defaultValue, String paramName ) {
+        String value = params.get( paramName );
         return value == null ? defaultValue : value;
     }
-
     
 }
\ No newline at end of file

Modified: jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/ui/admin/beans/PluginBean.java
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/ui/admin/beans/PluginBean.java?rev=1604637&r1=1604636&r2=1604637&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/ui/admin/beans/PluginBean.java (original)
+++ jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/ui/admin/beans/PluginBean.java Sun Jun 22 18:45:32 2014
@@ -32,7 +32,6 @@ import org.apache.wiki.ui.admin.SimpleAd
 import org.apache.wiki.util.XHTML;
 import org.apache.wiki.util.XhtmlUtil;
 import org.jdom2.Element;
-import org.jdom2.output.Format;
 
 public class PluginBean extends SimpleAdminBean {
 	
@@ -40,9 +39,6 @@ public class PluginBean extends SimpleAd
     
     private static final String VER_WARNING = "<span class='warning'>This module is not compatible with this version of JSPWiki.</span>";
     
-    /** to print <td></td> instead of <td /> */
-    private static final Format EXPAND_EMPTY_NODES = Format.getCompactFormat().setExpandEmptyElements( true );
-
     public PluginBean( WikiEngine engine ) throws NotCompliantMBeanException {
         m_engine = engine;
     }
@@ -92,7 +88,7 @@ public class PluginBean extends SimpleAd
             tb.addContent( tr );
         }
 
-        return XhtmlUtil.serialize( root, EXPAND_EMPTY_NODES );
+        return XhtmlUtil.serialize( root, XhtmlUtil.EXPAND_EMPTY_NODES );
     }
 
     String validPluginVersion( WikiPluginInfo info ) {

Modified: jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/util/XhtmlUtil.java
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/util/XhtmlUtil.java?rev=1604637&r1=1604636&r2=1604637&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/util/XhtmlUtil.java (original)
+++ jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/util/XhtmlUtil.java Sun Jun 22 18:45:32 2014
@@ -55,6 +55,9 @@ public final class XhtmlUtil {
 	
     private XhtmlUtil() {}
     
+    /** to print <td></td> instead of <td /> */
+    public static final Format EXPAND_EMPTY_NODES = Format.getCompactFormat().setExpandEmptyElements( true );
+    
     /**
      *  Serializes the Element to a String using a compact serialization format.
      *  

Modified: jspwiki/trunk/jspwiki-war/src/test/java/org/apache/wiki/plugin/RecentChangesPluginTest.java
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/test/java/org/apache/wiki/plugin/RecentChangesPluginTest.java?rev=1604637&r1=1604636&r2=1604637&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/test/java/org/apache/wiki/plugin/RecentChangesPluginTest.java (original)
+++ jspwiki/trunk/jspwiki-war/src/test/java/org/apache/wiki/plugin/RecentChangesPluginTest.java Sun Jun 22 18:45:32 2014
@@ -24,8 +24,8 @@ import java.util.Properties;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
-
 import net.sf.ehcache.CacheManager;
+
 import org.apache.wiki.TestEngine;
 import org.apache.wiki.WikiContext;
 import org.apache.wiki.WikiPage;
@@ -47,6 +47,7 @@ public class RecentChangesPluginTest ext
         testEngine.saveText("TestPage01", "Some Text for testing 01");
         testEngine.saveText("TestPage02", "Some Text for testing 02");
         testEngine.saveText("TestPage03", "Some Text for testing 03");
+        testEngine.saveText("TestPage04", "Some Text for testing 04");
 
         manager = new DefaultPluginManager(testEngine, props);
     }
@@ -55,6 +56,7 @@ public class RecentChangesPluginTest ext
         testEngine.deleteTestPage("TestPage01");
         testEngine.deleteTestPage("TestPage02");
         testEngine.deleteTestPage("TestPage03");
+        testEngine.deleteTestPage("TestPage04");
 
         TestEngine.emptyWorkDir();
     }
@@ -111,8 +113,23 @@ public class RecentChangesPluginTest ext
         assertFalse(res.contains("<a href=\"/Wiki.jsp?page=TestPage03\">Test Page 03</a>"));
     }
 
+    /**
+     * Test an empty recent changes table
+     * 
+     * @throws Exception
+     */
+    public void testNoRecentChanges() throws Exception {
+        context = new WikiContext(testEngine, new WikiPage(testEngine, "TestPage04"));
+
+        String res = manager.execute( context,
+                                      "{INSERT org.apache.wiki.plugin.RecentChangesPlugin since='-1'}" );
+
+        assertEquals( "<table class=\"recentchanges\" cellpadding=\"4\"></table>", res );
+        assertEquals( "<table class=\"recentchanges\" cellpadding=\"4\" />", res );
+    }
+
     public static Test suite() {
-        return new TestSuite(RecentChangesPluginTest.class);
+        return new TestSuite( RecentChangesPluginTest.class );
     }
     
 }