Author: ajaquith
Date: Mon Nov  2 03:45:48 2009
New Revision: 831797

URL: http://svn.apache.org/viewvc?rev=831797&view=rev
Log:
Fixed bug in ContentManager.pageExists() that caused tests for version 1 of 
pages to fail if there had been no other versions saved yet. Shockingly, we had 
never tested for this condition before. As a result, webapp page-viewing 
actions now work again. Related: added versioning to ViewActionBean, which 
hadn't been added previously because the versioning code hadn't stabilized 
until recently.

Modified:
    incubator/jspwiki/trunk/ChangeLog
    incubator/jspwiki/trunk/src/java/org/apache/wiki/Release.java
    incubator/jspwiki/trunk/src/java/org/apache/wiki/action/EditActionBean.java
    incubator/jspwiki/trunk/src/java/org/apache/wiki/action/ViewActionBean.java
    incubator/jspwiki/trunk/src/java/org/apache/wiki/content/ContentManager.java
    
incubator/jspwiki/trunk/tests/java/org/apache/wiki/action/ViewActionBeanTest.java
    
incubator/jspwiki/trunk/tests/java/org/apache/wiki/content/ContentManagerTest.java

Modified: incubator/jspwiki/trunk/ChangeLog
URL: 
http://svn.apache.org/viewvc/incubator/jspwiki/trunk/ChangeLog?rev=831797&r1=831796&r2=831797&view=diff
==============================================================================
--- incubator/jspwiki/trunk/ChangeLog (original)
+++ incubator/jspwiki/trunk/ChangeLog Mon Nov  2 03:45:48 2009
@@ -1,3 +1,15 @@
+2009-11-01 Andrew Jaquith <ajaquith AT apache DOT org>
+
+        * 3.0.0-svn-176
+
+        * Fixed bug in ContentManager.pageExists() that caused tests
+        for version 1 of pages to fail if there had been no other
+        versions saved yet. Shockingly, we had never tested for this
+        condition before. As a result, webapp page-viewing actions
+        now work again. Related: added versioning to ViewActionBean,
+        which hadn't been added previously because the versioning
+        code hadn't stabilized until recently.
+
 2009-10-26 Janne Jalkanen <[email protected]>
 
         * Priha 0.6.0, no other changes.  This new version functions

Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/Release.java
URL: 
http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/Release.java?rev=831797&r1=831796&r2=831797&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/Release.java (original)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/Release.java Mon Nov  2 
03:45:48 2009
@@ -77,7 +77,7 @@
      *  <p>
      *  If the build identifier is empty, it is not added.
      */
-    public static final String     BUILD         = "175";
+    public static final String     BUILD         = "176";
 
     /**
      *  This is the generic version string you should use

Modified: 
incubator/jspwiki/trunk/src/java/org/apache/wiki/action/EditActionBean.java
URL: 
http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/action/EditActionBean.java?rev=831797&r1=831796&r2=831797&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/action/EditActionBean.java 
(original)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/action/EditActionBean.java 
Mon Nov  2 03:45:48 2009
@@ -468,7 +468,7 @@
                   + m_author + ", Host=" + 
getContext().getRequest().getRemoteAddr() );
 
         // Set author information and other metadata
-        WikiPage modifiedPage = (WikiPage) wikiContext.getPage().clone();
+        WikiPage modifiedPage = (WikiPage)page.clone();
         modifiedPage.setAuthor( m_author );
         if( m_changeNote != null )
         {

Modified: 
incubator/jspwiki/trunk/src/java/org/apache/wiki/action/ViewActionBean.java
URL: 
http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/action/ViewActionBean.java?rev=831797&r1=831796&r2=831797&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/action/ViewActionBean.java 
(original)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/action/ViewActionBean.java 
Mon Nov  2 03:45:48 2009
@@ -32,12 +32,15 @@
 import net.sourceforge.stripes.validation.ValidationErrors;
 
 import org.apache.wiki.WikiEngine;
+import org.apache.wiki.WikiProvider;
 import org.apache.wiki.api.WikiException;
 import org.apache.wiki.api.WikiPage;
 import org.apache.wiki.auth.permissions.PagePermission;
+import org.apache.wiki.content.PageNotFoundException;
 import org.apache.wiki.log.Logger;
 import org.apache.wiki.log.LoggerFactory;
 import org.apache.wiki.ui.stripes.HandlerPermission;
+import org.apache.wiki.ui.stripes.WikiActionBeanContext;
 import org.apache.wiki.ui.stripes.WikiRequestContext;
 
 /**
@@ -51,6 +54,8 @@
 
     private String m_renameTo = null;
 
+    private int m_version = WikiProvider.LATEST_VERSION; 
+
     public ViewActionBean()
     {
         super();
@@ -81,6 +86,15 @@
     }
 
     /**
+     * Returns the version of the page.
+     * @return the version
+     */
+    public int getVersion()
+    {
+        return m_version;
+    }
+
+    /**
      * Handler that forwards to the page information display JSP
      * <code>/PageInfo.jsp</code>.
      * 
@@ -119,17 +133,18 @@
     @After( stages = LifecycleStage.BindingAndValidation )
     public Resolution resolvePage() throws WikiException
     {
-        WikiEngine engine = getContext().getEngine();
+        WikiActionBeanContext context = getContext();
+        WikiEngine engine = context.getEngine();
 
         if( isSpecialPageView() )
         {
             // The page might be null because it's a special page
             // WikiPageTypeConverter
             // refused to convert. If so, redirect.
-            String pageName = getContext().getRequest().getParameter( "page" );
+            String pageName = context.getRequest().getParameter( "page" );
             if( pageName != null )
             {
-                URI uri = getContext().getEngine().getSpecialPageReference( 
pageName );
+                URI uri = engine.getSpecialPageReference( pageName );
                 if( uri != null )
                 {
                     return new RedirectResolution( uri.toString() );
@@ -149,34 +164,49 @@
         }
 
         // If page still missing, it's an error condition
-        if( getPage() == null )
+        WikiPage page = getPage();
+        if( page == null )
         {
             throw new WikiException( "Page not supplied, and WikiEngine does 
not define a front page! This is highly unusual." );
         }
 
         // Is there an ALIAS attribute in the wiki page?
-        String specialUrl = (String) getPage().getAttribute( WikiPage.ALIAS );
+        String specialUrl = (String) page.getAttribute( WikiPage.ALIAS );
         if( specialUrl != null )
         {
-            return new RedirectResolution( getContext().getViewURL( specialUrl 
) );
+            return new RedirectResolution( context.getViewURL( specialUrl ) );
         }
 
         // Is there a REDIRECT attribute in the wiki page?
-        specialUrl = (String) getPage().getAttribute( WikiPage.REDIRECT );
+        specialUrl = (String) page.getAttribute( WikiPage.REDIRECT );
         if( specialUrl != null )
         {
-            return new RedirectResolution( getContext().getViewURL( specialUrl 
) );
+            return new RedirectResolution( context.getViewURL( specialUrl ) );
         }
 
         // Ok, the page exists. If attachment, make sure it's directed to the
         // "info" handler
-        WikiPage page = getPage();
-        String handler = getContext().getEventName();
-        if( getPage().isAttachment() && !"info".equals( handler ) )
+        String handler = context.getEventName();
+        if( page.isAttachment() && !"info".equals( handler ) )
         {
             return new RedirectResolution( ViewActionBean.class, "info" 
).addParameter( "page", page.getPath().toString() );
         }
 
+        // Now, retrieve the requested page or attachment version
+        if ( engine.pageExists( page.getPath().toString(), m_version ) )
+        {
+            try
+            {
+                page = engine.getPage( page.getPath().toString(), m_version );
+                setPage( page );
+            }
+            catch( PageNotFoundException e )
+            {
+                // Shouldn't happen!
+                throw new WikiException( "Did not retrieve the page even 
though it exists. "
+                                         + " This is a BUG. ", e );
+            }
+        }
         return null;
     }
 
@@ -202,6 +232,16 @@
     }
 
     /**
+     * Sets the version of the page to show. If not set, defaults to
+     * {...@link WikiProvider#LATEST_VERSION}.
+     * @param version the version
+     */
+    public void setVersion( int version )
+    {
+        m_version = version;
+    }
+
+    /**
      * Default handler that simply forwards the user back to the display JSP
      * <code>/Wiki.jsp</code>. Every ActionBean needs a default handler to
      * function properly, so we use this (very simple) one.

Modified: 
incubator/jspwiki/trunk/src/java/org/apache/wiki/content/ContentManager.java
URL: 
http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/content/ContentManager.java?rev=831797&r1=831796&r2=831797&view=diff
==============================================================================
--- 
incubator/jspwiki/trunk/src/java/org/apache/wiki/content/ContentManager.java 
(original)
+++ 
incubator/jspwiki/trunk/src/java/org/apache/wiki/content/ContentManager.java 
Mon Nov  2 03:45:48 2009
@@ -950,17 +950,33 @@
                 return false;
             }
             
-            if ( version == WikiProvider.LATEST_VERSION )
+            // Is Node's current version the one we want?
+            if ( node.hasProperty( JCRWikiPage.ATTR_VERSION ) )
+            {
+                Property versionProperty = node.getProperty( 
JCRWikiPage.ATTR_VERSION );
+                try
+                {
+                    if ( version == versionProperty.getLong() )
+                    {
+                        return true;
+                    }
+                }
+                catch ( ValueFormatException e ) {
+                    throw new ProviderException("Property " + 
JCRWikiPage.ATTR_VERSION + 
+                                                " for node " + jcrPath + " 
cannot be " +
+                                                " coerced to a Long. This is 
strange." );
+                }
+            }
+
+            boolean noVersions = !node.hasNode( WIKI_VERSIONS );
+            if ( version == WikiProvider.LATEST_VERSION || noVersions )
             {
                 return !isNew( node );
             }
             
             String v = Integer.toString( version );
-            if ( node.hasNode( WIKI_VERSIONS ) )
-            {
-                Node versions = node.getNode( WIKI_VERSIONS );
-                return versions.hasNode( v ) && !isNew( versions.getNode( v ) 
);
-            }
+            Node versions = node.getNode( WIKI_VERSIONS );
+            return versions.hasNode( v ) && !isNew( versions.getNode( v ) );
         }
         catch ( PathNotFoundException e )
         {
@@ -971,7 +987,6 @@
         {
             throw new ProviderException( "Unable to check for page existence", 
e );
         }
-        return false;
     }
 
     /**

Modified: 
incubator/jspwiki/trunk/tests/java/org/apache/wiki/action/ViewActionBeanTest.java
URL: 
http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/java/org/apache/wiki/action/ViewActionBeanTest.java?rev=831797&r1=831796&r2=831797&view=diff
==============================================================================
--- 
incubator/jspwiki/trunk/tests/java/org/apache/wiki/action/ViewActionBeanTest.java
 (original)
+++ 
incubator/jspwiki/trunk/tests/java/org/apache/wiki/action/ViewActionBeanTest.java
 Mon Nov  2 03:45:48 2009
@@ -115,22 +115,79 @@
 
     
     public void testView() throws Exception {
-        // Save page Test
-        m_engine.saveText("Test", "This is a test.");
-        WikiPage page = m_engine.getPage("Test");
-        assertNotNull("Did not save page Test!", page);
-        
-        // Set the 'page' request parameter to 'Test'...
-        MockRoundtrip trip = m_engine.guestTrip( "/Wiki.action");
-        trip.setParameter("page", "Test");
-        trip.execute("view");
+        String pageName = "ViewActionBeanTest";
+
+        // Save test page
+        m_engine.saveText( pageName, "This is a test." );
+        WikiPage page = m_engine.getPage( pageName );
+        assertNotNull("Did not save page " + pageName + "!", page);
+        
+        // Set the 'page' request parameter to 'ViewActionBeanTest'...
+        MockRoundtrip trip = m_engine.guestTrip( "/Wiki.action" );
+        trip.setParameter( "page", pageName );
+        trip.execute( "view" );
 
         // ...we should automatically see Test bound to the ActionBean (nice!)
-        ViewActionBean bean = trip.getActionBean(ViewActionBean.class);
+        ViewActionBean bean = trip.getActionBean( ViewActionBean.class );
         assertEquals( page, bean.getPage() );
         
         // ...and the destination should be Wiki.jsp (aka display JSP)
-        assertEquals("/Wiki.jsp", trip.getDestination() );
+        assertEquals( "/Wiki.jsp", trip.getDestination() );
+    }
+
+    public void testViewVersion() throws Exception {
+        String pageName = "ViewActionBeanTest";
+        m_engine.deletePage( pageName );
+
+        // Save test page
+        m_engine.saveText( pageName, "This is the first version." );
+        WikiPage page = m_engine.getPage( pageName );
+        assertNotNull("Did not save page " + pageName + "!", page);
+        
+        // Go get the first version
+        MockRoundtrip trip = m_engine.guestTrip( "/Wiki.action" );
+        trip.setParameter( "page", pageName );
+        trip.execute( "view" );
+        ViewActionBean bean = trip.getActionBean( ViewActionBean.class );
+        assertEquals( page, bean.getPage() );
+        String pageText = page.getContentAsString();
+        assertEquals( "This is the first version.\r\n", pageText );
+        
+        // Save a second version
+        m_engine.saveText( pageName, "This is the second version." );
+        WikiPage pageV1 = m_engine.getPage( pageName, 1 );
+        WikiPage pageV2 = m_engine.getPage( pageName, 2 );
+        
+        // Go get the first version again
+        trip = m_engine.guestTrip( "/Wiki.action" );
+        trip.setParameter( "page", pageName );
+        trip.setParameter( "version", "1" );
+        trip.execute( "view" );
+        bean = trip.getActionBean( ViewActionBean.class );
+        assertEquals( pageV1, bean.getPage() );
+        pageText = pageV1.getContentAsString();
+        assertEquals( "This is the first version.\r\n", pageText );
+        
+        // Go get the second version
+        trip = m_engine.guestTrip( "/Wiki.action" );
+        trip.setParameter( "page", pageName );
+        trip.setParameter( "version", "2" );
+        trip.execute( "view" );
+        bean = trip.getActionBean( ViewActionBean.class );
+        assertEquals( pageV2, bean.getPage() );
+        pageText = pageV2.getContentAsString();
+        assertEquals( "This is the second version.\r\n", pageText );
+        
+        // Go get the "latest" version
+        trip = m_engine.guestTrip( "/Wiki.action" );
+        trip.setParameter( "page", pageName );
+        trip.execute( "view" );
+        bean = trip.getActionBean( ViewActionBean.class );
+        assertEquals( pageV2, bean.getPage() );
+        pageText = pageV2.getContentAsString();
+        assertEquals( "This is the second version.\r\n", pageText );
+        
+        m_engine.deletePage( pageName );
     }
     
     public static Test suite()

Modified: 
incubator/jspwiki/trunk/tests/java/org/apache/wiki/content/ContentManagerTest.java
URL: 
http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/java/org/apache/wiki/content/ContentManagerTest.java?rev=831797&r1=831796&r2=831797&view=diff
==============================================================================
--- 
incubator/jspwiki/trunk/tests/java/org/apache/wiki/content/ContentManagerTest.java
 (original)
+++ 
incubator/jspwiki/trunk/tests/java/org/apache/wiki/content/ContentManagerTest.java
 Mon Nov  2 03:45:48 2009
@@ -29,6 +29,7 @@
 import junit.framework.TestSuite;
 
 import org.apache.wiki.TestEngine;
+import org.apache.wiki.WikiProvider;
 import org.apache.wiki.api.WikiException;
 import org.apache.wiki.api.WikiPage;
 import org.apache.wiki.providers.ProviderException;
@@ -134,6 +135,24 @@
         assertEquals( 2, allPages.size() );
     }
 
+    public void testPageExists() throws Exception
+    {
+        WikiPath path = WikiPath.valueOf( "ContentManagerTest-PageExists" );
+
+        // Save a new page
+        m_engine.saveText( path.toString(), "This is the first version" );
+        assertTrue( m_mgr.pageExists( path, WikiProvider.LATEST_VERSION ) );
+        assertTrue( m_mgr.pageExists( path, 1 ) );
+
+        // Save another version
+        m_engine.saveText( path.toString(), "This is the second version" );
+        assertTrue( m_mgr.pageExists( path, WikiProvider.LATEST_VERSION ) );
+        assertTrue( m_mgr.pageExists( path, 2 ) );
+        assertTrue( m_mgr.pageExists( path, 1 ) );
+
+        m_engine.deletePage( path.toString() );
+    }
+
     public void testVersions() throws Exception
     {
         String content = "Test Content";


Reply via email to