User: starksm 
  Date: 02/04/12 12:30:44

  Modified:    src/main/org/jboss/ejb/plugins/cmp/jdbc
                        JDBCRelationInterceptor.java JDBCStoreManager.java
  Log:
  Start cleaning up the web of container references in destroy so that
  the container may be garbage collected.
  
  Revision  Changes    Path
  1.11      +20 -14    
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCRelationInterceptor.java
  
  Index: JDBCRelationInterceptor.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCRelationInterceptor.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- JDBCRelationInterceptor.java      27 Dec 2001 17:32:25 -0000      1.10
  +++ JDBCRelationInterceptor.java      12 Apr 2002 19:30:44 -0000      1.11
  @@ -26,7 +26,7 @@
    * relationship.  This interceptor also manages the relation table data.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
  - * @version $Revision: 1.10 $
  + * @version $Revision: 1.11 $
    */
   public class JDBCRelationInterceptor extends AbstractInterceptor
   {
  @@ -89,20 +89,26 @@
         this.container = (EntityContainer)container;
   
         JDBCStoreManager manager = null;
  -      try {
  -         EntityContainer entityContainer = (EntityContainer)container;
  -         CMPPersistenceManager cmpManager = 
  -               (CMPPersistenceManager)entityContainer.getPersistenceManager();
  -         manager = (JDBCStoreManager) cmpManager.getPersistenceStore();
  -      } catch(ClassCastException e) {
  -         throw new EJBException("JDBCRealtionInteceptor can only be used " +
  -               "JDBCStoreManager", e);
  +      if( container != null )
  +      {
  +         try
  +         {
  +            EntityContainer entityContainer = (EntityContainer)container;
  +            CMPPersistenceManager cmpManager = 
  +                  (CMPPersistenceManager)entityContainer.getPersistenceManager();
  +            manager = (JDBCStoreManager) cmpManager.getPersistenceStore();
  +         }
  +         catch(ClassCastException e)
  +         {
  +            throw new EJBException("JDBCRealtionInteceptor can only be used " +
  +                  "JDBCStoreManager", e);
  +         }
  +
  +         log = Logger.getLogger(
  +               this.getClass().getName() + 
  +               "." + 
  +               manager.getMetaData().getName());
         }
  -      
  -      log = Logger.getLogger(
  -            this.getClass().getName() + 
  -            "." + 
  -            manager.getMetaData().getName());
      }
      
      public Container getContainer()
  
  
  
  1.31      +266 -195  
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.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- JDBCStoreManager.java     9 Apr 2002 21:39:51 -0000       1.30
  +++ JDBCStoreManager.java     12 Apr 2002 19:30:44 -0000      1.31
  @@ -60,37 +60,38 @@
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
    * @see org.jboss.ejb.EntityPersistenceStore
  - * @version $Revision: 1.30 $
  + * @version $Revision: 1.31 $
    */
  -public class JDBCStoreManager implements EntityPersistenceStore {
  -
  +public class JDBCStoreManager implements EntityPersistenceStore
  +{
  +   
      /**
       * The key used to store the tx data map.
       */
      private static final Object TX_DATA_KEY = "TX_DATA_KEY";
  -
  -   private static final Map applicationData = 
  -         Collections.synchronizedMap(new HashMap());
  -
  +   
  +   private static final Map applicationData =
  +   Collections.synchronizedMap(new HashMap());
  +   
      private EntityContainer container;
      private Logger log;
  -
  +   
      private JDBCEntityMetaData metaData;
      private JDBCEntityBridge entityBridge;
  -
  +   
      private JDBCTypeFactory typeFactory;
      private JDBCQueryManager queryManager;
  -
  +   
      private JDBCCommandFactory commandFactory;
  -
  +   
      private ReadAheadCache readAheadCache;
  -
  +   
      // Manager life cycle commands
      private JDBCInitCommand initCommand;
      private JDBCStartCommand startCommand;
      private JDBCStopCommand stopCommand;
      private JDBCDestroyCommand destroyCommand;
  -
  +   
      // Entity life cycle commands
      private JDBCCreateBeanClassInstanceCommand createBeanClassInstanceCommand;
      private JDBCInitEntityCommand initEntityCommand;
  @@ -103,217 +104,253 @@
      private JDBCStoreEntityCommand storeEntityCommand;
      private JDBCActivateEntityCommand activateEntityCommand;
      private JDBCPassivateEntityCommand passivateEntityCommand;
  -
  +   
      // commands
      private JDBCLoadRelationCommand loadRelationCommand;
      private JDBCDeleteRelationsCommand deleteRelationsCommand;
      private JDBCInsertRelationsCommand insertRelationsCommand;
  -
  +   
      /**
       * A Transaction manager so that we can link preloaded data to a transaction
       */
      private TransactionManager tm;
  -
  +   
      /**
       * Gets the container for this entity.
       * @return the container for this entity; null if container has not been set
       */
  -   public EntityContainer getContainer() {
  +   public EntityContainer getContainer()
  +   {
         return container;
      }
  -
  +   
      /**
       * Sets the container for this entity.
       * @param container the container for this entity
  -    * @throws ClassCastException if the container is not an instance of 
  +    * @throws ClassCastException if the container is not an instance of
       * EntityContainer
       */
  -   public void setContainer(Container container) {
  -      this.container = (EntityContainer)container;
  -      this.log = Logger.getLogger(
  -            this.getClass().getName() + 
  -            "." + 
  -            container.getBeanMetaData().getEjbName());
  +   public void setContainer(Container container)
  +   {
  +      this.container = (EntityContainer) container;
  +      if( container != null )
  +      {
  +         String categoryName = this.getClass().getName() +
  +            "." + container.getBeanMetaData().getEjbName();
  +         this.log = Logger.getLogger(categoryName);
  +      }
      }
  - 
  -   public JDBCEntityBridge getEntityBridge() {
  +
  +   public JDBCEntityBridge getEntityBridge()
  +   {
         return entityBridge;
      }
  -
  -   public JDBCTypeFactory getJDBCTypeFactory() {
  +   
  +   public JDBCTypeFactory getJDBCTypeFactory()
  +   {
         return typeFactory;
      }
  -
  -   public JDBCEntityMetaData getMetaData() {
  +   
  +   public JDBCEntityMetaData getMetaData()
  +   {
         return metaData;
      }
  -
  -   public JDBCQueryManager getQueryManager() {
  +   
  +   public JDBCQueryManager getQueryManager()
  +   {
         return queryManager;
      }
  -
  -   public JDBCCommandFactory getCommandFactory() {
  +   
  +   public JDBCCommandFactory getCommandFactory()
  +   {
         return commandFactory;
      }
      
  -   public ReadAheadCache getReadAheadCache() {
  +   public ReadAheadCache getReadAheadCache()
  +   {
         return readAheadCache;
      }
      
      //
      // Genertic data containers
      //
  -   public Map getApplicationDataMap() {
  +   public Map getApplicationDataMap()
  +   {
         return applicationData;
      }
  -
  -   public Object getApplicationData(Object key) {
  +   
  +   public Object getApplicationData(Object key)
  +   {
         return applicationData.get(key);
      }
  -
  -   public void putApplicationData(Object key, Object value) {
  +   
  +   public void putApplicationData(Object key, Object value)
  +   {
         applicationData.put(key, value);
      }
  -
  -   public void removeApplicationData(Object key) {
  +   
  +   public void removeApplicationData(Object key)
  +   {
         applicationData.remove(key);
      }
  -
  -   public Map getApplicationTxDataMap() {
  -      try {
  +   
  +   public Map getApplicationTxDataMap()
  +   {
  +      try
  +      {
            Transaction tx = tm.getTransaction();
  -      
  +         
            // get the map between the tx and the txDataMap
            Map txMap = (Map)getApplicationData(TX_DATA_KEY);
  -         synchronized(txMap) {
  +         synchronized(txMap)
  +         {
               // get the txDataMap from the txMap
               Map txDataMap = (Map)txMap.get(tx);
  -
  +            
               // do we have an existing map
               int status = tx.getStatus();
  -            if(txDataMap == null && 
  -                  (status == Status.STATUS_ACTIVE ||
  -                  status == Status.STATUS_PREPARING)) {
  -
  +            if(txDataMap == null &&
  +            (status == Status.STATUS_ACTIVE ||
  +            status == Status.STATUS_PREPARING))
  +            {
  +               
                  // We want to be notified when the transaction commits
  -               ApplicationTxDataSynchronization synch = 
  -                     new ApplicationTxDataSynchronization(tx);
  +               ApplicationTxDataSynchronization synch =
  +               new ApplicationTxDataSynchronization(tx);
                  tx.registerSynchronization(synch);
  -
  +               
                  // create and add the new map
                  txDataMap = new HashMap();
                  txMap.put(tx, txDataMap);
               }
               return txDataMap;
            }
  -      } catch(EJBException e) {
  +      } catch(EJBException e)
  +      {
            throw e;
  -      } catch(Exception e) {
  +      } catch(Exception e)
  +      {
            throw new EJBException("Error getting application tx data map.", e);
         }
      }
  -
  -   public Object getApplicationTxData(Object key) {
  +   
  +   public Object getApplicationTxData(Object key)
  +   {
         Map map = getApplicationTxDataMap();
  -      if(map != null) {
  +      if(map != null)
  +      {
            return map.get(key);
         }
         return null;
      }
  -
  -   public void putApplicationTxData(Object key, Object value) {
  +   
  +   public void putApplicationTxData(Object key, Object value)
  +   {
         Map map = getApplicationTxDataMap();
  -      if(map != null) {
  +      if(map != null)
  +      {
            map.put(key, value);
         }
      }
  -
  -   public void removeApplicationTxData(Object key) {
  +   
  +   public void removeApplicationTxData(Object key)
  +   {
         Map map = getApplicationTxDataMap();
  -      if(map != null) {
  +      if(map != null)
  +      {
            map.remove(key);
         }
      }
  -
  -   public Map getEntityTxDataMap() {
  +   
  +   public Map getEntityTxDataMap()
  +   {
         Map entityTxDataMap = (Map)getApplicationTxData(this);
  -      if(entityTxDataMap == null) {
  +      if(entityTxDataMap == null)
  +      {
            entityTxDataMap = new HashMap();
            putApplicationTxData(this, entityTxDataMap);
         }
         return entityTxDataMap;
      }
  -
  -   public Object getEntityTxData(Object key) {
  +   
  +   public Object getEntityTxData(Object key)
  +   {
         return getEntityTxDataMap().get(key);
      }
  -
  -   public void putEntityTxData(Object key, Object value) {
  +   
  +   public void putEntityTxData(Object key, Object value)
  +   {
         getEntityTxDataMap().put(key, value);
      }
  -
  -   public void removeEntityTxData(Object key) {
  +   
  +   public void removeEntityTxData(Object key)
  +   {
         getEntityTxDataMap().remove(key);
      }
  -
  -   private void initApplicationDataMap() {
  -      synchronized(applicationData) {
  +   
  +   private void initApplicationDataMap()
  +   {
  +      synchronized(applicationData)
  +      {
            Map txDataMap = (Map)getApplicationData(TX_DATA_KEY);
  -         if(txDataMap == null) {
  +         if(txDataMap == null)
  +         {
               txDataMap = new HashMap();
               putApplicationData(TX_DATA_KEY, txDataMap);
            }
         }
      }
  -
  +   
      //
      // Store Manager Life Cycle Commands
      //
  -   public void create() throws Exception {
  +   public void create() throws Exception
  +   {
         log.debug("Initializing CMP plugin for " +
  -                container.getBeanMetaData().getEjbName());
  -
  +      container.getBeanMetaData().getEjbName());
  +      
         // initializes the generic data containers
         initApplicationDataMap();
  -
  +      
         // load the metadata for this entity
         metaData = loadJDBCEntityMetaData();
  -
  +      
         // get the transaction manager
         tm = container.getTransactionManager();
  -
  +      
         // setup the type factory, which is used to map java types to sql types.
         typeFactory = new JDBCTypeFactory(
  -            metaData.getTypeMapping(), 
  -            metaData.getJDBCApplication().getValueClasses());
  -
  +      metaData.getTypeMapping(),
  +      metaData.getJDBCApplication().getValueClasses());
  +      
         // create the bridge between java land and this engine (sql land)
         entityBridge = new JDBCEntityBridge(metaData, this);
  -
  +      
         // add the entity bridge to the catalog
         Catalog catalog = (Catalog)getApplicationData("CATALOG");
  -      if(catalog == null) {
  +      if(catalog == null)
  +      {
            catalog = new Catalog();
            putApplicationData("CATALOG", catalog);
         }
         catalog.addEntity(entityBridge);
  -
  +      
         // create the read ahead cache
         readAheadCache = new ReadAheadCache(this);
         readAheadCache.create();
  -
  +      
         // Set up Commands
         commandFactory = new JDBCCommandFactory(this);
  -
  +      
         // Create store manager life cycle commands
         initCommand = commandFactory.createInitCommand();
         startCommand = commandFactory.createStartCommand();
         stopCommand = commandFactory.createStopCommand();
         destroyCommand = commandFactory.createDestroyCommand();
  -
  +      
         /// Create ejb life cycle commands
  -      createBeanClassInstanceCommand = 
  -            commandFactory.createCreateBeanClassInstanceCommand();
  +      createBeanClassInstanceCommand =
  +      commandFactory.createCreateBeanClassInstanceCommand();
         initEntityCommand = commandFactory.createInitEntityCommand();
         findEntityCommand = commandFactory.createFindEntityCommand();
         findEntitiesCommand = commandFactory.createFindEntitiesCommand();
  @@ -324,19 +361,20 @@
         storeEntityCommand = commandFactory.createStoreEntityCommand();
         activateEntityCommand = commandFactory.createActivateEntityCommand();
         passivateEntityCommand = commandFactory.createPassivateEntityCommand();
  -
  +      
         loadRelationCommand = commandFactory.createLoadRelationCommand();
         deleteRelationsCommand = commandFactory.createDeleteRelationsCommand();
         insertRelationsCommand = commandFactory.createInsertRelationsCommand();
  -
  +      
         // Create the query manager
         queryManager = new JDBCQueryManager(this);
  -
  +      
         // Execute the init Command
         initCommand.execute();
      }
  -
  -   public void start() throws Exception {
  +   
  +   public void start() throws Exception
  +   {
         startCommand.execute();
         
         // Start the query manager. At this point is creates all of the
  @@ -347,26 +385,30 @@
         
         readAheadCache.start();
      }
  -
  -   public void stop() {
  +   
  +   public void stop()
  +   {
         // On deploy errors, sometimes CMPStoreManager was never initialized!
  -      if(stopCommand != null) { 
  +      if(stopCommand != null)
  +      {
            stopCommand.execute();
         }
  -
  +      
         readAheadCache.stop();
      }
  -
  -   public void destroy() {
  +   
  +   public void destroy()
  +   {
         // On deploy errors, sometimes CMPStoreManager was never initialized!
  -      if(destroyCommand != null) {
  +      if(destroyCommand != null)
  +      {
            destroyCommand.execute();
         }
  -
  +      
         readAheadCache.destroy();
         readAheadCache = null;
      }
  -
  +   
      //
      // EJB Life Cycle Commands
      //
  @@ -375,163 +417,189 @@
       *
       * @return the new instance
       */
  -   public Object createBeanClassInstance() throws Exception {
  +   public Object createBeanClassInstance() throws Exception
  +   {
         return createBeanClassInstanceCommand.execute();
      }
  -
  -   public void initEntity(EntityEnterpriseContext ctx) {
  +   
  +   public void initEntity(EntityEnterpriseContext ctx)
  +   {
         initEntityCommand.execute(ctx);
      }
  -
  +   
      public Object createEntity(
  -         Method createMethod,
  -         Object[] args,
  -         EntityEnterpriseContext ctx) throws CreateException {
  -
  +   Method createMethod,
  +   Object[] args,
  +   EntityEnterpriseContext ctx) throws CreateException
  +   {
  +      
         Object pk = createEntityCommand.execute(createMethod, args, ctx);
  -
  +      
         // mark the entity as created
         entityBridge.setCreated(ctx);
  -
  +      
         return pk;
      }
  -
  +   
      public Object findEntity(
  -         Method finderMethod,
  -         Object[] args,
  -         EntityEnterpriseContext ctx) throws FinderException {
  -
  +   Method finderMethod,
  +   Object[] args,
  +   EntityEnterpriseContext ctx) throws FinderException
  +   {
  +      
         return findEntityCommand.execute(finderMethod, args, ctx);
      }
  -
  +   
      public FinderResults findEntities(
  -         Method finderMethod,
  -         Object[] args,
  -         EntityEnterpriseContext ctx) throws FinderException {
  +   Method finderMethod,
  +   Object[] args,
  +   EntityEnterpriseContext ctx) throws FinderException
  +   {
         return findEntitiesCommand.execute(finderMethod, args, ctx);
      }
  -
  -   public void activateEntity(EntityEnterpriseContext ctx) {
  +   
  +   public void activateEntity(EntityEnterpriseContext ctx)
  +   {
         activateEntityCommand.execute(ctx);
      }
  -
  -   public void loadEntity(EntityEnterpriseContext ctx) {
  +   
  +   public void loadEntity(EntityEnterpriseContext ctx)
  +   {
         // is any on the data already in the entity valid
  -      if(!ctx.isValid()) {
  -         if(log.isTraceEnabled()) {
  +      if(!ctx.isValid())
  +      {
  +         if(log.isTraceEnabled())
  +         {
               log.trace("RESET PERSISTENCE CONTEXT: id="+ctx.getId());
            }
            entityBridge.resetPersistenceContext(ctx);
         }
  -
  -      // mark the entity as created; if it was loading it was created 
  +      
  +      // mark the entity as created; if it was loading it was created
         entityBridge.setCreated(ctx);
  -
  +      
         loadEntityCommand.execute(ctx);
      }
  -
  +   
      public void loadField(
  -         JDBCCMPFieldBridge field, EntityEnterpriseContext ctx) {
  -
  +   JDBCCMPFieldBridge field, EntityEnterpriseContext ctx)
  +   {
  +      
         loadEntityCommand.execute(field, ctx);
      }
  -
  -   public boolean isModified(EntityEnterpriseContext ctx) {
  +   
  +   public boolean isModified(EntityEnterpriseContext ctx)
  +   {
         return isModifiedCommand.execute(ctx);
      }
  -
  -   public void storeEntity(EntityEnterpriseContext ctx) {
  +   
  +   public void storeEntity(EntityEnterpriseContext ctx)
  +   {
         storeEntityCommand.execute(ctx);
         synchronizeRelationData();
      }
  -
  -   private void synchronizeRelationData() {
  +   
  +   private void synchronizeRelationData()
  +   {
         Map txData = getApplicationTxDataMap();
  -      if(txData == null) {
  +      if(txData == null)
  +      {
            return;
         }
  -
  +      
         Iterator iterator = txData.values().iterator();
  -      while(iterator.hasNext()) {
  +      while(iterator.hasNext())
  +      {
            Object obj = iterator.next();
  -         if(obj instanceof RelationData) {
  +         if(obj instanceof RelationData)
  +         {
               RelationData relationData = (RelationData) obj;
  -               
  +            
               // only need to bother if neither side has a foreign key
               if(!relationData.getLeftCMRField().hasForeignKey() &&
  -            !relationData.getRightCMRField().hasForeignKey()) {
  -                  
  +            !relationData.getRightCMRField().hasForeignKey())
  +            {
  +               
                  // delete all removed pairs from relation table
                  deleteRelations(relationData);
  -                  
  +               
                  // insert all added pairs into the relation table
                  insertRelations(relationData);
  -                  
  +               
                  relationData.addedRelations.clear();
                  relationData.removedRelations.clear();
                  relationData.notRelatedPairs.clear();
               }
            }
         }
  -   }   
  -
  -   public void passivateEntity(EntityEnterpriseContext ctx) {
  +   }
  +   
  +   public void passivateEntity(EntityEnterpriseContext ctx)
  +   {
         passivateEntityCommand.execute(ctx);
      }
  -
  +   
      public void removeEntity(EntityEnterpriseContext ctx)
  -         throws RemoveException {
  +   throws RemoveException
  +   {
         removeEntityCommand.execute(ctx);
      }
  -
  +   
      //
      // Relationship Commands
      //
  -   public Collection loadRelation(JDBCCMRFieldBridge cmrField, Object pk) {
  +   public Collection loadRelation(JDBCCMRFieldBridge cmrField, Object pk)
  +   {
         return loadRelationCommand.execute(cmrField, pk);
      }
  -
  -   public void deleteRelations(RelationData relationData) {
  +   
  +   public void deleteRelations(RelationData relationData)
  +   {
         deleteRelationsCommand.execute(relationData);
      }
  -
  -   public void insertRelations(RelationData relationData) {  
  +   
  +   public void insertRelations(RelationData relationData)
  +   {
         insertRelationsCommand.execute(relationData);
      }
  -
  -   private JDBCEntityMetaData loadJDBCEntityMetaData() 
  -         throws DeploymentException {
  -
  -      ApplicationMetaData amd = 
  -            container.getBeanMetaData().getApplicationMetaData();
  -
  +   
  +   private JDBCEntityMetaData loadJDBCEntityMetaData()
  +   throws DeploymentException
  +   {
  +      
  +      ApplicationMetaData amd =
  +      container.getBeanMetaData().getApplicationMetaData();
  +      
         // Get JDBC MetaData
  -      JDBCApplicationMetaData jamd = 
  -            (JDBCApplicationMetaData)amd.getPluginData("CMP-JDBC");
  -
  -      if (jamd == null) {
  -         // we are the first cmp entity to need jbosscmp-jdbc. 
  +      JDBCApplicationMetaData jamd =
  +      (JDBCApplicationMetaData)amd.getPluginData("CMP-JDBC");
  +      
  +      if (jamd == null)
  +      {
  +         // we are the first cmp entity to need jbosscmp-jdbc.
            // Load jbosscmp-jdbc.xml for the whole application
            JDBCXmlFileLoader jfl = new JDBCXmlFileLoader(
  -               amd, 
  -               container.getClassLoader(),
  -               container.getLocalClassLoader(),
  -               log);
  -
  +         amd,
  +         container.getClassLoader(),
  +         container.getLocalClassLoader(),
  +         log);
  +         
            jamd = jfl.load();
            amd.addPluginData("CMP-JDBC", jamd);
         }
  -
  +      
         // Get JDBC Bean MetaData
         String ejbName = container.getBeanMetaData().getEjbName();
         JDBCEntityMetaData metadata = jamd.getBeanByEjbName(ejbName);
  -      if(metadata == null) {
  +      if(metadata == null)
  +      {
            throw new DeploymentException("No metadata found for bean " + ejbName);
         }
         return metadata;
      }
  -
  -   private class ApplicationTxDataSynchronization implements Synchronization {
  +   
  +   private class ApplicationTxDataSynchronization implements Synchronization
  +   {
         /**
          *  The transaction we follow.
          */
  @@ -544,20 +612,23 @@
         {
            this.tx = tx;
         }
  - 
  +      
         /**
          * Unused
          */
  -      public void beforeCompletion() {
  +      public void beforeCompletion()
  +      {
            //no-op
         }
  -
  +      
         /**
          * Free-up any data associated with this transaction.
          */
  -      public void afterCompletion(int status) {
  +      public void afterCompletion(int status)
  +      {
            Map txMap = (Map)getApplicationData(TX_DATA_KEY);
  -         synchronized(txMap) {
  +         synchronized(txMap)
  +         {
               txMap.remove(tx);
            }
         }
  
  
  

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

Reply via email to