You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jspwiki.apache.org by aj...@apache.org on 2009/05/02 16:15:14 UTC

svn commit: r770959 [2/2] - in /incubator/jspwiki/trunk: ./ src/java/org/apache/wiki/ src/java/org/apache/wiki/action/ src/java/org/apache/wiki/api/ src/java/org/apache/wiki/auth/ src/java/org/apache/wiki/content/ src/java/org/apache/wiki/event/ src/ja...

Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/content/PageRenamer.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/content/PageRenamer.java?rev=770959&r1=770958&r2=770959&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/content/PageRenamer.java (original)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/content/PageRenamer.java Sat May  2 14:15:13 2009
@@ -20,23 +20,8 @@
  */
 package org.apache.wiki.content;
 
-import java.util.Collection;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.wiki.InternalWikiException;
 import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiEngine;
 import org.apache.wiki.api.WikiException;
-import org.apache.wiki.api.WikiPage;
-import org.apache.wiki.log.Logger;
-import org.apache.wiki.log.LoggerFactory;
-import org.apache.wiki.parser.JSPWikiMarkupParser;
-import org.apache.wiki.parser.MarkupParser;
-import org.apache.wiki.providers.ProviderException;
-import org.apache.wiki.util.TextUtil;
 
 
 
@@ -49,13 +34,8 @@
  */
 public class PageRenamer
 {
-
-    private static final Logger log = LoggerFactory.getLogger( PageRenamer.class );
-    
-    private boolean m_camelCase = false;
-    
     /**
-     *  Renames a page.
+     *  Renames a page. Delegates to {@link ContentManager#renamePage(WikiContext, String, String, boolean)}.
      *  
      *  @param context The current context.
      *  @param renameFrom The name from which to rename.
@@ -70,372 +50,7 @@
                               boolean changeReferrers )
         throws WikiException
     {
-        //
-        //  Sanity checks first
-        //
-        if( renameFrom == null || renameFrom.length() == 0 )
-        {
-            throw new WikiException( "From name may not be null or empty" );
-        }
-        if( renameTo == null || renameTo.length() == 0 )
-        {
-            throw new WikiException( "To name may not be null or empty" );
-        }
-       
-        //
-        //  Clean up the "to" -name so that it does not contain anything illegal
-        //
-        
-        renameTo = MarkupParser.cleanLink( renameTo.trim() );
-        
-        if( renameTo.equals(renameFrom) )
-        {
-            throw new WikiException( "You cannot rename the page to itself" );
-        }
-        
-        //
-        //  Preconditions: "from" page must exist, and "to" page must not yet exist.
-        //
-        WikiEngine engine = context.getEngine();
-        WikiPage fromPage;
-        try
-        {
-            fromPage = engine.getPage( renameFrom );
-        }
-        catch( PageNotFoundException e )
-        {
-            throw new WikiException("No such page "+renameFrom, e );
-        }
-        
-        WikiPage toPage;
-        try
-        {
-            toPage = engine.getPage( renameTo );
-            if( toPage != null )
-            {
-                throw new WikiException("Page already exists "+renameTo);
-            }
-        }
-        catch( PageNotFoundException e )
-        {
-            // Good. The page should NOT exist already.
-        }
-        
-        //
-        //  Options
-        //
-        
-        m_camelCase = TextUtil.getBooleanProperty( engine.getWikiProperties(), 
-                                                   JSPWikiMarkupParser.PROP_CAMELCASELINKS, 
-                                                   m_camelCase );
-
-        Set<WikiPath> referrers = getReferencesToChange( fromPage, engine );
-
-        //
-        //  Do the actual rename by changing from the frompage to the topage, including
-        //  all of the attachments
-        //
-        
-        engine.getPageManager().getProvider().movePage( renameFrom, renameTo );
-        /*
-        if( engine.getAttachmentManager().attachmentsEnabled() )
-        {
-            engine.getAttachmentManager().getCurrentProvider().moveAttachmentsForPage( renameFrom, renameTo );
-        }
-*/
-        //
-        //  Add a comment to the page notifying what changed.  This adds a new revision
-        //  to the repo with no actual change.
-        //
-        
-        try
-        {
-            toPage = engine.getPage( renameTo );
-        }
-        catch( PageNotFoundException e )
-        {
-            throw new InternalWikiException( "Rename seems to have failed for some strange reason - please check logs!" );
-        }
-
-        toPage.setAttribute( WikiPage.CHANGENOTE, fromPage.getName() + " ==> " + toPage.getName() );
-        toPage.setAuthor( context.getCurrentUser().getName() );
-        
-        engine.getPageManager().putPageText( toPage, engine.getPureText( toPage ) );
-
-        //
-        //  Update the references
-        //
-        
-        try
-        {
-            engine.getReferenceManager().pageRemoved( fromPage.getPath() );
-        }
-        catch( PageNotFoundException e )
-        {
-            // This is fine.
-        }
-        engine.updateReferences( toPage );
-
-        //
-        //  Update referrers
-        //
-        if( changeReferrers )
-        {
-            updateReferrers( context, fromPage, toPage, referrers );
-        }
-
-        //
-        //  re-index the page 
-        //
-        engine.getSearchManager().reindexPage(toPage);
-
-        
-        //
-        //  Done, return the new name.
-        //
-        return renameTo;
-    }
-
-    /**
-     *  This method finds all the pages which have anything to do with the fromPage and
-     *  change any referrers it can figure out in that page.
-     *  
-     *  @param context WikiContext in which we operate
-     *  @param fromPage The old page
-     *  @param toPage The new page
-     */
-    private void updateReferrers( WikiContext context, WikiPage fromPage, WikiPage toPage, Set<WikiPath>referrers )
-    {
-        WikiEngine engine = context.getEngine();
-        
-        if( referrers.isEmpty() ) return; // No referrers
-        
-        for( WikiPath pageName : referrers )
-        {
-            //  In case the page was just changed from under us, let's do this
-            //  small kludge.
-            if( pageName.equals( fromPage.getPath() ) )
-            {
-                pageName = toPage.getPath();
-            }
-            
-            try
-            {
-                WikiPage p = engine.getContentManager().getPage( pageName );
-            
-                String sourceText = engine.getPureText( p );
-            
-                String newText = replaceReferrerString( context, sourceText, fromPage.getName(), toPage.getName() );
-            
-                if( m_camelCase )
-                    newText = replaceCCReferrerString( context, newText, fromPage.getName(), toPage.getName() );
-            
-                if( !sourceText.equals( newText ) )
-                {
-                    p.setAttribute( WikiPage.CHANGENOTE, fromPage.getName()+" ==> "+toPage.getName() );
-                    p.setAuthor( context.getCurrentUser().getName() );
-                    p.setContent( newText );
-                    p.save();
-                    engine.updateReferences( p );
-                }
-            }
-            catch( PageNotFoundException e )
-            {
-                // Just continue
-            }
-            catch( ProviderException e )
-            {
-                //
-                //  We fail with an error, but we will try to continue to rename
-                //  other referrers as well.
-                //
-                log.error("Unable to perform rename.",e);
-            }
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private Set<WikiPath> getReferencesToChange( WikiPage fromPage, WikiEngine engine )
-    {
-        Set<WikiPath> referrers = new TreeSet<WikiPath>();
-        
-        try
-        {
-            Collection<WikiPath> r = engine.getReferenceManager().findReferrers( fromPage.getPath() );
-            if( r != null ) referrers.addAll( r );
-            /*
-            Collection<Attachment> attachments = engine.getAttachmentManager().listAttachments( fromPage );
-
-            for( WikiPage att : attachments  )
-            {
-                Collection<String> c = engine.getReferenceManager().findReferrers(att.getName());
-
-                if( c != null ) referrers.addAll(c);
-            }
-            */
-        }
-        catch( ProviderException e )
-        {
-            // We will continue despite this error
-            log.error( "Provider error while fetching attachments for rename", e );
-        }
-        return referrers;
-    }
-
-    /**
-     *  Replaces camelcase links.
-     */
-    private String replaceCCReferrerString( WikiContext context, String sourceText, String from, String to )
-    {
-        StringBuilder sb = new StringBuilder( sourceText.length()+32 );
-        
-        Pattern linkPattern = Pattern.compile( "\\p{Lu}+\\p{Ll}+\\p{Lu}+[\\p{L}\\p{Digit}]*" );
-        
-        Matcher matcher = linkPattern.matcher( sourceText );
-        
-        int start = 0;
-        
-        while( matcher.find(start) )
-        {
-            String match = matcher.group();
-
-            sb.append( sourceText.substring( start, matcher.start() ) );
-
-            int lastOpenBrace = sourceText.lastIndexOf( '[', matcher.start() );
-            int lastCloseBrace = sourceText.lastIndexOf( ']', matcher.start() );
-            
-            if( match.equals( from ) && lastCloseBrace >= lastOpenBrace )
-            {
-                sb.append( to );
-            }
-            else
-            {
-                sb.append( match );
-            }
-            
-            start = matcher.end();
-        }
-        
-        sb.append( sourceText.substring( start ) );
-        
-        return sb.toString();
-    }
-
-    private String replaceReferrerString( WikiContext context, String sourceText, String from, String to )
-    {
-        StringBuilder sb = new StringBuilder( sourceText.length()+32 );
-        
-        //
-        //  This monstrosity just looks for a JSPWiki link pattern.  But it is pretty
-        //  cool for a regexp, isn't it?  If you can understand this in a single reading,
-        //  you have way too much time in your hands.
-        //
-        Pattern linkPattern = Pattern.compile( "([\\[\\~]?)\\[([^\\|\\]]*)(\\|)?([^\\|\\]]*)(\\|)?([^\\|\\]]*)\\]" );
-        
-        Matcher matcher = linkPattern.matcher( sourceText );
-        
-        int start = 0;
-        
-        // System.out.println("====");
-        // System.out.println("SRC="+sourceText.trim());
-        while( matcher.find(start) )
-        {
-            char charBefore = (char)-1;
-            
-            if( matcher.start() > 0 ) 
-                charBefore = sourceText.charAt( matcher.start()-1 );
-            
-            if( matcher.group(1).length() > 0 || charBefore == '~' || charBefore == '[' ) 
-            {
-                //
-                //  Found an escape character, so I am escaping.
-                //
-                sb.append( sourceText.substring( start, matcher.end() ) );
-                start = matcher.end();
-                continue;
-            }
-
-            String text = matcher.group(2);
-            String link = matcher.group(4);
-            String attr = matcher.group(6);
-             
-            /*
-            System.out.println("MATCH="+matcher.group(0));
-            System.out.println("   text="+text);
-            System.out.println("   link="+link);
-            System.out.println("   attr="+attr);
-            */
-            if( link.length() == 0 )
-            {
-                text = replaceSingleLink( context, text, from, to );
-            }
-            else
-            {
-                link = replaceSingleLink( context, link, from, to );
-                
-                //
-                //  A very simple substitution, but should work for quite a few cases.
-                //
-                text = TextUtil.replaceString( text, from, to );
-            }
-        
-            //
-            //  Construct the new string
-            //
-            sb.append( sourceText.substring( start, matcher.start() ) );
-            sb.append( "["+text );
-            if( link.length() > 0 ) sb.append( "|" + link );
-            if( attr.length() > 0 ) sb.append( "|" + attr );
-            sb.append( "]" );
-            
-            start = matcher.end();
-        }
-        
-        sb.append( sourceText.substring( start ) );
-        
-        return sb.toString();
-    }
-
-    /**
-     *  This method does a correct replacement of a single link, taking into
-     *  account anchors and attachments.
-     */
-    private String replaceSingleLink( WikiContext context, String original, String from, String newlink )
-    {
-        int hash = original.indexOf( '#' );
-        int slash = original.indexOf( '/' );
-        String reallink = original;
-        String oldStyleRealLink;
-        
-        if( hash != -1 ) reallink = original.substring( 0, hash );
-        if( slash != -1 ) reallink = original.substring( 0,slash );
-        
-        reallink = MarkupParser.cleanLink( reallink );
-        oldStyleRealLink = MarkupParser.wikifyLink( reallink );
-        
-        //WikiPage realPage  = context.getEngine().getPage( reallink );
-        // WikiPage p2 = context.getEngine().getPage( from );
-        
-        // System.out.println("   "+reallink+" :: "+ from);
-        // System.out.println("   "+p+" :: "+p2);
-        
-        //
-        //  Yes, these point to the same page.
-        //
-        if( reallink.equals(from) || original.equals(from) || oldStyleRealLink.equals(from) )
-        {
-            //
-            //  if the original contains blanks, then we should introduce a link, for example:  [My Page]  =>  [My Page|My Renamed Page]
-            int blank = reallink.indexOf( " ");
-            
-            if( blank != -1 )
-            {
-                return original + "|" + newlink;
-            }
-            
-            return newlink + ((hash > 0) ? original.substring( hash ) : "") + ((slash > 0) ? original.substring( slash ) : "") ;
-        }
-        
-        return original;
+        ContentManager cm = context.getEngine().getContentManager();
+        return cm.renamePage( context, renameFrom, renameTo, changeReferrers );
     }
 }

Added: incubator/jspwiki/trunk/src/java/org/apache/wiki/event/ContentEvent.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/event/ContentEvent.java?rev=770959&view=auto
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/event/ContentEvent.java (added)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/event/ContentEvent.java Sat May  2 14:15:13 2009
@@ -0,0 +1,47 @@
+package org.apache.wiki.event;
+
+import java.io.Serializable;
+
+/**
+ * Events fired by {@link org.apache.wiki.content.ContentManager} when nodes are
+ * created, saved or deleted.
+ */
+public class ContentEvent extends WikiPageEvent
+{
+    private static final long serialVersionUID = -6577147048708900469L;
+
+    /**
+     * Indicates that a node has been requested to be deleted, but it has not
+     * yet been removed from the repository.
+     */
+    public static final int NODE_DELETE_REQUEST = 220;
+
+    /**
+     * Indicates that a node was successfully deleted.
+     */
+    public static final int NODE_DELETED = 221;
+
+    /**
+     * Indicates that a node was successfully renamed.
+     */
+    public static final int NODE_RENAMED = 211;
+
+    /**
+     * Indicates a node was successfully saved.
+     */
+    public static final int NODE_SAVED = 201;
+
+    /**
+     * Constructs an instance of this event.
+     * 
+     * @param src the Object that is the source of the event.
+     * @param type the type of the event (see the enumerated int values defined
+     *            in {@link org.apache.wiki.event.WikiEvent}).
+     * @param pagename the WikiPage being acted upon.
+     * @param args additional arguments passed to the event.
+     */
+    public ContentEvent( Object src, int type, String pagename, Serializable... args )
+    {
+        super( src, type, pagename, args );
+    }
+}

Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/ReferringPagesPlugin.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/ReferringPagesPlugin.java?rev=770959&r1=770958&r2=770959&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/ReferringPagesPlugin.java (original)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/ReferringPagesPlugin.java Sat May  2 14:15:13 2009
@@ -94,7 +94,7 @@
         {
             WikiPage page = context.getEngine().getPage( pageName );
         
-            Collection<WikiPath> links = refmgr.findReferrers( page.getPath() );
+            Collection<WikiPath> links = refmgr.getReferredBy( page.getPath() );
             String wikitext = "";
 
             super.initialize( context, params );

Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/UndefinedPagesPlugin.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/UndefinedPagesPlugin.java?rev=770959&r1=770958&r2=770959&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/UndefinedPagesPlugin.java (original)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/UndefinedPagesPlugin.java Sat May  2 14:15:13 2009
@@ -24,6 +24,8 @@
 import java.util.Map;
 import java.util.TreeSet;
 
+import javax.jcr.RepositoryException;
+
 import org.apache.wiki.ReferenceManager;
 import org.apache.wiki.WikiContext;
 import org.apache.wiki.api.PluginException;
@@ -48,7 +50,16 @@
         throws PluginException
     {
         ReferenceManager refmgr = context.getEngine().getReferenceManager();
-        Collection<String> links = refmgr.findUncreated();
+        Collection<String> links;
+        try
+        {
+            links = refmgr.findUncreated();
+        }
+        catch( RepositoryException e )
+        {
+            e.printStackTrace();
+            throw new PluginException( "Could not find uncreated pages.", e );
+        }
 
         super.initialize( context, params );
 

Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/UnusedPagesPlugin.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/UnusedPagesPlugin.java?rev=770959&r1=770958&r2=770959&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/UnusedPagesPlugin.java (original)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/UnusedPagesPlugin.java Sat May  2 14:15:13 2009
@@ -25,6 +25,8 @@
 import java.util.Map;
 import java.util.TreeSet;
 
+import javax.jcr.RepositoryException;
+
 import org.apache.wiki.ReferenceManager;
 import org.apache.wiki.WikiContext;
 import org.apache.wiki.api.PluginException;
@@ -57,7 +59,16 @@
         throws PluginException
     {
         ReferenceManager refmgr = context.getEngine().getReferenceManager();
-        Collection<String> links = refmgr.findUnreferenced();
+        Collection<String> links;
+        try
+        {
+            links = refmgr.findUnreferenced();
+        }
+        catch( RepositoryException e )
+        {
+            e.printStackTrace();
+            throw new PluginException( "Could not find unreferenced pages.", e );
+        }
         //
         // filter out attachments if "excludeattachments" was requested:
         //

Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/render/RenderingManager.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/render/RenderingManager.java?rev=770959&r1=770958&r2=770959&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/render/RenderingManager.java (original)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/render/RenderingManager.java Sat May  2 14:15:13 2009
@@ -345,7 +345,7 @@
                 m_documentCache.flushPattern( pageName );
                 try
                 {
-                    Collection<WikiPath> referringPages = m_engine.getReferenceManager().findReferrers( WikiPath.valueOf(pageName) );
+                    Collection<WikiPath> referringPages = m_engine.getReferenceManager().getReferredBy( WikiPath.valueOf(pageName) );
 
                     //
                     //  Flush also those pages that refer to this page (if an nonexistant page

Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/search/SearchManager.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/search/SearchManager.java?rev=770959&r1=770958&r2=770959&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/java/org/apache/wiki/search/SearchManager.java (original)
+++ incubator/jspwiki/trunk/src/java/org/apache/wiki/search/SearchManager.java Sat May  2 14:15:13 2009
@@ -24,16 +24,14 @@
 import java.util.*;
 
 import org.apache.commons.lang.time.StopWatch;
-import org.apache.wiki.*;
+import org.apache.wiki.InternalWikiException;
+import org.apache.wiki.NoRequiredPropertyException;
+import org.apache.wiki.WikiEngine;
 import org.apache.wiki.api.FilterException;
 import org.apache.wiki.api.WikiException;
 import org.apache.wiki.api.WikiPage;
 import org.apache.wiki.content.PageNotFoundException;
-import org.apache.wiki.event.WikiEvent;
-import org.apache.wiki.event.WikiEventListener;
-import org.apache.wiki.event.WikiEventUtils;
-import org.apache.wiki.event.WikiPageEvent;
-import org.apache.wiki.filters.BasicPageFilter;
+import org.apache.wiki.event.*;
 import org.apache.wiki.log.Logger;
 import org.apache.wiki.log.LoggerFactory;
 import org.apache.wiki.modules.InternalModule;
@@ -53,7 +51,6 @@
  */
 
 public class SearchManager
-    extends BasicPageFilter
     implements InternalModule, WikiEventListener
 {
     private static final Logger log = LoggerFactory.getLogger(SearchManager.class);
@@ -70,6 +67,8 @@
 
     private SearchProvider    m_searchProvider = null;
 
+    private WikiEngine m_engine = null;
+
     /**
      *  The name of the JSON object that manages search.
      */
@@ -82,15 +81,11 @@
      *  @param properties The list of Properties.
      *  @throws WikiException If it cannot be instantiated.
      */
-    public SearchManager( WikiEngine engine, Properties properties )
+    public SearchManager()
         throws WikiException
     {
-        initialize( engine, properties );
-
-        WikiEventUtils.addWikiEventListener(m_engine.getContentManager(),
-                                            WikiPageEvent.PAGE_DELETE_REQUEST, this);
-
-        JSONRPCManager.registerGlobalObject( JSON_SEARCH, new JSONSearch() );
+        // Do nothing, really
+        super();
     }
 
     /**
@@ -220,6 +215,11 @@
 
         loadSearchProvider(properties);
 
+        // Make sure we catch any page add/save/rename events
+        WikiEventManager.addWikiEventListener( engine.getContentManager(), this );
+
+        JSONRPCManager.registerGlobalObject( JSON_SEARCH, new JSONSearch() );
+        
         try
         {
             m_searchProvider.initialize(engine, properties);
@@ -295,7 +295,7 @@
      *  
      *  @return The current SearchProvider.
      */
-    public SearchProvider getSearchEngine()
+    protected SearchProvider getSearchProvider()
     {
         return m_searchProvider;
     }
@@ -322,7 +322,7 @@
      *  Removes the page from the search cache (if any).
      *  @param page  The page to remove
      */
-    public void pageRemoved(WikiPage page)
+    private void removePage(WikiPage page)
     {
         try
         {
@@ -335,35 +335,6 @@
     }
 
     /**
-     *  Reindexes the page.
-     *  
-     *  @param wikiContext {@inheritDoc}
-     *  @param content {@inheritDoc}
-     */
-    @Override
-    public void postSave( WikiContext wikiContext, String content )
-    {
-        //
-        //  Makes sure that we're indexing the latest version of this
-        //  page.
-        //
-        WikiPage p;
-        try
-        {
-            p = m_engine.getPage( wikiContext.getPage().getName() );
-            reindexPage( p );
-        }
-        catch( PageNotFoundException e )
-        {
-            // Swallow quietly; something went wrong but no point making fuss about it.
-        }
-        catch( ProviderException e )
-        {
-            log.info("Could not reindex a page",e);
-        }
-    }
-
-    /**
      *   Forces the reindex of the given page.
      *
      *   @param page The page.
@@ -380,22 +351,55 @@
      */
     public void actionPerformed(WikiEvent event)
     {
-        if( (event instanceof WikiPageEvent) && (event.getType() == WikiPageEvent.PAGE_DELETE_REQUEST) )
+        if ( !(event instanceof WikiPageEvent ) )
         {
-            String pageName = ((WikiPageEvent) event).getPageName();
-
-            try
-            {
-                WikiPage p = m_engine.getPage( pageName );
-                pageRemoved( p );
-            }
-            catch( PageNotFoundException e )
+           return; 
+        }
+        
+        String pageName = ((WikiPageEvent) event).getPageName();
+        switch ( event.getType() )
+        {
+            // If page was deleted, remove it from the index
+            case ( ContentEvent.NODE_DELETE_REQUEST ):
             {
-                throw new InternalWikiException("Page removed already!?!");
+                try
+                {
+                    WikiPage p = m_engine.getPage( pageName );
+                    removePage( p );
+                }
+                catch( PageNotFoundException e )
+                {
+                    throw new InternalWikiException("Page removed already!?!");
+                }
+                catch( ProviderException e ) 
+                {
+                    log.info( "Could not reindex page " + pageName, e );
+                    e.printStackTrace();
+                }
             }
-            catch( ProviderException e ) 
+            
+            // If page was saved, reindex it
+            case ( ContentEvent.NODE_SAVED ):
             {
-                // FIXME: How should it deal with this?
+                //
+                //  Makes sure that we're indexing the latest version of this
+                //  page.
+                //
+                WikiPage p;
+                try
+                {
+                    p = m_engine.getPage( pageName );
+                    reindexPage( p );
+                }
+                catch( PageNotFoundException e )
+                {
+                    // Swallow quietly; something went wrong but no point making fuss about it.
+                }
+                catch( ProviderException e )
+                {
+                    log.info( "Could not reindex page " + pageName, e );
+                    e.printStackTrace();
+                }
             }
         }
     }

Added: incubator/jspwiki/trunk/tests/etc/TestMigratorForm.jsp
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/etc/TestMigratorForm.jsp?rev=770959&view=auto
==============================================================================
--- incubator/jspwiki/trunk/tests/etc/TestMigratorForm.jsp (added)
+++ incubator/jspwiki/trunk/tests/etc/TestMigratorForm.jsp Sat May  2 14:15:13 2009
@@ -0,0 +1,7 @@
+<%@ taglib uri="http://stripes.sourceforge.net/stripes.tld" prefix="stripes" %>
+<stripes:useActionBean beanclass="org.apache.wiki.action.LoginActionBean" event="view" id="wikiActionBean" />
+<stripes:layout-render name="/templates/default/DefaultLayout.jsp">
+  <stripes:layout-component name="content">
+    <jsp:include page="/templates/default/LoginContent.jsp" />
+  </stripes:layout-component>
+</stripes:layout-render>

Modified: incubator/jspwiki/trunk/tests/java/org/apache/wiki/ReferenceManagerTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/java/org/apache/wiki/ReferenceManagerTest.java?rev=770959&r1=770958&r2=770959&view=diff
==============================================================================
--- incubator/jspwiki/trunk/tests/java/org/apache/wiki/ReferenceManagerTest.java (original)
+++ incubator/jspwiki/trunk/tests/java/org/apache/wiki/ReferenceManagerTest.java Sat May  2 14:15:13 2009
@@ -21,62 +21,64 @@
 
 package org.apache.wiki;
 
-import java.io.File;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Properties;
-import java.util.Set;
+import java.util.*;
+
+import javax.jcr.Node;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.Property;
+import javax.jcr.Session;
 
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
 import org.apache.wiki.api.WikiException;
+import org.apache.wiki.content.ContentManager;
 import org.apache.wiki.content.WikiPath;
 import org.apache.wiki.providers.ProviderException;
 
-
 /**
- *  @author Torsten Hildebrandt.
+ * @author Torsten Hildebrandt.
  */
 public class ReferenceManagerTest extends TestCase
 {
+    private static final WikiPath PATH_FOOBAR = WikiPath.valueOf( "Foobar" );
+
+    public static void main( String[] args )
+    {
+        junit.textui.TestRunner.main( new String[] { ReferenceManagerTest.class.getName() } );
+    }
+
+    public static Test suite()
+    {
+        return new TestSuite( ReferenceManagerTest.class );
+    }
+
     Properties props = new Properties();
+
     TestEngine engine;
+
     ReferenceManager mgr;
-    
+
     public ReferenceManagerTest( String s )
     {
         super( s );
     }
 
-    public void setUp()
-        throws Exception
+    public void setUp() throws Exception
     {
         props.load( TestEngine.findTestProperties() );
-        props.setProperty( "jspwiki.translatorReader.matchEnglishPlurals", "true");
-
-        //
-        //  We must make sure that the reference manager cache is cleaned first.
-        //
-        String workDir = props.getProperty( "jspwiki.workDir" );
-
-        if( workDir != null )
-        {
-            File refmgrfile = new File( workDir, "refmgr.ser" );
-            if( refmgrfile.exists() ) refmgrfile.delete();
-        }
-        
-        engine = new TestEngine(props);
-
+        props.setProperty( "jspwiki.translatorReader.matchEnglishPlurals", "true" );
+        engine = new TestEngine( props );
+        engine.emptyRepository();
+        engine.getReferenceManager().rebuild();
         engine.saveText( "TestPage", "Reference to [Foobar]." );
         engine.saveText( "Foobar", "Reference to [Foobar2], [Foobars], [Foobar]" );
 
         mgr = engine.getReferenceManager();
     }
 
-    public void tearDown()
-        throws Exception
+    public void tearDown() throws Exception
     {
         engine.deletePage( "TestPage" );
         engine.deletePage( "Foobar" );
@@ -92,354 +94,620 @@
         engine.deletePage( "NewBug" );
         engine.deletePage( "BugOne" );
         engine.deletePage( "BugTwo" );
-        
+
         engine.shutdown();
     }
 
-    /** Shortcut to help testing. */
-    private Set<WikiPath> findReferrers( String path ) throws ProviderException
-    {
-        return mgr.findReferrers(  WikiPath.valueOf(path) );
-    }
-    
-    public void testNonExistant1()
-        throws Exception
-    {
-        Collection<WikiPath> c = mgr.findReferrers( WikiPath.valueOf("Foobar2") );
-        
-        assertTrue( c.size() == 1 && c.contains( WikiPath.valueOf("Foobar") ) );
-    }
-    
-    public void testNonExistant2() throws ProviderException
-    {
-        Collection<WikiPath> c = findReferrers("TestBug");
-        
-        assertTrue( c.size() == 0 );
-    }
-    
-    public void testRemove()
-        throws Exception
+    /**
+     * Tests protected method
+     * {@link ReferenceManager#addReferredBy(WikiPath, List)}, which sets inbound
+     * links to a page from multiple sources. The destination page exists.
+     * 
+     * @throws Exception
+     */
+    public void testAddReferredBy() throws Exception
     {
-        Collection<WikiPath> c = findReferrers("Foobar2");
-        
-        assertTrue( c.size() == 1 && c.contains( WikiPath.valueOf( "Foobar") ) );
+        WikiPath source = WikiPath.valueOf( "SetReferredBy" );
+        WikiPath destination1 = WikiPath.valueOf( "PageOne" );
+        WikiPath destination2 = WikiPath.valueOf( "PageTwo" );
+        WikiPath destination3 = WikiPath.valueOf( "PageThree" );
+        
+        List<WikiPath> destinations = new ArrayList<WikiPath>();
+        destinations.add( WikiPath.valueOf( "PageOne" ) );
+        destinations.add( WikiPath.valueOf( "PageTwo" ) );
+        destinations.add( WikiPath.valueOf( "PageThree" ) );
+        for ( WikiPath destination : destinations )
+        {
+            mgr.addReferredBy( destination, source );
+        }
 
-        engine.deletePage( "Foobar" );
-        
-        c = findReferrers("Foobar2");
-        
-        assertNull( c );
+        List<WikiPath> links = mgr.getReferredBy( source );
+        assertEquals( 0, links.size() );
         
-        engine.saveText( "Foobar", "[Foobar2]");
-        
-        c = findReferrers("Foobar2");
-        
-        assertTrue( c.size() == 1 && c.contains("Foobar") );        
+        links = mgr.getReferredBy( destination1 );
+        assertEquals( 1, links.size() );
+        assertTrue( links.contains(  source ) );
+               
+        links = mgr.getReferredBy( destination2 );
+        assertEquals( 1, links.size() );
+        assertTrue( links.contains(  source ) );
+        
+        links = mgr.getReferredBy( destination3 );
+        assertEquals( 1, links.size() );
+        assertTrue( links.contains(  source ) );
     }
-    
-    public void testUnreferenced()
-        throws Exception
+
+    /**
+     * Tests low-level method for adding to a multi-valued JCR Node property.
+     * @throws Exception
+     */
+    public void testAddToValues() throws Exception
     {
-        Collection<String> c = mgr.findUnreferenced();
-        assertTrue( "Unreferenced page not found by ReferenceManager",
-                    Util.collectionContains( c, "TestPage" ));
+        ContentManager cm = engine.getContentManager();
+        String jcrPath = ReferenceManager.REFERENCES_ROOT + "/" + "TestAddToValues";
+        Node node;
+        Property prop;
+        Session s = cm.getCurrentSession();
+        
+        mgr.addToValues( jcrPath, "foo","Value1" );
+        s.save();
+        node = cm.getJCRNode( jcrPath );
+        prop = node.getProperty( "foo" );
+        assertNotNull( prop.getValues() );
+        assertEquals( 1, prop.getValues().length );
+        assertEquals( "Value1", prop.getValues()[0].getString() );
+        
+        mgr.addToValues( jcrPath, "foo","Value2" );
+        s.save();
+        node = cm.getJCRNode( jcrPath );
+        prop = node.getProperty( "foo" );
+        assertNotNull( prop.getValues() );
+        assertEquals( 2, prop.getValues().length );
+        assertEquals( "Value2", prop.getValues()[1].getString() );
+        
+        // Add the same Value1 again!
+        mgr.addToValues( jcrPath, "foo","Value1" );
+        s.save();
+        node = cm.getJCRNode( jcrPath );
+        prop = node.getProperty( "foo" );
+        assertNotNull( prop.getValues() );
+        assertEquals( 3, prop.getValues().length );
+        assertEquals( "Value1", prop.getValues()[2].getString() );
     }
 
-
-    public void testBecomesUnreferenced()
-        throws Exception
+    public void testBecomesUnreferenced() throws Exception
     {
         engine.saveText( "Foobar2", "[TestPage]" );
 
-        Collection<String> c = mgr.findUnreferenced();
-        assertEquals( "Wrong # of orphan pages, stage 1", 0, c.size() );
+        List<String> c = mgr.findUnreferenced();
+        assertEquals( 0, c.size() );
 
         engine.saveText( "Foobar2", "norefs" );
         c = mgr.findUnreferenced();
-        assertEquals( "Wrong # of orphan pages", 1, c.size() );
-
-        Iterator<String> i = c.iterator();
-        String first = i.next();
-        assertEquals( "Not correct referrers", "TestPage", first );
+        assertEquals( 1, c.size() );
+        assertEquals( "TestPage", c.get( 0 ) );
     }
 
-    public void testUncreated()
-        throws Exception
+    public void testCircularRefs() throws Exception
     {
-        Collection<String> c = mgr.findUncreated();
-        
-        assertTrue( c.size()==1 && c.iterator().next().equals("Foobar2") );
-    }
-
-    public void testReferrers()
-        throws Exception
-    {
-        Collection<WikiPath> c = findReferrers( "TestPage" );
-        assertNull( "TestPage referrers", c );
-
-        c = findReferrers( "Foobar" );
-        assertTrue( "Foobar referrers", c.size()==2  );
-
-        c = findReferrers( "Foobar2" );
-        assertTrue( "Foobar2 referrers", c.size()==1 && ((WikiPath) c.iterator().next()).equals("Foobar") );
+        engine.saveText( "Foobar2", "ref to [TestPage]" );
 
-        c = findReferrers( "Foobars" );
-        assertEquals( "Foobars referrers", 2, c.size() );
-        //assertEquals( "Foobars referrer 'TestPage'", "TestPage", (String) c.iterator().next() );
+        assertEquals( 0, mgr.findUncreated().size() );
+        assertEquals( 0, mgr.findUnreferenced().size() );
     }
 
-    public void testRefersTo()
-        throws Exception
+    public void testExtractLinks() throws Exception
     {
-        Collection<String> s = mgr.findRefersTo( "Foobar" );
-        
-        assertTrue( "does not have Foobar", s.contains("Foobar") );
-        // assertTrue( "does not have Foobars", s.contains("Foobars") );
-        assertTrue( "does not have Foobar2", s.contains("Foobar2") );
+        String src = "Foobar. [Foobar].  Frobozz.  [This is a link].";
+        engine.deletePage( "Test" );
+        engine.saveText( "Test", src );
+        List<WikiPath> results = mgr.extractLinks( WikiPath.valueOf( "Test" ) );
+
+        assertEquals( 2, results.size() );
+        assertEquals( "item 0", PATH_FOOBAR, results.get( 0 ) );
+        assertEquals( "item 1", WikiPath.valueOf( "Main:This is a link" ), results.get( 1 ) );
     }
     
-    /**
-     *  Should fail in 2.2.14-beta
-     * @throws Exception
-     */
-    public void testSingularReferences()
-    throws Exception
+    public void testGetReferredBy() throws Exception
     {
-        engine.saveText( "RandomPage", "FatalBugs" );
-        engine.saveText( "FatalBugs", "<foo>" );
-        engine.saveText( "BugCommentPreviewDeletesAllComments", "FatalBug" );
+        //engine.saveText( "TestPage", "Reference to [Foobar]." );
+        //engine.saveText( "Foobar", "Reference to [Foobar2], [Foobars], [Foobar]" );
         
-        Collection<WikiPath> c = findReferrers( "FatalBugs" );
-        
-        assertEquals( "FatalBugs referrers number", 2, c.size()  );
-    }
+        List<WikiPath> c = mgr.getReferredBy( WikiPath.valueOf( "TestPage" ));
+        assertEquals( 0, c.size() );
 
-    /** 
-     *  Is a page recognized as referenced if only plural form links exist.
-     */
+        c = mgr.getReferredBy( WikiPath.valueOf( "Foobar" ));
+        assertEquals( 3, c.size() );
 
-    // NB: Unfortunately, cleaning out self-references in the case there's
-    //     a plural and a singular form of the page becomes nigh impossible, so we
-    //     just don't do it.
-    public void testUpdatePluralOnlyRef()
-        throws Exception
-    {
-        engine.saveText( "TestPage", "Reference to [Foobars]." );
-        Collection<String> c = mgr.findUnreferenced();
-        assertTrue( "Foobar unreferenced", c.size()==1 && c.iterator().next().equals("TestPage") );
+        c = mgr.getReferredBy( WikiPath.valueOf( "Foobar2" ));
+        assertEquals( 1, c.size() );
+        assertEquals( WikiPath.valueOf( "Foobar" ), c.get( 0 ) );
 
-        Collection<WikiPath>p = findReferrers( "Foobar" );
-        assertTrue( "Foobar referrers", 
-                    p.size()==2 );
+        // The singular 'Foobar' exists, but this variant does not
+        c = mgr.getReferredBy( WikiPath.valueOf( "Foobars" ));
+        assertEquals( 0, c.size() );
     }
 
-
-    /** 
-     *  Opposite to testUpdatePluralOnlyRef(). Is a page with plural form recognized as
-     *  the page referenced by a singular link.
-     */
-
-    public void testUpdateFoobar2s()
-        throws Exception
+    public void testGetRefersTo() throws Exception
     {
-        engine.saveText( "Foobar2s", "qwertz" );
-        assertTrue( "no uncreated", mgr.findUncreated().size()==0 );
+        List<WikiPath> links;
 
-        Collection<WikiPath> c = findReferrers( "Foobar2s" );
-        assertTrue( "referrers", c!=null && c.size()==1 && c.iterator().next().toString().equals("Foobar") );
-    }
+        links = mgr.getRefersTo( WikiPath.valueOf( "TestPage" ) );
+        assertEquals( 1, links.size() );
+        assertTrue( "Does not have Foobar, but it should have", links.contains( WikiPath.valueOf( "Foobar" ) ) );
 
-    public void testUpdateBothExist()
-        throws Exception
-    {
-        engine.saveText( "Foobars", "qwertz" );
-        Collection<WikiPath> c = findReferrers( "Foobars" );
-        assertEquals( "Foobars referrers", 2, c.size() );
-        assertTrue( "Foobars referrer is not TestPage", c.contains( WikiPath.valueOf( "TestPage" ) ) 
-                    && c.contains( WikiPath.valueOf( "Foobar") ) );
+        links = mgr.getRefersTo( WikiPath.valueOf( "Foobar" ) );
+        assertEquals( 3, links.size() );
+        assertTrue( "Does not have Foobar, but it should have", links.contains( WikiPath.valueOf( "Foobar" ) ) ); // 2 of
+        // these
+        assertTrue( "Does not have Foobar2, but it should have", links.contains( WikiPath.valueOf( "Foobar2" ) ) ); // 1 of
+        // these
+
+        links = mgr.getRefersTo( WikiPath.valueOf( "Foobar2" ) );
+        assertEquals( 0, links.size() );
     }
 
-    public void testUpdateBothExist2()
-        throws Exception
+    public void testNonExistant1() throws Exception
     {
-        engine.saveText( "Foobars", "qwertz" );
-        engine.saveText( "TestPage", "Reference to [Foobar], [Foobars]." );
-        
-        Collection<WikiPath> c = findReferrers( "Foobars" );
-        assertEquals( "Foobars referrers count", 2, c.size() );
+        Collection<WikiPath> c = mgr.getReferredBy( WikiPath.valueOf( "Foobar2" ) );
 
-        assertTrue( "Foobars referrers", 
-                    c.contains( WikiPath.valueOf( "TestPage" ) ) && c.contains( WikiPath.valueOf( "Foobar" ) ) );
+        assertTrue( c.size() == 1 && c.contains( WikiPath.valueOf( "Foobar" ) ) );
     }
 
-    public void testCircularRefs()
-        throws Exception
+    public void testNonExistant2() throws ProviderException
     {
-        engine.saveText( "Foobar2", "ref to [TestPage]" );
-        
-        assertTrue( "no uncreated", mgr.findUncreated().size()==0 );
-        assertTrue( "no unreferenced", mgr.findUnreferenced().size()==0 );
+        Collection<WikiPath> c = mgr.getReferredBy( WikiPath.valueOf( "TestBug" ));
+
+        assertTrue( c.size() == 0 );
     }
 
-    public void testPluralSingularUpdate1()
-        throws Exception
+    public void testPluralSingularUpdate1() throws Exception
     {
         engine.saveText( "BugOne", "NewBug" );
         engine.saveText( "NewBugs", "foo" );
         engine.saveText( "OpenBugs", "bar" );
-        
+
         engine.saveText( "BugOne", "OpenBug" );
-        
-        Collection<WikiPath> ref = findReferrers( "NewBugs" );
-        assertNull("newbugs",ref); // No referrers must be found
 
-        ref = findReferrers( "NewBug" );
-        assertNull("newbug",ref); // No referrers must be found
+        Collection<WikiPath> links = mgr.getReferredBy( WikiPath.valueOf( "NewBugs" ));
+        assertEquals( "newbugs", links.size() ); // No referrers must be found
+
+        links = mgr.getReferredBy( WikiPath.valueOf( "NewBug" ));
+        assertEquals( "newbug", links.size() ); // No referrers must be found
 
-        ref = findReferrers( "OpenBugs" );
-        assertEquals("openbugs",1,ref.size());
-        assertEquals("openbugs2","BugOne",ref.iterator().next().toString());
+        links = mgr.getReferredBy( WikiPath.valueOf( "OpenBugs" ));
+        assertEquals( "openbugs", 1, links.size() );
+        assertEquals( "openbugs2", "BugOne", links.iterator().next().toString() );
 
-        ref = findReferrers( "OpenBug" );
-        assertEquals("openbug",1,ref.size());
-        assertEquals("openbug2","BugOne",ref.iterator().next().toString());
+        links = mgr.getReferredBy( WikiPath.valueOf( "OpenBug" ));
+        assertEquals( "openbug", 1, links.size() );
+        assertEquals( "openbug2", "BugOne", links.iterator().next().toString() );
 
     }
 
-    public void testPluralSingularUpdate2()
-        throws Exception
+    public void testPluralSingularUpdate2() throws Exception
     {
         engine.saveText( "BugOne", "NewBug" );
         engine.saveText( "NewBug", "foo" );
         engine.saveText( "OpenBug", "bar" );
-    
+
         engine.saveText( "BugOne", "OpenBug" );
-    
-        Collection<WikiPath> ref = findReferrers( "NewBugs" );
-        assertNull("newbugs",ref); // No referrers must be found
 
-        ref = findReferrers( "NewBug" );
-        assertNull("newbug",ref); // No referrers must be found
+        Collection<WikiPath> links = mgr.getReferredBy( WikiPath.valueOf( "NewBugs" ));
+        assertEquals( 0, links.size() ); // No referrers must be found
+
+        links = mgr.getReferredBy( WikiPath.valueOf( "NewBug" ));
+        assertEquals( 0, links.size() ); // No referrers must be found
 
-        ref = findReferrers( "OpenBugs" );
-        assertEquals("openbugs",1,ref.size());
-        assertEquals("openbugs2","BugOne",ref.iterator().next().toString());
+        links = mgr.getReferredBy( WikiPath.valueOf( "OpenBugs" ));
+        assertEquals( "openbugs", 1, links.size() );
+        assertEquals( "openbugs2", "BugOne", links.iterator().next().toString() );
 
-        ref = findReferrers( "OpenBug" );
-        assertEquals("openbug",1,ref.size());
-        assertEquals("openbug2","BugOne",ref.iterator().next().toString());
+        links = mgr.getReferredBy( WikiPath.valueOf( "OpenBug" ));
+        assertEquals( "openbug", 1, links.size() );
+        assertEquals( "openbug2", "BugOne", links.iterator().next().toString() );
 
     }
 
-    public void testPluralSingularUpdate3()
-        throws Exception
+    public void testPluralSingularUpdate3() throws Exception
     {
         engine.saveText( "BugOne", "NewBug" );
         engine.saveText( "BugTwo", "NewBug" );
         engine.saveText( "NewBugs", "foo" );
         engine.saveText( "OpenBugs", "bar" );
-    
+
         engine.saveText( "BugOne", "OpenBug" );
-    
-        Collection<WikiPath> ref = findReferrers( "NewBugs" );
-        assertEquals("newbugs",1,ref.size()); 
-        assertEquals("newbugs2","BugTwo",ref.iterator().next().toString()); 
-
-        ref = findReferrers( "NewBug" );
-        assertEquals("newbugs",1,ref.size()); 
-        assertEquals("newbugs2","BugTwo",ref.iterator().next().toString()); 
-
-        ref = findReferrers( "OpenBugs" );
-        assertEquals("openbugs",1,ref.size());
-        assertEquals("openbugs2","BugOne",ref.iterator().next().toString());
-
-        ref = findReferrers( "OpenBug" );
-        assertEquals("openbug",1,ref.size());
-        assertEquals("openbug2","BugOne",ref.iterator().next().toString());
+
+        Collection<WikiPath> links = mgr.getReferredBy( WikiPath.valueOf( "NewBugs" ));
+        assertEquals( "newbugs", 1, links.size() );
+        assertEquals( "newbugs2", "BugTwo", links.iterator().next().toString() );
+
+        links = mgr.getReferredBy( WikiPath.valueOf( "NewBug" ));
+        assertEquals( "newbugs", 1, links.size() );
+        assertEquals( "newbugs2", "BugTwo", links.iterator().next().toString() );
+
+        links = mgr.getReferredBy( WikiPath.valueOf( "OpenBugs" ));
+        assertEquals( "openbugs", 1, links.size() );
+        assertEquals( "openbugs2", "BugOne", links.iterator().next().toString() );
+
+        links = mgr.getReferredBy( WikiPath.valueOf( "OpenBug" ));
+        assertEquals( "openbug", 1, links.size() );
+        assertEquals( "openbug2", "BugOne", links.iterator().next().toString() );
 
     }
 
+    public void testRebuild() throws Exception
+    {
+        ContentManager cm = engine.getContentManager();
+        Node node = (Node)cm.getJCRNode( ReferenceManager.REFERENCES_ROOT );
+        assertNotNull( node );
+        assertNotSame( 0, node.getNodes().getSize() );
+        mgr.rebuild();
+        
+        // Make sure all of the inbound references got deleted
+        node = (Node)cm.getJCRNode( ReferenceManager.REFERENCES_ROOT );
+        assertNotNull( node );
+        assertEquals( 0, node.getNodes().getSize() );
+        
+        // Make sure the not-created/not-referenced properties got created
+        try
+        {
+            node.getProperty( ReferenceManager.NOT_CREATED );
+        }
+        catch ( PathNotFoundException e )
+        {
+            // Excellent!
+        }
+        try
+        {
+            node.getProperty( ReferenceManager.NOT_REFERENCED );
+        }
+        catch ( PathNotFoundException e )
+        {
+            // Excellent!
+        }
+    }
+
+    public void testRemove() throws Exception
+    {
+        Collection<WikiPath> c = mgr.getReferredBy( WikiPath.valueOf( "Foobar2" ));
+        assertEquals( 1, c.size() );
+        assertTrue( c.contains( WikiPath.valueOf( "Foobar" ) ) );
+
+        engine.deletePage( "Foobar" );
+        c = mgr.getReferredBy( WikiPath.valueOf("Foobar2" ));
+        assertEquals( 0, c.size() );
+
+        engine.saveText( "Foobar", "[Foobar2]" );
+        c = mgr.getReferredBy( WikiPath.valueOf( "Foobar2" ));
+        assertEquals( 1, c.size() );
+        assertTrue( c.contains( WikiPath.valueOf( "Foobar" ) ) );
+    }
+
+    /**
+     * Tests low-level method for removing items from a multi-valued JCR Node property.
+     * @throws Exception
+     */
+    public void testRemoveAllFromValues() throws Exception
+    {
+        ContentManager cm = engine.getContentManager();
+        String jcrPath = ReferenceManager.REFERENCES_ROOT + "/" + "TestRemoveFromValues";
+        Node node;
+        Property prop;
+        Session s = cm.getCurrentSession();
+        
+        mgr.addToValues( jcrPath, "foo","Value1" );
+        mgr.addToValues( jcrPath, "foo","Value2" );
+        s.save();
+        node = cm.getJCRNode( jcrPath );
+        prop = node.getProperty( "foo" );
+        assertNotNull( prop.getValues() );
+        assertEquals( 2, prop.getValues().length );
+
+        // Remove the first value
+        mgr.removeAllFromValues( jcrPath, "foo", "Value1" );
+        s.save();
+        node = cm.getJCRNode( jcrPath );
+        prop = node.getProperty( "foo" );
+        assertNotNull( prop.getValues() );
+        assertEquals( 1, prop.getValues().length );
+        assertEquals( "Value2", prop.getValues()[0].getString() );
+        
+        // Try removing a value that does not exist in the property
+        mgr.removeAllFromValues( jcrPath, "foo", "NonExistentValue" );
+        s.save();
+        node = cm.getJCRNode( jcrPath );
+        prop = node.getProperty( "foo" );
+        assertNotNull( prop.getValues() );
+        assertEquals( 1, prop.getValues().length );
+        assertEquals( "Value2", prop.getValues()[0].getString() );
+        
+        // Remove the last value
+        mgr.removeAllFromValues( jcrPath, "foo", "Value2" );
+        s.save();
+        node = cm.getJCRNode( jcrPath );
+        try
+        {
+            prop = node.getProperty( "foo" );
+        }
+        catch ( PathNotFoundException e )
+        {
+            // Good! This is what we expect.
+        }
+        
+        // Add back in the first value, twice
+        mgr.addToValues( jcrPath, "foo","Value1" );
+        mgr.addToValues( jcrPath, "foo","Value1" );
+        s.save();
+        node = cm.getJCRNode( jcrPath );
+        prop = node.getProperty( "foo" );
+        assertNotNull( prop.getValues() );
+        assertEquals( 2, prop.getValues().length );
+        
+        // Remove the first value -- ALL should be gone now
+        mgr.removeAllFromValues( jcrPath, "foo", "Value1" );
+        s.save();
+        node = cm.getJCRNode( jcrPath );
+        try
+        {
+            prop = node.getProperty( "foo" );
+        }
+        catch ( PathNotFoundException e )
+        {
+            // Good! This is what we expect.
+        }
+    }
+
+    /**
+     * Tests protected method {@link ReferenceManager#removeLinks(WikiPath)},
+     * which removes all outbound links from a page to multiple destinations,
+     * and removes all inbound links to the page as well. The source page
+     * exists.
+     * 
+     * @throws Exception
+     */
+    public void testRemoveLinks() throws Exception
+    {
+        // Set up some test pages
+        engine.saveText( "RemoveLinks", "Test page." );
+        engine.saveText( "Destination1", "Test page." );
+        engine.saveText( "Destination2", "Test page." );
+        engine.saveText( "Destination3", "Test page." );
+
+        // Set source-->dest1,2,3,4
+        WikiPath source = WikiPath.valueOf( "RemoveLinks" );
+        List<WikiPath> destinations = new ArrayList<WikiPath>();
+        WikiPath destination1 = WikiPath.valueOf( "Destination1" );
+        WikiPath destination2 = WikiPath.valueOf( "Destination2" );
+        WikiPath destination3 = WikiPath.valueOf( "Destination3" );
+        WikiPath destination4 = WikiPath.valueOf( "Destination4" );
+        destinations.add( destination1 );
+        destinations.add( destination2 );
+        destinations.add( destination3 );
+        destinations.add( destination4 );
+        mgr.setLinks( source, destinations );
+        
+        // We should see four outbound links from source-->dest1,2,3,4
+        assertEquals( 4, mgr.getRefersTo( source ).size() );
+        assertEquals( 0, mgr.getRefersTo( destination1 ).size() );
+        assertEquals( 0, mgr.getRefersTo( destination2 ).size() );
+        assertEquals( 0, mgr.getRefersTo( destination3 ).size() );
+        assertEquals( 0, mgr.getRefersTo( destination4 ).size() );
+        
+        // We should see four inbound links dest1,2,3,4<--source
+        assertEquals( 0, mgr.getReferredBy( source ).size() );
+        assertEquals( 1, mgr.getReferredBy( destination1 ).size() );
+        assertEquals( 1, mgr.getReferredBy( destination2 ).size() );
+        assertEquals( 1, mgr.getReferredBy( destination3 ).size() );
+        assertEquals( 1, mgr.getReferredBy( destination4 ).size() );
+        
+        // Now, remove all links from the source to dest1,2,3, and all inbound links too
+        mgr.removeLinks( source );
+        assertEquals( 0, mgr.getRefersTo( source ).size() );
+        assertEquals( 0, mgr.getReferredBy( source ).size() );
+        assertEquals( 0, mgr.getReferredBy( destination1 ).size() );
+        assertEquals( 0, mgr.getReferredBy( destination2 ).size() );
+        assertEquals( 0, mgr.getReferredBy( destination3 ).size() );
+        assertEquals( 0, mgr.getReferredBy( destination4 ).size() );
+        assertEquals( 0, mgr.getRefersTo( destination1 ).size() );
+        assertEquals( 0, mgr.getRefersTo( destination2 ).size() );
+        assertEquals( 0, mgr.getRefersTo( destination3 ).size() );
+        assertEquals( 0, mgr.getRefersTo( destination4 ).size() );
+    }
+
     public void testSelf() throws WikiException
     {
         engine.saveText( "BugOne", "BugOne" );
-        Collection<WikiPath> ref = findReferrers( "BugOne" );
-        assertEquals("wrong size",1,ref.size());
-        assertEquals("ref", "Main:BugOne", ref.iterator().next().toString());
+        Collection<WikiPath> ref = mgr.getReferredBy( WikiPath.valueOf( "BugOne" ));
+        assertEquals( "wrong size", 1, ref.size() );
+        assertEquals( "ref", "Main:BugOne", ref.iterator().next().toString() );
     }
-    
-    public static Test suite()
+
+    /**
+     * Tests protected method {@link ReferenceManager#setLinks(WikiPath, List)},
+     * which sets bi-directional links from a source page to multiple
+     * destinations, and vice-versa. The source and destination pages exist.
+     * 
+     * @throws Exception
+     */
+    public void testSetLinks() throws Exception
     {
-        return new TestSuite( ReferenceManagerTest.class );
+        // Set up some test pages
+        engine.saveText( "SetLinks", "Test page." );
+        engine.saveText( "Destination1", "Test page." );
+        engine.saveText( "Destination2", "Test page." );
+        engine.saveText( "Destination3", "Test page." );
+
+        // Set source-->dest1,2,3
+        WikiPath source = WikiPath.valueOf( "SetLinks" );
+        List<WikiPath> destinations = new ArrayList<WikiPath>();
+        WikiPath destination1 = WikiPath.valueOf( "Destination1" );
+        WikiPath destination2 = WikiPath.valueOf( "Destination2" );
+        WikiPath destination3 = WikiPath.valueOf( "Destination3" );
+        destinations.add( destination1 );
+        destinations.add( destination2 );
+        destinations.add( destination3 );
+        mgr.setLinks( source, destinations );
+
+        // We should see three outbound links from source-->dest1,2,3
+        List<WikiPath> links;
+        links = mgr.getRefersTo( source );
+        assertEquals( 3, links.size() );
+        assertTrue( links.contains( destination1 ) );
+        assertTrue( links.contains( destination2 ) );
+        assertTrue( links.contains( destination3 ) );
+        
+        // Each dest1,2,3 should NOT have created an inbound link to source
+        assertEquals( 0, mgr.getReferredBy( source ).size() );
+
+        // Each of the destination pages should have 1 inbound link from source
+        links = mgr.getReferredBy( destination1 );
+        assertEquals( 1, links.size() );
+        assertTrue( links.contains( source ) );
+
+        links = mgr.getReferredBy( destination2 );
+        assertEquals( 1, links.size() );
+        assertTrue( links.contains( source ) );
+
+        links = mgr.getReferredBy( destination3 );
+        assertEquals( 1, links.size() );
+        assertTrue( links.contains( source ) );
     }
     
-    public static void main(String[] args)
+    /**
+     * Tests protected method
+     * {@link ReferenceManager#setRefersTo(WikiPath, List)}, which sets
+     * outbound links from a page to multiple destinatiions. The source page
+     * exists.
+     * 
+     * @throws Exception
+     */
+    public void testSetRefersTo() throws Exception
     {
-        junit.textui.TestRunner.main( new String[] { ReferenceManagerTest.class.getName() } );
+        WikiPath source = WikiPath.valueOf( "TestPage" );
+        List<WikiPath> destinations = new ArrayList<WikiPath>();
+        destinations.add( WikiPath.valueOf( "PageOne" ) );
+        destinations.add( WikiPath.valueOf( "PageTwo" ) );
+        destinations.add( WikiPath.valueOf( "PageThree" ) );
+        mgr.setRefersTo( source, destinations );
+
+        List<WikiPath> links = mgr.getRefersTo( source );
+        assertEquals( 3, links.size() );
+        assertTrue( links.contains( WikiPath.valueOf( "PageOne" ) ) );
+        assertTrue( links.contains( WikiPath.valueOf( "PageTwo" ) ) );
+        assertTrue( links.contains( WikiPath.valueOf( "PageThree" ) ) );
     }
     
+    /**
+     * Should fail in 2.2.14-beta
+     * 
+     * @throws Exception
+     */
+    public void testSingularReferences() throws Exception
+    {
+        engine.saveText( "RandomPage", "FatalBugs" );
+        engine.saveText( "FatalBugs", "<foo>" );
+        engine.saveText( "BugCommentPreviewDeletesAllComments", "FatalBug" );
+
+        Collection<WikiPath> c = mgr.getReferredBy( WikiPath.valueOf( "FatalBugs" ));
+
+        assertEquals( "FatalBugs referrers number", 2, c.size() );
+    }
     
+
+    public void testUncreated() throws Exception
+    {
+        List<String> c = mgr.findUncreated();
+        assertEquals( 1, c.size());
+        assertEquals( "Main:Foobar2", c.get( 0 ) );
+    }
+
+    public void testUnreferenced() throws Exception
+    {
+        List<String> c = mgr.findUnreferenced();
+        assertEquals( 1, c.size() );
+        assertEquals( "TestPage", c.get( 0 ) );
+    }
+
+    public void testUpdateBothExist() throws Exception
+    {
+        engine.saveText( "Foobars", "qwertz" );
+        Collection<WikiPath> c = mgr.getReferredBy( WikiPath.valueOf( "Foobars" ));
+        assertEquals( "Foobars referrers", 2, c.size() );
+        assertTrue( "Foobars referrer is not TestPage", c.contains( WikiPath.valueOf( "TestPage" ) )
+                                                        && c.contains( WikiPath.valueOf( "Foobar" ) ) );
+    }
+
+    public void testUpdateBothExist2() throws Exception
+    {
+        engine.saveText( "Foobars", "qwertz" );
+        engine.saveText( "TestPage", "Reference to [Foobar], [Foobars]." );
+
+        Collection<WikiPath> c = mgr.getReferredBy( WikiPath.valueOf( "Foobars" ));
+        assertEquals( "Foobars referrers count", 2, c.size() );
+
+        assertTrue( "Foobars referrers", c.contains( WikiPath.valueOf( "TestPage" ) ) && c.contains( WikiPath.valueOf( "Foobar" ) ) );
+    }
+
     /**
-     * Test method: dumps the contents of  ReferenceManager link lists to stdout.
-     * This method is NOT synchronized, and should be used in testing
-     * with one user, one WikiEngine only.
+     * Opposite to testUpdatePluralOnlyRef(). Is a page with plural form
+     * recognized as the page referenced by a singular link.
      */
-    /*
-    public static String dumpReferenceManager( ReferenceManager rm )
+
+    public void testUpdateFoobar2s() throws Exception
     {
-        StringBuffer buf = new StringBuffer();
-        try
-        {
-            buf.append( "================================================================\n" );
-            buf.append( "Referred By list:\n" );
-            Set keys = rm.getReferredBy().keySet();
-            Iterator it = keys.iterator();
-            while( it.hasNext() )
-            {
-                String key = (String) it.next();
-                buf.append( key + " referred by: " );
-                Set refs = (Set)rm.getReferredBy().get( key );
-                Iterator rit = refs.iterator();
-                while( rit.hasNext() )
-                {
-                    String aRef = (String)rit.next();
-                    buf.append( aRef + " " );
-                }
-                buf.append( "\n" );
-            }
-            
-            
-            buf.append( "----------------------------------------------------------------\n" );
-            buf.append( "Refers To list:\n" );
-            keys = rm.getRefersTo().keySet();
-            it = keys.iterator();
-            while( it.hasNext() )
-            {
-                String key = (String) it.next();
-                buf.append( key + " refers to: " );
-                Collection refs = (Collection)rm.getRefersTo().get( key );
-                if(refs != null)
-                {
-                    Iterator rit = refs.iterator();
-                    while( rit.hasNext() )
-                    {
-                        String aRef = (String)rit.next();
-                        buf.append( aRef + " " );
-                    }
-                    buf.append( "\n" );
-                }
-                else
-                    buf.append("(no references)\n");
-            }
-            buf.append( "================================================================\n" );
-        }
-        catch(Exception e)
-        {
-            buf.append("Problem in dump(): " + e + "\n" );
-        }
-        
-        return( buf.toString() );
+        engine.saveText( "Foobar2s", "qwertz" );
+        assertEquals( 0, mgr.findUncreated().size() );
+
+        Collection<WikiPath> c = mgr.getReferredBy( WikiPath.valueOf( "Foobar2s" ));
+        assertTrue( "referrers", c != null && c.size() == 1 && c.iterator().next().toString().equals( "Foobar" ) );
     }
-    */
 
-}
+    /**
+     * Is a page recognized as referenced if only plural form links exist.
+     */
+
+    // NB: Unfortunately, cleaning out self-references in the case there's
+    // a plural and a singular form of the page becomes nigh impossible, so we
+    // just don't do it.
+    public void testUpdatePluralOnlyRef() throws Exception
+    {
+        engine.saveText( "TestPage", "Reference to [Foobars]." );
+        List<String> c = mgr.findUnreferenced();
+        assertEquals( 1, c.size() );
+        assertEquals( "TestPage", c.get( 0 ) );
+
+        Collection<WikiPath> p = mgr.getReferredBy( WikiPath.valueOf( "Foobar" ));
+        assertTrue( "Foobar referrers", p.size() == 2 );
+    }
 
+    /**
+     * Test method: dumps the contents of ReferenceManager link lists to stdout.
+     * This method is NOT synchronized, and should be used in testing with one
+     * user, one WikiEngine only.
+     */
+    /*
+     * public static String dumpReferenceManager( ReferenceManager rm ) {
+     * StringBuffer buf = new StringBuffer(); try { buf.append(
+     * "================================================================\n" );
+     * buf.append( "Referred By list:\n" ); Set keys =
+     * rm.getReferredBy().keySet(); Iterator it = keys.iterator(); while(
+     * it.hasNext() ) { String key = (String) it.next(); buf.append( key + "
+     * referred by: " ); Set refs = (Set)rm.getReferredBy().get( key ); Iterator
+     * rit = refs.iterator(); while( rit.hasNext() ) { String aRef =
+     * (String)rit.next(); buf.append( aRef + " " ); } buf.append( "\n" ); }
+     * buf.append(
+     * "----------------------------------------------------------------\n" );
+     * buf.append( "Refers To list:\n" ); keys = rm.getRefersTo().keySet(); it =
+     * keys.iterator(); while( it.hasNext() ) { String key = (String) it.next();
+     * buf.append( key + " refers to: " ); Collection refs =
+     * (Collection)rm.getRefersTo().get( key ); if(refs != null) { Iterator rit =
+     * refs.iterator(); while( rit.hasNext() ) { String aRef =
+     * (String)rit.next(); buf.append( aRef + " " ); } buf.append( "\n" ); }
+     * else buf.append("(no references)\n"); } buf.append(
+     * "================================================================\n" ); }
+     * catch(Exception e) { buf.append("Problem in dump(): " + e + "\n" ); }
+     * return( buf.toString() ); }
+     */
+
+}

Modified: incubator/jspwiki/trunk/tests/java/org/apache/wiki/TestEngine.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/java/org/apache/wiki/TestEngine.java?rev=770959&r1=770958&r2=770959&view=diff
==============================================================================
--- incubator/jspwiki/trunk/tests/java/org/apache/wiki/TestEngine.java (original)
+++ incubator/jspwiki/trunk/tests/java/org/apache/wiki/TestEngine.java Sat May  2 14:15:13 2009
@@ -42,10 +42,8 @@
 import org.apache.wiki.api.WikiException;
 import org.apache.wiki.api.WikiPage;
 import org.apache.wiki.attachment.Attachment;
-import org.apache.wiki.auth.AuthenticationManager;
-import org.apache.wiki.auth.SessionMonitor;
-import org.apache.wiki.auth.Users;
-import org.apache.wiki.auth.WikiSecurityException;
+import org.apache.wiki.auth.*;
+import org.apache.wiki.auth.user.XMLUserDatabase;
 import org.apache.wiki.content.PageAlreadyExistsException;
 import org.apache.wiki.content.PageNotFoundException;
 import org.apache.wiki.content.WikiPath;
@@ -449,6 +447,8 @@
     {
         props.put( AuthenticationManager.PROP_LOGIN_THROTTLING, "false" );
         props.put( WikiEngine.PROP_URLCONSTRUCTOR, "org.apache.wiki.url.DefaultURLConstructor" );
+        props.put( UserManager.PROP_DATABASE, "org.apache.wiki.auth.user.XMLUserDatabase" );
+        props.put(XMLUserDatabase.PROP_USERDATABASE, "tests/etc/userdatabase.xml");
         return props;
     }
 

Modified: incubator/jspwiki/trunk/tests/java/org/apache/wiki/WikiEngineTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/java/org/apache/wiki/WikiEngineTest.java?rev=770959&r1=770958&r2=770959&view=diff
==============================================================================
--- incubator/jspwiki/trunk/tests/java/org/apache/wiki/WikiEngineTest.java (original)
+++ incubator/jspwiki/trunk/tests/java/org/apache/wiki/WikiEngineTest.java Sat May  2 14:15:13 2009
@@ -239,18 +239,6 @@
         assertEquals( "A%E2%89%A2%CE%91.", m_engine.encodeName( name ) );
     }
 
-    public void testReadLinks()
-        throws Exception
-    {
-        String src="Foobar. [Foobar].  Frobozz.  [This is a link].";
-
-        m_engine.deletePage( "Test" );
-        Object[] result = m_engine.scanWikiLinks( m_engine.createPage( WikiPath.valueOf( "Test" ) ), src ).toArray();
-        
-        assertEquals( "item 0", PATH_FOOBAR, result[0] );
-        assertEquals( "item 1", "Main:This is a link", result[1] );
-    }
-
     public void testBeautifyTitle()
     {
         String src = "WikiNameThingy";
@@ -713,7 +701,7 @@
         m_engine.saveText( NAME1, "[Foobar]" );
         m_engine.getText( NAME1 ); // Ensure that page is cached.
 
-        Collection<String> c = refMgr.findUncreated();
+        List<String> c = refMgr.findUncreated();
         assertTrue( "Non-existent reference not detected by ReferenceManager",
             Util.collectionContains( c, "Foobar" ));
 
@@ -754,7 +742,7 @@
         m_engine.saveText( NAME1, "[Foobar]" );
         m_engine.getText( NAME1 ); // Ensure that page is cached.
 
-        Collection<String> c = refMgr.findUncreated();
+        List<String> c = refMgr.findUncreated();
         assertEquals( "uncreated count", 1, c.size() );
         assertEquals( "wrong referenced page", "Foobar", (String)c.iterator().next() );
 
@@ -873,7 +861,7 @@
         m_engine.saveText( "RenameBugTestPage", "Mary had a little generic object" );
         m_engine.saveText( "OldNameTestPage", "Linked to RenameBugTestPage" );
        
-        Collection<WikiPath> pages = m_engine.getReferenceManager().findReferrers( WikiPath.valueOf("RenameBugTestPage") );
+        Collection<WikiPath> pages = m_engine.getReferenceManager().getReferredBy( WikiPath.valueOf("RenameBugTestPage") );
         assertEquals( "has one", "Main:OldNameTestPage", pages.iterator().next() );
         
         WikiContext ctx = m_engine.getWikiContextFactory().newViewContext( m_engine.getPage("OldNameTestPage") );
@@ -883,7 +871,7 @@
         assertFalse( "did not vanish", m_engine.pageExists( "OldNameTestPage") );
         assertTrue( "did not appear", m_engine.pageExists( "NewNameTestPage") );
         
-        pages = m_engine.getReferenceManager().findReferrers( WikiPath.valueOf("RenameBugTestPage") );
+        pages = m_engine.getReferenceManager().getReferredBy( WikiPath.valueOf("RenameBugTestPage") );
         
         assertEquals( "wrong # of referrers", 1, pages.size() );
         

Modified: incubator/jspwiki/trunk/tests/java/org/apache/wiki/action/RenameActionBeanTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/java/org/apache/wiki/action/RenameActionBeanTest.java?rev=770959&r1=770958&r2=770959&view=diff
==============================================================================
--- incubator/jspwiki/trunk/tests/java/org/apache/wiki/action/RenameActionBeanTest.java (original)
+++ incubator/jspwiki/trunk/tests/java/org/apache/wiki/action/RenameActionBeanTest.java Sat May  2 14:15:13 2009
@@ -151,8 +151,8 @@
         m_engine.saveText("ReferstoTest", "This page refers to [Test].\n");
         WikiPage referringPage = m_engine.getPage("ReferstoTest");
         assertNotNull("Did not save page ReferstoTest!", referringPage );
-        assertNotNull( m_engine.getReferenceManager().findReferrers(WikiPath.valueOf("Test")) );
-        assertEquals( 1, m_engine.getReferenceManager().findReferrers(WikiPath.valueOf("Test")).size() );
+        assertNotNull( m_engine.getReferenceManager().getReferredBy(WikiPath.valueOf("Test")) );
+        assertEquals( 1, m_engine.getReferenceManager().getReferredBy(WikiPath.valueOf("Test")).size() );
         
         MockRoundtrip trip;
         ValidationErrors errors;

Modified: incubator/jspwiki/trunk/tests/java/org/apache/wiki/content/PageRenamerTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/java/org/apache/wiki/content/PageRenamerTest.java?rev=770959&r1=770958&r2=770959&view=diff
==============================================================================
--- incubator/jspwiki/trunk/tests/java/org/apache/wiki/content/PageRenamerTest.java (original)
+++ incubator/jspwiki/trunk/tests/java/org/apache/wiki/content/PageRenamerTest.java Sat May  2 14:15:13 2009
@@ -21,18 +21,21 @@
 package org.apache.wiki.content;
 
 import java.util.Collection;
+import java.util.List;
 import java.util.Properties;
-import java.util.Set;
-
-import org.apache.wiki.*;
-import org.apache.wiki.api.WikiException;
-import org.apache.wiki.api.WikiPage;
-import org.apache.wiki.providers.ProviderException;
 
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
+import org.apache.wiki.TestEngine;
+import org.apache.wiki.WikiContext;
+import org.apache.wiki.WikiEngine;
+import org.apache.wiki.WikiProvider;
+import org.apache.wiki.api.WikiException;
+import org.apache.wiki.api.WikiPage;
+import org.apache.wiki.providers.ProviderException;
+
 
 public class PageRenamerTest extends TestCase
 {
@@ -78,9 +81,9 @@
         m_engine.shutdown();
     }
 
-    private Set<WikiPath> findReferrers(String path) throws ProviderException
+    private List<WikiPath> findReferrers(String path) throws ProviderException
     {
-        return m_engine.getReferenceManager().findReferrers( WikiPath.valueOf(path) );
+        return m_engine.getReferenceManager().getReferredBy( WikiPath.valueOf(path) );
     }
     
     public void testSimpleRename()

Modified: incubator/jspwiki/trunk/tests/java/org/apache/wiki/search/SearchManagerTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/java/org/apache/wiki/search/SearchManagerTest.java?rev=770959&r1=770958&r2=770959&view=diff
==============================================================================
--- incubator/jspwiki/trunk/tests/java/org/apache/wiki/search/SearchManagerTest.java (original)
+++ incubator/jspwiki/trunk/tests/java/org/apache/wiki/search/SearchManagerTest.java Sat May  2 14:15:13 2009
@@ -73,7 +73,7 @@
     public void testDefaultProvider()
     {
         assertEquals( "org.apache.wiki.search.LuceneSearchProvider", 
-                      m_mgr.getSearchEngine().getClass().getName() );    
+                      m_mgr.getSearchProvider().getClass().getName() );    
     }
     
     public void testSimpleSearch()



Re: svn commit: r770959 [2/2] - in /incubator/jspwiki/trunk: ./ src/java/org/apache/wiki/ src/java/org/apache/wiki/action/ src/java/org/apache/wiki/api/ src/java/org/apache/wiki/auth/ src/java/org/apache/wiki/content/ src/java/org/apache/wiki/event/ src/ja...

Posted by Janne Jalkanen <ja...@ecyrd.com>.
Request: Could we please have smaller commits with a single feature  
only? These massive megacommits are impossible to review...  I have no  
idea what was really done and why :-(.  Offhand, I think I would like  
to revert the changes to PageRenamer since I really don't want  
ContentManager to become a really massive class it is currently  
becoming - page renaming code is fairly heavy and it's better  
componentized elsewhere. But because it's one massive commit, I can't  
do it simply.

/Janne

On 2 May 2009, at 17:15, ajaquith@apache.org wrote:

> Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/content/ 
> PageRenamer.java
> URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/content/PageRenamer.java?rev=770959&r1=770958&r2=770959&view=diff
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- incubator/jspwiki/trunk/src/java/org/apache/wiki/content/ 
> PageRenamer.java (original)
> +++ incubator/jspwiki/trunk/src/java/org/apache/wiki/content/ 
> PageRenamer.java Sat May  2 14:15:13 2009
> @@ -20,23 +20,8 @@
>  */
> package org.apache.wiki.content;
>
> -import java.util.Collection;
> -import java.util.Set;
> -import java.util.TreeSet;
> -import java.util.regex.Matcher;
> -import java.util.regex.Pattern;
> -
> -import org.apache.wiki.InternalWikiException;
> import org.apache.wiki.WikiContext;
> -import org.apache.wiki.WikiEngine;
> import org.apache.wiki.api.WikiException;
> -import org.apache.wiki.api.WikiPage;
> -import org.apache.wiki.log.Logger;
> -import org.apache.wiki.log.LoggerFactory;
> -import org.apache.wiki.parser.JSPWikiMarkupParser;
> -import org.apache.wiki.parser.MarkupParser;
> -import org.apache.wiki.providers.ProviderException;
> -import org.apache.wiki.util.TextUtil;
>
>
>
> @@ -49,13 +34,8 @@
>  */
> public class PageRenamer
> {
> -
> -    private static final Logger log =  
> LoggerFactory.getLogger( PageRenamer.class );
> -
> -    private boolean m_camelCase = false;
> -
>     /**
> -     *  Renames a page.
> +     *  Renames a page. Delegates to {@link  
> ContentManager#renamePage(WikiContext, String, String, boolean)}.
>      *
>      *  @param context The current context.
>      *  @param renameFrom The name from which to rename.
> @@ -70,372 +50,7 @@
>                               boolean changeReferrers )
>         throws WikiException
>     {
> -        //
> -        //  Sanity checks first
> -        //
> -        if( renameFrom == null || renameFrom.length() == 0 )
> -        {
> -            throw new WikiException( "From name may not be null or  
> empty" );
> -        }
> -        if( renameTo == null || renameTo.length() == 0 )
> -        {
> -            throw new WikiException( "To name may not be null or  
> empty" );
> -        }
> -
> -        //
> -        //  Clean up the "to" -name so that it does not contain  
> anything illegal
> -        //
> -
> -        renameTo = MarkupParser.cleanLink( renameTo.trim() );
> -
> -        if( renameTo.equals(renameFrom) )
> -        {
> -            throw new WikiException( "You cannot rename the page to  
> itself" );
> -        }
> -
> -        //
> -        //  Preconditions: "from" page must exist, and "to" page  
> must not yet exist.
> -        //
> -        WikiEngine engine = context.getEngine();
> -        WikiPage fromPage;
> -        try
> -        {
> -            fromPage = engine.getPage( renameFrom );
> -        }
> -        catch( PageNotFoundException e )
> -        {
> -            throw new WikiException("No such page "+renameFrom, e );
> -        }
> -
> -        WikiPage toPage;
> -        try
> -        {
> -            toPage = engine.getPage( renameTo );
> -            if( toPage != null )
> -            {
> -                throw new WikiException("Page already exists  
> "+renameTo);
> -            }
> -        }
> -        catch( PageNotFoundException e )
> -        {
> -            // Good. The page should NOT exist already.
> -        }
> -
> -        //
> -        //  Options
> -        //
> -
> -        m_camelCase =  
> TextUtil.getBooleanProperty( engine.getWikiProperties(),
> -                                                    
> JSPWikiMarkupParser.PROP_CAMELCASELINKS,
> -                                                   m_camelCase );
> -
> -        Set<WikiPath> referrers = getReferencesToChange( fromPage,  
> engine );
> -
> -        //
> -        //  Do the actual rename by changing from the frompage to  
> the topage, including
> -        //  all of the attachments
> -        //
> -
> -        engine.getPageManager().getProvider().movePage( renameFrom,  
> renameTo );
> -        /*
> -        if( engine.getAttachmentManager().attachmentsEnabled() )
> -        {
> -             
> engine 
> .getAttachmentManager 
> ().getCurrentProvider().moveAttachmentsForPage( renameFrom,  
> renameTo );
> -        }
> -*/
> -        //
> -        //  Add a comment to the page notifying what changed.  This  
> adds a new revision
> -        //  to the repo with no actual change.
> -        //
> -
> -        try
> -        {
> -            toPage = engine.getPage( renameTo );
> -        }
> -        catch( PageNotFoundException e )
> -        {
> -            throw new InternalWikiException( "Rename seems to have  
> failed for some strange reason - please check logs!" );
> -        }
> -
> -        toPage.setAttribute( WikiPage.CHANGENOTE,  
> fromPage.getName() + " ==> " + toPage.getName() );
> -        toPage.setAuthor( context.getCurrentUser().getName() );
> -
> -        engine.getPageManager().putPageText( toPage,  
> engine.getPureText( toPage ) );
> -
> -        //
> -        //  Update the references
> -        //
> -
> -        try
> -        {
> -             
> engine.getReferenceManager().pageRemoved( fromPage.getPath() );
> -        }
> -        catch( PageNotFoundException e )
> -        {
> -            // This is fine.
> -        }
> -        engine.updateReferences( toPage );
> -
> -        //
> -        //  Update referrers
> -        //
> -        if( changeReferrers )
> -        {
> -            updateReferrers( context, fromPage, toPage, referrers );
> -        }
> -
> -        //
> -        //  re-index the page
> -        //
> -        engine.getSearchManager().reindexPage(toPage);
> -
> -
> -        //
> -        //  Done, return the new name.
> -        //
> -        return renameTo;
> -    }
> -
> -    /**
> -     *  This method finds all the pages which have anything to do  
> with the fromPage and
> -     *  change any referrers it can figure out in that page.
> -     *
> -     *  @param context WikiContext in which we operate
> -     *  @param fromPage The old page
> -     *  @param toPage The new page
> -     */
> -    private void updateReferrers( WikiContext context, WikiPage  
> fromPage, WikiPage toPage, Set<WikiPath>referrers )
> -    {
> -        WikiEngine engine = context.getEngine();
> -
> -        if( referrers.isEmpty() ) return; // No referrers
> -
> -        for( WikiPath pageName : referrers )
> -        {
> -            //  In case the page was just changed from under us,  
> let's do this
> -            //  small kludge.
> -            if( pageName.equals( fromPage.getPath() ) )
> -            {
> -                pageName = toPage.getPath();
> -            }
> -
> -            try
> -            {
> -                WikiPage p =  
> engine.getContentManager().getPage( pageName );
> -
> -                String sourceText = engine.getPureText( p );
> -
> -                String newText = replaceReferrerString( context,  
> sourceText, fromPage.getName(), toPage.getName() );
> -
> -                if( m_camelCase )
> -                    newText = replaceCCReferrerString( context,  
> newText, fromPage.getName(), toPage.getName() );
> -
> -                if( !sourceText.equals( newText ) )
> -                {
> -                    p.setAttribute( WikiPage.CHANGENOTE,  
> fromPage.getName()+" ==> "+toPage.getName() );
> -                     
> p.setAuthor( context.getCurrentUser().getName() );
> -                    p.setContent( newText );
> -                    p.save();
> -                    engine.updateReferences( p );
> -                }
> -            }
> -            catch( PageNotFoundException e )
> -            {
> -                // Just continue
> -            }
> -            catch( ProviderException e )
> -            {
> -                //
> -                //  We fail with an error, but we will try to  
> continue to rename
> -                //  other referrers as well.
> -                //
> -                log.error("Unable to perform rename.",e);
> -            }
> -        }
> -    }
> -
> -    @SuppressWarnings("unchecked")
> -    private Set<WikiPath> getReferencesToChange( WikiPage fromPage,  
> WikiEngine engine )
> -    {
> -        Set<WikiPath> referrers = new TreeSet<WikiPath>();
> -
> -        try
> -        {
> -            Collection<WikiPath> r =  
> engine.getReferenceManager().findReferrers( fromPage.getPath() );
> -            if( r != null ) referrers.addAll( r );
> -            /*
> -            Collection<Attachment> attachments =  
> engine.getAttachmentManager().listAttachments( fromPage );
> -
> -            for( WikiPage att : attachments  )
> -            {
> -                Collection<String> c =  
> engine.getReferenceManager().findReferrers(att.getName());
> -
> -                if( c != null ) referrers.addAll(c);
> -            }
> -            */
> -        }
> -        catch( ProviderException e )
> -        {
> -            // We will continue despite this error
> -            log.error( "Provider error while fetching attachments  
> for rename", e );
> -        }
> -        return referrers;
> -    }
> -
> -    /**
> -     *  Replaces camelcase links.
> -     */
> -    private String replaceCCReferrerString( WikiContext context,  
> String sourceText, String from, String to )
> -    {
> -        StringBuilder sb = new StringBuilder( sourceText.length() 
> +32 );
> -
> -        Pattern linkPattern = Pattern.compile( "\\p{Lu}+\\p{Ll}+\ 
> \p{Lu}+[\\p{L}\\p{Digit}]*" );
> -
> -        Matcher matcher = linkPattern.matcher( sourceText );
> -
> -        int start = 0;
> -
> -        while( matcher.find(start) )
> -        {
> -            String match = matcher.group();
> -
> -            sb.append( sourceText.substring( start,  
> matcher.start() ) );
> -
> -            int lastOpenBrace = sourceText.lastIndexOf( '[',  
> matcher.start() );
> -            int lastCloseBrace = sourceText.lastIndexOf( ']',  
> matcher.start() );
> -
> -            if( match.equals( from ) && lastCloseBrace >=  
> lastOpenBrace )
> -            {
> -                sb.append( to );
> -            }
> -            else
> -            {
> -                sb.append( match );
> -            }
> -
> -            start = matcher.end();
> -        }
> -
> -        sb.append( sourceText.substring( start ) );
> -
> -        return sb.toString();
> -    }
> -
> -    private String replaceReferrerString( WikiContext context,  
> String sourceText, String from, String to )
> -    {
> -        StringBuilder sb = new StringBuilder( sourceText.length() 
> +32 );
> -
> -        //
> -        //  This monstrosity just looks for a JSPWiki link  
> pattern.  But it is pretty
> -        //  cool for a regexp, isn't it?  If you can understand  
> this in a single reading,
> -        //  you have way too much time in your hands.
> -        //
> -        Pattern linkPattern = Pattern.compile( "([\\[\\~]?)\\[([^\\| 
> \\]]*)(\\|)?([^\\|\\]]*)(\\|)?([^\\|\\]]*)\\]" );
> -
> -        Matcher matcher = linkPattern.matcher( sourceText );
> -
> -        int start = 0;
> -
> -        // System.out.println("====");
> -        // System.out.println("SRC="+sourceText.trim());
> -        while( matcher.find(start) )
> -        {
> -            char charBefore = (char)-1;
> -
> -            if( matcher.start() > 0 )
> -                charBefore = sourceText.charAt( matcher.start()-1 );
> -
> -            if( matcher.group(1).length() > 0 || charBefore == '~'  
> || charBefore == '[' )
> -            {
> -                //
> -                //  Found an escape character, so I am escaping.
> -                //
> -                sb.append( sourceText.substring( start,  
> matcher.end() ) );
> -                start = matcher.end();
> -                continue;
> -            }
> -
> -            String text = matcher.group(2);
> -            String link = matcher.group(4);
> -            String attr = matcher.group(6);
> -
> -            /*
> -            System.out.println("MATCH="+matcher.group(0));
> -            System.out.println("   text="+text);
> -            System.out.println("   link="+link);
> -            System.out.println("   attr="+attr);
> -            */
> -            if( link.length() == 0 )
> -            {
> -                text = replaceSingleLink( context, text, from, to );
> -            }
> -            else
> -            {
> -                link = replaceSingleLink( context, link, from, to );
> -
> -                //
> -                //  A very simple substitution, but should work for  
> quite a few cases.
> -                //
> -                text = TextUtil.replaceString( text, from, to );
> -            }
> -
> -            //
> -            //  Construct the new string
> -            //
> -            sb.append( sourceText.substring( start,  
> matcher.start() ) );
> -            sb.append( "["+text );
> -            if( link.length() > 0 ) sb.append( "|" + link );
> -            if( attr.length() > 0 ) sb.append( "|" + attr );
> -            sb.append( "]" );
> -
> -            start = matcher.end();
> -        }
> -
> -        sb.append( sourceText.substring( start ) );
> -
> -        return sb.toString();
> -    }
> -
> -    /**
> -     *  This method does a correct replacement of a single link,  
> taking into
> -     *  account anchors and attachments.
> -     */
> -    private String replaceSingleLink( WikiContext context, String  
> original, String from, String newlink )
> -    {
> -        int hash = original.indexOf( '#' );
> -        int slash = original.indexOf( '/' );
> -        String reallink = original;
> -        String oldStyleRealLink;
> -
> -        if( hash != -1 ) reallink = original.substring( 0, hash );
> -        if( slash != -1 ) reallink = original.substring( 0,slash );
> -
> -        reallink = MarkupParser.cleanLink( reallink );
> -        oldStyleRealLink = MarkupParser.wikifyLink( reallink );
> -
> -        //WikiPage realPage  =  
> context.getEngine().getPage( reallink );
> -        // WikiPage p2 = context.getEngine().getPage( from );
> -
> -        // System.out.println("   "+reallink+" :: "+ from);
> -        // System.out.println("   "+p+" :: "+p2);
> -
> -        //
> -        //  Yes, these point to the same page.
> -        //
> -        if( reallink.equals(from) || original.equals(from) ||  
> oldStyleRealLink.equals(from) )
> -        {
> -            //
> -            //  if the original contains blanks, then we should  
> introduce a link, for example:  [My Page]  =>  [My Page|My Renamed  
> Page]
> -            int blank = reallink.indexOf( " ");
> -
> -            if( blank != -1 )
> -            {
> -                return original + "|" + newlink;
> -            }
> -
> -            return newlink + ((hash > 0) ?  
> original.substring( hash ) : "") + ((slash > 0) ?  
> original.substring( slash ) : "") ;
> -        }
> -
> -        return original;
> +        ContentManager cm = context.getEngine().getContentManager();
> +        return cm.renamePage( context, renameFrom, renameTo,  
> changeReferrers );
>     }
> }
>
> Added: incubator/jspwiki/trunk/src/java/org/apache/wiki/event/ 
> ContentEvent.java
> URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/event/ContentEvent.java?rev=770959&view=auto
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- incubator/jspwiki/trunk/src/java/org/apache/wiki/event/ 
> ContentEvent.java (added)
> +++ incubator/jspwiki/trunk/src/java/org/apache/wiki/event/ 
> ContentEvent.java Sat May  2 14:15:13 2009
> @@ -0,0 +1,47 @@
> +package org.apache.wiki.event;
> +
> +import java.io.Serializable;
> +
> +/**
> + * Events fired by {@link org.apache.wiki.content.ContentManager}  
> when nodes are
> + * created, saved or deleted.
> + */
> +public class ContentEvent extends WikiPageEvent
> +{
> +    private static final long serialVersionUID =  
> -6577147048708900469L;
> +
> +    /**
> +     * Indicates that a node has been requested to be deleted, but  
> it has not
> +     * yet been removed from the repository.
> +     */
> +    public static final int NODE_DELETE_REQUEST = 220;
> +
> +    /**
> +     * Indicates that a node was successfully deleted.
> +     */
> +    public static final int NODE_DELETED = 221;
> +
> +    /**
> +     * Indicates that a node was successfully renamed.
> +     */
> +    public static final int NODE_RENAMED = 211;
> +
> +    /**
> +     * Indicates a node was successfully saved.
> +     */
> +    public static final int NODE_SAVED = 201;
> +
> +    /**
> +     * Constructs an instance of this event.
> +     *
> +     * @param src the Object that is the source of the event.
> +     * @param type the type of the event (see the enumerated int  
> values defined
> +     *            in {@link org.apache.wiki.event.WikiEvent}).
> +     * @param pagename the WikiPage being acted upon.
> +     * @param args additional arguments passed to the event.
> +     */
> +    public ContentEvent( Object src, int type, String pagename,  
> Serializable... args )
> +    {
> +        super( src, type, pagename, args );
> +    }
> +}
>
> Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/ 
> ReferringPagesPlugin.java
> URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/ReferringPagesPlugin.java?rev=770959&r1=770958&r2=770959&view=diff
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/ 
> ReferringPagesPlugin.java (original)
> +++ incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/ 
> ReferringPagesPlugin.java Sat May  2 14:15:13 2009
> @@ -94,7 +94,7 @@
>         {
>             WikiPage page = context.getEngine().getPage( pageName );
>
> -            Collection<WikiPath> links =  
> refmgr.findReferrers( page.getPath() );
> +            Collection<WikiPath> links =  
> refmgr.getReferredBy( page.getPath() );
>             String wikitext = "";
>
>             super.initialize( context, params );
>
> Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/ 
> UndefinedPagesPlugin.java
> URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/UndefinedPagesPlugin.java?rev=770959&r1=770958&r2=770959&view=diff
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/ 
> UndefinedPagesPlugin.java (original)
> +++ incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/ 
> UndefinedPagesPlugin.java Sat May  2 14:15:13 2009
> @@ -24,6 +24,8 @@
> import java.util.Map;
> import java.util.TreeSet;
>
> +import javax.jcr.RepositoryException;
> +
> import org.apache.wiki.ReferenceManager;
> import org.apache.wiki.WikiContext;
> import org.apache.wiki.api.PluginException;
> @@ -48,7 +50,16 @@
>         throws PluginException
>     {
>         ReferenceManager refmgr =  
> context.getEngine().getReferenceManager();
> -        Collection<String> links = refmgr.findUncreated();
> +        Collection<String> links;
> +        try
> +        {
> +            links = refmgr.findUncreated();
> +        }
> +        catch( RepositoryException e )
> +        {
> +            e.printStackTrace();
> +            throw new PluginException( "Could not find uncreated  
> pages.", e );
> +        }
>
>         super.initialize( context, params );
>
>
> Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/ 
> UnusedPagesPlugin.java
> URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/UnusedPagesPlugin.java?rev=770959&r1=770958&r2=770959&view=diff
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/ 
> UnusedPagesPlugin.java (original)
> +++ incubator/jspwiki/trunk/src/java/org/apache/wiki/plugin/ 
> UnusedPagesPlugin.java Sat May  2 14:15:13 2009
> @@ -25,6 +25,8 @@
> import java.util.Map;
> import java.util.TreeSet;
>
> +import javax.jcr.RepositoryException;
> +
> import org.apache.wiki.ReferenceManager;
> import org.apache.wiki.WikiContext;
> import org.apache.wiki.api.PluginException;
> @@ -57,7 +59,16 @@
>         throws PluginException
>     {
>         ReferenceManager refmgr =  
> context.getEngine().getReferenceManager();
> -        Collection<String> links = refmgr.findUnreferenced();
> +        Collection<String> links;
> +        try
> +        {
> +            links = refmgr.findUnreferenced();
> +        }
> +        catch( RepositoryException e )
> +        {
> +            e.printStackTrace();
> +            throw new PluginException( "Could not find unreferenced  
> pages.", e );
> +        }
>         //
>         // filter out attachments if "excludeattachments" was  
> requested:
>         //
>
> Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/render/ 
> RenderingManager.java
> URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/render/RenderingManager.java?rev=770959&r1=770958&r2=770959&view=diff
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- incubator/jspwiki/trunk/src/java/org/apache/wiki/render/ 
> RenderingManager.java (original)
> +++ incubator/jspwiki/trunk/src/java/org/apache/wiki/render/ 
> RenderingManager.java Sat May  2 14:15:13 2009
> @@ -345,7 +345,7 @@
>                 m_documentCache.flushPattern( pageName );
>                 try
>                 {
> -                    Collection<WikiPath> referringPages =  
> m_engine 
> .getReferenceManager().findReferrers( WikiPath.valueOf(pageName) );
> +                    Collection<WikiPath> referringPages =  
> m_engine 
> .getReferenceManager().getReferredBy( WikiPath.valueOf(pageName) );
>
>                     //
>                     //  Flush also those pages that refer to this  
> page (if an nonexistant page
>
> Modified: incubator/jspwiki/trunk/src/java/org/apache/wiki/search/ 
> SearchManager.java
> URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/java/org/apache/wiki/search/SearchManager.java?rev=770959&r1=770958&r2=770959&view=diff
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- incubator/jspwiki/trunk/src/java/org/apache/wiki/search/ 
> SearchManager.java (original)
> +++ incubator/jspwiki/trunk/src/java/org/apache/wiki/search/ 
> SearchManager.java Sat May  2 14:15:13 2009
> @@ -24,16 +24,14 @@
> import java.util.*;
>
> import org.apache.commons.lang.time.StopWatch;
> -import org.apache.wiki.*;
> +import org.apache.wiki.InternalWikiException;
> +import org.apache.wiki.NoRequiredPropertyException;
> +import org.apache.wiki.WikiEngine;
> import org.apache.wiki.api.FilterException;
> import org.apache.wiki.api.WikiException;
> import org.apache.wiki.api.WikiPage;
> import org.apache.wiki.content.PageNotFoundException;
> -import org.apache.wiki.event.WikiEvent;
> -import org.apache.wiki.event.WikiEventListener;
> -import org.apache.wiki.event.WikiEventUtils;
> -import org.apache.wiki.event.WikiPageEvent;
> -import org.apache.wiki.filters.BasicPageFilter;
> +import org.apache.wiki.event.*;
> import org.apache.wiki.log.Logger;
> import org.apache.wiki.log.LoggerFactory;
> import org.apache.wiki.modules.InternalModule;
> @@ -53,7 +51,6 @@
>  */
>
> public class SearchManager
> -    extends BasicPageFilter
>     implements InternalModule, WikiEventListener
> {
>     private static final Logger log =  
> LoggerFactory.getLogger(SearchManager.class);
> @@ -70,6 +67,8 @@
>
>     private SearchProvider    m_searchProvider = null;
>
> +    private WikiEngine m_engine = null;
> +
>     /**
>      *  The name of the JSON object that manages search.
>      */
> @@ -82,15 +81,11 @@
>      *  @param properties The list of Properties.
>      *  @throws WikiException If it cannot be instantiated.
>      */
> -    public SearchManager( WikiEngine engine, Properties properties )
> +    public SearchManager()
>         throws WikiException
>     {
> -        initialize( engine, properties );
> -
> -         
> WikiEventUtils.addWikiEventListener(m_engine.getContentManager(),
> -                                             
> WikiPageEvent.PAGE_DELETE_REQUEST, this);
> -
> -        JSONRPCManager.registerGlobalObject( JSON_SEARCH, new  
> JSONSearch() );
> +        // Do nothing, really
> +        super();
>     }
>
>     /**
> @@ -220,6 +215,11 @@
>
>         loadSearchProvider(properties);
>
> +        // Make sure we catch any page add/save/rename events
> +         
> WikiEventManager.addWikiEventListener( engine.getContentManager(),  
> this );
> +
> +        JSONRPCManager.registerGlobalObject( JSON_SEARCH, new  
> JSONSearch() );
> +
>         try
>         {
>             m_searchProvider.initialize(engine, properties);
> @@ -295,7 +295,7 @@
>      *
>      *  @return The current SearchProvider.
>      */
> -    public SearchProvider getSearchEngine()
> +    protected SearchProvider getSearchProvider()
>     {
>         return m_searchProvider;
>     }
> @@ -322,7 +322,7 @@
>      *  Removes the page from the search cache (if any).
>      *  @param page  The page to remove
>      */
> -    public void pageRemoved(WikiPage page)
> +    private void removePage(WikiPage page)
>     {
>         try
>         {
> @@ -335,35 +335,6 @@
>     }
>
>     /**
> -     *  Reindexes the page.
> -     *
> -     *  @param wikiContext {@inheritDoc}
> -     *  @param content {@inheritDoc}
> -     */
> -    @Override
> -    public void postSave( WikiContext wikiContext, String content )
> -    {
> -        //
> -        //  Makes sure that we're indexing the latest version of this
> -        //  page.
> -        //
> -        WikiPage p;
> -        try
> -        {
> -            p = m_engine.getPage( wikiContext.getPage().getName() );
> -            reindexPage( p );
> -        }
> -        catch( PageNotFoundException e )
> -        {
> -            // Swallow quietly; something went wrong but no point  
> making fuss about it.
> -        }
> -        catch( ProviderException e )
> -        {
> -            log.info("Could not reindex a page",e);
> -        }
> -    }
> -
> -    /**
>      *   Forces the reindex of the given page.
>      *
>      *   @param page The page.
> @@ -380,22 +351,55 @@
>      */
>     public void actionPerformed(WikiEvent event)
>     {
> -        if( (event instanceof WikiPageEvent) && (event.getType() ==  
> WikiPageEvent.PAGE_DELETE_REQUEST) )
> +        if ( !(event instanceof WikiPageEvent ) )
>         {
> -            String pageName = ((WikiPageEvent) event).getPageName();
> -
> -            try
> -            {
> -                WikiPage p = m_engine.getPage( pageName );
> -                pageRemoved( p );
> -            }
> -            catch( PageNotFoundException e )
> +           return;
> +        }
> +
> +        String pageName = ((WikiPageEvent) event).getPageName();
> +        switch ( event.getType() )
> +        {
> +            // If page was deleted, remove it from the index
> +            case ( ContentEvent.NODE_DELETE_REQUEST ):
>             {
> -                throw new InternalWikiException("Page removed  
> already!?!");
> +                try
> +                {
> +                    WikiPage p = m_engine.getPage( pageName );
> +                    removePage( p );
> +                }
> +                catch( PageNotFoundException e )
> +                {
> +                    throw new InternalWikiException("Page removed  
> already!?!");
> +                }
> +                catch( ProviderException e )
> +                {
> +                    log.info( "Could not reindex page " + pageName,  
> e );
> +                    e.printStackTrace();
> +                }
>             }
> -            catch( ProviderException e )
> +
> +            // If page was saved, reindex it
> +            case ( ContentEvent.NODE_SAVED ):
>             {
> -                // FIXME: How should it deal with this?
> +                //
> +                //  Makes sure that we're indexing the latest  
> version of this
> +                //  page.
> +                //
> +                WikiPage p;
> +                try
> +                {
> +                    p = m_engine.getPage( pageName );
> +                    reindexPage( p );
> +                }
> +                catch( PageNotFoundException e )
> +                {
> +                    // Swallow quietly; something went wrong but no  
> point making fuss about it.
> +                }
> +                catch( ProviderException e )
> +                {
> +                    log.info( "Could not reindex page " + pageName,  
> e );
> +                    e.printStackTrace();
> +                }
>             }
>         }
>     }
>
> Added: incubator/jspwiki/trunk/tests/etc/TestMigratorForm.jsp
> URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/etc/TestMigratorForm.jsp?rev=770959&view=auto
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- incubator/jspwiki/trunk/tests/etc/TestMigratorForm.jsp (added)
> +++ incubator/jspwiki/trunk/tests/etc/TestMigratorForm.jsp Sat May   
> 2 14:15:13 2009
> @@ -0,0 +1,7 @@
> +<%@ taglib uri="http://stripes.sourceforge.net/stripes.tld"  
> prefix="stripes" %>
> +<stripes:useActionBean  
> beanclass="org.apache.wiki.action.LoginActionBean" event="view"  
> id="wikiActionBean" />
> +<stripes:layout-render name="/templates/default/DefaultLayout.jsp">
> +  <stripes:layout-component name="content">
> +    <jsp:include page="/templates/default/LoginContent.jsp" />
> +  </stripes:layout-component>
> +</stripes:layout-render>
>
> Modified: incubator/jspwiki/trunk/tests/java/org/apache/wiki/ 
> ReferenceManagerTest.java
> URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/java/org/apache/wiki/ReferenceManagerTest.java?rev=770959&r1=770958&r2=770959&view=diff
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- incubator/jspwiki/trunk/tests/java/org/apache/wiki/ 
> ReferenceManagerTest.java (original)
> +++ incubator/jspwiki/trunk/tests/java/org/apache/wiki/ 
> ReferenceManagerTest.java Sat May  2 14:15:13 2009
> @@ -21,62 +21,64 @@
>
> package org.apache.wiki;
>
> -import java.io.File;
> -import java.util.Collection;
> -import java.util.Iterator;
> -import java.util.Properties;
> -import java.util.Set;
> +import java.util.*;
> +
> +import javax.jcr.Node;
> +import javax.jcr.PathNotFoundException;
> +import javax.jcr.Property;
> +import javax.jcr.Session;
>
> import junit.framework.Test;
> import junit.framework.TestCase;
> import junit.framework.TestSuite;
>
> import org.apache.wiki.api.WikiException;
> +import org.apache.wiki.content.ContentManager;
> import org.apache.wiki.content.WikiPath;
> import org.apache.wiki.providers.ProviderException;
>
> -
> /**
> - *  @author Torsten Hildebrandt.
> + * @author Torsten Hildebrandt.
>  */
> public class ReferenceManagerTest extends TestCase
> {
> +    private static final WikiPath PATH_FOOBAR =  
> WikiPath.valueOf( "Foobar" );
> +
> +    public static void main( String[] args )
> +    {
> +        junit.textui.TestRunner.main( new String[]  
> { ReferenceManagerTest.class.getName() } );
> +    }
> +
> +    public static Test suite()
> +    {
> +        return new TestSuite( ReferenceManagerTest.class );
> +    }
> +
>     Properties props = new Properties();
> +
>     TestEngine engine;
> +
>     ReferenceManager mgr;
> -
> +
>     public ReferenceManagerTest( String s )
>     {
>         super( s );
>     }
>
> -    public void setUp()
> -        throws Exception
> +    public void setUp() throws Exception
>     {
>         props.load( TestEngine.findTestProperties() );
> -         
> props.setProperty( "jspwiki.translatorReader.matchEnglishPlurals",  
> "true");
> -
> -        //
> -        //  We must make sure that the reference manager cache is  
> cleaned first.
> -        //
> -        String workDir = props.getProperty( "jspwiki.workDir" );
> -
> -        if( workDir != null )
> -        {
> -            File refmgrfile = new File( workDir, "refmgr.ser" );
> -            if( refmgrfile.exists() ) refmgrfile.delete();
> -        }
> -
> -        engine = new TestEngine(props);
> -
> +         
> props.setProperty( "jspwiki.translatorReader.matchEnglishPlurals",  
> "true" );
> +        engine = new TestEngine( props );
> +        engine.emptyRepository();
> +        engine.getReferenceManager().rebuild();
>         engine.saveText( "TestPage", "Reference to [Foobar]." );
>         engine.saveText( "Foobar", "Reference to [Foobar2],  
> [Foobars], [Foobar]" );
>
>         mgr = engine.getReferenceManager();
>     }
>
> -    public void tearDown()
> -        throws Exception
> +    public void tearDown() throws Exception
>     {
>         engine.deletePage( "TestPage" );
>         engine.deletePage( "Foobar" );
> @@ -92,354 +94,620 @@
>         engine.deletePage( "NewBug" );
>         engine.deletePage( "BugOne" );
>         engine.deletePage( "BugTwo" );
> -
> +
>         engine.shutdown();
>     }
>
> -    /** Shortcut to help testing. */
> -    private Set<WikiPath> findReferrers( String path ) throws  
> ProviderException
> -    {
> -        return mgr.findReferrers(  WikiPath.valueOf(path) );
> -    }
> -
> -    public void testNonExistant1()
> -        throws Exception
> -    {
> -        Collection<WikiPath> c =  
> mgr.findReferrers( WikiPath.valueOf("Foobar2") );
> -
> -        assertTrue( c.size() == 1 &&  
> c.contains( WikiPath.valueOf("Foobar") ) );
> -    }
> -
> -    public void testNonExistant2() throws ProviderException
> -    {
> -        Collection<WikiPath> c = findReferrers("TestBug");
> -
> -        assertTrue( c.size() == 0 );
> -    }
> -
> -    public void testRemove()
> -        throws Exception
> +    /**
> +     * Tests protected method
> +     * {@link ReferenceManager#addReferredBy(WikiPath, List)},  
> which sets inbound
> +     * links to a page from multiple sources. The destination page  
> exists.
> +     *
> +     * @throws Exception
> +     */
> +    public void testAddReferredBy() throws Exception
>     {
> -        Collection<WikiPath> c = findReferrers("Foobar2");
> -
> -        assertTrue( c.size() == 1 &&  
> c.contains( WikiPath.valueOf( "Foobar") ) );
> +        WikiPath source = WikiPath.valueOf( "SetReferredBy" );
> +        WikiPath destination1 = WikiPath.valueOf( "PageOne" );
> +        WikiPath destination2 = WikiPath.valueOf( "PageTwo" );
> +        WikiPath destination3 = WikiPath.valueOf( "PageThree" );
> +
> +        List<WikiPath> destinations = new ArrayList<WikiPath>();
> +        destinations.add( WikiPath.valueOf( "PageOne" ) );
> +        destinations.add( WikiPath.valueOf( "PageTwo" ) );
> +        destinations.add( WikiPath.valueOf( "PageThree" ) );
> +        for ( WikiPath destination : destinations )
> +        {
> +            mgr.addReferredBy( destination, source );
> +        }
>
> -        engine.deletePage( "Foobar" );
> -
> -        c = findReferrers("Foobar2");
> -
> -        assertNull( c );
> +        List<WikiPath> links = mgr.getReferredBy( source );
> +        assertEquals( 0, links.size() );
>
> -        engine.saveText( "Foobar", "[Foobar2]");
> -
> -        c = findReferrers("Foobar2");
> -
> -        assertTrue( c.size() == 1 && c.contains("Foobar") );
> +        links = mgr.getReferredBy( destination1 );
> +        assertEquals( 1, links.size() );
> +        assertTrue( links.contains(  source ) );
> +
> +        links = mgr.getReferredBy( destination2 );
> +        assertEquals( 1, links.size() );
> +        assertTrue( links.contains(  source ) );
> +
> +        links = mgr.getReferredBy( destination3 );
> +        assertEquals( 1, links.size() );
> +        assertTrue( links.contains(  source ) );
>     }
> -
> -    public void testUnreferenced()
> -        throws Exception
> +
> +    /**
> +     * Tests low-level method for adding to a multi-valued JCR Node  
> property.
> +     * @throws Exception
> +     */
> +    public void testAddToValues() throws Exception
>     {
> -        Collection<String> c = mgr.findUnreferenced();
> -        assertTrue( "Unreferenced page not found by  
> ReferenceManager",
> -                    Util.collectionContains( c, "TestPage" ));
> +        ContentManager cm = engine.getContentManager();
> +        String jcrPath = ReferenceManager.REFERENCES_ROOT + "/" +  
> "TestAddToValues";
> +        Node node;
> +        Property prop;
> +        Session s = cm.getCurrentSession();
> +
> +        mgr.addToValues( jcrPath, "foo","Value1" );
> +        s.save();
> +        node = cm.getJCRNode( jcrPath );
> +        prop = node.getProperty( "foo" );
> +        assertNotNull( prop.getValues() );
> +        assertEquals( 1, prop.getValues().length );
> +        assertEquals( "Value1", prop.getValues()[0].getString() );
> +
> +        mgr.addToValues( jcrPath, "foo","Value2" );
> +        s.save();
> +        node = cm.getJCRNode( jcrPath );
> +        prop = node.getProperty( "foo" );
> +        assertNotNull( prop.getValues() );
> +        assertEquals( 2, prop.getValues().length );
> +        assertEquals( "Value2", prop.getValues()[1].getString() );
> +
> +        // Add the same Value1 again!
> +        mgr.addToValues( jcrPath, "foo","Value1" );
> +        s.save();
> +        node = cm.getJCRNode( jcrPath );
> +        prop = node.getProperty( "foo" );
> +        assertNotNull( prop.getValues() );
> +        assertEquals( 3, prop.getValues().length );
> +        assertEquals( "Value1", prop.getValues()[2].getString() );
>     }
>
> -
> -    public void testBecomesUnreferenced()
> -        throws Exception
> +    public void testBecomesUnreferenced() throws Exception
>     {
>         engine.saveText( "Foobar2", "[TestPage]" );
>
> -        Collection<String> c = mgr.findUnreferenced();
> -        assertEquals( "Wrong # of orphan pages, stage 1", 0,  
> c.size() );
> +        List<String> c = mgr.findUnreferenced();
> +        assertEquals( 0, c.size() );
>
>         engine.saveText( "Foobar2", "norefs" );
>         c = mgr.findUnreferenced();
> -        assertEquals( "Wrong # of orphan pages", 1, c.size() );
> -
> -        Iterator<String> i = c.iterator();
> -        String first = i.next();
> -        assertEquals( "Not correct referrers", "TestPage", first );
> +        assertEquals( 1, c.size() );
> +        assertEquals( "TestPage", c.get( 0 ) );
>     }
>
> -    public void testUncreated()
> -        throws Exception
> +    public void testCircularRefs() throws Exception
>     {
> -        Collection<String> c = mgr.findUncreated();
> -
> -        assertTrue( c.size()==1 &&  
> c.iterator().next().equals("Foobar2") );
> -    }
> -
> -    public void testReferrers()
> -        throws Exception
> -    {
> -        Collection<WikiPath> c = findReferrers( "TestPage" );
> -        assertNull( "TestPage referrers", c );
> -
> -        c = findReferrers( "Foobar" );
> -        assertTrue( "Foobar referrers", c.size()==2  );
> -
> -        c = findReferrers( "Foobar2" );
> -        assertTrue( "Foobar2 referrers", c.size()==1 && ((WikiPath)  
> c.iterator().next()).equals("Foobar") );
> +        engine.saveText( "Foobar2", "ref to [TestPage]" );
>
> -        c = findReferrers( "Foobars" );
> -        assertEquals( "Foobars referrers", 2, c.size() );
> -        //assertEquals( "Foobars referrer 'TestPage'", "TestPage",  
> (String) c.iterator().next() );
> +        assertEquals( 0, mgr.findUncreated().size() );
> +        assertEquals( 0, mgr.findUnreferenced().size() );
>     }
>
> -    public void testRefersTo()
> -        throws Exception
> +    public void testExtractLinks() throws Exception
>     {
> -        Collection<String> s = mgr.findRefersTo( "Foobar" );
> -
> -        assertTrue( "does not have Foobar", s.contains("Foobar") );
> -        // assertTrue( "does not have Foobars",  
> s.contains("Foobars") );
> -        assertTrue( "does not have Foobar2", s.contains("Foobar2") );
> +        String src = "Foobar. [Foobar].  Frobozz.  [This is a  
> link].";
> +        engine.deletePage( "Test" );
> +        engine.saveText( "Test", src );
> +        List<WikiPath> results =  
> mgr.extractLinks( WikiPath.valueOf( "Test" ) );
> +
> +        assertEquals( 2, results.size() );
> +        assertEquals( "item 0", PATH_FOOBAR, results.get( 0 ) );
> +        assertEquals( "item 1", WikiPath.valueOf( "Main:This is a  
> link" ), results.get( 1 ) );
>     }
>
> -    /**
> -     *  Should fail in 2.2.14-beta
> -     * @throws Exception
> -     */
> -    public void testSingularReferences()
> -    throws Exception
> +    public void testGetReferredBy() throws Exception
>     {
> -        engine.saveText( "RandomPage", "FatalBugs" );
> -        engine.saveText( "FatalBugs", "<foo>" );
> -        engine.saveText( "BugCommentPreviewDeletesAllComments",  
> "FatalBug" );
> +        //engine.saveText( "TestPage", "Reference to [Foobar]." );
> +        //engine.saveText( "Foobar", "Reference to [Foobar2],  
> [Foobars], [Foobar]" );
>
> -        Collection<WikiPath> c = findReferrers( "FatalBugs" );
> -
> -        assertEquals( "FatalBugs referrers number", 2, c.size()  );
> -    }
> +        List<WikiPath> c =  
> mgr.getReferredBy( WikiPath.valueOf( "TestPage" ));
> +        assertEquals( 0, c.size() );
>
> -    /**
> -     *  Is a page recognized as referenced if only plural form  
> links exist.
> -     */
> +        c = mgr.getReferredBy( WikiPath.valueOf( "Foobar" ));
> +        assertEquals( 3, c.size() );
>
> -    // NB: Unfortunately, cleaning out self-references in the case  
> there's
> -    //     a plural and a singular form of the page becomes nigh  
> impossible, so we
> -    //     just don't do it.
> -    public void testUpdatePluralOnlyRef()
> -        throws Exception
> -    {
> -        engine.saveText( "TestPage", "Reference to [Foobars]." );
> -        Collection<String> c = mgr.findUnreferenced();
> -        assertTrue( "Foobar unreferenced", c.size()==1 &&  
> c.iterator().next().equals("TestPage") );
> +        c = mgr.getReferredBy( WikiPath.valueOf( "Foobar2" ));
> +        assertEquals( 1, c.size() );
> +        assertEquals( WikiPath.valueOf( "Foobar" ), c.get( 0 ) );
>
> -        Collection<WikiPath>p = findReferrers( "Foobar" );
> -        assertTrue( "Foobar referrers",
> -                    p.size()==2 );
> +        // The singular 'Foobar' exists, but this variant does not
> +        c = mgr.getReferredBy( WikiPath.valueOf( "Foobars" ));
> +        assertEquals( 0, c.size() );
>     }
>
> -
> -    /**
> -     *  Opposite to testUpdatePluralOnlyRef(). Is a page with  
> plural form recognized as
> -     *  the page referenced by a singular link.
> -     */
> -
> -    public void testUpdateFoobar2s()
> -        throws Exception
> +    public void testGetRefersTo() throws Exception
>     {
> -        engine.saveText( "Foobar2s", "qwertz" );
> -        assertTrue( "no uncreated", mgr.findUncreated().size()==0 );
> +        List<WikiPath> links;
>
> -        Collection<WikiPath> c = findReferrers( "Foobar2s" );
> -        assertTrue( "referrers", c!=null && c.size()==1 &&  
> c.iterator().next().toString().equals("Foobar") );
> -    }
> +        links = mgr.getRefersTo( WikiPath.valueOf( "TestPage" ) );
> +        assertEquals( 1, links.size() );
> +        assertTrue( "Does not have Foobar, but it should have",  
> links.contains( WikiPath.valueOf( "Foobar" ) ) );
>
> -    public void testUpdateBothExist()
> -        throws Exception
> -    {
> -        engine.saveText( "Foobars", "qwertz" );
> -        Collection<WikiPath> c = findReferrers( "Foobars" );
> -        assertEquals( "Foobars referrers", 2, c.size() );
> -        assertTrue( "Foobars referrer is not TestPage",  
> c.contains( WikiPath.valueOf( "TestPage" ) )
> -                    && c.contains( WikiPath.valueOf( "Foobar") ) );
> +        links = mgr.getRefersTo( WikiPath.valueOf( "Foobar" ) );
> +        assertEquals( 3, links.size() );
> +        assertTrue( "Does not have Foobar, but it should have",  
> links.contains( WikiPath.valueOf( "Foobar" ) ) ); // 2 of
> +        // these
> +        assertTrue( "Does not have Foobar2, but it should have",  
> links.contains( WikiPath.valueOf( "Foobar2" ) ) ); // 1 of
> +        // these
> +
> +        links = mgr.getRefersTo( WikiPath.valueOf( "Foobar2" ) );
> +        assertEquals( 0, links.size() );
>     }
>
> -    public void testUpdateBothExist2()
> -        throws Exception
> +    public void testNonExistant1() throws Exception
>     {
> -        engine.saveText( "Foobars", "qwertz" );
> -        engine.saveText( "TestPage", "Reference to [Foobar],  
> [Foobars]." );
> -
> -        Collection<WikiPath> c = findReferrers( "Foobars" );
> -        assertEquals( "Foobars referrers count", 2, c.size() );
> +        Collection<WikiPath> c =  
> mgr.getReferredBy( WikiPath.valueOf( "Foobar2" ) );
>
> -        assertTrue( "Foobars referrers",
> -                    c.contains( WikiPath.valueOf( "TestPage" ) ) &&  
> c.contains( WikiPath.valueOf( "Foobar" ) ) );
> +        assertTrue( c.size() == 1 &&  
> c.contains( WikiPath.valueOf( "Foobar" ) ) );
>     }
>
> -    public void testCircularRefs()
> -        throws Exception
> +    public void testNonExistant2() throws ProviderException
>     {
> -        engine.saveText( "Foobar2", "ref to [TestPage]" );
> -
> -        assertTrue( "no uncreated", mgr.findUncreated().size()==0 );
> -        assertTrue( "no unreferenced",  
> mgr.findUnreferenced().size()==0 );
> +        Collection<WikiPath> c =  
> mgr.getReferredBy( WikiPath.valueOf( "TestBug" ));
> +
> +        assertTrue( c.size() == 0 );
>     }
>
> -    public void testPluralSingularUpdate1()
> -        throws Exception
> +    public void testPluralSingularUpdate1() throws Exception
>     {
>         engine.saveText( "BugOne", "NewBug" );
>         engine.saveText( "NewBugs", "foo" );
>         engine.saveText( "OpenBugs", "bar" );
> -
> +
>         engine.saveText( "BugOne", "OpenBug" );
> -
> -        Collection<WikiPath> ref = findReferrers( "NewBugs" );
> -        assertNull("newbugs",ref); // No referrers must be found
>
> -        ref = findReferrers( "NewBug" );
> -        assertNull("newbug",ref); // No referrers must be found
> +        Collection<WikiPath> links =  
> mgr.getReferredBy( WikiPath.valueOf( "NewBugs" ));
> +        assertEquals( "newbugs", links.size() ); // No referrers  
> must be found
> +
> +        links = mgr.getReferredBy( WikiPath.valueOf( "NewBug" ));
> +        assertEquals( "newbug", links.size() ); // No referrers  
> must be found
>
> -        ref = findReferrers( "OpenBugs" );
> -        assertEquals("openbugs",1,ref.size());
> -         
> assertEquals("openbugs2","BugOne",ref.iterator().next().toString());
> +        links = mgr.getReferredBy( WikiPath.valueOf( "OpenBugs" ));
> +        assertEquals( "openbugs", 1, links.size() );
> +        assertEquals( "openbugs2", "BugOne",  
> links.iterator().next().toString() );
>
> -        ref = findReferrers( "OpenBug" );
> -        assertEquals("openbug",1,ref.size());
> -         
> assertEquals("openbug2","BugOne",ref.iterator().next().toString());
> +        links = mgr.getReferredBy( WikiPath.valueOf( "OpenBug" ));
> +        assertEquals( "openbug", 1, links.size() );
> +        assertEquals( "openbug2", "BugOne",  
> links.iterator().next().toString() );
>
>     }
>
> -    public void testPluralSingularUpdate2()
> -        throws Exception
> +    public void testPluralSingularUpdate2() throws Exception
>     {
>         engine.saveText( "BugOne", "NewBug" );
>         engine.saveText( "NewBug", "foo" );
>         engine.saveText( "OpenBug", "bar" );
> -
> +
>         engine.saveText( "BugOne", "OpenBug" );
> -
> -        Collection<WikiPath> ref = findReferrers( "NewBugs" );
> -        assertNull("newbugs",ref); // No referrers must be found
>
> -        ref = findReferrers( "NewBug" );
> -        assertNull("newbug",ref); // No referrers must be found
> +        Collection<WikiPath> links =  
> mgr.getReferredBy( WikiPath.valueOf( "NewBugs" ));
> +        assertEquals( 0, links.size() ); // No referrers must be  
> found
> +
> +        links = mgr.getReferredBy( WikiPath.valueOf( "NewBug" ));
> +        assertEquals( 0, links.size() ); // No referrers must be  
> found
>
> -        ref = findReferrers( "OpenBugs" );
> -        assertEquals("openbugs",1,ref.size());
> -         
> assertEquals("openbugs2","BugOne",ref.iterator().next().toString());
> +        links = mgr.getReferredBy( WikiPath.valueOf( "OpenBugs" ));
> +        assertEquals( "openbugs", 1, links.size() );
> +        assertEquals( "openbugs2", "BugOne",  
> links.iterator().next().toString() );
>
> -        ref = findReferrers( "OpenBug" );
> -        assertEquals("openbug",1,ref.size());
> -         
> assertEquals("openbug2","BugOne",ref.iterator().next().toString());
> +        links = mgr.getReferredBy( WikiPath.valueOf( "OpenBug" ));
> +        assertEquals( "openbug", 1, links.size() );
> +        assertEquals( "openbug2", "BugOne",  
> links.iterator().next().toString() );
>
>     }
>
> -    public void testPluralSingularUpdate3()
> -        throws Exception
> +    public void testPluralSingularUpdate3() throws Exception
>     {
>         engine.saveText( "BugOne", "NewBug" );
>         engine.saveText( "BugTwo", "NewBug" );
>         engine.saveText( "NewBugs", "foo" );
>         engine.saveText( "OpenBugs", "bar" );
> -
> +
>         engine.saveText( "BugOne", "OpenBug" );
> -
> -        Collection<WikiPath> ref = findReferrers( "NewBugs" );
> -        assertEquals("newbugs",1,ref.size());
> -         
> assertEquals("newbugs2","BugTwo",ref.iterator().next().toString());
> -
> -        ref = findReferrers( "NewBug" );
> -        assertEquals("newbugs",1,ref.size());
> -         
> assertEquals("newbugs2","BugTwo",ref.iterator().next().toString());
> -
> -        ref = findReferrers( "OpenBugs" );
> -        assertEquals("openbugs",1,ref.size());
> -         
> assertEquals("openbugs2","BugOne",ref.iterator().next().toString());
> -
> -        ref = findReferrers( "OpenBug" );
> -        assertEquals("openbug",1,ref.size());
> -         
> assertEquals("openbug2","BugOne",ref.iterator().next().toString());
> +
> +        Collection<WikiPath> links =  
> mgr.getReferredBy( WikiPath.valueOf( "NewBugs" ));
> +        assertEquals( "newbugs", 1, links.size() );
> +        assertEquals( "newbugs2", "BugTwo",  
> links.iterator().next().toString() );
> +
> +        links = mgr.getReferredBy( WikiPath.valueOf( "NewBug" ));
> +        assertEquals( "newbugs", 1, links.size() );
> +        assertEquals( "newbugs2", "BugTwo",  
> links.iterator().next().toString() );
> +
> +        links = mgr.getReferredBy( WikiPath.valueOf( "OpenBugs" ));
> +        assertEquals( "openbugs", 1, links.size() );
> +        assertEquals( "openbugs2", "BugOne",  
> links.iterator().next().toString() );
> +
> +        links = mgr.getReferredBy( WikiPath.valueOf( "OpenBug" ));
> +        assertEquals( "openbug", 1, links.size() );
> +        assertEquals( "openbug2", "BugOne",  
> links.iterator().next().toString() );
>
>     }
>
> +    public void testRebuild() throws Exception
> +    {
> +        ContentManager cm = engine.getContentManager();
> +        Node node =  
> (Node)cm.getJCRNode( ReferenceManager.REFERENCES_ROOT );
> +        assertNotNull( node );
> +        assertNotSame( 0, node.getNodes().getSize() );
> +        mgr.rebuild();
> +
> +        // Make sure all of the inbound references got deleted
> +        node =  
> (Node)cm.getJCRNode( ReferenceManager.REFERENCES_ROOT );
> +        assertNotNull( node );
> +        assertEquals( 0, node.getNodes().getSize() );
> +
> +        // Make sure the not-created/not-referenced properties got  
> created
> +        try
> +        {
> +            node.getProperty( ReferenceManager.NOT_CREATED );
> +        }
> +        catch ( PathNotFoundException e )
> +        {
> +            // Excellent!
> +        }
> +        try
> +        {
> +            node.getProperty( ReferenceManager.NOT_REFERENCED );
> +        }
> +        catch ( PathNotFoundException e )
> +        {
> +            // Excellent!
> +        }
> +    }
> +
> +    public void testRemove() throws Exception
> +    {
> +        Collection<WikiPath> c =  
> mgr.getReferredBy( WikiPath.valueOf( "Foobar2" ));
> +        assertEquals( 1, c.size() );
> +        assertTrue( c.contains( WikiPath.valueOf( "Foobar" ) ) );
> +
> +        engine.deletePage( "Foobar" );
> +        c = mgr.getReferredBy( WikiPath.valueOf("Foobar2" ));
> +        assertEquals( 0, c.size() );
> +
> +        engine.saveText( "Foobar", "[Foobar2]" );
> +        c = mgr.getReferredBy( WikiPath.valueOf( "Foobar2" ));
> +        assertEquals( 1, c.size() );
> +        assertTrue( c.contains( WikiPath.valueOf( "Foobar" ) ) );
> +    }
> +
> +    /**
> +     * Tests low-level method for removing items from a multi- 
> valued JCR Node property.
> +     * @throws Exception
> +     */
> +    public void testRemoveAllFromValues() throws Exception
> +    {
> +        ContentManager cm = engine.getContentManager();
> +        String jcrPath = ReferenceManager.REFERENCES_ROOT + "/" +  
> "TestRemoveFromValues";
> +        Node node;
> +        Property prop;
> +        Session s = cm.getCurrentSession();
> +
> +        mgr.addToValues( jcrPath, "foo","Value1" );
> +        mgr.addToValues( jcrPath, "foo","Value2" );
> +        s.save();
> +        node = cm.getJCRNode( jcrPath );
> +        prop = node.getProperty( "foo" );
> +        assertNotNull( prop.getValues() );
> +        assertEquals( 2, prop.getValues().length );
> +
> +        // Remove the first value
> +        mgr.removeAllFromValues( jcrPath, "foo", "Value1" );
> +        s.save();
> +        node = cm.getJCRNode( jcrPath );
> +        prop = node.getProperty( "foo" );
> +        assertNotNull( prop.getValues() );
> +        assertEquals( 1, prop.getValues().length );
> +        assertEquals( "Value2", prop.getValues()[0].getString() );
> +
> +        // Try removing a value that does not exist in the property
> +        mgr.removeAllFromValues( jcrPath, "foo",  
> "NonExistentValue" );
> +        s.save();
> +        node = cm.getJCRNode( jcrPath );
> +        prop = node.getProperty( "foo" );
> +        assertNotNull( prop.getValues() );
> +        assertEquals( 1, prop.getValues().length );
> +        assertEquals( "Value2", prop.getValues()[0].getString() );
> +
> +        // Remove the last value
> +        mgr.removeAllFromValues( jcrPath, "foo", "Value2" );
> +        s.save();
> +        node = cm.getJCRNode( jcrPath );
> +        try
> +        {
> +            prop = node.getProperty( "foo" );
> +        }
> +        catch ( PathNotFoundException e )
> +        {
> +            // Good! This is what we expect.
> +        }
> +
> +        // Add back in the first value, twice
> +        mgr.addToValues( jcrPath, "foo","Value1" );
> +        mgr.addToValues( jcrPath, "foo","Value1" );
> +        s.save();
> +        node = cm.getJCRNode( jcrPath );
> +        prop = node.getProperty( "foo" );
> +        assertNotNull( prop.getValues() );
> +        assertEquals( 2, prop.getValues().length );
> +
> +        // Remove the first value -- ALL should be gone now
> +        mgr.removeAllFromValues( jcrPath, "foo", "Value1" );
> +        s.save();
> +        node = cm.getJCRNode( jcrPath );
> +        try
> +        {
> +            prop = node.getProperty( "foo" );
> +        }
> +        catch ( PathNotFoundException e )
> +        {
> +            // Good! This is what we expect.
> +        }
> +    }
> +
> +    /**
> +     * Tests protected method {@link  
> ReferenceManager#removeLinks(WikiPath)},
> +     * which removes all outbound links from a page to multiple  
> destinations,
> +     * and removes all inbound links to the page as well. The  
> source page
> +     * exists.
> +     *
> +     * @throws Exception
> +     */
> +    public void testRemoveLinks() throws Exception
> +    {
> +        // Set up some test pages
> +        engine.saveText( "RemoveLinks", "Test page." );
> +        engine.saveText( "Destination1", "Test page." );
> +        engine.saveText( "Destination2", "Test page." );
> +        engine.saveText( "Destination3", "Test page." );
> +
> +        // Set source-->dest1,2,3,4
> +        WikiPath source = WikiPath.valueOf( "RemoveLinks" );
> +        List<WikiPath> destinations = new ArrayList<WikiPath>();
> +        WikiPath destination1 = WikiPath.valueOf( "Destination1" );
> +        WikiPath destination2 = WikiPath.valueOf( "Destination2" );
> +        WikiPath destination3 = WikiPath.valueOf( "Destination3" );
> +        WikiPath destination4 = WikiPath.valueOf( "Destination4" );
> +        destinations.add( destination1 );
> +        destinations.add( destination2 );
> +        destinations.add( destination3 );
> +        destinations.add( destination4 );
> +        mgr.setLinks( source, destinations );
> +
> +        // We should see four outbound links from source-- 
> >dest1,2,3,4
> +        assertEquals( 4, mgr.getRefersTo( source ).size() );
> +        assertEquals( 0, mgr.getRefersTo( destination1 ).size() );
> +        assertEquals( 0, mgr.getRefersTo( destination2 ).size() );
> +        assertEquals( 0, mgr.getRefersTo( destination3 ).size() );
> +        assertEquals( 0, mgr.getRefersTo( destination4 ).size() );
> +
> +        // We should see four inbound links dest1,2,3,4<--source
> +        assertEquals( 0, mgr.getReferredBy( source ).size() );
> +        assertEquals( 1, mgr.getReferredBy( destination1 ).size() );
> +        assertEquals( 1, mgr.getReferredBy( destination2 ).size() );
> +        assertEquals( 1, mgr.getReferredBy( destination3 ).size() );
> +        assertEquals( 1, mgr.getReferredBy( destination4 ).size() );
> +
> +        // Now, remove all links from the source to dest1,2,3, and  
> all inbound links too
> +        mgr.removeLinks( source );
> +        assertEquals( 0, mgr.getRefersTo( source ).size() );
> +        assertEquals( 0, mgr.getReferredBy( source ).size() );
> +        assertEquals( 0, mgr.getReferredBy( destination1 ).size() );
> +        assertEquals( 0, mgr.getReferredBy( destination2 ).size() );
> +        assertEquals( 0, mgr.getReferredBy( destination3 ).size() );
> +        assertEquals( 0, mgr.getReferredBy( destination4 ).size() );
> +        assertEquals( 0, mgr.getRefersTo( destination1 ).size() );
> +        assertEquals( 0, mgr.getRefersTo( destination2 ).size() );
> +        assertEquals( 0, mgr.getRefersTo( destination3 ).size() );
> +        assertEquals( 0, mgr.getRefersTo( destination4 ).size() );
> +    }
> +
>     public void testSelf() throws WikiException
>     {
>         engine.saveText( "BugOne", "BugOne" );
> -        Collection<WikiPath> ref = findReferrers( "BugOne" );
> -        assertEquals("wrong size",1,ref.size());
> -        assertEquals("ref", "Main:BugOne",  
> ref.iterator().next().toString());
> +        Collection<WikiPath> ref =  
> mgr.getReferredBy( WikiPath.valueOf( "BugOne" ));
> +        assertEquals( "wrong size", 1, ref.size() );
> +        assertEquals( "ref", "Main:BugOne",  
> ref.iterator().next().toString() );
>     }
> -
> -    public static Test suite()
> +
> +    /**
> +     * Tests protected method {@link  
> ReferenceManager#setLinks(WikiPath, List)},
> +     * which sets bi-directional links from a source page to multiple
> +     * destinations, and vice-versa. The source and destination  
> pages exist.
> +     *
> +     * @throws Exception
> +     */
> +    public void testSetLinks() throws Exception
>     {
> -        return new TestSuite( ReferenceManagerTest.class );
> +        // Set up some test pages
> +        engine.saveText( "SetLinks", "Test page." );
> +        engine.saveText( "Destination1", "Test page." );
> +        engine.saveText( "Destination2", "Test page." );
> +        engine.saveText( "Destination3", "Test page." );
> +
> +        // Set source-->dest1,2,3
> +        WikiPath source = WikiPath.valueOf( "SetLinks" );
> +        List<WikiPath> destinations = new ArrayList<WikiPath>();
> +        WikiPath destination1 = WikiPath.valueOf( "Destination1" );
> +        WikiPath destination2 = WikiPath.valueOf( "Destination2" );
> +        WikiPath destination3 = WikiPath.valueOf( "Destination3" );
> +        destinations.add( destination1 );
> +        destinations.add( destination2 );
> +        destinations.add( destination3 );
> +        mgr.setLinks( source, destinations );
> +
> +        // We should see three outbound links from source-->dest1,2,3
> +        List<WikiPath> links;
> +        links = mgr.getRefersTo( source );
> +        assertEquals( 3, links.size() );
> +        assertTrue( links.contains( destination1 ) );
> +        assertTrue( links.contains( destination2 ) );
> +        assertTrue( links.contains( destination3 ) );
> +
> +        // Each dest1,2,3 should NOT have created an inbound link  
> to source
> +        assertEquals( 0, mgr.getReferredBy( source ).size() );
> +
> +        // Each of the destination pages should have 1 inbound link  
> from source
> +        links = mgr.getReferredBy( destination1 );
> +        assertEquals( 1, links.size() );
> +        assertTrue( links.contains( source ) );
> +
> +        links = mgr.getReferredBy( destination2 );
> +        assertEquals( 1, links.size() );
> +        assertTrue( links.contains( source ) );
> +
> +        links = mgr.getReferredBy( destination3 );
> +        assertEquals( 1, links.size() );
> +        assertTrue( links.contains( source ) );
>     }
>
> -    public static void main(String[] args)
> +    /**
> +     * Tests protected method
> +     * {@link ReferenceManager#setRefersTo(WikiPath, List)}, which  
> sets
> +     * outbound links from a page to multiple destinatiions. The  
> source page
> +     * exists.
> +     *
> +     * @throws Exception
> +     */
> +    public void testSetRefersTo() throws Exception
>     {
> -        junit.textui.TestRunner.main( new String[]  
> { ReferenceManagerTest.class.getName() } );
> +        WikiPath source = WikiPath.valueOf( "TestPage" );
> +        List<WikiPath> destinations = new ArrayList<WikiPath>();
> +        destinations.add( WikiPath.valueOf( "PageOne" ) );
> +        destinations.add( WikiPath.valueOf( "PageTwo" ) );
> +        destinations.add( WikiPath.valueOf( "PageThree" ) );
> +        mgr.setRefersTo( source, destinations );
> +
> +        List<WikiPath> links = mgr.getRefersTo( source );
> +        assertEquals( 3, links.size() );
> +         
> assertTrue( links.contains( WikiPath.valueOf( "PageOne" ) ) );
> +         
> assertTrue( links.contains( WikiPath.valueOf( "PageTwo" ) ) );
> +         
> assertTrue( links.contains( WikiPath.valueOf( "PageThree" ) ) );
>     }
>
> +    /**
> +     * Should fail in 2.2.14-beta
> +     *
> +     * @throws Exception
> +     */
> +    public void testSingularReferences() throws Exception
> +    {
> +        engine.saveText( "RandomPage", "FatalBugs" );
> +        engine.saveText( "FatalBugs", "<foo>" );
> +        engine.saveText( "BugCommentPreviewDeletesAllComments",  
> "FatalBug" );
> +
> +        Collection<WikiPath> c =  
> mgr.getReferredBy( WikiPath.valueOf( "FatalBugs" ));
> +
> +        assertEquals( "FatalBugs referrers number", 2, c.size() );
> +    }
>
> +
> +    public void testUncreated() throws Exception
> +    {
> +        List<String> c = mgr.findUncreated();
> +        assertEquals( 1, c.size());
> +        assertEquals( "Main:Foobar2", c.get( 0 ) );
> +    }
> +
> +    public void testUnreferenced() throws Exception
> +    {
> +        List<String> c = mgr.findUnreferenced();
> +        assertEquals( 1, c.size() );
> +        assertEquals( "TestPage", c.get( 0 ) );
> +    }
> +
> +    public void testUpdateBothExist() throws Exception
> +    {
> +        engine.saveText( "Foobars", "qwertz" );
> +        Collection<WikiPath> c =  
> mgr.getReferredBy( WikiPath.valueOf( "Foobars" ));
> +        assertEquals( "Foobars referrers", 2, c.size() );
> +        assertTrue( "Foobars referrer is not TestPage",  
> c.contains( WikiPath.valueOf( "TestPage" ) )
> +                                                        &&  
> c.contains( WikiPath.valueOf( "Foobar" ) ) );
> +    }
> +
> +    public void testUpdateBothExist2() throws Exception
> +    {
> +        engine.saveText( "Foobars", "qwertz" );
> +        engine.saveText( "TestPage", "Reference to [Foobar],  
> [Foobars]." );
> +
> +        Collection<WikiPath> c =  
> mgr.getReferredBy( WikiPath.valueOf( "Foobars" ));
> +        assertEquals( "Foobars referrers count", 2, c.size() );
> +
> +        assertTrue( "Foobars referrers",  
> c.contains( WikiPath.valueOf( "TestPage" ) ) &&  
> c.contains( WikiPath.valueOf( "Foobar" ) ) );
> +    }
> +
>     /**
> -     * Test method: dumps the contents of  ReferenceManager link  
> lists to stdout.
> -     * This method is NOT synchronized, and should be used in testing
> -     * with one user, one WikiEngine only.
> +     * Opposite to testUpdatePluralOnlyRef(). Is a page with plural  
> form
> +     * recognized as the page referenced by a singular link.
>      */
> -    /*
> -    public static String dumpReferenceManager( ReferenceManager rm )
> +
> +    public void testUpdateFoobar2s() throws Exception
>     {
> -        StringBuffer buf = new StringBuffer();
> -        try
> -        {
> -             
> buf 
> .append 
> ( "================================================================ 
> \n" );
> -            buf.append( "Referred By list:\n" );
> -            Set keys = rm.getReferredBy().keySet();
> -            Iterator it = keys.iterator();
> -            while( it.hasNext() )
> -            {
> -                String key = (String) it.next();
> -                buf.append( key + " referred by: " );
> -                Set refs = (Set)rm.getReferredBy().get( key );
> -                Iterator rit = refs.iterator();
> -                while( rit.hasNext() )
> -                {
> -                    String aRef = (String)rit.next();
> -                    buf.append( aRef + " " );
> -                }
> -                buf.append( "\n" );
> -            }
> -
> -
> -             
> buf 
> .append 
> ( "---------------------------------------------------------------- 
> \n" );
> -            buf.append( "Refers To list:\n" );
> -            keys = rm.getRefersTo().keySet();
> -            it = keys.iterator();
> -            while( it.hasNext() )
> -            {
> -                String key = (String) it.next();
> -                buf.append( key + " refers to: " );
> -                Collection refs =  
> (Collection)rm.getRefersTo().get( key );
> -                if(refs != null)
> -                {
> -                    Iterator rit = refs.iterator();
> -                    while( rit.hasNext() )
> -                    {
> -                        String aRef = (String)rit.next();
> -                        buf.append( aRef + " " );
> -                    }
> -                    buf.append( "\n" );
> -                }
> -                else
> -                    buf.append("(no references)\n");
> -            }
> -             
> buf 
> .append 
> ( "================================================================ 
> \n" );
> -        }
> -        catch(Exception e)
> -        {
> -            buf.append("Problem in dump(): " + e + "\n" );
> -        }
> -
> -        return( buf.toString() );
> +        engine.saveText( "Foobar2s", "qwertz" );
> +        assertEquals( 0, mgr.findUncreated().size() );
> +
> +        Collection<WikiPath> c =  
> mgr.getReferredBy( WikiPath.valueOf( "Foobar2s" ));
> +        assertTrue( "referrers", c != null && c.size() == 1 &&  
> c.iterator().next().toString().equals( "Foobar" ) );
>     }
> -    */
>
> -}
> +    /**
> +     * Is a page recognized as referenced if only plural form links  
> exist.
> +     */
> +
> +    // NB: Unfortunately, cleaning out self-references in the case  
> there's
> +    // a plural and a singular form of the page becomes nigh  
> impossible, so we
> +    // just don't do it.
> +    public void testUpdatePluralOnlyRef() throws Exception
> +    {
> +        engine.saveText( "TestPage", "Reference to [Foobars]." );
> +        List<String> c = mgr.findUnreferenced();
> +        assertEquals( 1, c.size() );
> +        assertEquals( "TestPage", c.get( 0 ) );
> +
> +        Collection<WikiPath> p =  
> mgr.getReferredBy( WikiPath.valueOf( "Foobar" ));
> +        assertTrue( "Foobar referrers", p.size() == 2 );
> +    }
>
> +    /**
> +     * Test method: dumps the contents of ReferenceManager link  
> lists to stdout.
> +     * This method is NOT synchronized, and should be used in  
> testing with one
> +     * user, one WikiEngine only.
> +     */
> +    /*
> +     * public static String dumpReferenceManager( ReferenceManager  
> rm ) {
> +     * StringBuffer buf = new StringBuffer(); try { buf.append(
> +     *  
> "================================================================ 
> \n" );
> +     * buf.append( "Referred By list:\n" ); Set keys =
> +     * rm.getReferredBy().keySet(); Iterator it = keys.iterator();  
> while(
> +     * it.hasNext() ) { String key = (String) it.next();  
> buf.append( key + "
> +     * referred by: " ); Set refs =  
> (Set)rm.getReferredBy().get( key ); Iterator
> +     * rit = refs.iterator(); while( rit.hasNext() ) { String aRef =
> +     * (String)rit.next(); buf.append( aRef + " " ); }  
> buf.append( "\n" ); }
> +     * buf.append(
> +     *  
> "---------------------------------------------------------------- 
> \n" );
> +     * buf.append( "Refers To list:\n" ); keys =  
> rm.getRefersTo().keySet(); it =
> +     * keys.iterator(); while( it.hasNext() ) { String key =  
> (String) it.next();
> +     * buf.append( key + " refers to: " ); Collection refs =
> +     * (Collection)rm.getRefersTo().get( key ); if(refs != null)  
> { Iterator rit =
> +     * refs.iterator(); while( rit.hasNext() ) { String aRef =
> +     * (String)rit.next(); buf.append( aRef + " " ); }  
> buf.append( "\n" ); }
> +     * else buf.append("(no references)\n"); } buf.append(
> +     *  
> "================================================================ 
> \n" ); }
> +     * catch(Exception e) { buf.append("Problem in dump(): " + e +  
> "\n" ); }
> +     * return( buf.toString() ); }
> +     */
> +
> +}
>
> Modified: incubator/jspwiki/trunk/tests/java/org/apache/wiki/ 
> TestEngine.java
> URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/java/org/apache/wiki/TestEngine.java?rev=770959&r1=770958&r2=770959&view=diff
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- incubator/jspwiki/trunk/tests/java/org/apache/wiki/ 
> TestEngine.java (original)
> +++ incubator/jspwiki/trunk/tests/java/org/apache/wiki/ 
> TestEngine.java Sat May  2 14:15:13 2009
> @@ -42,10 +42,8 @@
> import org.apache.wiki.api.WikiException;
> import org.apache.wiki.api.WikiPage;
> import org.apache.wiki.attachment.Attachment;
> -import org.apache.wiki.auth.AuthenticationManager;
> -import org.apache.wiki.auth.SessionMonitor;
> -import org.apache.wiki.auth.Users;
> -import org.apache.wiki.auth.WikiSecurityException;
> +import org.apache.wiki.auth.*;
> +import org.apache.wiki.auth.user.XMLUserDatabase;
> import org.apache.wiki.content.PageAlreadyExistsException;
> import org.apache.wiki.content.PageNotFoundException;
> import org.apache.wiki.content.WikiPath;
> @@ -449,6 +447,8 @@
>     {
>         props.put( AuthenticationManager.PROP_LOGIN_THROTTLING,  
> "false" );
>         props.put( WikiEngine.PROP_URLCONSTRUCTOR,  
> "org.apache.wiki.url.DefaultURLConstructor" );
> +        props.put( UserManager.PROP_DATABASE,  
> "org.apache.wiki.auth.user.XMLUserDatabase" );
> +        props.put(XMLUserDatabase.PROP_USERDATABASE, "tests/etc/ 
> userdatabase.xml");
>         return props;
>     }
>
>
> Modified: incubator/jspwiki/trunk/tests/java/org/apache/wiki/ 
> WikiEngineTest.java
> URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/java/org/apache/wiki/WikiEngineTest.java?rev=770959&r1=770958&r2=770959&view=diff
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- incubator/jspwiki/trunk/tests/java/org/apache/wiki/ 
> WikiEngineTest.java (original)
> +++ incubator/jspwiki/trunk/tests/java/org/apache/wiki/ 
> WikiEngineTest.java Sat May  2 14:15:13 2009
> @@ -239,18 +239,6 @@
>         assertEquals( "A%E2%89%A2%CE%91.",  
> m_engine.encodeName( name ) );
>     }
>
> -    public void testReadLinks()
> -        throws Exception
> -    {
> -        String src="Foobar. [Foobar].  Frobozz.  [This is a link].";
> -
> -        m_engine.deletePage( "Test" );
> -        Object[] result =  
> m_engine 
> .scanWikiLinks( m_engine.createPage( WikiPath.valueOf( "Test" ) ),  
> src ).toArray();
> -
> -        assertEquals( "item 0", PATH_FOOBAR, result[0] );
> -        assertEquals( "item 1", "Main:This is a link", result[1] );
> -    }
> -
>     public void testBeautifyTitle()
>     {
>         String src = "WikiNameThingy";
> @@ -713,7 +701,7 @@
>         m_engine.saveText( NAME1, "[Foobar]" );
>         m_engine.getText( NAME1 ); // Ensure that page is cached.
>
> -        Collection<String> c = refMgr.findUncreated();
> +        List<String> c = refMgr.findUncreated();
>         assertTrue( "Non-existent reference not detected by  
> ReferenceManager",
>             Util.collectionContains( c, "Foobar" ));
>
> @@ -754,7 +742,7 @@
>         m_engine.saveText( NAME1, "[Foobar]" );
>         m_engine.getText( NAME1 ); // Ensure that page is cached.
>
> -        Collection<String> c = refMgr.findUncreated();
> +        List<String> c = refMgr.findUncreated();
>         assertEquals( "uncreated count", 1, c.size() );
>         assertEquals( "wrong referenced page", "Foobar",  
> (String)c.iterator().next() );
>
> @@ -873,7 +861,7 @@
>         m_engine.saveText( "RenameBugTestPage", "Mary had a little  
> generic object" );
>         m_engine.saveText( "OldNameTestPage", "Linked to  
> RenameBugTestPage" );
>
> -        Collection<WikiPath> pages =  
> m_engine 
> .getReferenceManager 
> ().findReferrers( WikiPath.valueOf("RenameBugTestPage") );
> +        Collection<WikiPath> pages =  
> m_engine 
> .getReferenceManager 
> ().getReferredBy( WikiPath.valueOf("RenameBugTestPage") );
>         assertEquals( "has one", "Main:OldNameTestPage",  
> pages.iterator().next() );
>
>         WikiContext ctx =  
> m_engine 
> .getWikiContextFactory 
> ().newViewContext( m_engine.getPage("OldNameTestPage") );
> @@ -883,7 +871,7 @@
>         assertFalse( "did not vanish",  
> m_engine.pageExists( "OldNameTestPage") );
>         assertTrue( "did not appear",  
> m_engine.pageExists( "NewNameTestPage") );
>
> -        pages =  
> m_engine 
> .getReferenceManager 
> ().findReferrers( WikiPath.valueOf("RenameBugTestPage") );
> +        pages =  
> m_engine 
> .getReferenceManager 
> ().getReferredBy( WikiPath.valueOf("RenameBugTestPage") );
>
>         assertEquals( "wrong # of referrers", 1, pages.size() );
>
>
> Modified: incubator/jspwiki/trunk/tests/java/org/apache/wiki/action/ 
> RenameActionBeanTest.java
> URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/java/org/apache/wiki/action/RenameActionBeanTest.java?rev=770959&r1=770958&r2=770959&view=diff
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- incubator/jspwiki/trunk/tests/java/org/apache/wiki/action/ 
> RenameActionBeanTest.java (original)
> +++ incubator/jspwiki/trunk/tests/java/org/apache/wiki/action/ 
> RenameActionBeanTest.java Sat May  2 14:15:13 2009
> @@ -151,8 +151,8 @@
>         m_engine.saveText("ReferstoTest", "This page refers to  
> [Test].\n");
>         WikiPage referringPage = m_engine.getPage("ReferstoTest");
>         assertNotNull("Did not save page ReferstoTest!",  
> referringPage );
> -         
> assertNotNull 
> ( m_engine 
> .getReferenceManager().findReferrers(WikiPath.valueOf("Test")) );
> -        assertEquals( 1,  
> m_engine 
> .getReferenceManager 
> ().findReferrers(WikiPath.valueOf("Test")).size() );
> +         
> assertNotNull 
> ( m_engine 
> .getReferenceManager().getReferredBy(WikiPath.valueOf("Test")) );
> +        assertEquals( 1,  
> m_engine 
> .getReferenceManager 
> ().getReferredBy(WikiPath.valueOf("Test")).size() );
>
>         MockRoundtrip trip;
>         ValidationErrors errors;
>
> Modified: incubator/jspwiki/trunk/tests/java/org/apache/wiki/content/ 
> PageRenamerTest.java
> URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/java/org/apache/wiki/content/PageRenamerTest.java?rev=770959&r1=770958&r2=770959&view=diff
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- incubator/jspwiki/trunk/tests/java/org/apache/wiki/content/ 
> PageRenamerTest.java (original)
> +++ incubator/jspwiki/trunk/tests/java/org/apache/wiki/content/ 
> PageRenamerTest.java Sat May  2 14:15:13 2009
> @@ -21,18 +21,21 @@
> package org.apache.wiki.content;
>
> import java.util.Collection;
> +import java.util.List;
> import java.util.Properties;
> -import java.util.Set;
> -
> -import org.apache.wiki.*;
> -import org.apache.wiki.api.WikiException;
> -import org.apache.wiki.api.WikiPage;
> -import org.apache.wiki.providers.ProviderException;
>
> import junit.framework.Test;
> import junit.framework.TestCase;
> import junit.framework.TestSuite;
>
> +import org.apache.wiki.TestEngine;
> +import org.apache.wiki.WikiContext;
> +import org.apache.wiki.WikiEngine;
> +import org.apache.wiki.WikiProvider;
> +import org.apache.wiki.api.WikiException;
> +import org.apache.wiki.api.WikiPage;
> +import org.apache.wiki.providers.ProviderException;
> +
>
> public class PageRenamerTest extends TestCase
> {
> @@ -78,9 +81,9 @@
>         m_engine.shutdown();
>     }
>
> -    private Set<WikiPath> findReferrers(String path) throws  
> ProviderException
> +    private List<WikiPath> findReferrers(String path) throws  
> ProviderException
>     {
> -        return  
> m_engine 
> .getReferenceManager().findReferrers( WikiPath.valueOf(path) );
> +        return  
> m_engine 
> .getReferenceManager().getReferredBy( WikiPath.valueOf(path) );
>     }
>
>     public void testSimpleRename()
>
> Modified: incubator/jspwiki/trunk/tests/java/org/apache/wiki/search/ 
> SearchManagerTest.java
> URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/java/org/apache/wiki/search/SearchManagerTest.java?rev=770959&r1=770958&r2=770959&view=diff
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- incubator/jspwiki/trunk/tests/java/org/apache/wiki/search/ 
> SearchManagerTest.java (original)
> +++ incubator/jspwiki/trunk/tests/java/org/apache/wiki/search/ 
> SearchManagerTest.java Sat May  2 14:15:13 2009
> @@ -73,7 +73,7 @@
>     public void testDefaultProvider()
>     {
>         assertEquals( "org.apache.wiki.search.LuceneSearchProvider",
> -                      m_mgr.getSearchEngine().getClass().getName() );
> +                       
> m_mgr.getSearchProvider().getClass().getName() );
>     }
>
>     public void testSimpleSearch()
>