1 2 3 Previous Next 41 Replies Latest reply on Aug 28, 2006 10:12 AM by adrian.brock Go to original post
      • 30. Re: Bean instantiate order with contextual injection
        alesj

        I've added TypeProvider interface - to help me with determinig the class type of injectee in describeVisit method.

        public interface TypeProvider
        {
        
         Class getType(MetaDataVisitor visitor);
        
        }
        


        There are certain classes (ParameterMD, MapMD, ...) that have String value of the injectee class - if this value is set that's what we are looking for, else we go down the stack.
        But how to get the actual class - where to get ClassLoader?

        • 31. Re: Bean instantiate order with contextual injection
          alesj

          Found it. :-)

           KernelControllerContext context = visitor.getControllerContext();
           ClassLoader cl = Configurator.getClassLoader(context.getBeanMetaData());
          


          • 32. Re: Bean instantiate order with contextual injection
            alesj

            Ok, this is legit:

            <property name="foos"><list><inject/><list/></property>
            


            Is there a way to get list's element class type - if defined by generics?

            • 33. Re: Bean instantiate order with contextual injection

              There is, but it is a seperate task to genercize the BeanInfo/ClassInfo:

              example:

              package test;
              
              import java.lang.reflect.Method;
              import java.lang.reflect.ParameterizedType;
              import java.lang.reflect.Type;
              import java.util.List;
              
              public class Test
              {
               public List<String> getSomething()
               {
               return null;
               }
              
               public static void main(String[] args) throws Exception
               {
               Class<?> test = Test.class;
               Method getSomething = test.getMethod("getSomething", new Class[0]);
               ParameterizedType type = (ParameterizedType) getSomething.getGenericReturnType();
               for (Type t : type.getActualTypeArguments())
               System.out.println(((Class) t).getName());
               }
              }
              


              • 34. Re: Bean instantiate order with contextual injection

                There is also another feature request on collections
                where it uses any preconstructed collection
                rather than creating a new one.
                http://jira.jboss.com/jira/browse/JBMICROCONT-35

                public class MyClass
                {
                 private List<String> list;
                
                 public List<String> getList();
                }
                
                <property name="list"><list><value>...</value><list></property>
                


                i.e. this will do
                getList() and if it is not null, it will add to the list
                rather than overwriting it.

                • 35. Re: Bean instantiate order with contextual injection

                   

                  "alesj" wrote:

                  But how to get the actual class - where to get ClassLoader?


                  Why do you need the classloader? You should be using the
                  BeanInfo/TypeInfo.

                  • 36. Re: Bean instantiate order with contextual injection
                    alesj

                     

                    "adrian@jboss.org" wrote:
                    "alesj" wrote:

                    But how to get the actual class - where to get ClassLoader?


                    Why do you need the classloader? You should be using the
                    BeanInfo/TypeInfo.


                    What's the use of BeanInfo/TypeInfo when I need an actual class from parameters type definition / collections element class type definition / map's value type definition?

                    Isn't
                    KernelControllerContext context = visitor.getControllerContext();
                     ClassLoader cl = Configurator.getClassLoader(context.getBeanMetaData());
                    KernelConfiguration configuration
                    
                    KernelConfigurator.getClassInfo(String className, ClassLoader cl) throws Throwable;
                    

                    what results in what I want, if className exists?

                    What's the deal with ClassContextKernelRegistryPlugin?
                    Where to register/define it, so it doesn't 'polute' AbstractKernelController?



                    • 37. Re: Bean instantiate order with contextual injection
                      alesj

                      Another issue:

                       <bean name="testObject5" class="org.jboss.test.kernel.inject.support.PropertyInjectTestObject">
                       <property name="map">
                       <map>
                       <entry >
                       <key>test</key>
                       <value class="org.jboss.test.kernel.inject.support.TesterInterface"><inject/></value>
                       </entry>
                       </map>
                       </property>
                       </bean>
                      
                       public Class getType(MetaDataVisitor visitor, MetaDataVisitorNode previous) throws Throwable
                       {
                       // where did I come from ... key or value
                       for(MetaDataVisitorNode key : keySet())
                       {
                       if (previous.equals(key) && keyType != null)
                       {
                       return getClass(visitor, keyType);
                       }
                       }
                       for(MetaDataVisitorNode v : values())
                       {
                       if (previous.equals(v) && valueType != null)
                       {
                       return getClass(visitor, valueType);
                       }
                       }
                       return super.getType(visitor, this);
                       }
                      
                      


                      But the thing is that MD values seem to get cloned ... so we never actually get equality.

                      In that Constructor factory + inject problem we should probably set dependency item's whenRequired to earlier state ... will that do it?

                      Ok, off to the sea. :-)

                      • 38. Re: Bean instantiate order with contextual injection
                        alesj

                         

                        "alesj" wrote:
                        But the thing is that MD values seem to get cloned ... so we never actually get equality.


                        Uf, my wrong (key != keyClass) - it works now - don't know what I was looking :-(.


                        • 39. Re: Bean instantiate order with contextual injection

                          One thing you are missing is an "uninstall" part of the describe process
                          that removes the class references from the dependencies.

                          Otherwise you're going to cause a memory leak:

                          controllerContext -> dependencyInfo -> dependency -> class -> undeployed classloader -> memory leak

                          • 40. Re: Bean instantiate order with contextual injection
                            alesj

                             

                            "adrian@jboss.org" wrote:
                            One thing you are missing is an "uninstall" part of the describe process
                            that removes the class references from the dependencies.

                            Otherwise you're going to cause a memory leak:

                            controllerContext -> dependencyInfo -> dependency -> class -> undeployed classloader -> memory leak


                            Where to do this 'uninstall'?

                            Ok, when class dependency gets resolved, iDependOn (demandClass) is set with context name.

                            Probably simple adding of
                             public void unresolved(Controller controller)
                             {
                             setIDependOn(null);
                             super.unresolved(controller);
                             }
                            

                            won't do the trick entirely.

                            Should I iterate through DependencyInfo.getIDependOn(ClassContextDependencyItem.class) when context.beanInfo is set to null in DescribeAction.uninstallAction?

                            • 41. Re: Bean instantiate order with contextual injection

                              Correct.

                              1 2 3 Previous Next