/**
* Copyright (C) 2008-2010, Squale Project - http://www.squale.org
*
* This file is part of Squale.
*
* Squale is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or any later version.
*
* Squale is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Squale. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* Created on Feb 20, 2004
*/
package org.squale.jraf.bootstrap.initializer;
import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.squale.jraf.bootstrap.config.FileSystemXmlProviderConfigReader;
import org.squale.jraf.bootstrap.config.ProviderConfig;
import org.squale.jraf.bootstrap.config.ProviderConfigComparator;
import org.squale.jraf.bootstrap.locator.ProviderLocator;
import org.squale.jraf.commons.exception.JrafConfigException;
import org.squale.jraf.spi.bootstrap.IBootstrapConstants;
import org.squale.jraf.spi.bootstrap.IBootstrapProvider;
import org.squale.jraf.spi.initializer.IInitializable;
import org.squale.jraf.spi.initializer.IInitializableBean;
import org.squale.jraf.spi.provider.IProvider;
import org.squale.jraf.spi.provider.IProviderConstants;
/**
* <p>Title : Initializer.java</p>
* <p>Description : Initializer par defaut d'une application JRAF.
* Initialise tous les providers declarees dans le fichier de configuration
* des providers.</p>
* <p>Copyright : Copyright (c) 2004</p>
*
* @author Eric BELLARD
*/
public class Initializer implements IInitializable, IInitializableBean {
/** logger */
private static final Log log = LogFactory.getLog(Initializer.class);
/** chemin racine */
private String rootPath;
/** chemin relatif vers le fichier de configuration */
private String configFile;
/** bind jndi */
private boolean isJndi = false;
/** bind jndi */
private boolean isBootstrapJndi = false;
/**
* Constructeur vide type IOC2
*/
public Initializer() {
}
/**
* Constructeur avec parametres type IOC3
* @param rootPath chemin racine
* @param configFile chemin relatif vers le fichier de configuration
*/
public Initializer(String rootPath, String configFile) {
this(rootPath, configFile, false);
}
/**
* Constructeur avec parametres type IOC3
* @param rootPath chemin racine
* @param configFile chemin relatif vers le fichier de configuration
* @param isJndi enregistrement dans jndi
*/
public Initializer(String rootPath, String configFile, boolean isJndi) {
setRootPath(rootPath);
setConfigFile(configFile);
setJndi(isJndi);
afterPropertiesSet();
}
/* (non-Javadoc)
* @see org.squale.jraf.spi.initializer.IInitializable#initialize(java.util.Map)
*/
public IProvider initialize(Map in_initParameters)
throws JrafConfigException {
// debut de l'initialisation
log.info("Map des parametres : " + in_initParameters);
Map lc_map = in_initParameters;
// recuperation du chemin racine
String lc_rootPath =
(String) lc_map.get(IBootstrapConstants.ROOT_PATH_KEY);
setRootPath(lc_rootPath);
// recuperation du chemin relatif vers le fichier de configuration
String lc_configFile =
(String) lc_map.get(IBootstrapConstants.PROVIDER_CONFIG_KEY);
setConfigFile(lc_configFile);
// recuperation de l'information de bind jndi
String lc_isJndi = (String) lc_map.get(IBootstrapConstants.JNDI_BIND);
if (lc_isJndi != null) {
boolean b = Boolean.valueOf(lc_isJndi).booleanValue();
setJndi(b);
}
// verification de l'injection des dependances
afterPropertiesSet();
// on delegue l'initialisation
return initialize();
}
/**
* Creation d'un provider standard
* @param in_config configuration de provider
* @param in_rootPath root path du contexte
* @param in_logger logger
* @return provider
* @throws JrafConfigException
*/
protected final IProvider createStandardProvider(
ProviderConfig in_config,
String in_rootPath)
throws JrafConfigException {
// declaration d'un provider
IProvider lc_provider = null;
// declaration d'un initializer
IInitializable lc_Initializer = null;
if (log.isDebugEnabled()) {
log.debug(
"Debut d'initialisation du provider " + in_config.getId());
}
// ajout du chemin courant dans la configuration
in_config.putProperty(IBootstrapConstants.ROOT_PATH_KEY, in_rootPath);
// creation de l'initializer
lc_Initializer =
InitializableHelper.instanciateInitializable(
in_config.getClassName());
// creation et retour du bootstrap provider
lc_provider = lc_Initializer.initialize(in_config.getProperties());
if (log.isDebugEnabled()) {
log.debug(
"Initialisation du provider "
+ in_config.getId()
+ " effectuee");
}
return lc_provider;
}
/* (non-Javadoc)
* @see org.squale.jraf.spi.initializer.IInitializable#initialize()
*/
public IProvider initialize() throws JrafConfigException {
// liste des providers
List lc_providers = null;
// debut de l'initialisation
log.info("Debut de l'initialisation des providers JRAF...");
// creation du locator
ProviderLocator locator = null;
locator = ProviderLocator.getInstance();
// Test pour v�rifier que le locateur est null.
// Si oui, implique que l'ex�cution se fait
// dans un context hors serveur d'application.
if (locator == null) {
log.info("Ex�cution en mode standalone ... ");
locator = new ProviderLocator(new HashMap());
}
// recuperation du chemin racine
String lc_rootPath = getRootPath();
// recuperation du fichier de configuration
String lc_configFile = getConfigFile();
log.info("Lecture du fichier de configuration des providers...");
log.debug(
"fichier de config : "
+ lc_rootPath
+ File.separator
+ lc_configFile);
// lecture du fichier de configuration
try {
FileSystemXmlProviderConfigReader file = new FileSystemXmlProviderConfigReader(lc_rootPath
+ File.separator
+ lc_configFile);
lc_providers = file.readConfig();
} catch(Exception exc) {
exc.printStackTrace();
throw new JrafConfigException(exc);
}
if (log.isDebugEnabled())
log.debug(
"Lecture du fichier de configuration des providers effectue.");
// on trie la liste des providers
Collections.sort(lc_providers, new ProviderConfigComparator());
Iterator lc_i = lc_providers.iterator();
// initialisation des probiders
while (lc_i.hasNext()) {
ProviderConfig lc_config = (ProviderConfig) lc_i.next();
if (log.isDebugEnabled())
log.debug(
"Initialisation du provider " + lc_config.getId() + "...");
// creation du provider
IProvider lc_provider =
createStandardProvider(lc_config, getRootPath());
// on teste si le provider existe d�j� dans le Locator
String id = lc_config.getId();
if (locator.get(id) == null) {
locator.put(lc_config.getId(), lc_provider);
if (log.isDebugEnabled())
log.debug(
"Initialisation du provider "
+ lc_config.getId()
+ " effectue.");
}
}
log.info("Initialisation des providers optionnels effectue");
// // controle de presence du provider de logging
// if (locator.get("logging") == null) {
// String message =
// "Probleme de configuration: aucun provider de logging n'est renseigne";
// log.error(message);
// throw new JrafConfigException(message);
// }
// renseignement des providers dans le provider de bootstrap
// si il existe
IBootstrapProvider lc_bootstrapProvider =
(IBootstrapProvider) locator.get(
IProviderConstants.BOOTSTRAP_PROVIDER_KEY);
String bootStrapJndi = null;
if (lc_bootstrapProvider != null) {
lc_bootstrapProvider.setProviders(lc_providers);
// cas ancienne version des fichiers de configuration
bootStrapJndi =
(String) lc_bootstrapProvider.getParameters().get(
IBootstrapConstants.JNDI_BIND);
setBootstrapJndi(Boolean.valueOf(bootStrapJndi).booleanValue());
}
// bind jndi si necessaire
if (isBootstrapJndi() || isJndi()) {
log.info("Bind du provider locator dans JNDI...");
locator.bind();
} else {
// on fixe le singleton du provider locator
ProviderLocator.setProviderLocator(locator);
}
log.info("Reussite de l'intialisation des providers");
return lc_bootstrapProvider;
}
/* (non-Javadoc)
* @see org.squale.jraf.spi.initializer.IInitializableBean#afterPropertiesSet()
*/
public void afterPropertiesSet() {
// controle du fichier de configuration
if (getConfigFile() == null) {
throw new JrafConfigException("Fichier de configuration non fourni.");
}
// controle du chemin racine
if (getRootPath() == null) {
throw new JrafConfigException("Repertoire de configuration non fourni.");
}
}
/**
* Retourne le chemin relatif vers le fichier de configuration
* @return chemin relatif vers le fichier de configuration
*/
public String getConfigFile() {
return configFile;
}
/**
* Retourne true si enregistrement dans jndi, false sinon
* @return true si enregistrement dans jndi, false sinon
*/
public boolean isBootstrapJndi() {
return isBootstrapJndi;
}
/**
* Retourne le chemin racine
* @return chemin racine
*/
public String getRootPath() {
return rootPath;
}
/**
* Fixe le chemin du fichier de configuration
* @param string chemin du fichier de configuration
*/
public void setConfigFile(String string) {
configFile = string;
}
/**
* Fixe si le locator doit etre enregistre dans jndi
* @param b true si le locator doit etre enregistre dans jndi, false sinon
*/
public void setBootstrapJndi(boolean b) {
isBootstrapJndi = b;
}
/**
* Fixe le chemin vers le repertoire racine
* @param string chemin vers le repertoire racine
*/
public void setRootPath(String string) {
rootPath = string;
}
/**
* Retourne true si enregistrement du locator dans jndi, false sinon
* @return true si enregistrement du locator dans jndi, false sinon
*/
public boolean isJndi() {
return isJndi;
}
/**
* Fixe si le locator doit etre enregistre dans jndi
* @param b true si enregistrement du locator dans jndi, false sinon
*/
public void setJndi(boolean b) {
isJndi = b;
}
}