You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jspwiki.apache.org by ja...@apache.org on 2009/03/04 10:13:57 UTC

svn commit: r749948 - in /incubator/jspwiki/trunk: ./ doc/ etc/ src/java/org/apache/wiki/ src/java/org/apache/wiki/api/ src/java/org/apache/wiki/auth/ src/java/org/apache/wiki/content/ tests/java/org/apache/wiki/content/

Author: jalkanen
Date: Wed Mar  4 09:13:57 2009
New Revision: 749948

URL: http://svn.apache.org/viewvc?rev=749948&view=rev
Log:
JSPWIKI-421.  WikiPages are now stored in the JCR repository.

Added:
    incubator/jspwiki/trunk/doc/README - JCR Changes.txt
Modified:
    incubator/jspwiki/trunk/ChangeLog
    incubator/jspwiki/trunk/etc/   (props changed)
    incubator/jspwiki/trunk/src/java/org/apache/wiki/JCRWikiPage.java
    incubator/jspwiki/trunk/src/java/org/apache/wiki/PageManager.java
    incubator/jspwiki/trunk/src/java/org/apache/wiki/ReferenceManager.java
    incubator/jspwiki/trunk/src/java/org/apache/wiki/Release.java
    incubator/jspwiki/trunk/src/java/org/apache/wiki/WikiEngine.java
    incubator/jspwiki/trunk/src/java/org/apache/wiki/api/WikiPage.java
    incubator/jspwiki/trunk/src/java/org/apache/wiki/auth/UserManager.java
    incubator/jspwiki/trunk/src/java/org/apache/wiki/content/ContentManager.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=749948&r1=749947&r2=749948&view=diff
==============================================================================
--- incubator/jspwiki/trunk/ChangeLog (original)
+++ incubator/jspwiki/trunk/ChangeLog Wed Mar  4 09:13:57 2009
@@ -1,3 +1,10 @@
+2009-02-14  Janne Jalkanen <ja...@apache.org>
+
+        * 3.0.0-svn-78
+        
+        * JSPWIKI-421: First commit. PageManager removed from use;
+        AttachmentManager not yet migrated.
+
 2009-03-03  Harry Metske <me...@apache.org>
 
         * 3.0.0-svn-77

Added: incubator/jspwiki/trunk/doc/README - JCR Changes.txt
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/doc/README%20-%20JCR%20Changes.txt?rev=749948&view=auto
==============================================================================
--- incubator/jspwiki/trunk/doc/README - JCR Changes.txt (added)
+++ incubator/jspwiki/trunk/doc/README - JCR Changes.txt Wed Mar  4 09:13:57 2009
@@ -0,0 +1,71 @@
+JSPWiki 3 contains an all-new backend based on the JSR-170 specification.
+This document details the changes that this API will cause on the developers.
+
+Please note that since the integration work is not yet complete, some
+of the information in this document may not be up to date.
+
+Please see the TODO list in JSPWIKI-421 for information as to the current
+state of the migration.
+
+Architectural changes
+=====================
+
+Previously, JSPWiki has created a difference between WikiPages and Attachments.
+This separation is now gone since everything is now handled through the
+ContentManager class.  The wiki markup is separated through its own particular
+MIME type.  While this facility is not yet in 3.0, the intent is to turn this
+gradually into a "renderer" metaphor, where different content is rendered
+through different renderers - for example JSPWikiMarkup is parsed through 
+the JSPWikiMarkupParser, then rendered with the XHTMLRenderer.
+
+In addition, WikiPage has become an "active" object, in the sense that direct
+manipulation of its attributes will reflect on the repository state.  However,
+you will need to call WikiPage.save() in order for these changes to be permanent.
+
+The basic idea is that we will use the rich metadata model allowed by JCR and
+attach practically everything which has so far lived in separate subdirectories 
+(e.g. in the workDir) as page properties.  For example, references are no longer
+cached by ReferenceManager, but they are directly written in the repository
+as a property of the WikiPage.  Also, variables manipulated with SET are also
+directly written to the repository.
+
+However, the difficult bits of the JCR Repository management are hidden
+by the ContentManager class.  The biggest issue is that ContentManager holds
+a ThreadLocal reference to JCR Session objects without releasing them which means
+that you *need* to clear any changes you've made by calling ContentManager.discardModifications()
+in case of failure, or they will stay around when the next modification comes.
+
+
+Configuration
+=============
+
+All jspwiki.properties settings relating to providers are gone. They
+are replaced by a single setting "jspwiki.repository".
+
+Each backend will use its own configuration methodology. For Priha
+(the JCR implementation we ship with) this is done in a file called
+"priha.properties". Please see Priha configuration manual for further
+details.
+
+
+API Changes
+===========
+
+PageManager and AttachmentManager are now deprecated and will be gone
+soon.
+
+There is a new class, ContentManager, which takes care of all the functionality
+of PageManager and AttachmentManager.
+
+WikiProvider interface is gone, as are all different provider classes
+which implemented it.
+
+WikiPage has gained a series of new methods for direct manipulation of
+the page content.
+
+
+Versioning
+==========
+
+TBD, this has not yet been decided.
+ 
\ No newline at end of file

Propchange: incubator/jspwiki/trunk/etc/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Wed Mar  4 09:13:57 2009
@@ -1,3 +1,4 @@
 jspwiki.properties
 jspwiki.jks
 classes
+i18n

Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/JCRWikiPage.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/JCRWikiPage.java?rev=749948&r1=749947&r2=749948&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/JCRWikiPage.java (original)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/JCRWikiPage.java Wed Mar  4 09:13:57 2009
@@ -20,13 +20,14 @@
  */
 package org.apache.wiki;
 
-import java.io.InputStream;
+import java.io.*;
 import java.util.*;
 
-import javax.jcr.Node;
-import javax.jcr.PathNotFoundException;
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
+import javax.jcr.*;
+import javax.jcr.lock.LockException;
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionException;
 
 import org.apache.wiki.api.WikiException;
 import org.apache.wiki.api.WikiPage;
@@ -35,12 +36,12 @@
 import org.apache.wiki.auth.acl.AclImpl;
 import org.apache.wiki.content.ContentManager;
 import org.apache.wiki.content.WikiName;
+import org.apache.wiki.providers.ProviderException;
 import org.apache.wiki.providers.WikiPageProvider;
 
 
 /**
- *  Simple wrapper class for the Wiki page attributes.  The Wiki page
- *  content is moved around in Strings, though.
+ *  JCR-backed implementation of the WikiPage.
  *  
  *  @since 3.0
  */
@@ -55,16 +56,15 @@
 {
     private static final long serialVersionUID = 1L;
 
+    private static final String LASTMODIFIED = "wiki:lastModified";
+
+    private static final String AUTHOR       = "wiki:author";
+
+    private static final String ACL = "wiki:acl";
+
     private       WikiName   m_name;
     private       WikiEngine m_engine;
-    private Date             m_lastModified;
-    private long             m_fileSize = -1;
-    private int              m_version = WikiPageProvider.LATEST_VERSION;
-    private String           m_author = null;
-    private final HashMap<String,Object> m_attributes = new HashMap<String,Object>();
-    private Node             m_node;
-    
-    private Acl m_accessList = null;
+    private String           m_jcrPath = null;
     
     /**
      *  Use {@link WikiEngine#createPage(String)} instead.
@@ -72,8 +72,7 @@
      */
     public JCRWikiPage( WikiEngine engine, String path )
     {
-        m_engine = engine;
-        m_name   = WikiName.valueOf( path );
+        this( engine, WikiName.valueOf( path ) );
     }
 
     /** 
@@ -82,22 +81,22 @@
      */
     public JCRWikiPage( WikiEngine engine, WikiName name )
     {
-        m_engine = engine;
-        m_name   = name;
+        m_engine  = engine;
+        m_name    = name;
+        m_jcrPath = ContentManager.getJCRPath( name );
     }
 
     public JCRWikiPage(WikiEngine engine, Node node)
-        throws RepositoryException, WikiException
+        throws RepositoryException, ProviderException
     {
-        m_engine = engine;
-        m_node   = node;
-        m_name   = ContentManager.getWikiPath( node.getPath() );
+        m_engine  = engine;
+        m_jcrPath = node.getPath();
+        m_name    = ContentManager.getWikiPath( node.getPath() );
     }
-    
-    
-    public Node getJCRNode()
+        
+    public Node getJCRNode() throws RepositoryException
     {
-        return m_node;
+        return m_engine.getContentManager().getJCRNode(m_jcrPath);
     }
     
     /* (non-Javadoc)
@@ -111,9 +110,9 @@
     /* (non-Javadoc)
      * @see org.apache.wiki.WikiPage#getQualifiedName()
      */
-    public String getQualifiedName()
+    public WikiName getQualifiedName()
     {
-        return m_name.toString();
+        return m_name;
     }
 
     /* (non-Javadoc)
@@ -121,23 +120,58 @@
      */
     public Object getAttribute( String key )
     {
-        return m_attributes.get( key );
+        try
+        {
+            Property property = getJCRNode().getProperty( key );
+            
+            return getValue( property );
+        }
+        catch( ItemNotFoundException e ) {}
+        catch( RepositoryException e ) {} // FIXME: Should log this at least.
+        
+        return null;
+    }
+
+    private Object getValue( Property property ) throws RepositoryException, ValueFormatException
+    {
+        switch( property.getType() )
+        {
+            case PropertyType.STRING:
+                return property.getString();
+        }
+        
+        return property.getString();
     }
 
     /* (non-Javadoc)
      * @see org.apache.wiki.WikiPage#setAttribute(java.lang.String, java.lang.Object)
      */
-    public void setAttribute( String key, Object attribute )
+    public void setAttribute( String key, String attribute )
     {
-        m_attributes.put( key, attribute );
+        try
+        {
+            getJCRNode().setProperty( key, attribute );
+        }
+        catch(RepositoryException e) {} // FIXME: Should log
     }
 
+    public void setAttribute( String key, Date attribute )
+    {
+        try
+        {
+            Calendar c = Calendar.getInstance();
+            c.setTime( attribute );
+            getJCRNode().setProperty( key, c );
+        }
+        catch(RepositoryException e) {} // FIXME: Should log        
+    }
+    
     /* (non-Javadoc)
      * @see org.apache.wiki.WikiPage#getAttributes()
      */
     public Map getAttributes() 
     {
-        return m_attributes;
+        return null; // FIXME: m_attributes;
     }
 
     /* (non-Javadoc)
@@ -145,7 +179,18 @@
      */
     public Object removeAttribute( String key )
     {
-        return m_attributes.remove( key );
+        try
+        {
+            Property p = getJCRNode().getProperty( key );
+            
+            Object value = getValue(p);
+            p.remove();
+        
+            return value;
+        }
+        catch(RepositoryException e) {}
+        
+        return null;
     }
 
     /* (non-Javadoc)
@@ -153,7 +198,15 @@
      */
     public Date getLastModified()
     {
-        return m_lastModified;
+        try
+        {
+            return getJCRNode().getProperty( LASTMODIFIED ).getDate().getTime();
+        }
+        catch( RepositoryException e )
+        {
+            // FIXME: Should rethrow
+        }
+        return null;
     }
 
     /* (non-Javadoc)
@@ -161,15 +214,7 @@
      */
     public void setLastModified( Date date )
     {
-        m_lastModified = date;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.wiki.WikiPage#setVersion(int)
-     */
-    public void setVersion( int version )
-    {
-        m_version = version;
+        setAttribute( LASTMODIFIED, date );
     }
 
     /* (non-Javadoc)
@@ -177,7 +222,8 @@
      */
     public int getVersion()
     {
-        return m_version;
+        return -1;
+        //return getJCRNode().getBaseVersion().
     }
 
     /* (non-Javadoc)
@@ -185,15 +231,13 @@
      */
     public long getSize()
     {
-        return m_fileSize;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.wiki.WikiPage#setSize(long)
-     */
-    public void setSize( long size )
-    {
-        m_fileSize = size;
+        try
+        {
+            return getJCRNode().getProperty( ATTR_CONTENT ).getLength();
+        }
+        catch(RepositoryException e){}
+        
+        return -1;
     }
 
     /* (non-Javadoc)
@@ -201,7 +245,50 @@
      */
     public Acl getAcl()
     {
-        return m_accessList;
+        ObjectInputStream in = null;
+        
+        try
+        {
+            Property acl = getJCRNode().getProperty( ACL );
+            
+            in = new ObjectInputStream( acl.getStream() );
+            
+            Acl a = (Acl) in.readObject();
+            
+            return a;
+        }
+        catch( PathNotFoundException e )
+        {
+            // No ACL, so this is ok.
+        }
+        catch( RepositoryException e )
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        catch( IOException e )
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        catch( ClassNotFoundException e )
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        finally
+        {
+            if( in != null )
+                try
+                {
+                    in.close();
+                }
+                catch( IOException e )
+                {
+                }
+        }
+        
+        return null;
     }
 
     /* (non-Javadoc)
@@ -209,7 +296,49 @@
      */
     public void setAcl( Acl acl )
     {
-        m_accessList = acl;
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        
+        ObjectOutputStream oout;
+        try
+        {
+            oout = new ObjectOutputStream(out);
+            oout.writeObject( acl );
+        
+            oout.close();
+        
+            getJCRNode().setProperty( ACL, new ByteArrayInputStream(out.toByteArray()) );
+        }
+        catch( IOException e )
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        catch( ValueFormatException e )
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        catch( VersionException e )
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        catch( LockException e )
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        catch( ConstraintViolationException e )
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        catch( RepositoryException e )
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        
     }
 
     /* (non-Javadoc)
@@ -217,7 +346,7 @@
      */
     public void setAuthor( String author )
     {
-        m_author = author;
+        setAttribute( AUTHOR, author );
     }
 
     /* (non-Javadoc)
@@ -225,7 +354,7 @@
      */
     public String getAuthor()
     {
-        return m_author;
+        return (String)getAttribute( AUTHOR );
     }
     
     /* (non-Javadoc)
@@ -238,39 +367,11 @@
     }
 
     /* (non-Javadoc)
-     * @see org.apache.wiki.WikiPage#invalidateMetadata()
-     */
-    public void invalidateMetadata()
-    {        
-        m_hasMetadata = false;
-        setAcl( null );
-        m_attributes.clear();
-    }
-
-    private boolean m_hasMetadata = false;
-
-    /* (non-Javadoc)
-     * @see org.apache.wiki.WikiPage#hasMetadata()
-     */
-    public boolean hasMetadata()
-    {
-        return m_hasMetadata;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.wiki.WikiPage#setHasMetadata()
-     */
-    public void setHasMetadata()
-    {
-        m_hasMetadata = true;
-    }
-
-    /* (non-Javadoc)
      * @see org.apache.wiki.WikiPage#toString()
      */
     public String toString()
     {
-        return "WikiPage ["+m_name+",ver="+m_version+",mod="+m_lastModified+"]";
+        return "WikiPage ["+m_name+",ver="+getVersion()+",mod="+getLastModified()+"]";
     }
 
     /* (non-Javadoc)
@@ -280,30 +381,6 @@
     {
         JCRWikiPage p = new JCRWikiPage( m_engine, m_name );
             
-        p.m_author       = m_author;
-        p.m_version      = m_version;
-        p.m_lastModified = m_lastModified != null ? (Date)m_lastModified.clone() : null;
-
-        p.m_fileSize     = m_fileSize;
-
-        for( Map.Entry<String,Object> entry : m_attributes.entrySet() )
-        {
-            p.m_attributes.put( entry.getKey(), 
-                                entry.getValue() );
-        }
-
-        if( m_accessList != null )
-        {
-            p.m_accessList = new AclImpl();
-            
-            for( Enumeration entries = m_accessList.entries(); entries.hasMoreElements(); )
-            {
-                AclEntry e = (AclEntry)entries.nextElement();
-            
-                p.m_accessList.addEntry( e );
-            }
-        }
-            
         return p;
     }
     
@@ -356,7 +433,7 @@
      */
     public int hashCode()
     {
-        return m_name.hashCode() * m_version;
+        return m_name.hashCode() * getVersion();
     }
 
     public InputStream getContentAsStream()
@@ -381,7 +458,7 @@
     {
         try
         {
-            m_node.setProperty( ATTR_CONTENT, in );
+            getJCRNode().setProperty( ATTR_CONTENT, in );
         }
         catch( RepositoryException e )
         {
@@ -395,28 +472,29 @@
         
     }
     
-    public void save() throws WikiException
+    public void save() throws ProviderException
     {
         try
         {
-            if( m_node.isNew() )
-                m_node.getParent().save();
+            Node nd = getJCRNode();
+            if( nd.isNew() )
+                nd.getParent().save();
             else
-                m_node.save();
+                nd.save();
         }
         catch( RepositoryException e )
         {
-            throw new WikiException("Save failed",e);
+            throw new ProviderException("Save failed",e);
         }
     }
     
     private static final String ATTR_CONTENT = "wiki:content";
     
-    public String getContentAsString() throws WikiException
+    public String getContentAsString() throws ProviderException
     {
         try
         {
-            Property p = m_node.getProperty( ATTR_CONTENT );
+            Property p = getJCRNode().getProperty( ATTR_CONTENT );
                 
             return p.getString();
         }
@@ -425,22 +503,59 @@
         }
         catch( RepositoryException e )
         {
-            throw new WikiException("Unable to get property",e);
+            throw new ProviderException("Unable to get property",e);
         }
         
         return null;
     }
 
-    public void setContent( String content ) throws WikiException
+    public void setContent( String content ) throws ProviderException
     {
         try
         {
-            m_node.setProperty( ATTR_CONTENT, content );
+            getJCRNode().setProperty( ATTR_CONTENT, content );
         }
         catch( RepositoryException e )
         {
-            throw new WikiException("Unable to set content",e);
+            throw new ProviderException("Unable to set content",e);
         }
     }
 
+    // FIXME: The following are obsolete and must go.
+    public boolean hasMetadata()
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public void invalidateMetadata()
+    {
+        // TODO Auto-generated method stub
+        
+    }
+
+    public void setAttribute( String key, Object attribute )
+    {
+        // TODO Auto-generated method stub
+        
+    }
+
+    public void setHasMetadata()
+    {
+        // TODO Auto-generated method stub
+        
+    }
+
+    public void setSize( long size )
+    {
+        // TODO Auto-generated method stub
+        
+    }
+
+    public void setVersion( int version )
+    {
+        // TODO Auto-generated method stub
+        
+    }
+
 }

Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/PageManager.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/PageManager.java?rev=749948&r1=749947&r2=749948&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/PageManager.java (original)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/PageManager.java Wed Mar  4 09:13:57 2009
@@ -20,35 +20,19 @@
  */
 package org.apache.wiki;
 
-import java.io.IOException;
-import java.security.Permission;
-import java.security.Principal;
-import java.util.*;
+import java.util.Collection;
+import java.util.List;
+import java.util.Properties;
 
-import org.apache.commons.lang.ArrayUtils;
-import org.apache.wiki.api.FilterException;
 import org.apache.wiki.api.WikiException;
 import org.apache.wiki.api.WikiPage;
-import org.apache.wiki.auth.WikiPrincipal;
-import org.apache.wiki.auth.WikiSecurityException;
-import org.apache.wiki.auth.acl.Acl;
-import org.apache.wiki.auth.acl.AclEntry;
-import org.apache.wiki.auth.acl.AclEntryImpl;
-import org.apache.wiki.auth.user.UserProfile;
-import org.apache.wiki.event.*;
+import org.apache.wiki.content.ContentManager;
+import org.apache.wiki.content.WikiName;
 import org.apache.wiki.log.Logger;
 import org.apache.wiki.log.LoggerFactory;
 import org.apache.wiki.modules.ModuleManager;
-import org.apache.wiki.providers.CachingProvider;
 import org.apache.wiki.providers.ProviderException;
-import org.apache.wiki.providers.RepositoryModifiedException;
 import org.apache.wiki.providers.WikiPageProvider;
-import org.apache.wiki.util.ClassUtil;
-import org.apache.wiki.util.TextUtil;
-import org.apache.wiki.util.WikiBackgroundThread;
-import org.apache.wiki.workflow.Outcome;
-import org.apache.wiki.workflow.Task;
-import org.apache.wiki.workflow.Workflow;
 
 
 /**
@@ -64,7 +48,7 @@
 // FIXME: This class currently only functions just as an extra layer over providers,
 //        complicating things.  We need to move more provider-specific functionality
 //        from WikiEngine (which is too big now) into this class.
-public class PageManager extends ModuleManager implements WikiEventListener
+public class PageManager extends ModuleManager
 {
     private static final long serialVersionUID = 1L;
 
@@ -117,14 +101,6 @@
 
     private WikiPageProvider m_provider;
 
-    protected HashMap<String,PageLock> m_pageLocks = new HashMap<String,PageLock>();
-
-    private WikiEngine m_engine;
-
-    private int m_expiryTime = 60;
-
-    private LockReaper m_reaper = null;
-
     /**
      *  Creates a new PageManager.
      *  
@@ -136,66 +112,6 @@
         throws WikiException
     {
         super( engine );
-
-        String classname;
-
-        m_engine = engine;
-
-        boolean useCache = "true".equals(props.getProperty( PROP_USECACHE ));
-
-        m_expiryTime = TextUtil.parseIntParameter( props.getProperty( PROP_LOCKEXPIRY ), 60 );
-
-        //
-        //  If user wants to use a cache, then we'll use the CachingProvider.
-        //
-        if( useCache )
-        {
-            classname = "org.apache.wiki.providers.CachingProvider";
-        }
-        else
-        {
-            classname = WikiEngine.getRequiredProperty( props, PROP_PAGEPROVIDER );
-        }
-
-        try
-        {
-            log.debug("Page provider class: '"+classname+"'");
-
-            Class providerclass = ClassUtil.findClass( "org.apache.wiki.providers",
-                                                       classname );
-
-            m_provider = (WikiPageProvider)providerclass.newInstance();
-
-            log.debug("Initializing page provider class "+m_provider);
-            m_provider.initialize( m_engine, props );
-        }
-        catch( ClassNotFoundException e )
-        {
-            log.error("Unable to locate provider class '"+classname+"'",e);
-            throw new WikiException("no provider class");
-        }
-        catch( InstantiationException e )
-        {
-            log.error("Unable to create provider class '"+classname+"'",e);
-            throw new WikiException("faulty provider class");
-        }
-        catch( IllegalAccessException e )
-        {
-            log.error("Illegal access to provider class '"+classname+"'",e);
-            throw new WikiException("illegal provider class");
-        }
-        catch( NoRequiredPropertyException e )
-        {
-            log.error("Provider did not found a property it was looking for: "+e.getMessage(),
-                      e);
-            throw e;  // Same exception works.
-        }
-        catch( IOException e )
-        {
-            log.error("An I/O exception occurred while trying to create a new page provider: "+classname, e );
-            throw new WikiException("Unable to start page provider: "+e.getMessage());
-        }
-
     }
 
 
@@ -220,7 +136,7 @@
     public Collection getAllPages()
         throws ProviderException
     {
-        return m_provider.getAllPages();
+        return m_engine.getContentManager().getAllPages(null);
     }
 
     /**
@@ -236,49 +152,7 @@
     public String getPageText( String pageName, int version )
         throws ProviderException
     {
-        if( pageName == null || pageName.length() == 0 )
-        {
-            throw new ProviderException("Illegal page name");
-        }
-
-        String text = null;
-
-        try
-        {
-            text = m_provider.getPageText( pageName, version );
-        }
-        catch( RepositoryModifiedException e )
-        {
-            //
-            //  This only occurs with the latest version.
-            //
-            log.info("Repository has been modified externally while fetching page "+pageName );
-
-            //
-            //  Empty the references and yay, it shall be recalculated
-            //
-            //WikiPage p = new WikiPage( pageName );
-            WikiPage p = m_provider.getPageInfo( pageName, version );
-
-            m_engine.updateReferences( p );
-
-            if( p != null )
-            {
-                m_engine.getSearchManager().reindexPage( p );
-                text = m_provider.getPageText( pageName, version );
-            }
-            else
-            {
-                //
-                //  Make sure that it no longer exists in internal data structures either.
-                //
-                WikiPage dummy = m_engine.createPage(pageName);
-                m_engine.getSearchManager().pageRemoved(dummy);
-                m_engine.getReferenceManager().pageRemoved(dummy);
-            }
-        }
-
-        return text;
+        return m_engine.getContentManager().getPage( WikiName.valueOf( pageName ), version ).getContentAsString();
     }
 
     /**
@@ -302,12 +176,14 @@
     public void putPageText( WikiPage page, String content )
         throws ProviderException
     {
-        if( page == null || page.getName() == null || page.getName().length() == 0 )
-        {
-            throw new ProviderException("Illegal page name");
-        }
-
-        m_provider.putPageText( page, content );
+        WikiPage p = m_engine.getContentManager().getPage( page.getQualifiedName() );
+        
+        if( p == null )
+            p = m_engine.getContentManager().addPage( page.getQualifiedName(), ContentManager.JSPWIKI_CONTENT_TYPE );
+            
+        p.setContent(content);
+        
+        p.save();
     }
 
     /**
@@ -321,47 +197,7 @@
      */
     public PageLock lockPage( WikiPage page, String user )
     {
-        PageLock lock = null;
-
-        if( m_reaper == null )
-        {
-            //
-            //  Start the lock reaper lazily.  We don't want to start it in
-            //  the constructor, because starting threads in constructors
-            //  is a bad idea when it comes to inheritance.  Besides,
-            //  laziness is a virtue.
-            //
-            m_reaper = new LockReaper( m_engine );
-            m_reaper.start();
-        }
-
-        synchronized( m_pageLocks )
-        {
-            fireEvent( WikiPageEvent.PAGE_LOCK, page.getName() ); // prior to or after actual lock?
-
-            lock = m_pageLocks.get( page.getName() );
-
-            if( lock == null )
-            {
-                //
-                //  Lock is available, so make a lock.
-                //
-                Date d = new Date();
-                lock = new PageLock( page, user, d,
-                                     new Date( d.getTime() + m_expiryTime*60*1000L ) );
-
-                m_pageLocks.put( page.getName(), lock );
-
-                log.debug( "Locked page "+page.getName()+" for "+user);
-            }
-            else
-            {
-                log.debug( "Page "+page.getName()+" already locked by "+lock.getLocker() );
-                lock = null; // Nothing to return
-            }
-        }
-
-        return lock;
+        return m_engine.getContentManager().lockPage( page, user );
     }
 
     /**
@@ -372,16 +208,7 @@
      */
     public void unlockPage( PageLock lock )
     {
-        if( lock == null ) return;
-
-        synchronized( m_pageLocks )
-        {
-            m_pageLocks.remove( lock.getPage() );
-
-            log.debug( "Unlocked page "+lock.getPage() );
-        }
-
-        fireEvent( WikiPageEvent.PAGE_UNLOCK, lock.getPage() );
+        m_engine.getContentManager().unlockPage( lock );
     }
 
     /**
@@ -393,14 +220,7 @@
      */
     public PageLock getCurrentLock( WikiPage page )
     {
-        PageLock lock = null;
-
-        synchronized( m_pageLocks )
-        {
-            lock = m_pageLocks.get( page.getName() );
-        }
-
-        return lock;
+        return m_engine.getContentManager().getCurrentLock( page );
     }
 
     /**
@@ -413,17 +233,7 @@
      */
     public List getActiveLocks()
     {
-        ArrayList<PageLock> result = new ArrayList<PageLock>();
-
-        synchronized( m_pageLocks )
-        {
-            for( PageLock lock : m_pageLocks.values() )
-            {
-                result.add( lock );
-            }
-        }
-
-        return result;
+        return m_engine.getContentManager().getActiveLocks();
     }
 
     /**
@@ -438,47 +248,7 @@
     public WikiPage getPageInfo( String pageName, int version )
         throws ProviderException
     {
-        if( pageName == null || pageName.length() == 0 )
-        {
-            throw new ProviderException("Illegal page name '"+pageName+"'");
-        }
-
-        WikiPage page = null;
-
-        try
-        {
-            page = m_provider.getPageInfo( pageName, version );
-        }
-        catch( RepositoryModifiedException e )
-        {
-            //
-            //  This only occurs with the latest version.
-            //
-            log.info("Repository has been modified externally while fetching info for "+pageName );
-
-            page = m_provider.getPageInfo( pageName, version );
-
-            if( page != null )
-            {
-                m_engine.updateReferences( page );
-            }
-            else
-            {
-                m_engine.getReferenceManager().pageRemoved( m_engine.createPage(pageName) );
-            }
-        }
-
-        //
-        //  Should update the metadata.
-        //
-        /*
-        if( page != null && !page.hasMetadata() )
-        {
-            WikiContext ctx = new WikiContext(m_engine,page);
-            m_engine.textToHTML( ctx, getPageText(pageName,version) );
-        }
-        */
-        return page;
+        return m_engine.getContentManager().getPage( WikiName.valueOf( pageName ), version );        
     }
 
     /**
@@ -493,12 +263,7 @@
     public List getVersionHistory( String pageName )
         throws ProviderException
     {
-        if( pageExists( pageName ) )
-        {
-            return m_provider.getVersionHistory( pageName );
-        }
-
-        return null;
+        return m_engine.getContentManager().getVersionHistory( WikiName.valueOf( pageName ) );
     }
 
     /**
@@ -508,7 +273,7 @@
      */
     public String getProviderDescription()
     {
-        return m_provider.getProviderInfo();
+        return m_engine.getContentManager().getProviderDescription();
     }
 
     /**
@@ -521,15 +286,7 @@
      */
     public int getTotalPageCount()
     {
-        try
-        {
-            return m_provider.getAllPages().size();
-        }
-        catch( ProviderException e )
-        {
-            log.error( "Unable to count pages: ",e );
-            return -1;
-        }
+        return m_engine.getContentManager().getTotalPageCount( null );
     }
 
     /**
@@ -542,12 +299,7 @@
     public boolean pageExists( String pageName )
         throws ProviderException
     {
-        if( pageName == null || pageName.length() == 0 )
-        {
-            throw new ProviderException("Illegal page name");
-        }
-
-        return m_provider.pageExists( pageName );
+        return m_engine.getContentManager().pageExists( WikiName.valueOf( pageName ) );
     }
 
     /**
@@ -562,20 +314,7 @@
     public boolean pageExists( String pageName, int version )
         throws ProviderException
     {
-        if( pageName == null || pageName.length() == 0 )
-        {
-            throw new ProviderException("Illegal page name");
-        }
-
-        if( version == WikiProvider.LATEST_VERSION )
-            return pageExists( pageName );
-
-        if( m_provider instanceof CachingProvider )
-        {
-            return ((CachingProvider)m_provider).pageExists( pageName , version );
-        }
-
-        return m_provider.getPageInfo( pageName, version ) != null;
+        return m_engine.getContentManager().pageExists( WikiName.valueOf( pageName ), version );
     }
 
     /**
@@ -587,10 +326,7 @@
     public void deleteVersion( WikiPage page )
         throws ProviderException
     {
-        m_provider.deleteVersion( page.getName(), page.getVersion() );
-
-        // FIXME: If this was the latest, reindex Lucene
-        // FIXME: Update RefMgr
+        m_engine.getContentManager().deleteVersion( page );
     }
 
     /**
@@ -602,190 +338,10 @@
     public void deletePage( WikiPage page )
         throws ProviderException
     {
-        fireEvent( WikiPageEvent.PAGE_DELETE_REQUEST, page.getName() );
-
-        m_provider.deletePage( page.getName() );
-
-        fireEvent( WikiPageEvent.PAGE_DELETED, page.getName() );
-    }
-
-    /**
-     *  This is a simple reaper thread that runs roughly every minute
-     *  or so (it's not really that important, as long as it runs),
-     *  and removes all locks that have expired.
-     */
-    private class LockReaper extends WikiBackgroundThread
-    {
-        /**
-         *  Create a LockReaper for a given engine.
-         *  
-         *  @param engine WikiEngine to own this thread.
-         */
-        public LockReaper( WikiEngine engine )
-        {
-            super( engine, 60 );
-            setName("JSPWiki Lock Reaper");
-        }
-
-        public void backgroundTask() throws Exception
-        {
-            synchronized( m_pageLocks )
-            {
-                Collection entries = m_pageLocks.values();
-
-                Date now = new Date();
-
-                for( Iterator i = entries.iterator(); i.hasNext(); )
-                {
-                    PageLock p = (PageLock) i.next();
-
-                    if( now.after( p.getExpiryTime() ) )
-                    {
-                        i.remove();
-
-                        log.debug( "Reaped lock: "+p.getPage()+
-                                   " by "+p.getLocker()+
-                                   ", acquired "+p.getAcquisitionTime()+
-                                   ", and expired "+p.getExpiryTime() );
-                    }
-                }
-            }
-        }
-    }
-
-    // workflow task inner classes....................................................
-
-    /**
-     * Inner class that handles the page pre-save actions. If the proposed page
-     * text is the same as the current version, the {@link #execute()} method
-     * returns {@link org.apache.wiki.workflow.Outcome#STEP_ABORT}. Any
-     * WikiExceptions thrown by page filters will be re-thrown, and the workflow
-     * will abort.
-     *
-     * @author Andrew Jaquith
-     */
-    public static class PreSaveWikiPageTask extends Task
-    {
-        private static final long serialVersionUID = 6304715570092804615L;
-        private final WikiContext m_context;
-        private final String m_proposedText;
-
-        /**
-         *  Creates the task.
-         *  
-         *  @param context The WikiContext
-         *  @param proposedText The text that was just saved.
-         */
-        public PreSaveWikiPageTask( WikiContext context, String proposedText )
-        {
-            super( PRESAVE_TASK_MESSAGE_KEY );
-            m_context = context;
-            m_proposedText = proposedText;
-        }
-
-        /**
-         *  {@inheritDoc}
-         */
-        @Override
-        public Outcome execute() throws WikiException
-        {
-            // Retrieve attributes
-            WikiEngine engine = m_context.getEngine();
-            Workflow workflow = getWorkflow();
-
-            // Get the wiki page
-            WikiPage page = m_context.getPage();
-
-            // Figure out who the author was. Prefer the author
-            // set programmatically; otherwise get from the
-            // current logged in user
-            if ( page.getAuthor() == null )
-            {
-                Principal wup = m_context.getCurrentUser();
-
-                if ( wup != null )
-                    page.setAuthor( wup.getName() );
-            }
-
-            // Run the pre-save filters. If any exceptions, add error to list, abort, and redirect
-            String saveText;
-            try
-            {
-                saveText = engine.getFilterManager().doPreSaveFiltering( m_context, m_proposedText );
-            }
-            catch ( FilterException e )
-            {
-                throw e;
-            }
-
-            // Stash the wiki context, old and new text as workflow attributes
-            workflow.setAttribute( PRESAVE_WIKI_CONTEXT, m_context );
-            workflow.setAttribute( FACT_PROPOSED_TEXT, saveText );
-            return Outcome.STEP_COMPLETE;
-        }
-    }
-
-    /**
-     * Inner class that handles the actual page save and post-save actions. Instances
-     * of this class are assumed to have been added to an approval workflow via
-     * {@link org.apache.wiki.workflow.WorkflowBuilder#buildApprovalWorkflow(Principal, String, Task, String, org.apache.wiki.workflow.Fact[], Task, String)};
-     * they will not function correctly otherwise.
-     *
-     * @author Andrew Jaquith
-     */
-    public static class SaveWikiPageTask extends Task
-    {
-        private static final long serialVersionUID = 3190559953484411420L;
-
-        /**
-         *  Creates the Task.
-         */
-        public SaveWikiPageTask()
-        {
-            super( SAVE_TASK_MESSAGE_KEY );
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public Outcome execute() throws WikiException
-        {
-            // Retrieve attributes
-            WikiContext context = (WikiContext) getWorkflow().getAttribute( PRESAVE_WIKI_CONTEXT );
-            String proposedText = (String) getWorkflow().getAttribute( FACT_PROPOSED_TEXT );
-
-            WikiEngine engine = context.getEngine();
-            WikiPage page = context.getPage();
-
-            // Let the rest of the engine handle actual saving.
-            engine.getPageManager().putPageText( page, proposedText );
-
-            // Refresh the context for post save filtering.
-            engine.getPage( page.getName() );
-            engine.textToHTML( context, proposedText );
-            engine.getFilterManager().doPostSaveFiltering( context, proposedText );
-
-            return Outcome.STEP_COMPLETE;
-        }
-    }
-
-    // events processing .......................................................
-
-    /**
-     *  Fires a WikiPageEvent of the provided type and page name
-     *  to all registered listeners.
-     *
-     * @see org.apache.wiki.event.WikiPageEvent
-     * @param type       the event type to be fired
-     * @param pagename   the wiki page name as a String
-     */
-    protected final void fireEvent( int type, String pagename )
-    {
-        if ( WikiEventManager.isListening(this) )
-        {
-            WikiEventManager.fireEvent(this,new WikiPageEvent(m_engine,type,pagename));
-        }
+        m_engine.getContentManager().deletePage( page );
     }
 
+ 
     /**
      *  {@inheritDoc}
      */
@@ -796,117 +352,4 @@
         return null;
     }
 
-
-    /**
-     *  Listens for {@link org.apache.wiki.event.WikiSecurityEvent#PROFILE_NAME_CHANGED}
-     *  events. If a user profile's name changes, each page ACL is inspected. If an entry contains
-     *  a name that has changed, it is replaced with the new one. No events are emitted
-     *  as a consequence of this method, because the page contents are still the same; it is
-     *  only the representations of the names within the ACL that are changing.
-     * 
-     *  @param event The event
-     */
-    public void actionPerformed(WikiEvent event)
-    {
-        if (! ( event instanceof WikiSecurityEvent ) )
-        {
-            return;
-        }
-
-        WikiSecurityEvent se = (WikiSecurityEvent)event;
-        if ( se.getType() == WikiSecurityEvent.PROFILE_NAME_CHANGED )
-        {
-            UserProfile[] profiles = (UserProfile[])se.getTarget();
-            Principal[] oldPrincipals = new Principal[]
-                { new WikiPrincipal( profiles[0].getLoginName() ),
-                  new WikiPrincipal( profiles[0].getFullname() ),
-                  new WikiPrincipal( profiles[0].getWikiName() ) };
-            Principal newPrincipal = new WikiPrincipal( profiles[1].getFullname() );
-
-            // Examine each page ACL
-            try
-            {
-                int pagesChanged = 0;
-                Collection pages = getAllPages();
-                for ( Iterator it = pages.iterator(); it.hasNext(); )
-                {
-                    WikiPage page = (WikiPage)it.next();
-                    boolean aclChanged = changeAcl( page, oldPrincipals, newPrincipal );
-                    if ( aclChanged )
-                    {
-                        // If the Acl needed changing, change it now
-                        try
-                        {
-                            m_engine.getAclManager().setPermissions( page, page.getAcl() );
-                        }
-                        catch ( WikiSecurityException e )
-                        {
-                            log.error( "Could not change page ACL for page " + page.getName() + ": " + e.getMessage() );
-                        }
-                        pagesChanged++;
-                    }
-                }
-                log.info( "Profile name change for '" + newPrincipal.toString() +
-                          "' caused " + pagesChanged + " page ACLs to change also." );
-            }
-            catch ( ProviderException e )
-            {
-                // Oooo! This is really bad...
-                log.error( "Could not change user name in Page ACLs because of Provider error:" + e.getMessage() );
-            }
-        }
-    }
-
-    /**
-     *  For a single wiki page, replaces all Acl entries matching a supplied array of Principals 
-     *  with a new Principal.
-     * 
-     *  @param page the wiki page whose Acl is to be modified
-     *  @param oldPrincipals an array of Principals to replace; all AclEntry objects whose
-     *   {@link AclEntry#getPrincipal()} method returns one of these Principals will be replaced
-     *  @param newPrincipal the Principal that should receive the old Principals' permissions
-     *  @return <code>true</code> if the Acl was actually changed; <code>false</code> otherwise
-     */
-    protected boolean changeAcl( WikiPage page, Principal[] oldPrincipals, Principal newPrincipal )
-    {
-        Acl acl = page.getAcl();
-        boolean pageChanged = false;
-        if ( acl != null )
-        {
-            Enumeration entries = acl.entries();
-            Collection<AclEntry> entriesToAdd    = new ArrayList<AclEntry>();
-            Collection<AclEntry> entriesToRemove = new ArrayList<AclEntry>();
-            while ( entries.hasMoreElements() )
-            {
-                AclEntry entry = (AclEntry)entries.nextElement();
-                if ( ArrayUtils.contains( oldPrincipals, entry.getPrincipal() ) )
-                {
-                    // Create new entry
-                    AclEntry newEntry = new AclEntryImpl();
-                    newEntry.setPrincipal( newPrincipal );
-                    Enumeration permissions = entry.permissions();
-                    while ( permissions.hasMoreElements() )
-                    {
-                        Permission permission = (Permission)permissions.nextElement();
-                        newEntry.addPermission(permission);
-                    }
-                    pageChanged = true;
-                    entriesToRemove.add( entry );
-                    entriesToAdd.add( newEntry );
-                }
-            }
-            for ( Iterator ix = entriesToRemove.iterator(); ix.hasNext(); )
-            {
-                AclEntry entry = (AclEntry)ix.next();
-                acl.removeEntry( entry );
-            }
-            for ( Iterator ix = entriesToAdd.iterator(); ix.hasNext(); )
-            {
-                AclEntry entry = (AclEntry)ix.next();
-                acl.addEntry( entry );
-            }
-        }
-        return pageChanged;
-    }
-
 }

Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/ReferenceManager.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/ReferenceManager.java?rev=749948&r1=749947&r2=749948&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/ReferenceManager.java (original)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/ReferenceManager.java Wed Mar  4 09:13:57 2009
@@ -412,157 +412,21 @@
     /**
      *  Reads the serialized data from the disk back to memory.
      *  Returns the date when the data was last written on disk
+     *  @deprecated to be removed
      */
     private synchronized long unserializeAttrsFromDisk(WikiPage p)
         throws IOException,
                ClassNotFoundException
     {
-        ObjectInputStream in = null;
-        long saved = 0L;
-
-        try
-        {
-            StopWatch sw = new StopWatch();
-            sw.start();
-
-            //
-            //  Find attribute cache, and check if it exists
-            //
-            File f = new File( m_engine.getWorkDir(), SERIALIZATION_DIR );
-
-            f = new File( f, getHashFileName(p.getName()) );
-
-            if( !f.exists() )
-            {
-                return 0L;
-            }
-
-            log.debug("Deserializing attributes for "+p.getName());
-
-            in = new ObjectInputStream( new BufferedInputStream(new FileInputStream(f)) );
-
-            long ver     = in.readLong();
-
-            if( ver != serialVersionUID )
-            {
-                log.debug("File format has changed; cannot deserialize.");
-                return 0L;
-            }
-
-            saved        = in.readLong();
-
-            String name  = in.readUTF();
-
-            if( !name.equals(p.getName()) )
-            {
-                log.debug("File name does not match ("+name+"), skipping...");
-                return 0L; // Not here
-            }
-
-            long entries = in.readLong();
-
-            for( int i = 0; i < entries; i++ )
-            {
-                String key   = in.readUTF();
-                Object value = in.readObject();
-
-                p.setAttribute( key, value );
-
-                log.debug("   attr: "+key+"="+value);
-            }
-
-            in.close();
-
-            sw.stop();
-            log.debug("Read serialized data for "+name+" successfully in "+sw);
-            p.setHasMetadata();
-        }
-        catch( NoSuchAlgorithmException e )
-        {
-            log.error("No MD5!?!");
-        }
-        finally
-        {
-            if( in != null ) in.close();
-        }
-
-        return saved;
+        return 0L;
     }
 
     /**
      *  Serializes hashmaps to disk.  The format is private, don't touch it.
+     *  @deprecated To be removed
      */
     private synchronized void serializeAttrsToDisk( WikiPage p )
     {
-        ObjectOutputStream out = null;
-        StopWatch sw = new StopWatch();
-        sw.start();
-
-        try
-        {
-            File f = new File( m_engine.getWorkDir(), SERIALIZATION_DIR );
-
-            if( !f.exists() ) f.mkdirs();
-
-            //
-            //  Create a digest for the name
-            //
-            f = new File( f, getHashFileName(p.getName()) );
-
-            // FIXME: There is a concurrency issue here...
-            Set entries = p.getAttributes().entrySet();
-
-            if( entries.size() == 0 ) 
-            {
-                //  Nothing to serialize, therefore we will just simply remove the
-                //  serialization file so that the next time we boot, we don't
-                //  deserialize old data.
-                f.delete();
-                return;
-            }
-
-            out = new ObjectOutputStream( new BufferedOutputStream(new FileOutputStream(f)) );
-
-            out.writeLong( serialVersionUID );
-            out.writeLong( System.currentTimeMillis() ); // Timestamp
-
-            out.writeUTF( p.getName() );
-            out.writeLong( entries.size() );
-
-            for( Iterator i = entries.iterator(); i.hasNext(); )
-            {
-                Map.Entry e = (Map.Entry) i.next();
-
-                if( e.getValue() instanceof Serializable )
-                {
-                    out.writeUTF( (String)e.getKey() );
-                    out.writeObject( e.getValue() );
-                }
-            }
-
-            out.close();
-
-        }
-        catch( IOException e )
-        {
-            log.error("Unable to serialize!");
-
-            try
-            {
-                if( out != null ) out.close();
-            }
-            catch( IOException ex ) {}
-        }
-        catch( NoSuchAlgorithmException e )
-        {
-            log.error("No MD5 algorithm!?!");
-        }
-        finally
-        {
-            sw.stop();
-
-            log.debug("serialization for "+p.getName()+" done - took "+sw);
-        }
     }
 
     /**

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=749948&r1=749947&r2=749948&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/Release.java (original)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/Release.java Wed Mar  4 09:13:57 2009
@@ -77,7 +77,7 @@
      *  <p>
      *  If the build identifier is empty, it is not added.
      */
-    public static final String     BUILD         = "77";
+    public static final String     BUILD         = "78";
     
     /**
      *  This is the generic version string you should use

Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/WikiEngine.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/WikiEngine.java?rev=749948&r1=749947&r2=749948&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/WikiEngine.java (original)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/WikiEngine.java Wed Mar  4 09:13:57 2009
@@ -1751,8 +1751,8 @@
         // If submitter is authenticated, any reject messages will appear in his/her workflow inbox.
         WorkflowBuilder builder = WorkflowBuilder.getBuilder( this );
         Principal submitter = context.getCurrentUser();
-        Task prepTask = new PageManager.PreSaveWikiPageTask( context, proposedText );
-        Task completionTask = new PageManager.SaveWikiPageTask();
+        Task prepTask = new ContentManager.PreSaveWikiPageTask( context, proposedText );
+        Task completionTask = new ContentManager.SaveWikiPageTask();
         String diffText = m_differenceManager.makeDiff( context, oldText, proposedText );
         boolean isAuthenticated = context.getWikiSession().isAuthenticated();
         Fact[] facts = new Fact[5];

Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/api/WikiPage.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/api/WikiPage.java?rev=749948&r1=749947&r2=749948&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/api/WikiPage.java (original)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/api/WikiPage.java Wed Mar  4 09:13:57 2009
@@ -24,6 +24,8 @@
 import java.util.Map;
 
 import org.apache.wiki.auth.acl.Acl;
+import org.apache.wiki.content.WikiName;
+import org.apache.wiki.providers.ProviderException;
 
 
 /**
@@ -65,7 +67,7 @@
      * {@link org.apache.wiki.ui.stripes.HandlerPermission} annotations.
      * @return the qualified page name, for example <code>mywiki:Main</code>
      */
-    public String getQualifiedName();
+    public WikiName getQualifiedName();
 
     /**
      *  A WikiPage may have a number of attributes, which might or might not be 
@@ -233,9 +235,9 @@
      */
     public int compareTo( Object o );
  
-    public String getContentAsString() throws WikiException;
+    public String getContentAsString() throws ProviderException;
 
-    public void save() throws WikiException;
+    public void save() throws ProviderException;
     
-    public void setContent(String content) throws WikiException;
+    public void setContent(String content) throws ProviderException;
 }

Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/auth/UserManager.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/auth/UserManager.java?rev=749948&r1=749947&r2=749948&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/auth/UserManager.java (original)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/auth/UserManager.java Wed Mar  4 09:13:57 2009
@@ -117,7 +117,7 @@
 
         // Attach the PageManager as a listener
         // TODO: it would be better if we did this in PageManager directly
-        addWikiEventListener( engine.getPageManager() );
+        addWikiEventListener( engine.getContentManager() );
 
         JSONRPCManager.registerGlobalObject( "users", new JSONUserModule(this), new AllPermission(null) );
     }

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=749948&r1=749947&r2=749948&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 Wed Mar  4 09:13:57 2009
@@ -46,10 +46,7 @@
 import org.apache.wiki.auth.acl.AclEntry;
 import org.apache.wiki.auth.acl.AclEntryImpl;
 import org.apache.wiki.auth.user.UserProfile;
-import org.apache.wiki.event.WikiEvent;
-import org.apache.wiki.event.WikiEventManager;
-import org.apache.wiki.event.WikiPageEvent;
-import org.apache.wiki.event.WikiSecurityEvent;
+import org.apache.wiki.event.*;
 import org.apache.wiki.log.Logger;
 import org.apache.wiki.log.LoggerFactory;
 import org.apache.wiki.providers.ProviderException;
@@ -85,7 +82,7 @@
  *  @since 3.0
  */
 
-public class ContentManager
+public class ContentManager implements WikiEventListener
 {
     /**
      *  The name of the default WikiSpace.
@@ -166,6 +163,7 @@
      *  @param engine WikiEngine instance
      *  @throws WikiException If anything goes wrong, you get this.
      */
+    @SuppressWarnings("unchecked")
     public ContentManager( WikiEngine engine )
         throws WikiException
     {
@@ -238,14 +236,14 @@
         
         try
         {
-            Object foo = acquire();
             initialize();
-            release(foo);
         }
         catch( RepositoryException e )
         {
             throw new WikiException("Failed to initialize the repository content",e);
         }
+        
+        log.info("ContentManager initialized!");
     }
 
     /**
@@ -286,6 +284,17 @@
 
     }
     
+    /**
+     *  Discards all unsaved modifications made to this repository.
+     *  
+     *  @throws RepositoryException 
+     */
+    public void discardModifications() throws RepositoryException
+    {
+        m_sessionManager.getSession().refresh( false );
+    }
+        
+    /*
     public Object acquire() throws ProviderException
     {
         try
@@ -302,6 +311,7 @@
     {
         m_sessionManager.destroySession( id );
     }
+    */
     
     /**
      *  Returns all pages in some random order.  If you need just the page names, 
@@ -549,10 +559,10 @@
         List<WikiPage> result = new ArrayList<WikiPage>();
         JCRWikiPage base = getPage(path);
 
-        Node baseNode = base.getJCRNode();
-        
         try
         {
+            Node baseNode = base.getJCRNode();
+            
             VersionHistory vh = baseNode.getVersionHistory();
             
             for( VersionIterator vi = vh.getAllVersions(); vi.hasNext(); )
@@ -648,11 +658,11 @@
      *  @throws WikiException If the backend fails or the wikiPath is illegal.
      */
     public boolean pageExists( WikiName wikiPath, int version )
-        throws WikiException
+        throws ProviderException
     {
         if( wikiPath == null )
         {
-            throw new WikiException("Illegal page name");
+            throw new ProviderException("Illegal page name");
         }
 
         try
@@ -663,7 +673,7 @@
         }
         catch( RepositoryException e )
         {
-            throw new WikiException("Unable to check for page existence",e);
+            throw new ProviderException("Unable to check for page existence",e);
         }
     }
 
@@ -674,7 +684,7 @@
      *  @throws WikiException if the page fails
      */
     public void deleteVersion( WikiPage page )
-        throws WikiException
+        throws ProviderException
     {
         fireEvent( WikiPageEvent.PAGE_DELETE_REQUEST, page.getName() );
 
@@ -688,7 +698,7 @@
         }
         catch( RepositoryException e )
         {
-            throw new WikiException("Unable to delete a page",e);
+            throw new ProviderException("Unable to delete a page",e);
         }
     }
     
@@ -700,7 +710,7 @@
      */
     
     public void deletePage( WikiPage page )
-        throws WikiException
+        throws ProviderException
     {
         fireEvent( WikiPageEvent.PAGE_DELETE_REQUEST, page.getName() );
 
@@ -733,7 +743,7 @@
         }
         catch( RepositoryException e )
         {
-            throw new WikiException("Deletion of pages failed.",e);
+            throw new ProviderException("Deletion of pages failed.",e);
         }
     }
 
@@ -921,7 +931,7 @@
      *  @param wikiName The WikiName.
      *  @return A full JCR path
      */
-    protected static String getJCRPath( WikiName wikiName )
+    public static String getJCRPath( WikiName wikiName )
     {
         String spaceName;
         String spacePath;
@@ -940,7 +950,7 @@
      *  @throws WikiException If the backend fails.
      */
     // FIXME: Should be protected - fix once WikiPage moves to content-package
-    public static WikiName getWikiPath( String jcrpath ) throws WikiException
+    public static WikiName getWikiPath( String jcrpath ) throws ProviderException
     {
         if( jcrpath.startsWith("/"+JCR_PAGES_NODE+"/") )
         {
@@ -955,7 +965,7 @@
             }
         }
         
-        throw new WikiException("This is not a valid JSPWiki JCR path: "+jcrpath);
+        throw new ProviderException("This is not a valid JSPWiki JCR path: "+jcrpath);
     }
     
     /**
@@ -967,7 +977,7 @@
      *  @return the {@link JCRWikiPage} 
      *  @throws WikiException If the backend fails.
      */
-    public JCRWikiPage addPage( WikiName path, String contentType ) throws WikiException
+    public JCRWikiPage addPage( WikiName path, String contentType ) throws ProviderException
     {
         try
         {
@@ -981,7 +991,7 @@
         }
         catch( RepositoryException e )
         {
-            throw new WikiException( "Unable to add a page", e );
+            throw new ProviderException( "Unable to add a page", e );
         }
     }
 
@@ -1017,25 +1027,36 @@
         }
     }
 
-    public JCRWikiPage getPage( WikiName path, int version ) throws WikiException
+    public JCRWikiPage getPage( WikiName path, int version ) throws ProviderException
     {
         try
         {
+            JCRWikiPage page = null;
             Session session = m_sessionManager.getSession();
         
             Node nd = session.getRootNode().getNode( getJCRPath(path) );
 
-            VersionHistory vh = nd.getVersionHistory();
+            try
+            {
+                VersionHistory vh = nd.getVersionHistory();
             
-            Version v = vh.getVersion( Integer.toString( version ) );
+                Version v = vh.getVersion( Integer.toString( version ) );
             
-            JCRWikiPage page = new JCRWikiPage(m_engine, v);
+                page = new JCRWikiPage(m_engine, v);
+            }
+            catch( UnsupportedRepositoryOperationException e )
+            {
+                // No version history yet
+                
+                if( version == WikiProvider.LATEST_VERSION || version == 1)
+                    page = new JCRWikiPage( m_engine, nd );
+            }
             
             return page;
         }
         catch( RepositoryException e )
         {
-            throw new WikiException( "Unable to get a page", e );
+            throw new ProviderException( "Unable to get a page", e );
         }
     }
     
@@ -1221,12 +1242,18 @@
          *  
          *  @return A valid Session object, if called between createSession and destroySession().
          *  @throws IllegalStateException If the object has not been acquired with createSession()
+         * @throws RepositoryException 
+         * @throws LoginException 
          */
-        public Session getSession() throws IllegalStateException
+        public Session getSession() throws LoginException, RepositoryException
         {
             Session s = m_currentSession.get();
             
-            if( s == null ) throw new IllegalStateException("You have not yet opened a Session");
+            if( s == null ) 
+            {
+                createSession();
+                s = m_currentSession.get();
+            }
             
             return s;
         } 
@@ -1245,4 +1272,9 @@
         }
         boolean m_identity = false;        
     }
+
+    public Node getJCRNode( String path ) throws RepositoryException
+    {
+        return (Node)m_sessionManager.getSession().getItem( path );
+    }
 }

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=749948&r1=749947&r2=749948&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 Wed Mar  4 09:13:57 2009
@@ -17,7 +17,6 @@
 {
     ContentManager m_mgr;
     TestEngine     m_engine;
-    Object         m_owner;
     
     @Override
     protected void setUp() throws Exception
@@ -30,7 +29,6 @@
         m_engine = new TestEngine(props);
         
         m_mgr = m_engine.getContentManager();
-        m_owner = m_mgr.acquire();
     }
 
     @Override
@@ -40,7 +38,6 @@
         
         if( p != null ) m_mgr.deletePage( p );
         
-        m_mgr.release( m_owner );
         super.tearDown();
     }