// 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 fitnesse.responders.run.SuiteResponder;
import fitnesse.responders.run.TestEventListener;
import fitnesse.responders.run.TestResponder;
import fitnesse.wiki.PageData;
import fitnesse.wiki.WikiImportProperty;
import fitnesse.wiki.WikiPage;
public class WikiImportTestEventListener implements TestEventListener {
public static void register() {
TestResponder.registerListener(new WikiImportTestEventListener(new WikiImporterFactory()));
}
private WikiImporterFactory importerFactory;
public WikiImportTestEventListener(WikiImporterFactory importerFactory) {
this.importerFactory = importerFactory;
}
public void notifyPreTest(TestResponder testResponder, PageData data) throws Exception {
TestEventProcessor eventProcessor;
if (testResponder instanceof SuiteResponder)
eventProcessor = new SuiteEventProcessor();
else
eventProcessor = new TestEventProcessor();
eventProcessor.run(testResponder, data);
}
private class TestEventProcessor implements WikiImporterClient {
private TestResponder testResponder;
private boolean errorOccured;
protected WikiImporter wikiImporter;
protected WikiPage wikiPage;
protected PageData data;
protected WikiImportProperty importProperty;
public void run(TestResponder testResponder, PageData data) throws Exception {
this.testResponder = testResponder;
this.data = data;
importProperty = WikiImportProperty.createFrom(data.getProperties());
if (importProperty != null && importProperty.isAutoUpdate()) {
announceImportAttempt(testResponder);
doImport(testResponder, data);
closeAnnouncement(testResponder);
}
}
private void closeAnnouncement(TestResponder testResponder) throws Exception {
if (testResponder.getResponse().isHtmlFormat())
testResponder.addToResponse("</span>");
}
private void announceImportAttempt(TestResponder testResponder) throws Exception {
if (testResponder.getResponse().isHtmlFormat()) {
testResponder.addToResponse("<span class=\"meta\">Updating imported content...</span>");
testResponder.addToResponse("<span class=\"meta\">");
}
}
private void doImport(TestResponder testResponder, PageData data) throws Exception {
try {
wikiImporter = importerFactory.newImporter(this);
wikiImporter.parseUrl(importProperty.getSourceUrl());
wikiPage = data.getWikiPage();
doUpdating();
if (!errorOccured)
announceDone(testResponder);
}
catch (Exception e) {
pageImportError(data.getWikiPage(), e);
}
}
private void announceDone(TestResponder testResponder) throws Exception {
if (testResponder.getResponse().isHtmlFormat())
testResponder.addToResponse("done");
}
protected void doUpdating() throws Exception {
updatePagePassedIn();
}
protected void updatePagePassedIn() throws Exception {
wikiImporter.importRemotePageContent(wikiPage);
data.setContent(wikiPage.getData().getContent());
}
public void pageImported(WikiPage localPage) {
}
public void pageImportError(WikiPage localPage, Exception e) {
errorOccured = true;
System.out.println("Exception while importing \"local page\": " + localPage.getName() + ", exception: " + e.getMessage());
if (e.getCause() != null)
System.out.println(" cause: " + e.getCause().getMessage());
e.printStackTrace(System.out);
testResponder.addToResponse(e.toString());
}
}
private class SuiteEventProcessor extends TestEventProcessor {
protected void doUpdating() throws Exception {
if (!importProperty.isRoot())
updatePagePassedIn();
wikiImporter.setAutoUpdateSetting(true);
wikiImporter.importWiki(wikiPage);
}
}
}