package br.com.citframework.util;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.resource.ResourceException;
import org.apache.commons.lang3.StringUtils;
/**
* Recupera recurso publicados na JNDI
*
* @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a>
* @since 19/08/2014
*
*/
public final class JNDIFactory implements IContextFactory<Object> {
private static final Logger LOGGER = Logger.getLogger(JNDIFactory.class.getName());
private Context context;
/**
* Constr�i um {@link JNDIFactory} com propriedades padr�o do contexto
*
*/
public JNDIFactory() {
try {
context = new InitialContext();
} catch (final NamingException e) {
final String mensagem = "Ocorreu um erro ao inicializar o contexto JNDI: " + e.getMessage();
LOGGER.log(Level.SEVERE, mensagem, e);
}
}
/**
* Constr�i um {@link JNDIFactory} informado propriedades do contexto
*
* @param properties
* propriedades a serem utilizadas no contexto
*/
public JNDIFactory(final Properties properties) {
try {
context = new InitialContext(properties);
} catch (final NamingException e) {
final String mensagem = "Ocorreu um erro ao inicializar o contexto JNDI: " + e.getMessage();
LOGGER.log(Level.SEVERE, mensagem, e);
}
}
@Override
public Object getResource(final String resourceName) throws ResourceException {
try {
return context.lookup(normalizeJNDIResourceName(resourceName));
} catch (final NamingException e) {
final String mensagem = "Ocorreu um erro ao tentar localizar objeto na refer�ncia " + resourceName
+ " no servidor: " + e.getMessage();
LOGGER.log(Level.SEVERE, mensagem, e);
throw new ResourceException(mensagem, e);
}
}
@Override
public Boolean putResource(final Context context, final String name, final Object object) throws ResourceException {
try {
context.bind(name, object);
return true;
} catch (final NamingException e) {
LOGGER.log(Level.WARNING, "N�o foi poss�vel fazer bind do objeto: " + e.getMessage(), e);
}
return false;
}
private static final String javaStart = "java:/";
private static final String jbossStart = "jboss:/";
private static final String contextoConexao = Constantes.getValue("CONTEXTO_CONEXAO");
private String normalizeJNDIResourceName(final String jndiName) {
final String[] jndiNameStarts = new String[] {javaStart, jbossStart};
String completeJNDIName = jndiName;
if (!StringUtils.startsWithAny(jndiName, jndiNameStarts)) {
if (StringUtils.isNotBlank(contextoConexao)) {
completeJNDIName = contextoConexao.concat(jndiName);
} else {
completeJNDIName = javaStart.concat(jndiName);
}
}
return completeJNDIName;
}
}