/**
* 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.io.IOException;
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.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.squale.jraf.bootstrap.ApplicationContextFactoryInitializer;
import org.squale.jraf.bootstrap.config.ClassPathXmlProviderConfigReader;
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.initializer.InitializableHelper;
import org.squale.jraf.bootstrap.locator.ProviderLocator;
import org.squale.jraf.bootstrap.test.ApplicationContextFactoryHelper;
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 d'une application JRAF a partir de SPRING.
* Initialise tous les providers declarees dans le fichier de configuration
* des providers.</p>
* <p>Copyright : Copyright (c) 2007</p>
*
* @author Franck Bisti
*/
public class SpringInitializer
extends Initializer
implements IInitializable, IInitializableBean, ApplicationContextAware {
/** logger */
private static final Log log = LogFactory.getLog(SpringInitializer.class);
/** Spring context */
private ApplicationContext applicationContext = null;
/**
* Constructeur vide type IOC2
*/
public SpringInitializer() {
setRootPath(null);
}
/**
* Constructeur avec parametres type IOC3
* @param rootPath chemin racine
* @param configFile chemin relatif vers le fichier de configuration
*/
public SpringInitializer(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 SpringInitializer(
String rootPath,
String configFile,
boolean isJndi) {
super(rootPath, configFile, isJndi);
}
/* (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();
if (lc_configFile != null) {
lc_providers =
providersInitialize(
lc_providers,
locator,
lc_rootPath,
lc_configFile);
}
// 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;
}
private List providersInitialize(
List lc_providers,
ProviderLocator locator,
String lc_rootPath,
String lc_configFile) {
String lc_fullPathConfigFile = null;
try {
if (lc_rootPath == null) {
lc_fullPathConfigFile =
getApplicationContext()
.getResource(getConfigFile())
.getURL()
.getPath();
lc_rootPath =
lc_fullPathConfigFile.substring(
0,
lc_fullPathConfigFile.indexOf(lc_configFile));
setRootPath(lc_rootPath);
} else {
lc_fullPathConfigFile =
lc_rootPath + File.separator + lc_configFile;
}
log.info("Lecture du fichier de configuration des providers...");
log.debug("fichier de config : " + lc_fullPathConfigFile);
// lecture du fichier de configuration
FileSystemXmlProviderConfigReader file =
new FileSystemXmlProviderConfigReader(lc_fullPathConfigFile);
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");
return lc_providers;
}
/* (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.");
}
}
/* (non-Javadoc)
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
*/
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
private ApplicationContext getApplicationContext() {
return applicationContext;
}
}