EJBHomeFactory.java
上传用户:dinglihq
上传日期:2013-02-04
资源大小:99958k
文件大小:4k
源码类别:

Java编程

开发平台:

Java

  1. package com.portal.util;
  2. import javax.ejb.*;
  3. import java.rmi.*;
  4. import javax.rmi.*;
  5. import java.util.*;
  6. import javax.naming.*;
  7. /**
  8.  * EJB Home Factory, maintains a simple hashmap cache of EJBHomes
  9.  * For a production implementations, exceptions such as NamingException
  10.  * can be wrapped with a factory exception to futher simplify
  11.  * the client.
  12.  */
  13. public class EJBHomeFactory
  14. {
  15. private Map ejbHomes;
  16. private static EJBHomeFactory aFactorySingleton;
  17. Context ctx;
  18. /**
  19.  * EJBHomeFactory private constructor.
  20.  */
  21. private EJBHomeFactory() throws NamingException
  22. {
  23.         try
  24.         {
  25.             ctx = new InitialContext();
  26.             this.ejbHomes = Collections.synchronizedMap(new HashMap());
  27.         }
  28.         catch(Exception e)
  29.         {
  30.             //can't do anything about this
  31.             //client will catch errors upon trying to
  32.             //do a lookup
  33.         }
  34. }
  35. /*
  36.  * Returns the singleton instance of the EJBHomeFactory
  37.      * The sychronized keyword is intentionally left out the
  38.      * as I don't think the potential to intialize the singleton
  39.      * twice at startup time (which is not a destructive event)
  40.      * is worth creating a sychronization bottleneck on this
  41.      * VERY frequently used class, for the lifetime of the
  42.      * client application.
  43.      */
  44. public static EJBHomeFactory getFactory() throws HomeFactoryException
  45. {
  46.         try
  47.         {
  48.             if ( EJBHomeFactory.aFactorySingleton == null )
  49.             {
  50.                 EJBHomeFactory.aFactorySingleton = new EJBHomeFactory();
  51.             }
  52.         } catch (NamingException e)
  53.         {
  54.             throw new HomeFactoryException(e);
  55.         }
  56.         return EJBHomeFactory.aFactorySingleton;
  57. }
  58. /**
  59.  * Lookup and cache an EJBHome object using a home class.
  60.      * Assumes that the JNDI name of the EJB Home being looked for
  61.      * is the same as the fully qualified class name of the
  62.      * same EJB Home.
  63.      * If EJB-REF tags are being used externally, then the classname
  64.      * of the EJB Home can be mapped to the actual JNDI name of the
  65.      * deployed bean transaprently at deployment time.
  66.      * If EJB-REF tags are not used, then the EJB's must be deployed
  67.      * with JNDI names equal to their fully qualified home interfaces.
  68.      */
  69. public EJBHome lookUpHome(Class homeClass)
  70.     throws HomeFactoryException
  71. {
  72. EJBHome anEJBHome;
  73. anEJBHome = (EJBHome) this.ejbHomes.get(homeClass);
  74.         try
  75.         {
  76.             if(anEJBHome == null)
  77.             {
  78.                 anEJBHome = (EJBHome) PortableRemoteObject.narrow
  79.                             (ctx.lookup(homeClass.getName()), homeClass);
  80.                 this.ejbHomes.put(homeClass, anEJBHome);
  81.             }
  82.         }
  83.         catch (ClassCastException e)
  84.         {
  85.             throw new HomeFactoryException(e);
  86.         }
  87.         catch (NamingException e)
  88.         {
  89.             throw new HomeFactoryException(e);
  90.         }
  91.         return anEJBHome;
  92. }
  93. /**
  94.  * Lookup and cache an EJBHome object.
  95.      * This 'alternate' implementation delegates JNDI name knowledge
  96.      * to the client. It is included here for example only.
  97.  */
  98. public EJBHome lookUpHome(Class homeClass, String jndiName)
  99.     throws HomeFactoryException
  100. {
  101. EJBHome anEJBHome;
  102. anEJBHome = (EJBHome) this.ejbHomes.get(homeClass);
  103.         try
  104.         {
  105.             if(anEJBHome == null)
  106.             {
  107.                 System.out.println("finding HOME for first time");
  108.                 anEJBHome = (EJBHome) PortableRemoteObject.narrow
  109.                             ( ctx.lookup (jndiName), homeClass);
  110.                 this.ejbHomes.put(homeClass, anEJBHome);
  111.             }
  112.         }
  113.         catch (ClassCastException e)
  114.         {
  115.             throw new HomeFactoryException(e);
  116.         }
  117.         catch (NamingException e)
  118.         {
  119.             throw new HomeFactoryException(e);
  120.         }
  121. return anEJBHome;
  122. }
  123. }