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 );