Skip to content

Commit

Permalink
Register custom formatters
Browse files Browse the repository at this point in the history
  • Loading branch information
amolenaar committed Jun 26, 2015
1 parent 9a39ad1 commit a1dd48b
Show file tree
Hide file tree
Showing 12 changed files with 107 additions and 7 deletions.
1 change: 1 addition & 0 deletions src/fitnesse/ConfigurationParameter.java
Expand Up @@ -29,6 +29,7 @@ public enum ConfigurationParameter {
PLUGINS("Plugins"),
RESPONDERS("Responders"),
TEST_SYSTEMS("TestSystems"),
FORMATTERS("Formatters"),
SYMBOL_TYPES("SymbolTypes"),
SLIM_TABLES("SlimTables"),
AUTHENTICATOR("Authenticator"),
Expand Down
5 changes: 5 additions & 0 deletions src/fitnesse/ContextConfigurator.java
Expand Up @@ -8,6 +8,7 @@
import fitnesse.components.Logger;
import fitnesse.plugins.PluginException;
import fitnesse.plugins.PluginsLoader;
import fitnesse.reporting.FormatterFactory;
import fitnesse.responders.editing.ContentFilter;
import fitnesse.responders.editing.ContentFilterResponder;
import fitnesse.testrunner.MultipleTestSystemFactory;
Expand Down Expand Up @@ -119,6 +120,8 @@ public FitNesseContext makeFitNesseContext() throws IOException, PluginException

MultipleTestSystemFactory testSystemFactory = new MultipleTestSystemFactory(slimTableFactory, customComparatorRegistry);

FormatterFactory formatterFactory = new FormatterFactory(componentFactory);

FitNesseContext context = new FitNesseContext(version,
wikiPageFactory,
rootPath,
Expand All @@ -131,6 +134,7 @@ public FitNesseContext makeFitNesseContext() throws IOException, PluginException
logger,
testSystemFactory,
testSystemListener,
formatterFactory,
properties);

SymbolProvider symbolProvider = SymbolProvider.wikiParsingProvider;
Expand All @@ -143,6 +147,7 @@ public FitNesseContext makeFitNesseContext() throws IOException, PluginException
LOG.warning("Wiki page factory does not implement interface WikiPageFactoryRegistrar, configured factories can not be loaded.");
}
pluginsLoader.loadTestSystems(testSystemFactory);
pluginsLoader.loadFormatters(formatterFactory);
pluginsLoader.loadSymbolTypes(symbolProvider);
pluginsLoader.loadSlimTables(slimTableFactory);
pluginsLoader.loadCustomComparators(customComparatorRegistry);
Expand Down
5 changes: 5 additions & 0 deletions src/fitnesse/FitNesseContext.java
Expand Up @@ -9,6 +9,7 @@
import fitnesse.authentication.Authenticator;
import fitnesse.components.Logger;
import fitnesse.html.template.PageFactory;
import fitnesse.reporting.FormatterFactory;
import fitnesse.responders.ResponderFactory;
import fitnesse.testsystems.TestSystemFactory;
import fitnesse.testsystems.TestSystemListener;
Expand All @@ -34,6 +35,8 @@ public class FitNesseContext {
public final TestSystemFactory testSystemFactory;
public final TestSystemListener testSystemListener;

public final FormatterFactory formatterFactory;

public final int port;
private final WikiPageFactory wikiPageFactory;
public final String rootPath;
Expand All @@ -57,6 +60,7 @@ protected FitNesseContext(FitNesseVersion version, WikiPageFactory wikiPageFacto
RecentChanges recentChanges, int port,
Authenticator authenticator, Logger logger,
TestSystemFactory testSystemFactory, TestSystemListener testSystemListener,
FormatterFactory formatterFactory,
Properties properties) {
super();
this.version = version;
Expand All @@ -71,6 +75,7 @@ protected FitNesseContext(FitNesseVersion version, WikiPageFactory wikiPageFacto
this.logger = logger;
this.testSystemFactory = testSystemFactory;
this.testSystemListener = testSystemListener;
this.formatterFactory = formatterFactory;
this.properties = properties;
responderFactory = new ResponderFactory(getRootPagePath());
variableSource = new SystemVariableSource(properties);
Expand Down
3 changes: 3 additions & 0 deletions src/fitnesse/plugins/PluginFeatureFactory.java
@@ -1,6 +1,7 @@
package fitnesse.plugins;

import fitnesse.authentication.Authenticator;
import fitnesse.reporting.FormatterRegistry;
import fitnesse.responders.ResponderFactory;
import fitnesse.responders.editing.ContentFilter;
import fitnesse.testrunner.TestSystemFactoryRegistry;
Expand All @@ -21,6 +22,8 @@ public interface PluginFeatureFactory {

void registerWikiPageFactories(WikiPageFactoryRegistry wikiPageFactoryRegistry) throws PluginException;

void registerFormatters(FormatterRegistry registrar) throws PluginException;

void registerTestSystemFactories(TestSystemFactoryRegistry testSystemFactoryRegistry) throws PluginException;

void registerSlimTables(SlimTableFactory slimTableFactory) throws PluginException;
Expand Down
10 changes: 5 additions & 5 deletions src/fitnesse/plugins/PluginFeatureFactoryBase.java
@@ -1,6 +1,8 @@
package fitnesse.plugins;

import fitnesse.authentication.Authenticator;
import fitnesse.reporting.FormatterFactory;
import fitnesse.reporting.FormatterRegistry;
import fitnesse.responders.ResponderFactory;
import fitnesse.responders.editing.ContentFilter;
import fitnesse.testrunner.TestSystemFactoryRegistry;
Expand All @@ -24,31 +26,29 @@ public ContentFilter getContentFilter() {

@Override
public void registerResponders(ResponderFactory responderFactory) throws PluginException {

}

@Override
public void registerSymbolTypes(SymbolProvider symbolProvider) throws PluginException {

}

@Override
public void registerWikiPageFactories(WikiPageFactoryRegistry wikiPageFactoryRegistry) throws PluginException {
}

@Override
public void registerFormatters(FormatterRegistry registrar) throws PluginException {
}

@Override
public void registerTestSystemFactories(TestSystemFactoryRegistry testSystemFactoryRegistry) throws PluginException {

}

@Override
public void registerSlimTables(SlimTableFactory slimTableFactory) throws PluginException {

}

@Override
public void registerCustomComparators(CustomComparatorRegistry customComparatorRegistry) throws PluginException {

}
}
8 changes: 8 additions & 0 deletions src/fitnesse/plugins/PluginsLoader.java
Expand Up @@ -13,6 +13,8 @@
import fitnesse.authentication.PromiscuousAuthenticator;
import fitnesse.components.ComponentFactory;
import fitnesse.components.Logger;
import fitnesse.reporting.FormatterFactory;
import fitnesse.reporting.FormatterRegistry;
import fitnesse.responders.ResponderFactory;
import fitnesse.responders.editing.ContentFilter;
import fitnesse.testrunner.TestSystemFactoryRegistry;
Expand Down Expand Up @@ -89,6 +91,12 @@ public void loadWikiPageFactories(WikiPageFactoryRegistry registrar) throws Plug
}
}

public void loadFormatters(FormatterRegistry registrar) throws PluginException {
for (PluginFeatureFactory pff : pluginFeatureFactories) {
pff.registerFormatters(registrar);
}
}

public ContentFilter loadContentFilter() {
ContentFilter filter = null;
for (PluginFeatureFactory pff : pluginFeatureFactories) {
Expand Down
16 changes: 15 additions & 1 deletion src/fitnesse/plugins/PropertyBasedPluginFeatureFactory.java
Expand Up @@ -9,6 +9,9 @@
import fitnesse.authentication.Authenticator;
import fitnesse.components.ComponentFactory;
import fitnesse.components.ComponentInstantiationException;
import fitnesse.reporting.Formatter;
import fitnesse.reporting.FormatterFactory;
import fitnesse.reporting.FormatterRegistry;
import fitnesse.responders.ResponderFactory;
import fitnesse.responders.editing.ContentFilter;
import fitnesse.testrunner.TestSystemFactoryRegistry;
Expand Down Expand Up @@ -85,7 +88,18 @@ public void registerWikiPageFactories(final WikiPageFactoryRegistry registrar) t
registrar.registerWikiPageFactory(instance);
LOG.info("Loaded WikiPageFactory " + instance.getClass().getName());
}
}
});
}

@Override
public void registerFormatters(final FormatterRegistry registrar) throws PluginException {
forEachClass(ConfigurationParameter.FORMATTERS, new ClassRegistrar<Formatter>() {
@Override
public void register(Class<Formatter> clazz) {
registrar.registerFormatter(clazz);
LOG.info("Loaded formatter " + clazz.getName());
}
});
}

@Override
Expand Down
2 changes: 1 addition & 1 deletion src/fitnesse/reporting/BaseFormatter.java
Expand Up @@ -12,7 +12,7 @@
import java.io.IOException;
import java.util.logging.Logger;

public abstract class BaseFormatter implements TestSystemListener<WikiTestPage> {
public abstract class BaseFormatter implements Formatter {
protected final Logger LOG = Logger.getLogger(getClass().getName());

private final WikiPage page;
Expand Down
13 changes: 13 additions & 0 deletions src/fitnesse/reporting/Formatter.java
@@ -0,0 +1,13 @@
package fitnesse.reporting;

import fitnesse.testrunner.WikiTestPage;
import fitnesse.testsystems.TestSystemListener;

/**
* This factory is instantiated as FitNesse component, hence can use constructor arguments.
*
* Optionally implement java.io.Closeable and/or fitnesse.testrunner.TestsRunnerListener.
*/
public interface Formatter extends TestSystemListener<WikiTestPage> {

}
31 changes: 31 additions & 0 deletions src/fitnesse/reporting/FormatterFactory.java
@@ -0,0 +1,31 @@
package fitnesse.reporting;

import java.util.ArrayList;
import java.util.List;

import fitnesse.components.ComponentFactory;

public class FormatterFactory implements FormatterRegistry {


private final ComponentFactory componentFactory;
private List<Class<? extends Formatter>> formatters;

public FormatterFactory(ComponentFactory componentFactory) {
this.componentFactory = componentFactory;
formatters = new ArrayList<Class<? extends Formatter>>();
}

@Override
public void registerFormatter(Class<? extends Formatter> formatter) {
formatters.add(formatter);
}

public Formatter[] createFormatters() {
Formatter[] instances = new Formatter[formatters.size()];
for (int i = 0; i < formatters.size(); i++) {
instances[i] = componentFactory.createComponent(formatters.get(i));
}
return instances;
}
}
5 changes: 5 additions & 0 deletions src/fitnesse/reporting/FormatterRegistry.java
@@ -0,0 +1,5 @@
package fitnesse.reporting;

public interface FormatterRegistry {
void registerFormatter(Class<? extends Formatter> formatter);
}
15 changes: 15 additions & 0 deletions test/fitnesse/plugins/PluginsLoaderTest.java
Expand Up @@ -15,6 +15,8 @@
import fitnesse.authentication.PromiscuousAuthenticator;
import fitnesse.components.ComponentFactory;
import fitnesse.components.PluginsClassLoader;
import fitnesse.reporting.BaseFormatter;
import fitnesse.reporting.FormatterFactory;
import fitnesse.responders.ResponderFactory;
import fitnesse.responders.WikiPageResponder;
import fitnesse.responders.editing.ContentFilter;
Expand Down Expand Up @@ -216,6 +218,15 @@ public void testWikiPageFactoryCreation() throws Exception {
verify(wikiPageFactory).registerWikiPageFactory(any(FooWikiPageFactory.class));
}

@Test
public void tesFormatterFactoryCreation() throws Exception {
testProperties.setProperty(ConfigurationParameter.FORMATTERS.getKey(), FooFormatter.class.getName());

FormatterFactory formatterFactory = mock(FormatterFactory.class);
loader.loadFormatters(formatterFactory);
verify(formatterFactory).registerFormatter(eq(FooFormatter.class));
}

@Test
public void testSlimTablesCreation() throws PluginException {
SlimTableFactory slimTableFactory = new SlimTableFactory();
Expand Down Expand Up @@ -358,4 +369,8 @@ public boolean supports(File path) {
return false;
}
}

public static class FooFormatter extends BaseFormatter {

}
}

0 comments on commit a1dd48b

Please sign in to comment.