package com.processpuzzle.fitnesse.application;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
import com.processpuzzle.application.domain.Application;
import com.processpuzzle.application.domain.ApplicationException;
import com.processpuzzle.application.domain.ApplicationFactory;
import com.processpuzzle.application.domain.ProcessPuzzleApplication;
import com.processpuzzle.litest.fitnesse.WorkflowFixtureSupport;
import fit.Parse;
public class ApplicationTestCoordinator extends WorkflowFixtureSupport {
protected static Class<? extends Application> applicationClass = ProcessPuzzleApplication.class;
private static final Logger logger = LoggerFactory.getLogger( ApplicationTestCoordinator.class );
private static String configurationDescriptorPath;
private Application application = null;
private Multiset<String> pageRuns = HashMultiset.create();
public ApplicationTestCoordinator() {
super();
logger.trace( ApplicationTestCoordinator.class.getSimpleName() + " was instantiated." );
}
@Override
public void doTable( Parse table ) {
logger.trace( "doTable()" );
if( args.length > 0 ){
configurationPath( args[0] );
}
super.doTable( table );
}
public void configurationPath( String configurationDescriptorPath ) {
ApplicationTestCoordinator.configurationDescriptorPath = configurationDescriptorPath;
}
public void notifyOnTestPageSetUp( String testPageName ) throws ApplicationException {
checkIfApplicationIsUp();
pageRuns.add( testPageName );
}
public void notifyOnTestPageTearDown( String testPageName ) {
pageRuns.remove( testPageName );
checkIfApplicationShouldTearDown();
}
public void terminate() {
uninstallApplication();
}
// Properties
public Application getApplication() {
return application;
}
public Integer getHitCountFor( String testPageName ) {
return pageRuns.count( testPageName );
}
private void checkIfApplicationIsUp() throws ApplicationException {
if( application == null ){
installApplication();
}
}
private void checkIfApplicationShouldTearDown() {
if( pageRuns.size() == 0 ){
application.unInstall();
}
}
private void installApplication() throws ApplicationException {
logger.debug( "Installing application: " + applicationClass.getName() );
application = ApplicationFactory.create( applicationClass, configurationDescriptorPath );
application.install();
}
private void uninstallApplication() {
logger.debug( "Uninstalling application: " + applicationClass.getName() );
application.unInstall();
}
}