[jboss-user] [JBoss Microcontainer Development] New message: "Re: Activating OnDemand beans from child controller"

Kabir Khan do-not-reply at jboss.com
Thu Jan 14 15:13:07 EST 2010


User development,

A new message was posted in the thread "Activating OnDemand beans from child controller":

http://community.jboss.org/message/520168#520168

Author  : Kabir Khan
Profile : http://community.jboss.org/people/kabir.khan@jboss.com

Message:
--------------------------------------------------------------
The messages you added to avoid the errors shown in the dev list post now get triggered for contexts that have been uninstalled. As you can see I modified them a bit. If I have an OnDemand bean called Bean1 and Bean2 and Bean3 depend on it, then if I 
-uninstall Bean2
-when uninstalling Bean3 I get an error message when checking Bean3's dependencies. It finds Bean1 and then checks Bean1's DependsOnMe. The message I get is "Could not find reverse dependency 'Name2' while uninstalling on demand contexts for AbstractDependencyItem at 6c3c9c31{name=Name3 dependsOn=Name1 whenRequired=Configured resolved=true}"
 
   protected void uninstallUnusedOnDemandContexts(ControllerContext context, boolean trace)
   {
      lockWrite();
      try
      {
         DependencyInfo dependencies = context.getDependencyInfo();
         if (dependencies != null)
         {
            Set<DependencyItem> iDependOn = dependencies.getIDependOn(null);
            if (iDependOn.isEmpty() == false)
            {
               for (DependencyItem item : iDependOn)
               {
                  if (item.isResolved()) //TODO Is this check necessary
                  {
                     Object name = item.getIDependOn();
                     if (name == null)
                        continue;
   
                     ControllerContext other = getContext(name, null);
                     if (other == null)
                     {
                        log.warn("Could not find dependency '" + name + "' while uninstalling on demand contexts for " + item);
                        continue;
                     }
                     if (other.getMode() != ControllerMode.ON_DEMAND)
                        continue;
   
                     DependencyInfo otherDependencies = other.getDependencyInfo();
                     if (otherDependencies == null)
                        continue;
                     
                     Set<DependencyItem> dependsOnOther = otherDependencies.getDependsOnMe(null);
                     boolean isRequired = false;
                     for (DependencyItem dependsOnOtherItem : dependsOnOther)
                     {
                        ControllerContext dependsContext = getContext(dependsOnOtherItem.getName(), null);
                        if (dependsContext == null)
                        {
                           log.warn("Could not find reverse dependency '" + dependsOnOtherItem.getName() + "' while uninstalling on demand contexts for " + item);
                           continue;
                        }
                        
                        ControllerState requiredState = item.getWhenRequired();
                        ControllerState actualState = dependsContext.getState();
                        
                        if (requiredState.equals(actualState) || stateModel.isBeforeState(requiredState, actualState))
                        {
                           isRequired = true;
                           break;
                        }
                     }
                     if (!isRequired)
                     {
                        //For some reason uninstallContext() uninstalls to the state below the passed in one, add one
                        ControllerState state = stateModel.getNextState(ControllerMode.ON_DEMAND.getRequiredState());
                        uninstallContext(other, state, trace);
                     }
                  }
               }
            }
         }
      }
      finally
      {
         unlockWrite();
      }
   }
 
 

 
This simple test shows that DependsOnMe never gets cleared:
 
public class DependsOnMeTestCase extends AbstractDependencyTest
{
   public DependsOnMeTestCase(String name)
   {
      super(name);
   }
 
   public void testDependsOnMeCorrectOrder() throws Throwable
   {
      ControllerContext context1 = assertInstall(getDelegate1());
      assertEmpty(context1.getDependencyInfo().getIDependOn(null));
      assertEmpty(context1.getDependencyInfo().getDependsOnMe(null));
      
      ControllerContext context2 = assertInstall(getDelegate2());
      assertEmpty(context2.getDependencyInfo().getDependsOnMe(null));
      assertEquals(1, context2.getDependencyInfo().getIDependOn(null).size());
      assertEquals("Name1", context2.getDependencyInfo().getIDependOn(null).iterator().next().getIDependOn());
      
      assertEmpty(context1.getDependencyInfo().getIDependOn(null));
      assertEquals(1, context1.getDependencyInfo().getDependsOnMe(null).size());
      assertEquals("Name1", context1.getDependencyInfo().getDependsOnMe(null).iterator().next().getIDependOn());
   }
   
   public void testDependsOnMeWrongOrder() throws Throwable
   {
      ControllerContext context2 = assertInstall(getDelegate2(), ControllerState.PRE_INSTALL);
      assertEmpty(context2.getDependencyInfo().getDependsOnMe(null));
      assertEquals(1, context2.getDependencyInfo().getIDependOn(null).size());
      assertEquals("Name1", context2.getDependencyInfo().getIDependOn(null).iterator().next().getIDependOn());
      
      ControllerContext context1 = assertInstall(getDelegate1());
      assertEmpty(context1.getDependencyInfo().getIDependOn(null));
      assertEquals(1, context1.getDependencyInfo().getDependsOnMe(null).size());
      assertEquals("Name1", context1.getDependencyInfo().getDependsOnMe(null).iterator().next().getIDependOn());
 
      assertEmpty(context2.getDependencyInfo().getDependsOnMe(null));
      assertEquals(1, context2.getDependencyInfo().getIDependOn(null).size());
      assertEquals("Name1", context2.getDependencyInfo().getIDependOn(null).iterator().next().getIDependOn());
   }
   
   public void testDependsOnMeUninstallRightOrder() throws Throwable
   {
      ControllerContext context1 = assertInstall(getDelegate1());
      assertEmpty(context1.getDependencyInfo().getIDependOn(null));
      assertEmpty(context1.getDependencyInfo().getDependsOnMe(null));
      
      ControllerContext context2 = assertInstall(getDelegate2());
      assertEmpty(context2.getDependencyInfo().getDependsOnMe(null));
      assertEquals(1, context2.getDependencyInfo().getIDependOn(null).size());
      assertEquals("Name1", context2.getDependencyInfo().getIDependOn(null).iterator().next().getIDependOn());
      
      assertEmpty(context1.getDependencyInfo().getIDependOn(null));
      assertEquals(1, context1.getDependencyInfo().getDependsOnMe(null).size());
      assertEquals("Name1", context1.getDependencyInfo().getDependsOnMe(null).iterator().next().getIDependOn());
      
      assertUninstall(context2);
      assertEmpty(context2.getDependencyInfo().getDependsOnMe(null));
      assertEquals(1, context2.getDependencyInfo().getIDependOn(null).size());
      assertEquals("Name1", context2.getDependencyInfo().getIDependOn(null).iterator().next().getIDependOn());
 
      context1 = assertContext("Name1", ControllerState.INSTALLED);
      assertEmpty(context1.getDependencyInfo().getIDependOn(null));
      assertEmpty(context1.getDependencyInfo().getDependsOnMe(null));  // FAILS - dependsOnMe still contains Name2
   }
   
   
   protected TestDelegate getDelegate1()
   {
      return new TestDelegate("Name1");
   }
   
   protected TestDelegate getDelegate2()
   {
      TestDelegate result = new TestDelegate("Name2");
      result.addDependency(new AbstractDependencyItem("Name2", "Name1", ControllerState.DESCRIBED, ControllerState.INSTALLED));
      return result;
   }
 
}
 
 


--------------------------------------------------------------

To reply to this message visit the message page: http://community.jboss.org/message/520168#520168




More information about the jboss-user mailing list