package com.constellio.app.services.factories; import java.io.File; import java.util.Map; import com.constellio.app.conf.AppLayerConfiguration; import com.constellio.app.conf.PropertiesAppLayerConfiguration; import com.constellio.data.conf.DataLayerConfiguration; import com.constellio.data.conf.PropertiesDataLayerConfiguration; import com.constellio.data.dao.services.factories.DataLayerFactory; import com.constellio.data.io.IOServicesFactory; import com.constellio.data.utils.Delayed; import com.constellio.data.utils.Factory; import com.constellio.data.utils.PropertyFileUtils; import com.constellio.model.conf.FoldersLocator; import com.constellio.model.conf.ModelLayerConfiguration; import com.constellio.model.conf.PropertiesModelLayerConfiguration; import com.constellio.model.services.extensions.ConstellioModulesManager; import com.constellio.model.services.factories.ModelLayerFactory; public class ConstellioFactories { public static ConstellioFactoriesInstanceProvider instanceProvider = new SingletonConstellioFactoriesInstanceProvider(); private File propertyFile; private ConstellioFactoriesDecorator decorator; private DataLayerConfiguration dataLayerConfiguration; private ModelLayerConfiguration modelLayerConfiguration; private AppLayerConfiguration appLayerConfiguration; private FoldersLocator foldersLocator; private IOServicesFactory ioServicesFactory; private DataLayerFactory dataLayerFactory; private ModelLayerFactory modelLayerFactory; private AppLayerFactory appLayerFactory; private ConstellioFactories() { } public static ConstellioFactories getInstance() { File propertyFile = new FoldersLocator().getConstellioProperties(); ConstellioFactoriesDecorator constellioFactoriesDecorator = new ConstellioFactoriesDecorator(); return getInstance(propertyFile, constellioFactoriesDecorator); } public static ConstellioFactories getInstance(ConstellioFactoriesDecorator constellioFactoriesDecorator) { File propertyFile = new FoldersLocator().getConstellioProperties(); return getInstance(propertyFile, constellioFactoriesDecorator); } public static ConstellioFactories getInstance(final File propertyFile, final ConstellioFactoriesDecorator decorator) { return instanceProvider.getInstance(new Factory<ConstellioFactories>() { @Override public ConstellioFactories get() { ConstellioFactories instance = buildFor(propertyFile, decorator, null); return instance; } }); } public static void start() { //getInstance().getAppLayerFactory().initialize(); //instance.appLayerFactory.initialize(); } public static void clear() { instanceProvider.clear(); // if (instance != null) { // instance.appLayerFactory.close(); // instance = null; // } } // // public static void restart() { // File propertyFile = getInstance().propertyFile; // ConstellioFactoriesDecorator decorator = getInstance().decorator; // clear(); // getInstance(propertyFile, decorator); // } public static ConstellioFactories buildFor(File propertyFile, ConstellioFactoriesDecorator decorator, String instanceName) { ConstellioFactories factories = new ConstellioFactories(); factories.propertyFile = propertyFile; Map<String, String> configs = PropertyFileUtils.loadKeyValues(propertyFile); factories.decorator = decorator; factories.foldersLocator = decorator.decorateFoldersLocator(new FoldersLocator()); factories.buildConfiguration(propertyFile, configs); factories.buildLayers(instanceName); return factories; } private void buildLayers(String instanceName) { Delayed<ConstellioModulesManager> modulesManager = new Delayed<>(); ioServicesFactory = new IOServicesFactory(dataLayerConfiguration.getTempFolder()); dataLayerFactory = decorator.decorateDataLayerFactory(new DataLayerFactory(ioServicesFactory, dataLayerConfiguration, decorator.getStatefullServiceDecorator(), instanceName)); modelLayerFactory = decorator.decorateModelServicesFactory(new ModelLayerFactory(dataLayerFactory, foldersLocator, modelLayerConfiguration, decorator.getStatefullServiceDecorator(), modulesManager, instanceName, new ModelLayerFactoryFactory())); appLayerFactory = decorator.decorateAppServicesFactory(new AppLayerFactory(appLayerConfiguration, modelLayerFactory, dataLayerFactory, decorator.getStatefullServiceDecorator(), instanceName)); modulesManager.set(appLayerFactory.getModulesManager()); } private void buildConfiguration(File propertyFile, Map<String, String> configs) { File defaultTempFolder = foldersLocator.getDefaultTempFolder(); File defaultFileSystemBaseFolder = new File(foldersLocator.getConfFolder(), "settings"); this.dataLayerConfiguration = decorator .decorateDataLayerConfiguration(new PropertiesDataLayerConfiguration(configs, defaultTempFolder, defaultFileSystemBaseFolder, propertyFile)); this.modelLayerConfiguration = decorator .decorateModelLayerConfiguration( new PropertiesModelLayerConfiguration(configs, dataLayerConfiguration, foldersLocator, propertyFile)); this.appLayerConfiguration = decorator .decorateAppLayerConfiguration( new PropertiesAppLayerConfiguration(configs, modelLayerConfiguration, foldersLocator, propertyFile)); } public IOServicesFactory getIoServicesFactory() { return ioServicesFactory; } public DataLayerFactory getDataLayerFactory() { return dataLayerFactory; } public ModelLayerFactory getModelLayerFactory() { return modelLayerFactory; } public DataLayerConfiguration getDataLayerConfiguration() { return dataLayerConfiguration; } public ModelLayerConfiguration getModelLayerConfiguration() { return modelLayerConfiguration; } public AppLayerConfiguration getAppLayerConfiguration() { return appLayerConfiguration; } public FoldersLocator getFoldersLocator() { return foldersLocator; } public AppLayerFactory getAppLayerFactory() { return appLayerFactory; } }