package fitnesse.responders.refactoring; import fitnesse.FitNesseContext; import fitnesse.Responder; import fitnesse.authentication.AlwaysSecureOperation; import fitnesse.authentication.SecureOperation; import fitnesse.authentication.SecureResponder; import fitnesse.components.ReferenceRenamer; import fitnesse.html.HtmlUtil; import fitnesse.http.Request; import fitnesse.http.Response; import fitnesse.http.SimpleResponse; import fitnesse.responders.ErrorResponder; import fitnesse.responders.NotFoundResponder; import fitnesse.wiki.*; import java.util.List; public abstract class PageMovementResponder implements SecureResponder { protected String oldNameOfPageToBeMoved; protected WikiPage oldRefactoredPage; protected WikiPage newParentPage; protected WikiPagePath newParentPath; protected abstract boolean getAndValidateNewParentPage(FitNesseContext context, Request request); protected abstract boolean getAndValidateRefactoringParameters(Request request); protected abstract ReferenceRenamer getReferenceRenamer(FitNesseContext context); protected abstract String getNewPageName(); protected abstract String getErrorMessageHeader(); protected abstract void execute(); public Response makeResponse(FitNesseContext context, Request request) throws Exception { if (!getAndValidateRefactoredPage(context, request)) { return new NotFoundResponder().makeResponse(context, request); } if (!getAndValidateNewParentPage(context, request)) { return makeErrorMessageResponder(newParentPath == null ? "null" : newParentPath.toString() + " does not exist.").makeResponse(context, request); } if (!getAndValidateRefactoringParameters(request)) { return makeErrorMessageResponder("").makeResponse(context, request); } if (targetPageExists()) { return makeErrorMessageResponder(makeLink(getNewPageName()) + " already exists").makeResponse(context, request); } if (request.hasInput("refactorReferences")) { getReferenceRenamer(context).renameReferences(); } execute(); SimpleResponse response = new SimpleResponse(); response.redirect(createRedirectionUrl(newParentPage, getNewPageName())); return response; } protected boolean getAndValidateRefactoredPage(FitNesseContext context, Request request) { PageCrawler crawler = context.root.getPageCrawler(); oldNameOfPageToBeMoved = request.getResource(); WikiPagePath path = PathParser.parse(oldNameOfPageToBeMoved); oldRefactoredPage = crawler.getPage(context.root, path); return (oldRefactoredPage != null); } private Responder makeErrorMessageResponder(String message) { return new ErrorResponder(getErrorMessageHeader() + "<br/>" + message); } private boolean targetPageExists() { return newParentPage.hasChildPage(getNewPageName()); } protected String makeLink(String page) { return HtmlUtil.makeLink(page, page).html(); } protected String createRedirectionUrl(WikiPage newParent, String newName) { PageCrawler crawler = newParent.getPageCrawler(); if(crawler.isRoot(newParent)) { return newName; } return PathParser.render(crawler.getFullPath(newParent).addNameToEnd(newName)); } protected void movePage(WikiPage movedPage, WikiPage targetPage) { PageData pageData = movedPage.getData(); targetPage.commit(pageData); moveChildren(movedPage, targetPage); WikiPage parentOfMovedPage = movedPage.getParent(); parentOfMovedPage.removeChildPage(movedPage.getName()); } protected void moveChildren(WikiPage movedPage, WikiPage newParentPage) { List<WikiPage> children = movedPage.getChildren(); for (WikiPage page : children) { movePage(page, newParentPage.addChildPage(page.getName())); } } public SecureOperation getSecureOperation() { return new AlwaysSecureOperation(); } }