package gcom.util; import gcom.fachada.Fachada; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collections; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; import javax.ejb.EJBLocalHome; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.ObjectMessage; import javax.jms.Queue; import javax.jms.Session; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.rmi.PortableRemoteObject; /** * Efetua a localiza��o, instanciamento e cache de servi�os * * @author Administrador */ public class ServiceLocator { private static ServiceLocator instancia = null; private static Context contexto = null; private static Map mapaHomes = null; private static ConnectionFactory connectionFactoryJms = null; private static String empresa = null; static { try { Hashtable env = new Hashtable(); env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces"); env.put(javax.naming.Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); // env.put(javax.naming.Context.PROVIDER_URL, "localhost:1099"); contexto = new InitialContext(env); mapaHomes = Collections.synchronizedMap(new HashMap()); instancia = new ServiceLocator(); connectionFactoryJms = (ConnectionFactory) contexto .lookup("java:JmsXA"); } catch (Exception e) { e.printStackTrace(); throw new SistemaException(e); } } /** * Retorna a �nica inst�ncia do ServiceLocator * * @return A inst�ncia do ServiceLocator * @exception ServiceLocatorException * Exce��o levantada caso ocorra algum erro de localiza��o ou * instanciamento */ public static ServiceLocator getInstancia() throws ServiceLocatorException { return instancia; } /** * Construtor da classe ServiceLocator */ private ServiceLocator() { } /** * Retorna a interface Home de um Entreprise Java Bean * * @param jndiName * O jndiName do EJB * @param classe * O nome do .class da interface home * @return A interface Home de um Entreprise Java Bean * @exception ServiceLocatorException * Exce��o levantada caso ocorra algum erro de localiza��o ou * instanciamento */ public Object getHome(String jndiName, Class classe) throws ServiceLocatorException { Object home = mapaHomes.get(jndiName); if (home == null) { try { Object referencia = contexto.lookup(jndiName); home = PortableRemoteObject.narrow(referencia, classe); mapaHomes.put(jndiName, home); } catch (NamingException e) { throw new ServiceLocatorException(e, e.getMessage()); } } return home; } /** * will get the ejb Local home factory. clients need to cast to the type of * EJBHome they desire * * @param jndiHomeName * Descri��o do par�metro * @return the Local EJB Home corresponding to the homeName * @exception ServiceLocatorException * Descri��o da exce��o */ public EJBLocalHome getLocalHome(String jndiHomeName) throws ServiceLocatorException { try { return (EJBLocalHome) contexto.lookup(jndiHomeName); } catch (NamingException e) { throw new ServiceLocatorException(e, e.getMessage()); } } public EJBLocalHome getLocalHomePorEmpresa(String jndiHomeName) throws ServiceLocatorException { try { if (empresa == null) { empresa = Fachada.getInstancia().pesquisarParametrosDoSistema() .getNomeControlador(); } jndiHomeName = jndiHomeName.replace("GCOM", empresa); return (EJBLocalHome) contexto.lookup(jndiHomeName); } catch (NamingException e) { throw new ServiceLocatorException(e, e.getMessage()); } } /** * Retorna a inst�ncia do servi�o de componente solicitado. * * @param nome * Nome do servi�o de componente necess�rio. * @return Object Uma inst�ncia do servi�o de componente solicitado * @exception ServiceLocatorException * Exce��o levantada caso ocorra algum erro de localiza��o ou * instanciamento. */ public Object getComponente(String nome) throws ServiceLocatorException { return this.carregaClasse(nome); } /** * Realiza a carga e instanciamento de uma classe * * @param nome * O nome da classe a ser carregada * @return Uma inst�ncia da classe solicitada * @exception ServiceLocatorException * Exce��o levantada caso ocorra algum erro de localiza��o ou * instanciamento */ private Object carregaClasse(String nome) throws ServiceLocatorException { Object classe = null; Class classAuxiliar = null; Method metodo = null; try { classAuxiliar = Class.forName(nome); metodo = classAuxiliar.getMethod("getInstancia", (Class[]) null); } catch (ClassNotFoundException e) { e.printStackTrace(); throw new ServiceLocatorException(e, "Classe n�o encontrada"); } catch (NoSuchMethodException e) { try { metodo = classAuxiliar.getMethod("getInstance", (Class[]) null); } catch (NoSuchMethodException ex) { ex.printStackTrace(); throw new ServiceLocatorException(ex); } } catch (Throwable e) { e.printStackTrace(); } try { classe = metodo.invoke(null, (Object[]) null); } catch (IllegalAccessException e) { e.printStackTrace(); throw new ServiceLocatorException(e); } catch (InvocationTargetException e) { e.printStackTrace(); throw new ServiceLocatorException(e); } return classe; } public void enviarMensagemJms(int metodo, String queueMDB, Object[] parametros) throws ServiceLocatorException { Connection connection = null; Session session = null; try { // Direciona a fila para o controlador Queue destination = (Queue) contexto.lookup(queueMDB); connection = connectionFactoryJms.createConnection(); session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer messageProducer = session .createProducer(destination); ObjectMessage message = session.createObjectMessage(); // Monta a mensagem message.setIntProperty("nomeMetodo", metodo); // Passa os parametros message.setObject(parametros); // Manda a mensagem messageProducer.send(message); } catch (NamingException e) { throw new ServiceLocatorException(e, e.getMessage()); } catch (JMSException e) { throw new ServiceLocatorException(e, e.getMessage()); } finally { try { session.close(); connection.close(); } catch (JMSException e) { throw new ServiceLocatorException(e, e.getMessage()); } } } public void enviarMensagemJms(String queueMDB, Object[] parametros) throws ServiceLocatorException { Connection connection = null; Session session = null; try { // Direciona a fila para o controlador Queue destination = (Queue) contexto.lookup(queueMDB); connection = connectionFactoryJms.createConnection(); session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer messageProducer = session .createProducer(destination); ObjectMessage message = session.createObjectMessage(); // Passa os parametros message.setObject(parametros); // Manda a mensagem messageProducer.send(message); } catch (NamingException e) { throw new ServiceLocatorException(e, e.getMessage()); } catch (JMSException e) { throw new ServiceLocatorException(e, e.getMessage()); } finally { try { session.close(); connection.close(); } catch (JMSException e) { throw new ServiceLocatorException(e, e.getMessage()); } } } public static Object getResource(String jndiName) throws ServiceLocatorException { Object resource = null; try { resource = contexto.lookup(jndiName); } catch (NamingException e) { //throw new ServiceLocatorException(e, e.getMessage()); } return resource; } }