Skip to content

Commit

Permalink
Merge pull request #764 from amolenaar/formatters
Browse files Browse the repository at this point in the history
Custom formatters
  • Loading branch information
amolenaar committed Jul 6, 2015
2 parents 3de0074 + b995efd commit 7dcb583
Show file tree
Hide file tree
Showing 15 changed files with 188 additions and 34 deletions.
2 changes: 2 additions & 0 deletions build.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
<property name="lib.dir" location="lib"/>
<property name="antlib.dir" location="antlib"/>
<property name="port" value="8001"/>

<property file="${user.home}/.sonatype.properties" />

<target name="all" depends="unit_tests, acceptance_tests" description="Run this target any time you change code or acceptance tests. It will clean, then compile the source, run all the unit test and fitnesse acceptance tests."/>

Expand Down
1 change: 1 addition & 0 deletions src/fitnesse/ConfigurationParameter.java
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
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
86 changes: 62 additions & 24 deletions src/fitnesse/plugins/PropertyBasedPluginFeatureFactory.java
Original file line number Diff line number Diff line change
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 @@ -43,7 +46,7 @@ private PropertyBasedPluginFeatureFactory(ComponentFactory componentFactory) {

@Override
public void registerResponders(final ResponderFactory responderFactory) throws PluginException {
forEachNamedObject(ConfigurationParameter.RESPONDERS, new Registrar() {
forEachNamedObject(ConfigurationParameter.RESPONDERS, new KeyRegistrar() {
@Override public void register(String key, Class clazz) {
responderFactory.addResponder(key, clazz);
LOG.info("Loaded responder " + key + ": " + clazz.getName());
Expand All @@ -69,27 +72,34 @@ public Authenticator getAuthenticator() {
}

@Override
public void registerSymbolTypes(SymbolProvider symbolProvider) throws PluginException {
String[] symbolTypeNames = getListFromProperties(ConfigurationParameter.SYMBOL_TYPES);
if (symbolTypeNames != null) {
for (String symbolTypeName : symbolTypeNames) {
Class<SymbolType> symbolTypeClass = forName(symbolTypeName.trim());
symbolProvider.add(componentFactory.createComponent(symbolTypeClass));
LOG.info("Loaded SymbolType " + symbolTypeClass.getName());
public void registerSymbolTypes(final SymbolProvider symbolProvider) throws PluginException {
forEachObject(ConfigurationParameter.SYMBOL_TYPES, new Registrar<SymbolType>() {
@Override public void register(SymbolType instance) {
symbolProvider.add(instance);
LOG.info("Loaded SymbolType " + instance.getClass().getName());
}
}
});
}

@Override
public void registerWikiPageFactories(WikiPageFactoryRegistry registrar) throws PluginException {
String[] factoryNames = getListFromProperties(ConfigurationParameter.WIKI_PAGE_FACTORIES);
if (factoryNames != null) {
for (String factoryName : factoryNames) {
Class<WikiPageFactory> factory = forName(factoryName.trim());
registrar.registerWikiPageFactory(componentFactory.createComponent(factory));
LOG.info("Loaded WikiPageFactory " + factory.getName());
public void registerWikiPageFactories(final WikiPageFactoryRegistry registrar) throws PluginException {
forEachObject(ConfigurationParameter.WIKI_PAGE_FACTORIES, new Registrar<WikiPageFactory>() {
@Override public void register(WikiPageFactory instance) {
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 All @@ -99,7 +109,7 @@ public ContentFilter getContentFilter() {

@Override
public void registerSlimTables(final SlimTableFactory slimTableFactory) throws PluginException {
forEachNamedObject(ConfigurationParameter.SLIM_TABLES, new Registrar<SlimTable>() {
forEachNamedObject(ConfigurationParameter.SLIM_TABLES, new KeyRegistrar<SlimTable>() {
@Override public void register(String key, Class<SlimTable> clazz) {
slimTableFactory.addTableType(key, clazz);
LOG.info("Loaded custom SLiM table type " + key + ":" + clazz.getName());
Expand All @@ -109,7 +119,7 @@ public void registerSlimTables(final SlimTableFactory slimTableFactory) throws P

@Override
public void registerCustomComparators(final CustomComparatorRegistry customComparatorRegistry) throws PluginException {
forEachNamedObject(ConfigurationParameter.CUSTOM_COMPARATORS, new Registrar<CustomComparator>() {
forEachNamedObject(ConfigurationParameter.CUSTOM_COMPARATORS, new KeyRegistrar<CustomComparator>() {
@Override public void register(String key, Class<CustomComparator> clazz) {
customComparatorRegistry.addCustomComparator(key, componentFactory.createComponent(clazz));
LOG.info("Loaded custom comparator " + key + ": " + clazz.getName());
Expand All @@ -119,15 +129,33 @@ public void registerCustomComparators(final CustomComparatorRegistry customCompa

@Override
public void registerTestSystemFactories(final TestSystemFactoryRegistry registrar) throws PluginException {
forEachNamedObject(ConfigurationParameter.TEST_SYSTEMS, new Registrar<TestSystemFactory>() {
forEachNamedObject(ConfigurationParameter.TEST_SYSTEMS, new KeyRegistrar<TestSystemFactory>() {
@Override public void register(String key, Class<TestSystemFactory> clazz) {
registrar.registerTestSystemFactory(key, componentFactory.createComponent(clazz));
LOG.info("Loaded test system " + key + ": " + clazz.getName());
}
});
}

private void forEachNamedObject(final ConfigurationParameter parameter, Registrar registrar) throws PluginException {
private <T> void forEachClass(final ConfigurationParameter parameter, ClassRegistrar<T> registrar) throws PluginException {
String[] propList = getListFromProperties(parameter);
if (propList != null) {
for (String entry : propList) {
Class<T> clazz = forName(entry.trim());
registrar.register(clazz);
}
}
}

private <T> void forEachObject(final ConfigurationParameter parameter, final Registrar<T> registrar) throws PluginException {
forEachClass(parameter, new ClassRegistrar<T>() {
@Override public void register(Class<T> clazz) {
registrar.register(componentFactory.createComponent(clazz));
}
});
}

private <T> void forEachNamedObject(final ConfigurationParameter parameter, KeyRegistrar<T> registrar) throws PluginException {
String[] propList = getListFromProperties(parameter);
if (propList != null) {
for (String entry : propList) {
Expand All @@ -141,9 +169,10 @@ private void forEachNamedObject(final ConfigurationParameter parameter, Registra
}
}

private void register(Registrar registrar, String prefix, String className) throws PluginException {
private <T> void register(KeyRegistrar<T> registrar, String prefix, String className) throws PluginException {
try {
registrar.register(prefix, forName(className));
Class<T> clazz = forName(className);
registrar.register(prefix, clazz);
} catch (ComponentInstantiationException e) {
throw new PluginException("Can not register plug in " + className, e);
}
Expand All @@ -164,6 +193,7 @@ private static Collection<PluginFeatureFactory> createWrappersForLegacyPlugins(C
}
}

@SuppressWarnings("unchecked")
private static <T> Class<T> forName(String className) throws PluginException {
try {
return (Class<T>) Class.forName(className);
Expand All @@ -172,7 +202,15 @@ private static <T> Class<T> forName(String className) throws PluginException {
}
}

private static interface Registrar<T> {
private interface Registrar<T> {
void register(T instance);
}

private interface ClassRegistrar<T> {
void register(Class<T> clazz);
}

private interface KeyRegistrar<T> {
void register(String key, Class<T> clazz);
}
}
2 changes: 1 addition & 1 deletion src/fitnesse/reporting/BaseFormatter.java
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package fitnesse.reporting;

public interface FormatterRegistry {
void registerFormatter(Class<? extends Formatter> formatter);
}
Loading

0 comments on commit 7dcb583

Please sign in to comment.