/**
* 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.naming;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.Name;
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
import javax.naming.NoInitialContextException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.squale.jraf.bootstrap.locator.ProviderLocator;
import org.squale.jraf.commons.exception.JrafConfigException;
/**
* <p>Title : NamingHelper.java</p>
* <p>Description : Helper pour la communication avec JNDI</p>
* <p>Copyright : Copyright (c) 2004</p>
*
* @author Eric BELLARD
*/
public class NamingHelper {
/** logger */
private static final Log log = LogFactory.getLog(NamingHelper.class);
/** nom de la classe d'acces a jndi par defaut */
private final static String DEFAULT_JNDI_CLASS =
"com.ibm.websphere.naming.WsnInitialContextFactory";
/**
* Cree un contexte initial
* @param in_properties proprietes
* @return contexte initial
* @throws JrafConfigException
*/
public static Context getInitialContext() throws JrafConfigException {
return getInitialContext(null, null);
}
/**
* Cree un contexte initial
* @param jndiUrl url de l'annuaire
* @param jndiClass classe d'acces
* @return contexte initial
* @throws JrafConfigException
*/
public static Context getInitialContext(String jndiUrl, String jndiClass)
throws JrafConfigException {
Hashtable hash = getJndiProperties(jndiUrl, jndiClass);
if (log.isDebugEnabled()) {
log.debug("JNDI InitialContext properties:" + hash.size());
}
Context lc_context = null;
try {
if (hash.size() == 0) {
lc_context = new InitialContext();
if (log.isDebugEnabled()) {
try {
log.debug("New initial context" + lc_context.getNameInNamespace());
}catch(NoInitialContextException exc) {
log.debug("No initial context...");
}
}
} else {
lc_context = new InitialContext(hash);
if (log.isDebugEnabled()) {
log.debug("new Initial context:" + lc_context.getNameInNamespace() + " " + hash.size());
}
}
return lc_context;
} catch (NamingException e) {
log.error("Impossible de recuperer le contexte JNDI : ", e);
throw new JrafConfigException(
"Impossible de recuperer le contexte JNDI : ",
e);
}
}
/**
* Bind le couple nom/valeur dans le contexte jndi.
* @param in_context contexte jndi racine
* @param in_name nom
* @param in_value valeur
* @throws NamingException
*/
public static void bind(
Context in_context,
String in_name,
Object in_value)
throws JrafConfigException {
if (log.isDebugEnabled()) {
log.debug("binding : " + in_name);
}
String lc_name = in_name;
try {
in_context.rebind(lc_name, in_value);
} catch (NamingException e) {
try {
Name n = in_context.getNameParser("").parse(lc_name);
while (n.size() > 1) {
String ctxName = n.get(0);
Context subctx = null;
try {
if (log.isDebugEnabled()) {
log.debug("lookup: " + ctxName);
}
subctx = (Context) in_context.lookup(ctxName);
} catch (NameNotFoundException nfe) {
}
if (subctx != null) {
if (log.isDebugEnabled()) {
log.debug("Found subcontext: " + ctxName);
}
in_context = subctx;
} else {
// log.info("Creating subcontext: " + ctxName);
in_context = in_context.createSubcontext(ctxName);
}
n = n.getSuffix(1);
}
if (log.isDebugEnabled()) {
log.debug("binding: " + n);
}
in_context.rebind(n, in_value);
} catch (NamingException e1) {
log.error("Impossible de recupere l'objet dans JNDI.", e);
throw new JrafConfigException(
"Impossible de recupere l'objet dans JNDI.",
e);
}
}
if (log.isDebugEnabled()) {
log.debug("Bound name: " + in_name);
}
}
/**
* Recupere un objet dans un contexte jndi
* @param in_context contexte jndi d'entre
* @param in_name nom du composant a rechercher
* @return composant retourne
*/
public static Object lookup(Context in_context, String in_name)
throws JrafConfigException {
Object lc_value = null;
if (in_name != null) {
try {
lc_value = in_context.lookup(in_name);
}catch(NoInitialContextException noI)
{
// A ce niveau, ce qui signifie qu'on est pas dans le
// cadre d'un serveur d'application.
//log.error("");
}
catch (NameNotFoundException nne) {
// non jndi non trouve
// on ne fait rien
if (log.isDebugEnabled()) {
log.debug(
"L'element recherche suivant n'est pas present dans JNDI : "
+ in_name);
}
} catch (NamingException e) {
log.error(
"Impossible de retrouver dans JNDI l'element : " + in_name,
e);
throw new JrafConfigException(
"Impossible de retrouver dans JNDI l'element : " + in_name,
e);
}
}
return lc_value;
}
/**
* Retourne les proprietes JNDI associees a partir de l'url d'un annuaire et de la factory d'acces
* @param jndiUrl url de l'annuaire
* @param jndiClass factory d'acces
* @return
*/
public static Properties getJndiProperties(
String jndiUrl,
String jndiClass) {
Properties properties = new Properties();
// context factory
if (jndiClass != null) {
properties.put(Context.INITIAL_CONTEXT_FACTORY, jndiClass);
}
// URL
if (jndiUrl != null) {
properties.put(Context.PROVIDER_URL, jndiUrl);
}
return properties;
}
}