Author: jalkanen
Date: Tue May 13 13:29:48 2008
New Revision: 655997

URL: http://svn.apache.org/viewvc?rev=655997&view=rev
Log:
[JSPWIKI-265] Implemented referrer changing.

Modified:
    incubator/jspwiki/trunk/ChangeLog
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/Release.java
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/content/PageRenamer.java
    incubator/jspwiki/trunk/tests/com/ecyrd/jspwiki/PageRenamerTest.java

Modified: incubator/jspwiki/trunk/ChangeLog
URL: 
http://svn.apache.org/viewvc/incubator/jspwiki/trunk/ChangeLog?rev=655997&r1=655996&r2=655997&view=diff
==============================================================================
--- incubator/jspwiki/trunk/ChangeLog (original)
+++ incubator/jspwiki/trunk/ChangeLog Tue May 13 13:29:48 2008
@@ -1,5 +1,12 @@
 2008-05-11  Janne Jalkanen <[EMAIL PROTECTED]>
 
+        * 2.7.0-svn-23
+        
+        * [JSPWIKI-265] Referrers are now changed, though the
+        functionality is still a bit broken in places.
+        
+2008-05-11  Janne Jalkanen <[EMAIL PROTECTED]>
+
         * 2.7.0-svn-22
         
         * [JSPWIKI-260] ReferringPagesPlugin now creates the "more"

Modified: incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/Release.java
URL: 
http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/Release.java?rev=655997&r1=655996&r2=655997&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/Release.java (original)
+++ incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/Release.java Tue May 13 
13:29:48 2008
@@ -77,7 +77,7 @@
      *  <p>
      *  If the build identifier is empty, it is not added.
      */
-    public static final String     BUILD         = "22";
+    public static final String     BUILD         = "23";
     
     /**
      *  This is the generic version string you should use

Modified: incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/content/PageRenamer.java
URL: 
http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/content/PageRenamer.java?rev=655997&r1=655996&r2=655997&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/content/PageRenamer.java 
(original)
+++ incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/content/PageRenamer.java Tue 
May 13 13:29:48 2008
@@ -20,10 +20,17 @@
  */
 package com.ecyrd.jspwiki.content;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.log4j.Logger;
 
 import com.ecyrd.jspwiki.*;
+import com.ecyrd.jspwiki.attachment.Attachment;
 import com.ecyrd.jspwiki.parser.MarkupParser;
+import com.ecyrd.jspwiki.providers.ProviderException;
 
 /**
  *  Provides page renaming functionality.  Note that there used to be
@@ -35,6 +42,8 @@
 public class PageRenamer
 {
 
+    private static final Logger log = Logger.getLogger( PageRenamer.class );
+    
     /**
      *  Renames a page.
      *  
@@ -103,7 +112,7 @@
         {
             
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.
@@ -125,12 +134,16 @@
         engine.getReferenceManager().pageRemoved( fromPage );
         engine.getReferenceManager().updateReferences( renameTo, 
                                                        engine.scanWikiLinks( 
toPage, engine.getPureText( toPage )) );
-        
+
+        //
+        //  Update referrers first
+        //
         if( changeReferrers )
         {
             updateReferrers( context, fromPage, toPage );
         }
-        
+
+
         //
         //  Done, return the new name.
         //
@@ -148,10 +161,30 @@
     private void updateReferrers( WikiContext context, WikiPage fromPage, 
WikiPage toPage )
     {
         WikiEngine engine = context.getEngine();
+        Collection<String> referrers = new ArrayList<String>();
         
-        Collection<String> referrers = 
engine.getReferenceManager().findReferrers( fromPage.getName() );
+        Collection<String> r = engine.getReferenceManager().findReferrers( 
fromPage.getName() );
+        if( r != null ) referrers.addAll( r );
         
-        if( referrers == null ) return; // No referrers
+        try
+        {
+            Collection<Attachment> attachments = 
engine.getAttachmentManager().listAttachments( fromPage );
+
+            for( Attachment 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 );
+        }
+
+        
+        if( referrers.isEmpty() ) return; // No referrers
         
         for( String pageName : referrers )
         {
@@ -160,12 +193,122 @@
             String sourceText = engine.getPureText( p );
             
             String newText = replaceReferrerString( context, sourceText, 
fromPage.getName(), toPage.getName() );
+            
+            if( !sourceText.equals( newText ) )
+            {
+                p.setAttribute( WikiPage.CHANGENOTE, "Renaming change 
"+fromPage.getName()+" to "+toPage.getName() );
+                p.setAuthor( context.getCurrentUser().getName() );
+         
+                try
+                {
+                    engine.getPageManager().putPageText( p, newText );
+                    engine.getReferenceManager().updateReferences( 
p.getName(), 
+                                                                   
engine.scanWikiLinks( p, engine.getPureText( p )) );
+                }
+                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);
+                }
+            }
+        }
+    }
+
+    private String replaceReferrerString( WikiContext context, String 
sourceText, String from, String to )
+    {
+        StringBuffer sb = new StringBuffer( sourceText.length() );
+        
+        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) )
+        {
+            if( matcher.group(1).length() > 0 ) 
+            {
+                //
+                //  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 );
+            }
+        
+            //
+            //  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();
     }
 
-    // FIXME: Does not yet work.
-    private String replaceReferrerString( WikiContext context, String 
sourceText, String name, String name2 )
+    /**
+     *  This method does a correct replacement of a single link, taking into
+     *  account anchors and attachments.
+     *  
+     *  @param link
+     *  @param to
+     *  @return
+     */
+    private String replaceSingleLink( WikiContext context, String original, 
String from, String newlink )
     {
-        return sourceText;
+        int hash = original.indexOf( '#' );
+        int slash = original.indexOf( '/' );
+        String reallink = original;
+        
+        if( hash != -1 ) reallink = original.substring( 0, hash );
+        if( slash != -1 ) reallink = original.substring( 0,slash );
+        
+        reallink = MarkupParser.cleanLink( reallink );
+        
+        // WikiPage p  = 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) )
+        {
+            return newlink + ((hash > 0) ? original.substring( hash ) : "") + 
((slash > 0) ? original.substring( slash ) : "") ;
+        }
+        
+        return original;
     }
 }

Modified: incubator/jspwiki/trunk/tests/com/ecyrd/jspwiki/PageRenamerTest.java
URL: 
http://svn.apache.org/viewvc/incubator/jspwiki/trunk/tests/com/ecyrd/jspwiki/PageRenamerTest.java?rev=655997&r1=655996&r2=655997&view=diff
==============================================================================
--- incubator/jspwiki/trunk/tests/com/ecyrd/jspwiki/PageRenamerTest.java 
(original)
+++ incubator/jspwiki/trunk/tests/com/ecyrd/jspwiki/PageRenamerTest.java Tue 
May 13 13:29:48 2008
@@ -339,7 +339,7 @@
             fail();
         }
     }
-    
+   
     public void testBug85_case2() throws Exception 
     {
         try
@@ -394,6 +394,30 @@
         }
     }
     
+    public void testRenameOfEscapedLinks() throws Exception
+    {
+        String src = "[[Link to TestPage2|TestPage2|target='_new']";
+        
+        m_engine.saveText( "TestPage", src );
+        m_engine.saveText( "TestPage2", "foo" );
+        
+        rename ("TestPage2", "Test");
+        
+        assertEquals( "[[Link to TestPage2|TestPage2|target='_new']", 
m_engine.getText( "TestPage" ).trim() );
+    }
+
+    public void testRenameOfEscapedLinks2() throws Exception
+    {
+        String src = "~[Link to TestPage2|TestPage2|target='_new']";
+        
+        m_engine.saveText( "TestPage", src );
+        m_engine.saveText( "TestPage2", "foo" );
+        
+        rename ("TestPage2", "Test");
+        
+        assertEquals( "~[Link to TestPage2|TestPage2|target='_new']", 
m_engine.getText( "TestPage" ).trim() );
+    }
+
     public static Test suite()
     {
         return new TestSuite( PageRenamerTest.class );


Reply via email to