/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.toolkit.core.setup;
import de.rcenvironment.toolkit.core.api.Toolkit;
import de.rcenvironment.toolkit.core.api.ToolkitException;
import de.rcenvironment.toolkit.core.internal.PicoContainerObjectGraph;
import de.rcenvironment.toolkit.core.internal.ToolkitBuilderImpl;
import de.rcenvironment.toolkit.core.internal.ToolkitInstanceTracker;
/**
* Static entry point and factory for constructing {@link Toolkit} instances.
*
* @author Robert Mischke
*/
public final class ToolkitFactory {
private ToolkitFactory() {}
/**
* The single entry point to the factory that creates a {@link Toolkit} instance from a given {@link ToolkitConfiguration}. Typical
* {@link ToolkitConfiguration} instances should be stateless, and can be used to create multiple independent {@link Toolkit} instances.
*
* @param toolkitConfiguration the configuration to use for the new {@link Toolkit} instance
* @return the new {@link Toolkit} instance
* @throws ToolkitException on initialization errors, e.g. a configuration error, or lack of a suitable dependency injection library in
* the classpath
*/
public static Toolkit create(ToolkitConfiguration toolkitConfiguration) throws ToolkitException {
final ToolkitBuilderImpl builder = createBuilder();
toolkitConfiguration.configure(builder);
Toolkit newInstance = builder.create();
ToolkitInstanceTracker.getInstance().register(newInstance);
return newInstance;
}
private static ToolkitBuilderImpl createBuilder() throws ToolkitException {
if (testForClass("org.picocontainer.PicoContainer")) {
return new ToolkitBuilderImpl(new PicoContainerObjectGraph());
} else {
throw new ToolkitException("No supported dependency injection library (currently: PicoContainer 2.x) found in classpath");
}
}
private static boolean testForClass(String className) {
try {
Class.forName(className, false, ToolkitFactory.class.getClassLoader());
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
}