User: starksm 
  Date: 02/04/12 14:39:48

  Modified:    src/main/org/jboss/ejb/plugins/cmp/jdbc
                        JDBCCreateBeanClassInstanceCommand.java
                        JDBCQueryManager.java JDBCStoreManager.java
  Log:
  Replace container references with WeakReferences to allow the container
  to be garbage collected after undeployment.
  
  Revision  Changes    Path
  1.4       +13 -10    
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCCreateBeanClassInstanceCommand.java
  
  Index: JDBCCreateBeanClassInstanceCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCCreateBeanClassInstanceCommand.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- JDBCCreateBeanClassInstanceCommand.java   28 Jan 2002 21:44:43 -0000      1.3
  +++ JDBCCreateBeanClassInstanceCommand.java   12 Apr 2002 21:39:47 -0000      1.4
  @@ -7,6 +7,7 @@
    
   package org.jboss.ejb.plugins.cmp.jdbc;
   
  +import java.lang.ref.WeakReference;
   import java.lang.reflect.Constructor;
   
   import org.jboss.ejb.EntityContainer;
  @@ -23,25 +24,26 @@
    * <FIX-ME>should not generat a subclass for ejb 1.1</FIX-ME>
    *    
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
  - * @version $Revision: 1.3 $
  + * @version $Revision: 1.4 $
    */
    
   public class JDBCCreateBeanClassInstanceCommand {
  -   private EntityContainer container;
  +   private WeakReference container;
      private JDBCEntityBridge entityBridge;
      private Class beanClass;
      private Constructor beanProxyConstructor;
      
      public JDBCCreateBeanClassInstanceCommand(JDBCStoreManager manager) 
  -         throws Exception {
  -
  -      container = manager.getContainer();
  +         throws Exception
  +   {
  +      EntityContainer theContainer = manager.getContainer();
  +      container = new WeakReference(theContainer);
         entityBridge = manager.getEntityBridge();
  -      beanClass = container.getBeanClass();
  +      beanClass = theContainer.getBeanClass();
   
         // use proxy generator to create one implementation
         EntityBridgeInvocationHandler handler = new EntityBridgeInvocationHandler(
  -            container,
  +            theContainer,
               entityBridge,
               beanClass);
         Class[] classes = new Class[] { beanClass };
  @@ -57,13 +59,14 @@
         execute();
      }
      
  -   public Object execute() throws Exception {
  +   public Object execute() throws Exception
  +   {
  +      EntityContainer theContainer = (EntityContainer) container.get();
         EntityBridgeInvocationHandler handler = new EntityBridgeInvocationHandler(
  -            container,
  +            theContainer,
               entityBridge,
               beanClass);
   
         return beanProxyConstructor.newInstance(new Object[]{handler});
      }
   }
  -
  
  
  
  1.5       +134 -93   
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCQueryManager.java
  
  Index: JDBCQueryManager.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCQueryManager.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- JDBCQueryManager.java     26 Feb 2002 23:52:01 -0000      1.4
  +++ JDBCQueryManager.java     12 Apr 2002 21:39:47 -0000      1.5
  @@ -32,160 +32,187 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Marc Fleury</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Joe Shevland</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
  - * @version $Revision: 1.4 $
  + * @version $Revision: 1.5 $
    */
  -public class JDBCQueryManager {
  +public class JDBCQueryManager
  +{
      private final Map knownQueries = new HashMap();
      private final JDBCStoreManager manager;
      
  -   public JDBCQueryManager(JDBCStoreManager manager) {
  +   public JDBCQueryManager(JDBCStoreManager manager)
  +   {
         this.manager = manager;
      }
  -   
  -   public JDBCQueryCommand getQueryCommand(Method queryMethod) 
  -         throws FinderException {
   
  +   public JDBCQueryCommand getQueryCommand(Method queryMethod)
  +   throws FinderException
  +   {
  +      
         JDBCQueryCommand queryCommand =
  -            (JDBCQueryCommand)knownQueries.get(queryMethod);
  -   
  -      if(queryCommand == null) {
  +      (JDBCQueryCommand)knownQueries.get(queryMethod);
  +      
  +      if(queryCommand == null)
  +      {
            throw new FinderException("Unknown query: " + queryMethod);
         }
         return queryCommand;
      }
  -
  -   public void start() throws DeploymentException {
  +   
  +   public void start() throws DeploymentException
  +   {
         Logger log = Logger.getLogger(
  -            this.getClass().getName() + 
  -            "." + 
  -            manager.getMetaData().getName());
  +      this.getClass().getName() +
  +      "." +
  +      manager.getMetaData().getName());
         
  -      JDBCCommandFactory factory = manager.getCommandFactory();      
  +      JDBCCommandFactory factory = manager.getCommandFactory();
         
         Class homeClass = manager.getContainer().getHomeClass();
         Class localHomeClass = manager.getContainer().getLocalHomeClass();
  -
  -      // 
  +      
  +      //
         // findByPrimaryKey
         //
         JDBCEntityBridge entity = manager.getEntityBridge();
  -      if(homeClass != null) {
  -         try {
  +      if(homeClass != null)
  +      {
  +         try
  +         {
               // try to get the finder method on the home interface
               Method method = homeClass.getMethod(
  -                  "findByPrimaryKey", 
  -                  new Class[] {entity.getPrimaryKeyClass()});
  +            "findByPrimaryKey",
  +            new Class[]
  +            {entity.getPrimaryKeyClass()});
               
               // got it add it to known finders
               JDBCQueryMetaData q = new JDBCAutomaticQueryMetaData(method);
               knownQueries.put(
  -                  method, 
  -                  factory.createFindByPrimaryKeyQuery(q));
  -
  +            method,
  +            factory.createFindByPrimaryKeyQuery(q));
  +            
               log.debug("Added findByPrimaryKey query command for " +
  -                  "home interface");
  -         } catch(NoSuchMethodException e) {
  +            "home interface");
  +         } catch(NoSuchMethodException e)
  +         {
               throw new DeploymentException("Home interface does not " +
  -                  "have a findByPrimaryKey method");
  +            "have a findByPrimaryKey method");
            }
         }
  -         
  -      if(localHomeClass != null) {
  -         try {
  +      
  +      if(localHomeClass != null)
  +      {
  +         try
  +         {
               // try to get the finder method on the local home interface
               Method method = localHomeClass.getMethod(
  -                  "findByPrimaryKey", 
  -                  new Class[] {entity.getPrimaryKeyClass()});
  +            "findByPrimaryKey",
  +            new Class[]
  +            {entity.getPrimaryKeyClass()});
               
               // got it add it to known finders
               JDBCQueryMetaData q = new JDBCAutomaticQueryMetaData(method);
               knownQueries.put(
  -                  method, 
  -                  factory.createFindByPrimaryKeyQuery(q));
  -
  +            method,
  +            factory.createFindByPrimaryKeyQuery(q));
  +            
               log.debug("Added findByPrimaryKey query command for " +
  -                  "local home interface");
  -         } catch(NoSuchMethodException e) {
  +            "local home interface");
  +         } catch(NoSuchMethodException e)
  +         {
               throw new DeploymentException("Local home interface does " +
  -                  "not have a findByPrimaryKey method");
  +            "not have a findByPrimaryKey method");
            }
         }
  - 
  +      
         //
         // Custom finders - Overrides defined and automatic finders.
         //
         Class ejbClass = manager.getMetaData().getEntityClass();
  -
  -      Method[] customMethods = ejbClass.getMethods();         
  -      for (int i = 0; i < customMethods.length; i++) {
  +      
  +      Method[] customMethods = ejbClass.getMethods();
  +      for (int i = 0; i < customMethods.length; i++)
  +      {
            Method m = customMethods[i];
            String  methodName = m.getName();
  -         if(methodName.startsWith("ejbFind")) {
  +         if(methodName.startsWith("ejbFind"))
  +         {
               String interfaceName = "f" +  methodName.substring(4);
  -
  -            if(homeClass != null) {
  -               try {
  +            
  +            if(homeClass != null)
  +            {
  +               try
  +               {
                     // try to get the finder method on the home interface
                     Method interfaceMethod = homeClass.getMethod(
  -                        interfaceName, 
  -                        m.getParameterTypes());
  +                  interfaceName,
  +                  m.getParameterTypes());
                     
                     // got it add it to known finders
                     knownQueries.put(
  -                        interfaceMethod, 
  -                        new JDBCCustomFinderQuery(manager, m));
  -
  +                  interfaceMethod,
  +                  new JDBCCustomFinderQuery(manager, m));
  +                  
                     log.debug("Added custom finder " + methodName +
  -                        " on home interface");
  -               } catch(NoSuchMethodException e) {
  +                  " on home interface");
  +               } catch(NoSuchMethodException e)
  +               {
                     // this is ok method may not be defined on this interface
                  }
               }
  -               
  -            if(localHomeClass != null) {
  -               try {
  +            
  +            if(localHomeClass != null)
  +            {
  +               try
  +               {
                     // try to get the finder method on the local home interface
                     Method interfaceMethod = localHomeClass.getMethod(
  -                        interfaceName, 
  -                        m.getParameterTypes());
  +                  interfaceName,
  +                  m.getParameterTypes());
                     
                     // got it add it to known finders
                     knownQueries.put(
  -                        interfaceMethod, 
  -                        new JDBCCustomFinderQuery(manager, m));
  -
  +                  interfaceMethod,
  +                  new JDBCCustomFinderQuery(manager, m));
  +                  
                     log.debug("Added custom finder " + methodName +
  -                        " on local home interface");
  -               } catch(NoSuchMethodException e) {
  +                  " on local home interface");
  +               } catch(NoSuchMethodException e)
  +               {
                     // this is ok method may not be defined on this interface
                  }
               }
            }
         }
  -
  +      
         //
         // Defined finders - Overrides automatic finders.
         //
         Iterator definedFinders = manager.getMetaData().getQueries().iterator();
  -      while(definedFinders.hasNext()) {
  +      while(definedFinders.hasNext())
  +      {
            JDBCQueryMetaData q = (JDBCQueryMetaData)definedFinders.next();
  -
  -         if(!knownQueries.containsKey(q.getMethod()) ) {
  -            if(q instanceof JDBCJBossQLQueryMetaData) {
  +         
  +         if(!knownQueries.containsKey(q.getMethod()) )
  +         {
  +            if(q instanceof JDBCJBossQLQueryMetaData)
  +            {
                  knownQueries.put(
  -                     q.getMethod(), factory.createJBossQLQuery(q));
  -                  
  -            } else if(q instanceof JDBCDynamicQLQueryMetaData) {
  +               q.getMethod(), factory.createJBossQLQuery(q));
  +               
  +            } else if(q instanceof JDBCDynamicQLQueryMetaData)
  +            {
                  knownQueries.put(
  -                     q.getMethod(), factory.createDynamicQLQuery(q));
  -                  
  -            } else if(q instanceof JDBCDeclaredQueryMetaData) {
  +               q.getMethod(), factory.createDynamicQLQuery(q));
  +               
  +            } else if(q instanceof JDBCDeclaredQueryMetaData)
  +            {
                  knownQueries.put(
  -                     q.getMethod(), factory.createDeclaredSQLQuery(q));
  -                  
  -            } else if(q instanceof JDBCQlQueryMetaData) {
  +               q.getMethod(), factory.createDeclaredSQLQuery(q));
  +               
  +            } else if(q instanceof JDBCQlQueryMetaData)
  +            {
                  knownQueries.put(
  -                     q.getMethod(), factory.createEJBQLQuery(q));
  +               q.getMethod(), factory.createEJBQLQuery(q));
               }
            }
         }
  @@ -193,38 +220,52 @@
         //
         // Automatic finders - The last resort
         //
  -      if(homeClass != null) {
  +      if(homeClass != null)
  +      {
            addAutomaticFinders(manager, homeClass.getMethods(), log);
         }
         
  -      if(localHomeClass != null) {
  +      if(localHomeClass != null)
  +      {
            addAutomaticFinders(manager, localHomeClass.getMethods(), log);
         }
      }
  -   
  -   private void addAutomaticFinders(
  -         JDBCStoreManager manager,
  -         Method[] homeMethods,
  -         Logger log) {
   
  -      JDBCCommandFactory factory = manager.getCommandFactory();      
  -      for (int i = 0; i < homeMethods.length; i++) {
  +   public void clear()
  +   {
  +      this.knownQueries.clear();
  +   }
  +
  +   private void addAutomaticFinders(
  +      JDBCStoreManager manager,
  +      Method[] homeMethods,
  +      Logger log)
  +   {
  +      
  +      JDBCCommandFactory factory = manager.getCommandFactory();
  +      for (int i = 0; i < homeMethods.length; i++)
  +      {
            Method m = homeMethods[i];
            
  -         if(!knownQueries.containsKey(m)) {
  +         if(!knownQueries.containsKey(m))
  +         {
               String name = m.getName();
  -            if(name.equals("findAll")) {
  +            if(name.equals("findAll"))
  +            {
                  JDBCQueryMetaData q = new JDBCAutomaticQueryMetaData(m);
                  knownQueries.put(m, factory.createFindAllQuery(q));
               } else if(name.startsWith("findBy") &&
  -                  !name.equals("findByPrimaryKey")) {
  +            !name.equals("findByPrimaryKey"))
  +            {
                  
  -               try {
  +               try
  +               {
                     JDBCQueryMetaData q = new JDBCAutomaticQueryMetaData(m);
                     knownQueries.put(m, factory.createFindByQuery(q));
  -               } catch (IllegalArgumentException e) {
  +               } catch (IllegalArgumentException e)
  +               {
                     log.debug("Could not create the finder " + name +
  -                        ", because no matching CMP field was found.");
  +                  ", because no matching CMP field was found.");
                  }
               }
            }
  
  
  
  1.32      +4 -2      
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStoreManager.java
  
  Index: JDBCStoreManager.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStoreManager.java,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- JDBCStoreManager.java     12 Apr 2002 19:30:44 -0000      1.31
  +++ JDBCStoreManager.java     12 Apr 2002 21:39:47 -0000      1.32
  @@ -60,7 +60,7 @@
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
    * @see org.jboss.ejb.EntityPersistenceStore
  - * @version $Revision: 1.31 $
  + * @version $Revision: 1.32 $
    */
   public class JDBCStoreManager implements EntityPersistenceStore
   {
  @@ -407,8 +407,10 @@
         
         readAheadCache.destroy();
         readAheadCache = null;
  +      queryManager.clear();
  +      queryManager = null;
      }
  -   
  +
      //
      // EJB Life Cycle Commands
      //
  
  
  

_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to