// 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.components.MovedPageReferenceRenamer; import fitnesse.components.ReferenceRenamer; import fitnesse.http.Request; import fitnesse.wiki.PageCrawler; import fitnesse.wiki.PathParser; import fitnesse.wiki.WikiPage; 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.root.getPageCrawler(); newParentName = getNameofNewParent(request); if (newParentName == null) return false; newParentPath = PathParser.parse(newParentName); newParentPage = crawler.getPage(context.root, 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) { PageCrawler crawler = oldRefactoredPage.getPageCrawler(); WikiPagePath pageToBeMovedPath = crawler.getFullPath(oldRefactoredPage); WikiPagePath newParentPath = crawler.getFullPath(newParentPage); 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.root, oldRefactoredPage, newParentName); } @Override protected void execute() { final WikiPage newPage = newParentPage.addChildPage(getNewPageName()); movePage(oldRefactoredPage, newPage); } @Override protected String getNewPageName() { return oldRefactoredPage.getName(); } @Override protected String getErrorMessageHeader() { return "Cannot move " + makeLink(oldNameOfPageToBeMoved) + " below " + newParentName; } }