package pt.ist.fenixframework;
import jvstm.TransactionalCommand;
import pt.ist.fenixframework.pstm.DataAccessPatterns;
import pt.ist.fenixframework.pstm.MetadataManager;
import pt.ist.fenixframework.pstm.PersistentRoot;
import pt.ist.fenixframework.pstm.Transaction;
import pt.ist.fenixframework.pstm.repository.RepositoryBootstrap;
import dml.DomainModel;
/**
* This class provides a method to initialize the entire Fenix Framework. To do
* it, programmers should call the static <code>initialize(Config)</code> method
* with a proper instance of the <code>Config</code> class.
*
* After initialization, it is possible to get an instance of the
* <code>DomainModel</code> class representing the structure of the
* application's domain.
*
* @see Config
* @see dml.DomainModel
*/
public class FenixFramework {
private static final Object INIT_LOCK = new Object();
private static boolean bootstrapped = false;
private static boolean initialized = false;
private static Config config;
public static void initialize(Config config) {
bootStrap(config);
initialize();
}
public static void bootStrap(Config config) {
synchronized (INIT_LOCK) {
if (bootstrapped) {
throw new Error("Fenix framework already initialized");
}
FenixFramework.config = ((config != null) ? config : new Config());
config.checkConfig();
MetadataManager.init(config);
new RepositoryBootstrap(config).updateDataRepositoryStructureIfNeeded();
DataAccessPatterns.init(config);
bootstrapped = true;
}
}
public static void initialize() {
synchronized (INIT_LOCK) {
if (initialized) {
throw new Error("Fenix framework already initialized");
}
PersistentRoot.initRootIfNeeded(config);
FenixFrameworkPlugin[] plugins = config.getPlugins();
if (plugins != null) {
for (final FenixFrameworkPlugin plugin : plugins) {
Transaction.withTransaction(new TransactionalCommand() {
@Override
public void doIt() {
plugin.initialize();
}
});
}
}
initialized = true;
}
}
public static Config getConfig() {
return config;
}
public static DomainModel getDomainModel() {
return MetadataManager.getDomainModel();
}
public static <T extends DomainObject> T getRoot() {
return (T) PersistentRoot.getRoot();
}
}