Package com.cosmo.comm

Source Code of com.cosmo.comm.CommunicationsFactory

package com.cosmo.comm;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;

import com.cosmo.Workspace;
import com.cosmo.util.PluginProperties;
import com.cosmo.util.StringUtils;

/**
* Implementa una clase que permite obtener la instancia del agente de autenticaci�n configurado en el workspace.
* <br /><br />
* Esta clase est� dise�ada seg�n el patr�n <em>Singleton</em> para asegurar que s�lo se instancia una vez
* la implementaci�n del agente de autenticaci�n.
*
* @author Gerard Llort
*/
public abstract class CommunicationsFactory
{
   // Mapa con las instancias �nicas de los agentes de comunicaciones
   private static HashMap<String, CommAgent> agents = null;


   //==============================================
   // Static members
   //==============================================

   /**
    * Envia un mensaje usando un determinado agente de comunicaciones.
    *
    * @param workspace Una instancia de {@link Workspace} que representa el workspace actual.
    * @param agentId Identificador del agente de comunicaciones a usar.
    * @param message Una instancia de {@link Message} que contiene los detalles del mensaje.
    *
    * @throws Exception
    */
   public static void sendMessage(Workspace workspace, String agentId, Message message) throws Exception
   {
      CommAgent server = loadProvider(workspace, agentId);

      server.sendMessage(message);
   }

   /**
    * Envia un mensaje usando el agente de comunicaciones por defecto.
    *
    * @param workspace Una instancia de {@link Workspace} que representa el workspace actual.
    * @param message Una instancia de {@link Message} que contiene los detalles del mensaje.
    *
    * @throws Exception
    */
   public static void sendMessage(Workspace workspace, Message message) throws Exception
   {
      sendMessage(workspace, null, message);
   }

   /**
    * Devuelve una instancia de {@link CommAgent} convenientemente instanciada.
    *
    * @param workspace Una instancia de {@link Workspace} que representa el workspace actual.
    * @param agentId Identificador del agente de comunicaciones a usar.
    *
    * @return Una instancia �nica de {@link CommAgent} (sigleton).
    *
    * @throws CommunicationsException
    */
   public static CommAgent getInstance(Workspace workspace, String agentId) throws CommunicationsException
   {
      return loadProvider(workspace, agentId);
   }

   /**
    * Devuelve una instancia de {@link CommAgent} convenientemente instanciada.
    *
    * @param workspace Una instancia de {@link Workspace} que representa el workspace actual.
    *
    * @return Una instancia �nica de {@link CommAgent} (sigleton).
    *
    * @throws CommunicationsException
    */
   public static CommAgent getInstance(Workspace workspace) throws CommunicationsException
   {
      return getInstance(workspace, null);
   }


   //==============================================
   // Private members
   //==============================================

   /**
    * Carga el controlador de usuarios.
    *
    * @throws CommunicationsException
    */
   private static CommAgent loadProvider(Workspace workspace, String agentId) throws CommunicationsException
   {
      String className;

      // Inicializa el diccionario de agentes de comunicaci�n
      if (agents == null)
      {
         agents = new HashMap<String, CommAgent>();
      }

      // Si no se proporciona un identificador de agente, se usa el especificado por defecto en la configuraci�n.
      if (StringUtils.isNullOrEmptyTrim(agentId))
      {
         agentId = workspace.getProperties().getCommProperties().getDefaultCommunicationsAgentId();
      }

      if (agents.containsKey(agentId))
      {
         return agents.get(agentId);
      }
      else
      {
         PluginProperties agent = workspace.getProperties().getCommProperties().getCommunicationAgent(agentId);

         className = agent.getModuleClass();
         if (StringUtils.isNullOrEmptyTrim(className))
         {
            throw new CommunicationsException("Communications Configuration Exception: No communications driver found");
         }

         try
         {
            Class<?> cls = Class.forName(className);

            // Genera la instancia del agente solicitado
            Class<?>[] types = { PluginProperties.class };
            Object[] arguments = { agent };
            CommAgent server = (CommAgent) cls.getDeclaredConstructor(types).newInstance(arguments);

            // Almacena la instancia en la lista de instancias de agentes (Singleton)
            agents.put(agentId, server);

            return server;
         }
         catch (NoSuchMethodException ex)
         {
            throw new CommunicationsException("NoSuchMethodException: " + className, ex);
         }
         catch (InvocationTargetException ex)
         {
            throw new CommunicationsException("InvocationTargetException: " + className, ex);
         }
         catch (ClassNotFoundException ex)
         {
            throw new CommunicationsException("ClassNotFoundException: " + className, ex);
         }
         catch (InstantiationException ex)
         {
            throw new CommunicationsException("InstantiationException: " + className, ex);
         }
         catch (IllegalAccessException ex)
         {
            throw new CommunicationsException("IllegalAccessException: " + className, ex);
         }
      }
   }
}
TOP

Related Classes of com.cosmo.comm.CommunicationsFactory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.