// 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; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.util.Iterator; import java.util.List; import fitnesse.authentication.SecureOperation; import fitnesse.authentication.SecureResponder; import fitnesse.authentication.SecureWriteOperation; import fitnesse.components.TraversalListener; import fitnesse.components.Traverser; import fitnesse.html.HtmlTag; import fitnesse.html.HtmlUtil; import fitnesse.html.TagGroup; import fitnesse.http.ChunkedResponse; import fitnesse.responders.templateUtilities.HtmlPage; import fitnesse.responders.templateUtilities.PageTitle; import fitnesse.wiki.PageCrawler; import fitnesse.wiki.PageData; import fitnesse.wiki.PathParser; import fitnesse.wiki.WikiImportProperty; import fitnesse.wiki.WikiPage; import fitnesse.wiki.WikiPagePath; public class WikiImportingResponder extends ChunkingResponder implements SecureResponder, WikiImporterClient, Traverser { private int alternation = 0; private boolean isUpdate; private boolean isNonRoot; public PageData data; private WikiImporter importer = new WikiImporter(); private TraversalListener traversalListener; public void setImporter(WikiImporter importer) { this.importer = importer; } protected void doSending() throws Exception { data = page.getData(); initializeImporter(); HtmlPage htmlPage = makeHtml(); htmlPage.render(response.getWriter()); response.closeAll(); } @Override public void traverse(TraversalListener traversalListener) { this.traversalListener = traversalListener; try { if (isNonRoot) { importer.importRemotePageContent(page); } importer.importWiki(page); if (!isUpdate) { WikiImportProperty importProperty = new WikiImportProperty(importer.remoteUrl()); importProperty.setRoot(true); importProperty.setAutoUpdate(importer.getAutoUpdateSetting()); importProperty.addTo(data.getProperties()); page.commit(data); } } catch (MalformedURLException e) { traversalListener.process(new ImportError("ERROR", e.getMessage(), e)); } catch (FileNotFoundException e) { traversalListener.process(new ImportError("ERROR", "The remote resource, " + importer.remoteUrl() + ", was not found.")); } catch (WikiImporter.AuthenticationRequiredException e) { traversalListener.process(new ImportError("AUTH", e.getMessage())); } catch (Exception e) { traversalListener.process(new ImportError("ERROR", e.getMessage(), e)); } } public void initializeImporter() throws Exception { String remoteWikiUrl = establishRemoteUrlAndUpdateStyle(); importer.setWikiImporterClient(this); importer.setLocalPath(path); importer.parseUrl(remoteWikiUrl); setRemoteUserCredentialsOnImporter(); importer.setAutoUpdateSetting(request.hasInput("autoUpdate")); } private void setRemoteUserCredentialsOnImporter() { if (request.hasInput("remoteUsername")) importer.setRemoteUsername((String) request.getInput("remoteUsername")); if (request.hasInput("remotePassword")) importer.setRemotePassword((String) request.getInput("remotePassword")); } private String establishRemoteUrlAndUpdateStyle() throws Exception { String remoteWikiUrl = (String) request.getInput("remoteUrl"); WikiImportProperty importProperty = WikiImportProperty.createFrom(data.getProperties()); if (importProperty != null) { remoteWikiUrl = importProperty.getSourceUrl(); isUpdate = true; isNonRoot = !importProperty.isRoot(); } return remoteWikiUrl; } private HtmlPage makeHtml() throws Exception { HtmlPage html = context.pageFactory.newPage(); html = context.pageFactory.newPage(); String title = "Wiki Import"; if (isUpdate) title += " Update"; String localPathName = PathParser.render(path); html.setTitle(title + ": " + localPathName); html.setPageTitle(new PageTitle(title, path)); html.setMainTemplate("wikiImportingPage"); html.put("isUpdate", isUpdate); String pageName = PathParser.render(path); html.put("pageName", pageName); String remoteWikiUrl = importer.remoteUrl(); html.put("remoteUrl", remoteWikiUrl); html.put("importer", importer); html.put("PathParser", PathParser.class); html.put("importTraverser", this); return html; } protected PageCrawler getPageCrawler() { return root.getPageCrawler(); } public void setResponse(ChunkedResponse response) { this.response = response; } public SecureOperation getSecureOperation() { return new SecureWriteOperation(); } // Callback from importer public void pageImported(WikiPage localPage) { traversalListener.process(localPage); } // Callback from importer public void pageImportError(WikiPage localPage, Exception e) { traversalListener.process(new ImportError("PAGEERROR", e.getMessage(), e)); } public WikiImporter getImporter() { return importer; } public static class ImportError { private String message; private String type; private Exception exception; public ImportError(String type, String message) { this(type, message, null); } public ImportError(String type, String message, Exception exception) { super(); this.type = type; this.message = message; this.exception = exception; } public String getType() { return type; } public String getMessage() { return message; } public Exception getException() { return exception; } } }