/**
* 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 Mar 5, 2004
*/
package org.squale.jraf.bootstrap.locator;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.swing.SpringLayout;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.squale.jraf.bootstrap.naming.IJndiBinder;
import org.squale.jraf.bootstrap.naming.JndiBinder;
import org.squale.jraf.commons.exception.JrafConfigException;
import org.squale.jraf.spi.initializer.IInitializableBean;
import org.squale.jraf.spi.provider.IProvider;
/**
* <p>Title : ProviderLocator.java</p>
* <p>Description : permet de retrouver les provider d'une application</p>
* <p>Copyright : Copyright (c) 2004</p>
*
* @author Eric BELLARD
*/
public class ProviderLocator
implements Serializable, IInitializableBean, ILocator {
/** logger */
private final static Log log = LogFactory.getLog(ProviderLocator.class);
/////// proprietes statiques
/** provider locator */
private static ProviderLocator _providerLocator;
/** map des providers */
private Map providers;
/**
* Constructeur vide type IOC2
*/
public ProviderLocator() {
super();
}
/**
* Constructeur avec parametres type IOC3.
* La map de provider est fourni en parametres
* @param providers map de parametres
*/
public ProviderLocator(Map providers) {
setProviders(providers);
afterPropertiesSet();
}
/**
* Recupere un singleton de provider locator
* @return singleton de provider locator
* @throws JrafConfigException
*/
public static ProviderLocator getInstance() {
ProviderLocator loc = _providerLocator;
if (_providerLocator == null) {
loc = lookup();
}
// on retourne le provider locator
return loc;
}
/**
* Recupere le provider locator dans JNDI
* @param in_parameters parametres jndi
* @return provider locator
* @throws JrafConfigException
*/
private static ProviderLocator lookup() throws JrafConfigException {
ProviderLocator locator = null;
// url jndi
String jndiUrl = null;
// jndi class
String jndiClass = null;
// nom jndi du locator
String locatorJndiName = null;
if (log.isDebugEnabled()) {
log.debug("Recuperation du contexte JNDI...");
}
// binder local
IJndiBinder binderLocal = new JndiBinder(null);
// recuperation des parametres dans l'annuaire jndi local
jndiUrl =
(String) binderLocal.lookup(IProviderLocatorConstants.JNDI_URL_KEY);
jndiClass =
(String) binderLocal.lookup(
IProviderLocatorConstants.JNDI_CLASSNAME_KEY);
locatorJndiName =
(String) binderLocal.lookup(
IProviderLocatorConstants.PROVIDER_LOCATOR_NAME_KEY);
// trace
if (log.isDebugEnabled()) {
log.debug("URL JNDI de l'annuaire JNDI=" + jndiUrl);
log.debug("Classe d'acces JNDI=" + jndiClass);
log.debug("Nom JNDI du locator=" + locatorJndiName);
}
// creation d'un binder JNDI distant
IJndiBinder remoteBinder = new JndiBinder(jndiClass, jndiUrl);
// binder jndi
locator = (ProviderLocator) remoteBinder.lookup(locatorJndiName);
// on retourne le provider locator
return locator;
}
/**
* Recupere un provider a partir de son nom
* @param in_name nom du provider
* @return provider
*/
public static IProvider getProvider(String in_name) {
ProviderLocator loc = getInstance();
if (loc == null) {
log.debug("Pas de provider locator - test spring locator");
SpringLocator springLocator = SpringLocator.getInstance();
if(springLocator == null) {
throw new JrafConfigException("L'application n'a pas ete correctement initialise, le provider locator n'est pas present dans JNDI");
}
return (IProvider) springLocator.getBean(in_name);
} else {
return (IProvider) loc.getProviders().get(in_name);
}
}
/**
* Retourne les providers
* @return providers
*/
public Map getProviders() {
return providers;
}
/**
* Ajoute un provider sur le provider locator
* @param in_id id du provider
* @param in_provider provider
* @deprecated utliser la methode put en remplacement
*/
public void putProvider(String in_id, IProvider in_provider) {
put(in_id, in_provider);
}
/**
* Supprime un provider du provider locator
* @param in_id id du provider
* @deprecated utliser la methode remove en remplacement
*/
public void removeProvider(String in_id) {
remove(in_id);
}
/**
* Fixe le provider locator.
* Ex�cut� une seule fois � l'initialisation
* @param in_providerLocator provider locator
*/
public static void setProviderLocator(ProviderLocator in_providerLocator) {
_providerLocator = in_providerLocator;
}
/**
* Rend le provider locator non modifiable.
*/
public void setReadOnly() {
Map lc_providers = providers;
lc_providers = Collections.unmodifiableMap(lc_providers);
providers = lc_providers;
}
/* (non-Javadoc)
* @see org.squale.jraf.bootstrap.locator.IProviderLocator#get(java.lang.String)
*/
public IProvider get(String name) {
return (IProvider) getProviders().get(name);
}
/* (non-Javadoc)
* @see org.squale.jraf.bootstrap.locator.IProviderLocator#put(java.lang.String, org.squale.jraf.spi.provider.IProvider)
*/
public void put(String name, IProvider provider) {
getProviders().put(name, provider);
}
/* (non-Javadoc)
* @see org.squale.jraf.bootstrap.locator.IProviderLocator#remove(java.lang.String)
*/
public void remove(String name) {
providers.remove(name);
}
/**
* Fixe la map de providers
* @param map map de providers
*/
public void setProviders(Map map) {
providers = map;
}
/* (non-Javadoc)
* @see org.squale.jraf.spi.initializer.IInitializableBean#afterPropertiesSet()
*/
public void afterPropertiesSet() {
// initilize la map de providers au besoin
if (getProviders() == null) {
setProviders(new HashMap());
}
}
/**
* Bind du locator dans JNDI
*/
public void bind() {
log.info("Bind du locator dans JNDI...");
// url jndi
String jndiUrl = null;
// jndi class
String jndiClass = null;
// nom jndi du locator
String locatorJndiName = null;
if (log.isDebugEnabled()) {
log.debug("Recuperation du contexte JNDI...");
}
// binder local
IJndiBinder binderLocal = new JndiBinder(null);
jndiUrl =
(String) binderLocal.lookup(IProviderLocatorConstants.JNDI_URL_KEY);
jndiClass =
(String) binderLocal.lookup(
IProviderLocatorConstants.JNDI_CLASSNAME_KEY);
locatorJndiName =
(String) binderLocal.lookup(
IProviderLocatorConstants.PROVIDER_LOCATOR_NAME_KEY);
// trace
if (log.isDebugEnabled()) {
log.debug("URL JNDI de l'annuaire JNDI=" + jndiUrl);
log.debug("Classe d'acces JNDI=" + jndiClass);
log.debug("Nom JNDI du locator=" + locatorJndiName);
}
// creation d'un binder JNDI distant
IJndiBinder remoteBinder = new JndiBinder(jndiClass, jndiUrl);
// rend le provider locator non modifiable
setReadOnly();
if (locatorJndiName != null) {
// bind le provider locator dans jndi
if (log.isDebugEnabled()) {
log.debug("Bind dans JNDI du locator...");
}
remoteBinder.bind(locatorJndiName, this);
log.info("Bind dans JNDI du locator effectue.");
} else {
log.info("Le nom JNDI n'a pas ete specifie. Bind JNDI annule.");
}
}
}