incubator-jspwiki-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Harry Metske <harry.met...@gmail.com>
Subject Re: JCR commit?
Date Wed, 04 Mar 2009 05:28:59 GMT
+1

do you expect us to help solve bugs, fix JUnit tests and so on, or should we
wait until a few more commits come in ?

regards,
Harry

2009/3/3 Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

> Folks,
>
> I'd like to make the commit which removes the PageProviders from use and
> replaces them with the JCR backend (I'm scared to keep it in my hard drive
> for long).
>
> However, this will break about 150 unit tests, and I haven't yet had time
> to see which ones became obsolete and which ones are really broken.  Also
> error handling is far from optimal (I don't want to tweak it too hard until
> we decide if we want to change the way we do errors).  But it should give
> you a chance to start hacking on it.
>
> Any objections?  The patch is included, if you want to try it out before
> having an opinion. It's against the SVN trunk as of now.
>
> /Janne
>
> ### Eclipse Workspace Patch 1.0
> #P JSPWiki-trunk
> Index: src/java/org/apache/wiki/WikiEngine.java
> ===================================================================
> --- src/java/org/apache/wiki/WikiEngine.java    (revision 749743)
> +++ src/java/org/apache/wiki/WikiEngine.java    (working copy)
> @@ -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];
> Index: src/java/org/apache/wiki/PageManager.java
> ===================================================================
> --- src/java/org/apache/wiki/PageManager.java   (revision 749743)
> +++ src/java/org/apache/wiki/PageManager.java   (working copy)
> @@ -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() );
> +        m_engine.getContentManager().deletePage( page );
>     }
>
> -    /**
> -     *  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));
> -        }
> -    }
> -
> +
>     /**
>      *  {@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;
> -    }
> -
>  }
> Index: src/java/org/apache/wiki/JCRWikiPage.java
> ===================================================================
> --- src/java/org/apache/wiki/JCRWikiPage.java   (revision 749743)
> +++ src/java/org/apache/wiki/JCRWikiPage.java   (working copy)
> @@ -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
> +
> +    }
> +
>  }
> Index: src/java/org/apache/wiki/auth/UserManager.java
> ===================================================================
> --- src/java/org/apache/wiki/auth/UserManager.java      (revision 749743)
> +++ src/java/org/apache/wiki/auth/UserManager.java      (working copy)
> @@ -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) );
>     }
> Index: tests/java/org/apache/wiki/content/ContentManagerTest.java
> ===================================================================
> --- tests/java/org/apache/wiki/content/ContentManagerTest.java  (revision
> 749743)
> +++ tests/java/org/apache/wiki/content/ContentManagerTest.java  (working
> copy)
> @@ -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();
>     }
>
>
> Property changes on: etc
> ___________________________________________________________________
> Modified: svn:ignore
>   - jspwiki.properties
> jspwiki.jks
> classes
>
>   + jspwiki.properties
> jspwiki.jks
> classes
> i18n
>
>
> Index: src/java/org/apache/wiki/content/ContentManager.java
> ===================================================================
> --- src/java/org/apache/wiki/content/ContentManager.java        (revision
> 749743)
> +++ src/java/org/apache/wiki/content/ContentManager.java        (working
> copy)
> @@ -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 );
> +    }
>  }
> Index: src/java/org/apache/wiki/api/WikiPage.java
> ===================================================================
> --- src/java/org/apache/wiki/api/WikiPage.java  (revision 749743)
> +++ src/java/org/apache/wiki/api/WikiPage.java  (working copy)
> @@ -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;
>  }
> Index: src/java/org/apache/wiki/ReferenceManager.java
> ===================================================================
> --- src/java/org/apache/wiki/ReferenceManager.java      (revision 749743)
> +++ src/java/org/apache/wiki/ReferenceManager.java      (working copy)
> @@ -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);
> -        }
>     }
>
>     /**
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message