// Modified or written by Object Mentor, Inc. for inclusion with FitNesse.
// Copyright (c) 2002 Cunningham & Cunningham, Inc.
// Released under the terms of the GNU General Public License version 2 or later.
// Copyright (C) 2003,2004 by Object Mentor, Inc. All rights reserved.
// Released under the terms of the GNU General Public License version 2 or
// later.
package fit;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import fit.exception.CouldNotLoadComponentFitFailureException;
import fit.exception.NoSuchFixtureException;
// REFACTOR The fixture path is really the only part of this
// class that needs to be globally accessible.
public class FixtureLoader {
private static FixtureLoader instance;
public static FixtureLoader instance() {
if (instance == null) {
instance = new FixtureLoader();
}
return instance;
}
public static void setInstance(FixtureLoader loader) {
instance = loader;
}
public Set<String> fixturePathElements = new HashSet<String>() {
private static final long serialVersionUID = 1L;
{
add("fit");
}
};
public Fixture disgraceThenLoad(String tableName) throws Throwable {
FixtureName fixtureName = new FixtureName(tableName);
Fixture fixture = instantiateFirstValidFixtureClass(fixtureName);
addPackageToFixturePath(fixture);
return fixture;
}
private void addPackageToFixturePath(Fixture fixture) {
Package fixturePackage = fixture.getClass().getPackage();
if (fixturePackage != null)
addPackageToPath(fixturePackage.getName());
}
public void addPackageToPath(String name) {
fixturePathElements.add(name);
}
private Fixture instantiateFixture(String fixtureName) throws Throwable {
Class<?> classForFixture = loadFixtureClass(fixtureName);
FixtureClass fixtureClass = new FixtureClass(classForFixture);
return fixtureClass.newInstance();
}
private Class<?> loadFixtureClass(String fixtureName) {
try {
return Class.forName(fixtureName);
}
catch (ClassNotFoundException deadEnd) {
if (deadEnd.getMessage().equals(fixtureName))
throw new NoSuchFixtureException(fixtureName);
else
throw new CouldNotLoadComponentFitFailureException(
deadEnd.getMessage(), fixtureName);
}
}
private Fixture instantiateFirstValidFixtureClass(FixtureName fixtureName)
throws Throwable {
for (Iterator<String> i = fixtureName.getPotentialFixtureClassNames(
fixturePathElements).iterator(); i.hasNext();) {
String each = (String) i.next();
try {
return instantiateFixture(each);
}
catch (NoSuchFixtureException ignoreAndTryTheNextCandidate) {
}
}
throw new NoSuchFixtureException(fixtureName.toString());
}
}