// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved.
// Released under the terms of the CPL Common Public License version 1.0.
package fitnesse.responders.refactoring;


import fitnesse.FitNesseContext;
import fitnesse.authentication.SecureResponder;
import fitnesse.wiki.refactoring.MovedPageReferenceRenamer;
import fitnesse.wiki.refactoring.ReferenceRenamer;
import fitnesse.http.Request;
import fitnesse.wiki.PageCrawler;
import fitnesse.wiki.PathParser;
import fitnesse.wiki.WikiPagePath;

public class MovePageResponder extends PageMovementResponder implements SecureResponder {

  private String newParentName;

  @Override
  protected boolean getAndValidateNewParentPage(FitNesseContext context, Request request) {
    PageCrawler crawler = context.getRootPage().getPageCrawler();

    newParentName = getNameofNewParent(request);
    if (newParentName == null)
      return false;

    newParentPath = PathParser.parse(newParentName);
    newParentPage = crawler.getPage(newParentPath);

    return (newParentPage != null);
  }

  private static String getNameofNewParent(Request request) {
    String newParentName = (String) request.getInput("newLocation");
    if (".".equals(newParentName)) {
      return "";
    }
    return newParentName;
  }

  @Override
  protected boolean getAndValidateRefactoringParameters(Request request) {
    WikiPagePath pageToBeMovedPath = oldRefactoredPage.getPageCrawler().getFullPath();
    WikiPagePath newParentPath = newParentPage.getPageCrawler().getFullPath();

    return !pageToBeMovedPath.equals(newParentPath) &&
    !selfPage(pageToBeMovedPath, newParentPath) &&
    !pageIsAncestorOfNewParent(pageToBeMovedPath, newParentPath);
  }

  private boolean selfPage(WikiPagePath pageToBeMovedPath, WikiPagePath newParentPath) {
    WikiPagePath originalParentPath = pageToBeMovedPath.parentPath();
    return originalParentPath.equals(newParentPath);
  }

  boolean pageIsAncestorOfNewParent(WikiPagePath pageToBeMovedPath, WikiPagePath newParentPath) {
    return newParentPath.startsWith(pageToBeMovedPath);
  }

  @Override
  protected ReferenceRenamer getReferenceRenamer(FitNesseContext context) {
    return new MovedPageReferenceRenamer(context.getRootPage(), oldRefactoredPage, newParentName);
  }

  @Override
  protected void execute() throws RefactorException {
    movePage(oldRefactoredPage, newParentPage, getNewPageName());
  }

  @Override
  protected String getNewPageName() {
    return oldRefactoredPage.getName();
  }

  @Override
  protected String getErrorMessageHeader() {
    return "Cannot move " + makeLink(oldNameOfPageToBeMoved) + " below " + newParentName + ".";
  }

}

@@ -571,35 +571,8 @@
 der 
-implements SecureResponder 
 %7B%0A%0A 

Remove redundant interface