hammett     2004/04/17 20:31:31

  Modified:    avalon-net/Castle/MicroKernel
                        Apache.Avalon.Castle.MicroKernel.csproj
                        AssemblyInfo.cs AvalonKernel.cs DefaultKernel.cs
                        MicroKernel.sln
               avalon-net/Castle/MicroKernel/Assemble Assembler.cs
               avalon-net/Castle/MicroKernel/Concerns ConcernManager.cs
               avalon-net/Castle/MicroKernel/Factory/Default
                        ConcernChainComponentFactory.cs
                        SimpleComponentFactory.cs
               avalon-net/Castle/MicroKernel/Handler AbstractHandler.cs
               avalon-net/Castle/MicroKernel/Handler/Default
                        DefaultHandler.cs
               avalon-net/Castle/MicroKernel/Lifestyle/Default
                        SimpleLifestyleManagerFactory.cs
                        TransientLifestyleManager.cs
               avalon-net/Castle/MicroKernel/Model/Default
                        DefaultComponentModel.cs
                        DefaultComponentModelBuilder.cs
               avalon-net/Castle/MicroKernel/Model IComponentModel.cs
  Added:       avalon-net/Castle/MicroKernel TODO.txt
               avalon-net/Castle/MicroKernel/Concerns
                        IDestructionConcern.cs
               avalon-net/Castle/MicroKernel/Concerns/Default
                        DestructionConcern.cs
               avalon-net/Castle/MicroKernel/Factory/Default
                        ComponentInstanceBurden.cs
               avalon-net/Castle/MicroKernel/Lifestyle/Default
                        AbstractLifestyleManager.cs
                        PerThreadLifestyleManager.cs
                        SingletonLifestyleManager.cs
               avalon-net/Castle/MicroKernel/Avalon/Configuration/Default
                        AvalonConfigurationSectionHandler.cs
                        ContainerConfiguration.cs
                        DefaultConfigurationManager.cs
               avalon-net/Castle/MicroKernel/Avalon/Configuration
                        IConfigurationManager.cs
               avalon-net/Castle/MicroKernel/Avalon/Context/Default
                        ContextManager.cs
               avalon-net/Castle/MicroKernel/Avalon/Context
                        IContextManager.cs
               avalon-net/Castle/MicroKernel/Avalon/Logger/Default
                        LoggerManager.cs
               avalon-net/Castle/MicroKernel/Avalon/Logger
                        ILoggerManager.cs
               avalon-net/Castle/MicroKernel/Lifestyle
                        UnsupportedLifestyleException.cs
  Log:
  Corrections, support for Configuration. Need to implement support for Context 
and Loggers.
  
  Revision  Changes    Path
  1.5       +75 -0     
avalon-sandbox/avalon-net/Castle/MicroKernel/Apache.Avalon.Castle.MicroKernel.csproj
  
  Index: Apache.Avalon.Castle.MicroKernel.csproj
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/avalon-net/Castle/MicroKernel/Apache.Avalon.Castle.MicroKernel.csproj,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Apache.Avalon.Castle.MicroKernel.csproj   3 Apr 2004 23:16:34 -0000       
1.4
  +++ Apache.Avalon.Castle.MicroKernel.csproj   18 Apr 2004 03:31:31 -0000      
1.5
  @@ -149,6 +149,46 @@
                       BuildAction = "Compile"
                   />
                   <File
  +                    RelPath = "Avalon\Configuration\IConfigurationManager.cs"
  +                    SubType = "Code"
  +                    BuildAction = "Compile"
  +                />
  +                <File
  +                    RelPath = 
"Avalon\Configuration\Default\AvalonConfigurationSectionHandler.cs"
  +                    SubType = "Code"
  +                    BuildAction = "Compile"
  +                />
  +                <File
  +                    RelPath = 
"Avalon\Configuration\Default\ContainerConfiguration.cs"
  +                    SubType = "Code"
  +                    BuildAction = "Compile"
  +                />
  +                <File
  +                    RelPath = 
"Avalon\Configuration\Default\DefaultConfigurationManager.cs"
  +                    SubType = "Code"
  +                    BuildAction = "Compile"
  +                />
  +                <File
  +                    RelPath = "Avalon\Context\IContextManager.cs"
  +                    SubType = "Code"
  +                    BuildAction = "Compile"
  +                />
  +                <File
  +                    RelPath = "Avalon\Context\Default\ContextManager.cs"
  +                    SubType = "Code"
  +                    BuildAction = "Compile"
  +                />
  +                <File
  +                    RelPath = "Avalon\Logger\ILoggerManager.cs"
  +                    SubType = "Code"
  +                    BuildAction = "Compile"
  +                />
  +                <File
  +                    RelPath = "Avalon\Logger\Default\LoggerManager.cs"
  +                    SubType = "Code"
  +                    BuildAction = "Compile"
  +                />
  +                <File
                       RelPath = "Concerns\ConcernManager.cs"
                       SubType = "Code"
                       BuildAction = "Compile"
  @@ -174,6 +214,11 @@
                       BuildAction = "Compile"
                   />
                   <File
  +                    RelPath = "Concerns\IDestructionConcern.cs"
  +                    SubType = "Code"
  +                    BuildAction = "Compile"
  +                />
  +                <File
                       RelPath = "Concerns\Default\AbstractConcern.cs"
                       SubType = "Code"
                       BuildAction = "Compile"
  @@ -194,6 +239,11 @@
                       BuildAction = "Compile"
                   />
                   <File
  +                    RelPath = "Concerns\Default\DestructionConcern.cs"
  +                    SubType = "Code"
  +                    BuildAction = "Compile"
  +                />
  +                <File
                       RelPath = "Concerns\Default\EnableLoggerConcern.cs"
                       SubType = "Code"
                       BuildAction = "Compile"
  @@ -224,6 +274,11 @@
                       BuildAction = "Compile"
                   />
                   <File
  +                    RelPath = "Factory\Default\ComponentInstanceBurden.cs"
  +                    SubType = "Code"
  +                    BuildAction = "Compile"
  +                />
  +                <File
                       RelPath = 
"Factory\Default\ConcernChainComponentFactory.cs"
                       SubType = "Code"
                       BuildAction = "Compile"
  @@ -289,7 +344,27 @@
                       BuildAction = "Compile"
                   />
                   <File
  +                    RelPath = "Lifestyle\UnsupportedLifestyleException.cs"
  +                    SubType = "Code"
  +                    BuildAction = "Compile"
  +                />
  +                <File
  +                    RelPath = "Lifestyle\Default\AbstractLifestyleManager.cs"
  +                    SubType = "Code"
  +                    BuildAction = "Compile"
  +                />
  +                <File
  +                    RelPath = 
"Lifestyle\Default\PerThreadLifestyleManager.cs"
  +                    SubType = "Code"
  +                    BuildAction = "Compile"
  +                />
  +                <File
                       RelPath = 
"Lifestyle\Default\SimpleLifestyleManagerFactory.cs"
  +                    SubType = "Code"
  +                    BuildAction = "Compile"
  +                />
  +                <File
  +                    RelPath = 
"Lifestyle\Default\SingletonLifestyleManager.cs"
                       SubType = "Code"
                       BuildAction = "Compile"
                   />
  
  
  
  1.3       +4 -4      
avalon-sandbox/avalon-net/Castle/MicroKernel/AssemblyInfo.cs
  
  Index: AssemblyInfo.cs
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/avalon-net/Castle/MicroKernel/AssemblyInfo.cs,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- AssemblyInfo.cs   31 Mar 2004 03:45:08 -0000      1.2
  +++ AssemblyInfo.cs   18 Apr 2004 03:31:31 -0000      1.3
  @@ -15,12 +15,12 @@
   using System.Reflection;
   using System.Runtime.CompilerServices;
   
  -[assembly: AssemblyTitle("AvalonFramework")]
  -[assembly: AssemblyDescription("Avalon Framework defines the lifecycle 
interfaces and contracts that all components must obey.")]
  +[assembly: AssemblyTitle("Apache.Avalon.Castle.MicroKernel")]
  +[assembly: AssemblyDescription("Apache.Avalon.Castle.MicroKernel")]
   [assembly: AssemblyConfiguration("")]
   [assembly: AssemblyCompany("Apache Software Foundation")]
  -[assembly: AssemblyProduct("Avalon Framework")]
  -[assembly: AssemblyCopyright("Copyright (c) 2003 Apache Software 
Foundation")]
  +[assembly: AssemblyProduct("Apache.Avalon.Castle.MicroKernel")]
  +[assembly: AssemblyCopyright("Copyright (c) 2003-2004 Apache Software 
Foundation")]
   [assembly: AssemblyTrademark("")]
   [assembly: AssemblyCulture("")]              
   [assembly: AssemblyVersion("1.0.0.0")]
  
  
  
  1.2       +25 -1     
avalon-sandbox/avalon-net/Castle/MicroKernel/AvalonKernel.cs
  
  Index: AvalonKernel.cs
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/avalon-net/Castle/MicroKernel/AvalonKernel.cs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- AvalonKernel.cs   3 Apr 2004 23:03:02 -0000       1.1
  +++ AvalonKernel.cs   18 Apr 2004 03:31:31 -0000      1.2
  @@ -18,15 +18,39 @@
   
        using Apache.Avalon.Castle.MicroKernel.Concerns;
        using Apache.Avalon.Castle.MicroKernel.Model;
  +     using Apache.Avalon.Castle.MicroKernel.Configuration;
  +     using Apache.Avalon.Castle.MicroKernel.Logger;
   
        /// <summary>
  -     /// Summary description for AvalonKernel.
  +     /// Specialization of Kernel to support 
  +     /// avalon semantics
        /// </summary>
        public interface AvalonKernel : Kernel
        {
  +             /// <summary>
  +             /// Manages the concerns related to Avalon Framework
  +             /// </summary>
                ConcernManager Concerns
                {
                        get;
  +             }
  +
  +             /// <summary>
  +             /// 
  +             /// </summary>
  +             IConfigurationManager ConfigurationManager
  +             {
  +                     get;
  +                     set;
  +             }
  +
  +             /// <summary>
  +             /// 
  +             /// </summary>
  +             ILoggerManager LoggerManager
  +             {
  +                     get;
  +                     set;
                }
        }
   }
  
  
  
  1.2       +42 -0     
avalon-sandbox/avalon-net/Castle/MicroKernel/DefaultKernel.cs
  
  Index: DefaultKernel.cs
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/avalon-net/Castle/MicroKernel/DefaultKernel.cs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultKernel.cs  3 Apr 2004 23:03:02 -0000       1.1
  +++ DefaultKernel.cs  18 Apr 2004 03:31:31 -0000      1.2
  @@ -18,6 +18,8 @@
   
        using Apache.Avalon.Castle.MicroKernel.Concerns;
        using Apache.Avalon.Castle.MicroKernel.Model;
  +     using Apache.Avalon.Castle.MicroKernel.Configuration;
  +     using Apache.Avalon.Castle.MicroKernel.Logger;
   
        /// <summary>
        /// Specialization of BaseKernel to adhere to Avalon 
  @@ -27,6 +29,10 @@
        {
                protected ConcernManager m_concerns = new ConcernManager();
   
  +             protected IConfigurationManager m_configManager;
  +
  +             protected ILoggerManager m_loggerManager;
  +
                /// <summary>
                /// 
                /// </summary>
  @@ -38,11 +44,47 @@
   
                #region AvalonKernel Members
   
  +             /// <summary>
  +             /// Manages the concerns related
  +             /// to Avalon Framework
  +             /// </summary>
                public ConcernManager Concerns
                {
                        get
                        {
                                return m_concerns;
  +                     }
  +             }
  +
  +             /// <summary>
  +             /// 
  +             /// </summary>
  +             public IConfigurationManager ConfigurationManager
  +             {
  +                     get
  +                     {
  +                             return m_configManager;
  +                     }
  +                     set
  +                     {
  +                             AssertUtil.ArgumentNotNull( value, "value" );
  +                             m_configManager = value;
  +                     }
  +             }
  +
  +             /// <summary>
  +             /// 
  +             /// </summary>
  +             public ILoggerManager LoggerManager
  +             {
  +                     get
  +                     {
  +                             return m_loggerManager;
  +                     }
  +                     set
  +                     {
  +                             AssertUtil.ArgumentNotNull( value, "value" );
  +                             m_loggerManager = value;
                        }
                }
   
  
  
  
  1.2       +1 -1      
avalon-sandbox/avalon-net/Castle/MicroKernel/MicroKernel.sln
  
  Index: MicroKernel.sln
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/avalon-net/Castle/MicroKernel/MicroKernel.sln,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- MicroKernel.sln   31 Mar 2004 00:43:30 -0000      1.1
  +++ MicroKernel.sln   18 Apr 2004 03:31:31 -0000      1.2
  @@ -3,7 +3,7 @@
        ProjectSection(ProjectDependencies) = postProject
        EndProjectSection
   EndProject
  -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MicroKernelTest", 
"MicroKernelTest\MicroKernelTest.csproj", 
"{50442F0D-987F-4A8D-B38C-DFA855B9249E}"
  +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = 
"Apache.Avalon.Castle.MicroKernel.Test", 
"MicroKernelTest\Apache.Avalon.Castle.MicroKernel.Test.csproj", 
"{50442F0D-987F-4A8D-B38C-DFA855B9249E}"
        ProjectSection(ProjectDependencies) = postProject
        EndProjectSection
   EndProject
  
  
  
  1.1                  avalon-sandbox/avalon-net/Castle/MicroKernel/TODO.txt
  
  Index: TODO.txt
  ===================================================================
  - Add support to AvalonConfigurationAttribute
  - Add support to AvalonStageAttribute
  - Add support to AvalonExtensionAttribute
  - Add support to AvalonContextAttribute
  - Add support to AvalonEntryAttribute
  
  
  
  1.2       +8 -7      
avalon-sandbox/avalon-net/Castle/MicroKernel/Assemble/Assembler.cs
  
  Index: Assembler.cs
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/avalon-net/Castle/MicroKernel/Assemble/Assembler.cs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Assembler.cs      3 Apr 2004 23:03:02 -0000       1.1
  +++ Assembler.cs      18 Apr 2004 03:31:31 -0000      1.2
  @@ -26,7 +26,7 @@
        public delegate void ResolveTypeHandler( 
                IComponentModel model, 
                Type typeRequest, String argumentOrPropertyName, 
  -             out object value );
  +             object key, out object value );
   
        /// <summary>
        /// Summary description for Assembler.
  @@ -65,7 +65,7 @@
                /// <param name="resolver"></param>
                /// <returns></returns>
                public static object[] BuildConstructorArguments( 
  -                     IComponentModel model, ResolveTypeHandler resolver )
  +                     IComponentModel model, object key, ResolveTypeHandler 
resolver )
                {
                        AssertUtil.ArgumentNotNull( model, "model" );
                        AssertUtil.ArgumentNotNull( resolver, "resolver" );
  @@ -79,7 +79,7 @@
                                Type service = parameter.ParameterType;
                                String argumentName = parameter.Name;
                                
  -                             object value = Resolve( model, service, 
argumentName, resolver );
  +                             object value = Resolve( model, service, 
argumentName, key, resolver );
                                
                                args[ parameter.Position ] = value;
                        }
  @@ -87,7 +87,8 @@
                        return args;                    
                }
   
  -             public static void AssembleProperties( object instance, 
IComponentModel model, ResolveTypeHandler resolver )
  +             public static void AssembleProperties( object instance, 
IComponentModel model, 
  +                     object key, ResolveTypeHandler resolver )
                {
                        AssertUtil.ArgumentNotNull( model, "model" );
                        AssertUtil.ArgumentNotNull( resolver, "resolver" );
  @@ -97,7 +98,7 @@
                                Type service = property.PropertyType;
                                String propertyName = property.Name;
   
  -                             object value = Resolve( model, service, 
propertyName, resolver );
  +                             object value = Resolve( model, service, 
propertyName, key, resolver );
   
                                if (value != null)
                                {
  @@ -116,7 +117,7 @@
                /// <returns></returns>
                private static object Resolve( 
                        IComponentModel model, Type type, 
  -                     String argumentOrPropertyName, ResolveTypeHandler 
resolver  )
  +                     String argumentOrPropertyName, object key, 
ResolveTypeHandler resolver  )
                {
                        if (IsLogger( type ))
                        {
  @@ -133,7 +134,7 @@
   
                        object value = null;
   
  -                     resolver( model, type, argumentOrPropertyName, out 
value );
  +                     resolver( model, type, argumentOrPropertyName, key, out 
value );
   
                        return value;
                }
  
  
  
  1.2       +8 -0      
avalon-sandbox/avalon-net/Castle/MicroKernel/Concerns/ConcernManager.cs
  
  Index: ConcernManager.cs
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/avalon-net/Castle/MicroKernel/Concerns/ConcernManager.cs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ConcernManager.cs 3 Apr 2004 23:03:02 -0000       1.1
  +++ ConcernManager.cs 18 Apr 2004 03:31:31 -0000      1.2
  @@ -26,6 +26,8 @@
        {
                private Type m_creationConcern;
   
  +             private Type m_destructionConcern;
  +
                private ArrayList m_commissionConcerns = new ArrayList();
   
                private ArrayList m_decommissionConcerns = new ArrayList();
  @@ -44,6 +46,7 @@
                        Add( typeof(InitializeConcern) );
                        Add( typeof(StartConcern) );
                        Add( typeof(ShutdownConcern) );
  +                     Add( typeof(DestructionConcern) );
                }
   
                public void Add( Type concern )
  @@ -54,6 +57,10 @@
                        {
                                m_creationConcern = concern;
                        }
  +                     else if ( 
typeof(IDestructionConcern).IsAssignableFrom(concern) )
  +                     {
  +                             m_destructionConcern = concern;
  +                     }
                        else if ( 
typeof(ICommissionConcern).IsAssignableFrom(concern) )
                        {
                                m_commissionConcerns.Add( concern );
  @@ -108,6 +115,7 @@
                public IConcern GetDecommissionChain( Kernel kernel )
                {
                        ArrayList concerns = new ArrayList( 
m_decommissionConcerns );
  +                     concerns.Add( m_destructionConcern );
                        Type[] concernTypes = (Type[]) concerns.ToArray( 
typeof(Type) );
                        Array.Reverse( concernTypes );
   
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Concerns/IDestructionConcern.cs
  
  Index: IDestructionConcern.cs
  ===================================================================
  // Copyright 2004 The Apache Software Foundation
  // 
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // 
  //     http://www.apache.org/licenses/LICENSE-2.0
  // 
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  namespace Apache.Avalon.Castle.MicroKernel.Concerns
  {
        using System;
  
        using Apache.Avalon.Castle.MicroKernel.Model;
  
        /// <summary>
        /// Summary description for IDestructionConcern.
        /// </summary>
        public interface IDestructionConcern : IDecommissionConcern
        {
                void Apply( IComponentModel model, IComponentFactory factory, 
object instance );
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Concerns/Default/DestructionConcern.cs
  
  Index: DestructionConcern.cs
  ===================================================================
  // Copyright 2004 The Apache Software Foundation
  // 
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // 
  //     http://www.apache.org/licenses/LICENSE-2.0
  // 
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  namespace Apache.Avalon.Castle.MicroKernel.Concerns.Default
  {
        using System;
  
        using Apache.Avalon.Castle.MicroKernel.Model;
  
        /// <summary>
        /// Summary description for DestructionConcern.
        /// </summary>
        public class DestructionConcern : AbstractConcern, IDestructionConcern
        {
                public DestructionConcern(IConcern next) : base(next)
                {
                }
  
                #region IDestructionConcern Members
  
                public void Apply(IComponentModel model, IComponentFactory 
factory, 
                        object instance)
                {
                        factory.Etherialize( instance );
                }
  
                #endregion
        }
  }
  
  
  
  1.2       +19 -0     
avalon-sandbox/avalon-net/Castle/MicroKernel/Factory/Default/ConcernChainComponentFactory.cs
  
  Index: ConcernChainComponentFactory.cs
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/avalon-net/Castle/MicroKernel/Factory/Default/ConcernChainComponentFactory.cs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ConcernChainComponentFactory.cs   3 Apr 2004 23:03:03 -0000       1.1
  +++ ConcernChainComponentFactory.cs   18 Apr 2004 03:31:31 -0000      1.2
  @@ -60,6 +60,25 @@
                public void Etherialize( object instance )
                {
                        m_decomissionChain.Apply( m_model, instance );
  +
  +                     IDecommissionConcern concern = (IDecommissionConcern) 
m_decomissionChain;
  +
  +                     while( true )
  +                     {
  +                             if (concern is IDestructionConcern)
  +                             {
  +                                     (concern as IDestructionConcern).Apply( 
m_model, m_innerFactory, instance );
  +                                     break;
  +                             }
  +                             
  +                             concern = concern.Next as IDecommissionConcern;
  +
  +                             if (concern == null)
  +                             {
  +                                     // IDestructionConcern not found?
  +                                     break;
  +                             }
  +                     }
                }
   
                #endregion
  
  
  
  1.2       +41 -12    
avalon-sandbox/avalon-net/Castle/MicroKernel/Factory/Default/SimpleComponentFactory.cs
  
  Index: SimpleComponentFactory.cs
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/avalon-net/Castle/MicroKernel/Factory/Default/SimpleComponentFactory.cs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SimpleComponentFactory.cs 3 Apr 2004 23:03:03 -0000       1.1
  +++ SimpleComponentFactory.cs 18 Apr 2004 03:31:31 -0000      1.2
  @@ -31,6 +31,7 @@
                protected IAspect[] m_after;
                protected IComponentModel m_componentModel;
                protected Hashtable m_serv2handler;
  +             private Hashtable m_instances = new Hashtable();
   
                public SimpleComponentFactory( IAspect[] before, IAspect[] 
after, 
                        IComponentModel componentModel,
  @@ -53,7 +54,9 @@
                {
                        try
                        {
  -                             object[] arguments = BuildArguments();
  +                             ComponentInstanceBurden burden = new 
ComponentInstanceBurden();
  +
  +                             object[] arguments = BuildArguments(burden);
   
                                Object instance = Activator.CreateInstance( 
m_componentModel.ConstructionModel.Implementation, arguments );
   
  @@ -64,7 +67,9 @@
                                                new 
Aspects.AspectInvocationHandler( m_before, m_after, instance ) ); 
                                }
   
  -                             SetupProperties( instance );
  +                             SetupProperties( instance, burden );
  +
  +                             AssociateBurden( instance, burden );
   
                                return instance;
                        }
  @@ -76,27 +81,51 @@
   
                public virtual void Etherialize( object instance )
                {
  -                     // TODO: Obtain InstanceGarbageHolder and release it
  -                     // See below (ResolveType)
  +                     if (instance == null)
  +                     {
  +                             return;
  +                     }
  +
  +                     ReleaseBurden( instance );
                }
   
                #endregion
   
  -             protected virtual object[] BuildArguments()
  +             private void AssociateBurden( object instance, 
ComponentInstanceBurden burden )
  +             {
  +                     if ( burden.HasBurden )
  +                     {
  +                             m_instances.Add( instance, burden );
  +                     }
  +             }
  +
  +             private void ReleaseBurden( object instance )
  +             {
  +                     if (m_instances.ContainsKey( instance ))
  +                     {
  +                             ComponentInstanceBurden burden = 
  +                                     (ComponentInstanceBurden) m_instances[ 
instance ];
  +
  +                             burden.ReleaseBurden();
  +
  +                             m_instances.Remove( instance );
  +                     }
  +             }
  +
  +             protected virtual object[] 
BuildArguments(ComponentInstanceBurden burden)
                {
                        return Assembler.BuildConstructorArguments( 
  -                             m_componentModel, new ResolveTypeHandler( 
ResolveType ));
  +                             m_componentModel, burden, new 
ResolveTypeHandler( ResolveType ));
                }
   
  -             protected virtual void SetupProperties( object instance )
  +             protected virtual void SetupProperties( object instance, 
ComponentInstanceBurden burden )
                {
                        Assembler.AssembleProperties( 
  -                             instance, 
  -                             m_componentModel, new ResolveTypeHandler( 
ResolveType ));
  +                             instance, m_componentModel, burden, new 
ResolveTypeHandler( ResolveType ));
                }
   
                private void ResolveType( IComponentModel model, Type 
typeRequest, 
  -                     String argumentOrPropertyName, out object value )
  +                     String argumentOrPropertyName, object key, out object 
value )
                {
                        value = null;
   
  @@ -105,8 +134,8 @@
                                IHandler handler = (IHandler) m_serv2handler[ 
typeRequest ];
                                value = handler.Resolve();
   
  -                             // TODO: Enqueue handlers for dispose in 
Etherialize()
  -                             // Criar um InstanceGarbageHolder or something 
like that.
  +                             ComponentInstanceBurden burden = 
(ComponentInstanceBurden) key;
  +                             burden.AddBurden( value, handler );
                        }
                }
        }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Factory/Default/ComponentInstanceBurden.cs
  
  Index: ComponentInstanceBurden.cs
  ===================================================================
  // Copyright 2004 The Apache Software Foundation
  // 
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // 
  //     http://www.apache.org/licenses/LICENSE-2.0
  // 
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  namespace Apache.Avalon.Castle.MicroKernel.Factory.Default
  {
        using System;
        using System.Collections;
  
        /// <summary>
        /// ComponentInstanceBurden is responsible for keep tracking 
        /// of dependencies assembled by the container - not by 
        /// the component code - and release it correctly on disposal
        /// </summary>
        public class ComponentInstanceBurden
        {
                private ArrayList m_list = new ArrayList();
  
                public ComponentInstanceBurden()
                {
                }
  
                public void AddBurden( Object instance, IHandler handler )
                {
                        m_list.Add( new BurdenData( instance, handler ) );
                }
  
                public bool HasBurden
                {
                        get
                        {
                                return m_list.Count != 0;
                        }
                }
  
                public void ReleaseBurden()
                {
                        foreach( BurdenData data in m_list )
                        {
                                data.Handler.Release( data.Instance );
                        }
  
                        m_list.Clear();
                }
        }
  
        class BurdenData 
        {
                private object m_instance;
                private IHandler m_handler;
  
                public BurdenData( object instance, IHandler handler )
                {
                        AssertUtil.ArgumentNotNull( instance, "instance" );
                        AssertUtil.ArgumentNotNull( handler, "handler" );
  
                        m_instance = instance;
                        m_handler = handler;
                }
  
                public object Instance
                {
                        get
                        {
                                return m_instance;
                        }
                }
  
                public IHandler Handler
                {
                        get
                        {
                                return m_handler;
                        }
                }
        }
  }
  
  
  
  1.2       +11 -10    
avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/AbstractHandler.cs
  
  Index: AbstractHandler.cs
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/AbstractHandler.cs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- AbstractHandler.cs        3 Apr 2004 23:18:17 -0000       1.1
  +++ AbstractHandler.cs        18 Apr 2004 03:31:31 -0000      1.2
  @@ -109,9 +109,9 @@
                {
                        if (!HasInstance( instance, false ))
                        {
  -                             WeakReference reference = new WeakReference( 
instance );
  -
  -                             m_instances.Add( reference );
  +                             // WeakReference reference = new WeakReference( 
instance );
  +                             // m_instances.Add( reference );
  +                             m_instances.Add( instance );
                        }
                }
   
  @@ -127,18 +127,19 @@
   
                protected virtual bool HasInstance( object instance, bool 
removeIfFound )
                {
  -                     foreach( WeakReference reference in m_instances )
  +                     // foreach( WeakReference reference in m_instances )
  +                     foreach( object storedInstance in m_instances )
                        {
  -                             if (reference.Target == null)
  -                             {
  -                                     m_instances.Remove( reference );
  -                             }
  +                             // if (reference.Target == null)
  +                             // {
  +                             //      m_instances.Remove( reference );
  +                             // }
   
  -                             if ( Object.ReferenceEquals( instance, 
reference.Target ) )
  +                             if ( Object.ReferenceEquals( instance, 
storedInstance /*reference.Target*/ ) )
                                {
                                        if (removeIfFound)
                                        {
  -                                             m_instances.Remove( reference );
  +                                             m_instances.Remove( instance );
                                        }
   
                                        return true;
  
  
  
  1.2       +0 -1      
avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/Default/DefaultHandler.cs
  
  Index: DefaultHandler.cs
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/Default/DefaultHandler.cs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultHandler.cs 3 Apr 2004 23:18:17 -0000       1.1
  +++ DefaultHandler.cs 18 Apr 2004 03:31:31 -0000      1.2
  @@ -55,6 +55,5 @@
                                m_kernel.LifestyleManagerFactory.Create( 
                                        innerFactory, m_componentModel );
                }
  -
        }
   }
  
  
  
  1.2       +19 -1     
avalon-sandbox/avalon-net/Castle/MicroKernel/Lifestyle/Default/SimpleLifestyleManagerFactory.cs
  
  Index: SimpleLifestyleManagerFactory.cs
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/avalon-net/Castle/MicroKernel/Lifestyle/Default/SimpleLifestyleManagerFactory.cs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SimpleLifestyleManagerFactory.cs  3 Apr 2004 23:16:35 -0000       1.1
  +++ SimpleLifestyleManagerFactory.cs  18 Apr 2004 03:31:31 -0000      1.2
  @@ -16,6 +16,7 @@
   {
        using System;
        
  +     using Apache.Avalon.Framework;
        using Apache.Avalon.Castle.MicroKernel.Model;
   
        /// <summary>
  @@ -31,7 +32,24 @@
   
                public ILifestyleManager Create( IComponentFactory factory, 
IComponentModel model )
                {
  -                     return new TransientLifestyleManager( factory );
  +                     if (model.SupportedLifestyle == 
Apache.Avalon.Framework.Lifestyle.Singleton)
  +                     {
  +                             return new SingletonLifestyleManager( factory );
  +                     }
  +                     else if (model.SupportedLifestyle == 
Apache.Avalon.Framework.Lifestyle.Thread)
  +                     {
  +                             return new PerThreadLifestyleManager( factory );
  +                     }
  +                     else if (model.SupportedLifestyle == 
Apache.Avalon.Framework.Lifestyle.Transient)
  +                     {
  +                             return new TransientLifestyleManager( factory );
  +                     }
  +                     else
  +                     {
  +                             throw new UnsupportedLifestyleException(
  +                                     String.Format("Lifestyle requested by 
component {0} is not supported.", 
  +                                     
model.ConstructionModel.Implementation));
  +                     }
                }
   
                #endregion
  
  
  
  1.2       +2 -19     
avalon-sandbox/avalon-net/Castle/MicroKernel/Lifestyle/Default/TransientLifestyleManager.cs
  
  Index: TransientLifestyleManager.cs
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/avalon-net/Castle/MicroKernel/Lifestyle/Default/TransientLifestyleManager.cs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TransientLifestyleManager.cs      3 Apr 2004 23:16:35 -0000       1.1
  +++ TransientLifestyleManager.cs      18 Apr 2004 03:31:31 -0000      1.2
  @@ -19,27 +19,10 @@
        /// <summary>
        /// Summary description for TransientLifestyleManager.
        /// </summary>
  -     public class TransientLifestyleManager : ILifestyleManager
  +     public class TransientLifestyleManager : AbstractLifestyleManager
        {
  -             private IComponentFactory m_componentFactory;
  -
  -             public TransientLifestyleManager(IComponentFactory 
componentFactory)
  +             public TransientLifestyleManager(IComponentFactory 
componentFactory) : base(componentFactory)
                {
  -                     m_componentFactory = componentFactory;
                }
  -
  -             #region IResolver Members
  -
  -             public object Resolve()
  -             {
  -                     return m_componentFactory.Incarnate();
  -             }
  -
  -             public void Release( object instance )
  -             {
  -                     m_componentFactory.Etherialize( instance );
  -             }
  -
  -             #endregion
        }
   }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Lifestyle/Default/AbstractLifestyleManager.cs
  
  Index: AbstractLifestyleManager.cs
  ===================================================================
  // Copyright 2004 The Apache Software Foundation
  // 
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // 
  //     http://www.apache.org/licenses/LICENSE-2.0
  // 
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  namespace Apache.Avalon.Castle.MicroKernel.Lifestyle.Default
  {
        using System;
  
        /// <summary>
        /// Summary description for AbstractLifestyleManager.
        /// </summary>
        public abstract class AbstractLifestyleManager : ILifestyleManager
        {
                protected IComponentFactory m_componentFactory;
  
                public AbstractLifestyleManager(IComponentFactory 
componentFactory)
                {
                        m_componentFactory = componentFactory;
                }
  
                public virtual void Release(object instance)
                {
                        m_componentFactory.Etherialize( instance );
                }
        
                public virtual object Resolve()
                {
                        return m_componentFactory.Incarnate();
                }
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Lifestyle/Default/PerThreadLifestyleManager.cs
  
  Index: PerThreadLifestyleManager.cs
  ===================================================================
  // Copyright 2004 The Apache Software Foundation
  // 
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // 
  //     http://www.apache.org/licenses/LICENSE-2.0
  // 
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  namespace Apache.Avalon.Castle.MicroKernel.Lifestyle.Default
  {
        using System;
        using System.Collections;
        using System.Threading;
  
        /// <summary>
        /// Summary description for PerThreadLifestyleManager.
        /// </summary>
        public class PerThreadLifestyleManager : AbstractLifestyleManager
        {
                private static LocalDataStoreSlot m_slot = 
Thread.AllocateNamedDataSlot("CastlePerThread");
  
                private static IList m_instances = new ArrayList();
  
                /// <summary>
                /// 
                /// </summary>
                /// <param name="componentFactory"></param>
                public PerThreadLifestyleManager(IComponentFactory 
componentFactory) : base(componentFactory)
                {
                }
  
                /// <summary>
                /// 
                /// </summary>
                ~PerThreadLifestyleManager()
                {
                        foreach( object instance in m_instances )
                        {
                                base.Release( instance );
                        }
  
                        m_instances.Clear();
  
                        Thread.FreeNamedDataSlot( "CastlePerThread" );
                }
  
                #region IResolver Members
  
                public override object Resolve()
                {
                        lock(m_slot)
                        {
                                Hashtable map = (Hashtable) Thread.GetData( 
m_slot );
  
                                if (map == null)
                                {
                                        map = new Hashtable();
  
                                        Thread.SetData( m_slot, map );
                                }
  
                                Object instance = map[ m_componentFactory ];
  
                                if ( instance == null )
                                {
                                        instance = base.Resolve();
                                        map.Add( m_componentFactory, instance );
                                        m_instances.Add( instance );
                                }
  
                                return instance;
                        }
                }
  
                public override void Release( object instance )
                {
                        // Do nothing.
                }
  
                #endregion
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Lifestyle/Default/SingletonLifestyleManager.cs
  
  Index: SingletonLifestyleManager.cs
  ===================================================================
  // Copyright 2004 The Apache Software Foundation
  // 
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // 
  //     http://www.apache.org/licenses/LICENSE-2.0
  // 
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  namespace Apache.Avalon.Castle.MicroKernel.Lifestyle.Default
  {
        using System;
  
        /// <summary>
        /// Summary description for SingletonLifestyleManager.
        /// </summary>
        public class SingletonLifestyleManager : AbstractLifestyleManager
        {
                private Object m_instance;
  
                public SingletonLifestyleManager(IComponentFactory 
componentFactory) : base(componentFactory)
                {
                }
  
                ~SingletonLifestyleManager()
                {
                        base.Release( m_instance );
                }
  
                #region IResolver Members
  
                public override object Resolve()
                {
                        lock(m_componentFactory)
                        {
                                if (m_instance == null)
                                {
                                        m_instance = base.Resolve();
                                }
                        }
  
                        return m_instance;
                }
  
                public override void Release( object instance )
                {
                        // Do nothing
                }
  
                #endregion
        }
  }
  
  
  
  1.2       +20 -0     
avalon-sandbox/avalon-net/Castle/MicroKernel/Model/Default/DefaultComponentModel.cs
  
  Index: DefaultComponentModel.cs
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/avalon-net/Castle/MicroKernel/Model/Default/DefaultComponentModel.cs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultComponentModel.cs  3 Apr 2004 23:03:03 -0000       1.1
  +++ DefaultComponentModel.cs  18 Apr 2004 03:31:31 -0000      1.2
  @@ -25,6 +25,7 @@
        public class DefaultComponentModel : IComponentModel
        {
                private Type m_service;
  +             private String m_name;
                private Lifestyle m_lifestyle;
                private ILogger m_logger;
                private IConfiguration m_config;
  @@ -33,6 +34,7 @@
                private IConstructionModel m_constructionModel;
   
                public DefaultComponentModel(
  +                     String name,
                        Type service,
                        Lifestyle lifestyle, 
                        ILogger logger, 
  @@ -41,6 +43,7 @@
                        IDependencyModel[] dependencies, 
                        IConstructionModel constructionModel)
                {
  +                     AssertUtil.ArgumentNotNull( name, "name" );
                        AssertUtil.ArgumentNotNull( service, "service" );
                        AssertUtil.ArgumentNotNull( logger, "logger" );
                        AssertUtil.ArgumentNotNull( configuration, 
"configuration" );
  @@ -48,6 +51,7 @@
                        AssertUtil.ArgumentNotNull( dependencies, 
"dependencies" );
                        AssertUtil.ArgumentNotNull( constructionModel, 
"constructionModel" );
   
  +                     m_name = name;
                        m_service = service;
                        m_lifestyle = lifestyle;
                        m_logger = logger;
  @@ -59,6 +63,14 @@
   
                #region IComponentModel Members
   
  +             public String Name
  +             {
  +                     get
  +                     {
  +                             return m_name;
  +                     }
  +             }
  +
                public Type Service
                {
                        get
  @@ -81,6 +93,10 @@
                        {
                                return m_logger;
                        }
  +                     set
  +                     {
  +                             m_logger = value;
  +                     }
                }
   
                public IConfiguration Configuration
  @@ -88,6 +104,10 @@
                        get
                        {
                                return m_config;
  +                     }
  +                     set
  +                     {
  +                             m_config = value;
                        }
                }
   
  
  
  
  1.2       +147 -34   
avalon-sandbox/avalon-net/Castle/MicroKernel/Model/Default/DefaultComponentModelBuilder.cs
  
  Index: DefaultComponentModelBuilder.cs
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/avalon-net/Castle/MicroKernel/Model/Default/DefaultComponentModelBuilder.cs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultComponentModelBuilder.cs   3 Apr 2004 23:03:03 -0000       1.1
  +++ DefaultComponentModelBuilder.cs   18 Apr 2004 03:31:31 -0000      1.2
  @@ -36,30 +36,27 @@
   
                public IComponentModel BuildModel(String key, Type service, 
Type implementation)
                {
  -                     // TODO: This code sucks. Refactor it!
  -
  -                     ArrayList dependencies = new ArrayList();
  -
  -                     ConstructorInfo constructor = 
InspectConstructors(implementation, dependencies);
  -                     PropertyInfo[] properties = InspectSetMethods(service, 
dependencies);
  -                     InspectAvalonAttributes( implementation, dependencies );
  -
  -                     IDependencyModel[] dependenciesArray = 
  -                             (IDependencyModel[]) dependencies.ToArray( 
typeof(IDependencyModel) );
  +                     AssertUtil.ArgumentNotNull( key, "key" );
  +                     AssertUtil.ArgumentNotNull( service, "service" );
  +                     AssertUtil.ArgumentNotNull( implementation, 
"implementation" );
  +
  +                     ComponentData data = new ComponentData(implementation);
  +
  +                     InspectConstructors(data);
  +                     InspectSetMethods(service, data);
  +                     InspectAvalonAttributes(data);
   
                        IConstructionModel constructionModel = 
  -                             new DefaultConstructionModel( implementation, 
constructor, properties );
  -
  -                     // TODO: Consoler. Context and Configuration should be 
created by 
  -                     //   a separated entity - how to reach it? Kernel?
  +                             new DefaultConstructionModel( implementation, 
data.Constructor, data.PropertiesInfo );
   
                        DefaultComponentModel model = new 
DefaultComponentModel( 
  +                             data.Name,
                                service, 
  -                             Avalon.Framework.Lifestyle.Transient, 
  +                             data.SupportedLifestyle, 
                                new ConsoleLogger( service.Name, 
LoggerLevel.Debug ), 
                                new DefaultConfiguration(), 
                                new DefaultContext(), 
  -                             dependenciesArray, 
  +                             data.DependencyModel, 
                                constructionModel );
   
                        return model;
  @@ -67,20 +64,20 @@
   
                #endregion
   
  -             protected void InspectAvalonAttributes( Type implementation, 
IList dependencies )
  +             protected void InspectAvalonAttributes( ComponentData 
componentData )
                {
  -                     if (!implementation.IsDefined( 
typeof(AvalonComponentAttribute), false ))
  +                     if (!componentData.Implementation.IsDefined( 
typeof(AvalonComponentAttribute), false ))
                        {
                                return;
                        }
   
  -                     AvalonComponentAttribute componentAttribute = 
GetComponentAttribute( implementation );
  -                     AvalonLoggerAttribute loggerAttribute = 
GetLoggerAttribute( implementation );
  -                     AvalonDependencyAttribute[] dependencyAttributes = 
GetDependencyAttributes( implementation );
  +                     componentData.AvalonComponent = GetComponentAttribute( 
componentData.Implementation );
  +                     componentData.AvalonLogger = GetLoggerAttribute( 
componentData.Implementation );
  +                     AvalonDependencyAttribute[] dependencyAttributes = 
GetDependencyAttributes( componentData.Implementation );
   
                        foreach( AvalonDependencyAttribute dependency in 
dependencyAttributes )
                        {
  -                             AddDependency( dependencies, 
dependency.DependencyType, 
  +                             AddDependency( componentData.Dependencies, 
dependency.DependencyType, 
                                        dependency.Key, dependency.IsOptional );
                        }
                }
  @@ -117,11 +114,11 @@
                        return implementation.GetCustomAttributes( attribute, 
false );
                }
   
  -             protected ConstructorInfo InspectConstructors( Type 
implementation, IList dependencies )
  +             protected void InspectConstructors( ComponentData componentData 
)
                {
                        ConstructorInfo constructor = null;
   
  -                     ConstructorInfo[] constructors = 
implementation.GetConstructors();
  +                     ConstructorInfo[] constructors = 
componentData.Implementation.GetConstructors();
   
                        // TODO: Try to sort the array 
                        // by the arguments lenght in descendent order
  @@ -141,7 +138,7 @@
                                                        continue;
                                                }
   
  -                                             AddDependency( dependencies, 
parameter.ParameterType );
  +                                             AddDependency( 
componentData.Dependencies, parameter.ParameterType );
                                        }
   
                                        break;
  @@ -152,28 +149,24 @@
                        {
                                throw new ModelBuilderException( 
                                        String.Format("Handler could not find 
an eligible constructor for type {0}", 
  -                                     implementation.FullName) );
  +                                     componentData.Implementation.FullName) 
);
                        }
   
  -                     return constructor;
  +                     componentData.Constructor = constructor;
                }
   
  -             protected PropertyInfo[] InspectSetMethods( Type service, IList 
dependencies )
  +             protected void InspectSetMethods( Type service, ComponentData 
componentData )
                {
  -                     ArrayList selected = new ArrayList();
  -
                        PropertyInfo[] properties = service.GetProperties();
   
                        foreach(PropertyInfo property in properties)
                        {
                                if (IsEligible( property ))
                                {
  -                                     AddDependency( dependencies, 
property.PropertyType );
  -                                     selected.Add( property );
  +                                     AddDependency( 
componentData.Dependencies, property.PropertyType );
  +                                     componentData.Properties.Add( property 
);
                                }
                        }
  -
  -                     return (PropertyInfo[]) selected.ToArray( 
typeof(PropertyInfo) );
                }
   
                protected bool IsEligible( PropertyInfo property )
  @@ -228,6 +221,126 @@
                protected virtual void AddDependency( IList dependencies, Type 
type )
                {
                        AddDependency( dependencies, type, String.Empty, false 
);
  +             }
  +     }
  +
  +     /// <summary>
  +     /// Holds a component data during inspect phase.
  +     /// </summary>
  +     public class ComponentData
  +     {
  +             private ArrayList m_dependencies = new ArrayList();
  +             private ArrayList m_properties = new ArrayList();
  +             private ConstructorInfo m_constructor;
  +             private AvalonComponentAttribute m_componentAttribute;
  +             private AvalonLoggerAttribute m_loggerAttribute;
  +             private Type m_implementation;
  +
  +             public ComponentData( Type implementation )
  +             {
  +                     this.m_implementation = implementation;
  +             }
  +
  +             public Type Implementation
  +             {
  +                     get
  +                     {
  +                             return m_implementation;
  +                     }
  +             }
  +
  +             public IList Dependencies
  +             {
  +                     get
  +                     {
  +                             return m_dependencies;
  +                     }
  +             }
  +
  +             public IDependencyModel[] DependencyModel
  +             {
  +                     get
  +                     {
  +                             return (IDependencyModel[]) 
m_dependencies.ToArray( typeof(IDependencyModel) );
  +                     }
  +             }
  +
  +             public ConstructorInfo Constructor
  +             {
  +                     get
  +                     {
  +                             return m_constructor;
  +                     }
  +                     set
  +                     {
  +                             m_constructor = value;
  +                     }
  +             }
  +
  +             public IList Properties
  +             {
  +                     get
  +                     {
  +                             return m_properties;
  +                     }
  +             }
  +
  +             public PropertyInfo[] PropertiesInfo
  +             {
  +                     get
  +                     {
  +                             return (PropertyInfo[]) m_properties.ToArray( 
typeof(PropertyInfo) );
  +                     }
  +             }
  +
  +             public AvalonComponentAttribute AvalonComponent
  +             {
  +                     get
  +                     {
  +                             return m_componentAttribute;
  +                     }
  +                     set
  +                     {
  +                             m_componentAttribute = value;
  +                     }
  +             }
  +
  +             public AvalonLoggerAttribute AvalonLogger
  +             {
  +                     get
  +                     {
  +                             return m_loggerAttribute;
  +                     }
  +                     set
  +                     {
  +                             m_loggerAttribute = value;
  +                     }
  +             }
  +
  +             public Apache.Avalon.Framework.Lifestyle SupportedLifestyle
  +             {
  +                     get
  +                     {
  +                             if (AvalonComponent == null)
  +                             {
  +                                     return 
Apache.Avalon.Framework.Lifestyle.Transient;
  +                             }
  +
  +                             return AvalonComponent.Lifestyle;
  +                     }
  +             }
  +
  +             public String Name
  +             {
  +                     get
  +                     {
  +                             if (AvalonComponent == null)
  +                             {
  +                                     return Implementation.Name;
  +                             }
  +
  +                             return AvalonComponent.Name;
  +                     }
                }
        }
   }
  
  
  
  1.2       +11 -4     
avalon-sandbox/avalon-net/Castle/MicroKernel/Model/IComponentModel.cs
  
  Index: IComponentModel.cs
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/avalon-net/Castle/MicroKernel/Model/IComponentModel.cs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- IComponentModel.cs        3 Apr 2004 23:03:03 -0000       1.1
  +++ IComponentModel.cs        18 Apr 2004 03:31:31 -0000      1.2
  @@ -23,27 +23,34 @@
        /// </summary>
        public interface IComponentModel
        {
  +             String Name
  +             {
  +                     get;
  +             }
  +
                Lifestyle SupportedLifestyle
                {
                        get;
                }
   
  -             ILogger Logger
  +             Type Service
                {
                        get;
                }
   
  -             IConfiguration Configuration
  +             ILogger Logger
                {
                        get;
  +                     set;
                }
   
  -             IContext Context
  +             IConfiguration Configuration
                {
                        get;
  +                     set;
                }
   
  -             Type Service
  +             IContext Context
                {
                        get;
                }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Avalon/Configuration/Default/AvalonConfigurationSectionHandler.cs
  
  Index: AvalonConfigurationSectionHandler.cs
  ===================================================================
  // Copyright 2004 The Apache Software Foundation
  // 
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // 
  //     http://www.apache.org/licenses/LICENSE-2.0
  // 
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  namespace Apache.Avalon.Castle.MicroKernel.Configuration.Default
  {
        using System;
        using System.Configuration;
        using System.Xml;
  
        /// <summary>
        /// Implementation of <see 
cref="System.Configuration.IConfigurationSectionHandler"/>
        /// to allow natural mapping of a section in the configuration file 
associated with an 
        /// AppDomain to a <see cref="ContainerConfiguration"/>.
        /// </summary>
        public class AvalonConfigurationSectionHandler : 
IConfigurationSectionHandler
        {
                /// <summary>
                /// The static name of the section in the configuration file.
                /// </summary>
                private static readonly String SECTION_NAME = 
"castle.container";
  
                public AvalonConfigurationSectionHandler()
                {
                }
  
                /// <summary>
                /// Returns the default name of the section in the
                /// configuration file.
                /// </summary>
                internal static String Section
                {
                        get
                        {
                                return SECTION_NAME;
                        }
                }
  
                #region IConfigurationSectionHandler Members
  
                /// <summary>
                /// Invoke by Configuration API - Should return any object 
represeting the
                /// actual configuration
                /// </summary>
                /// <param name="parent">If hierarquical configuration is being 
used, 
                /// a non-null ContainerConfiguration to be overrided.
                /// </param>
                /// <param name="configContext">API specific.</param>
                /// <param name="section">The <see cref="XmlNode"/> to be 
parsed.</param>
                /// <returns>A ContainerConfiguration instance.</returns>
                public object Create(object parent, object configContext, 
XmlNode section)
                {
                        return new ContainerConfiguration(
                                (ContainerConfiguration) parent, section);
                }
  
                #endregion
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Avalon/Configuration/Default/ContainerConfiguration.cs
  
  Index: ContainerConfiguration.cs
  ===================================================================
  // Copyright 2004 The Apache Software Foundation
  // 
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // 
  //     http://www.apache.org/licenses/LICENSE-2.0
  // 
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  namespace Apache.Avalon.Castle.MicroKernel.Configuration.Default
  {
        using System;
        using System.Xml;
        using System.IO;
  
        using Apache.Avalon.Framework;
  
        /// <summary>
        /// Keeps the container configuration.
        /// </summary>
        public class ContainerConfiguration
        {
                private IConfiguration m_configuration;
  
                /// <summary>
                /// Constructs a ContainerConfiguration with an optional parent.
                /// </summary>
                /// <param name="parent">The ContainerConfiguration parent. Can 
be null</param>
                public ContainerConfiguration(ContainerConfiguration parent)
                {
                }
  
                /// <summary>
                /// Constructs a ContainerConfiguration with an optional parent.
                /// </summary>
                /// <param name="parent">The ContainerConfiguration parent. Can 
be null</param>
                /// <param name="section">XmlNode to be parsed.</param>
                public ContainerConfiguration(ContainerConfiguration parent, 
XmlNode section) : this( parent )
                {
                        if ( section == null )
                        {
                                throw new ArgumentNullException( "section" );
                        }
  
                        Deserialize( section );
                }
  
                /// <summary>
                /// Constructs a ContainerConfiguration with the
                /// <see cref="XmlNode"/> to be parsed.
                /// </summary>
                /// <param name="parent">The ContainerConfiguration parent. Can 
be null</param>
                /// <param name="section">XmlNode to be parsed.</param>
                public ContainerConfiguration(XmlNode section) : this(null, 
section)
                {
                }
  
                /// <summary>
                /// Constructs a ContainerConfiguration with the filename 
containing
                /// the xml to be parsed.
                /// </summary>
                /// <param name="filename">The filename to be parsed.</param>
                public ContainerConfiguration(String filename) : this(null as 
ContainerConfiguration)
                {
                        ParseFromFile(filename);
                }
  
                /// <summary>
                /// Parses a configuration file. Looks for a node 
                /// 'configuration/avalon.container'
                /// </summary>
                /// <param name="filename">The xml full file name</param>
                private void ParseFromFile(String filename)
                {
                        XmlTextReader reader = new XmlTextReader(
                                new FileStream(filename, FileMode.Open, 
FileAccess.Read));
  
                        XmlDocument doc = new XmlDocument() ;
                        doc.Load(reader);
  
                        XmlNode avalonNode = 
                                doc.SelectSingleNode("configuration/" + 
AvalonConfigurationSectionHandler.Section);
  
                        Deserialize( avalonNode );
                }
  
                /// <summary>
                /// 
                /// </summary>
                /// <param name="section"></param>
                private void Deserialize( XmlNode section )
                {
                        m_configuration = 
DefaultConfigurationSerializer.Deserialize( section );
                }
  
                /// <summary>
                /// 
                /// </summary>
                public IConfiguration Configuration
                {
                        get
                        {
                                return m_configuration;
                        }
                }
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Avalon/Configuration/Default/DefaultConfigurationManager.cs
  
  Index: DefaultConfigurationManager.cs
  ===================================================================
  // Copyright 2004 The Apache Software Foundation
  // 
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // 
  //     http://www.apache.org/licenses/LICENSE-2.0
  // 
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  namespace Apache.Avalon.Castle.MicroKernel.Configuration.Default
  {
        using System;
        using System.Configuration;
  
        using Apache.Avalon.Framework;
        using Apache.Avalon.Castle.MicroKernel.Model;
        using Apache.Avalon.Castle.MicroKernel.Configuration;
  
        /// <summary>
        /// The default implementation of IConfigurationManager uses the 
        /// .config associated with the AppDomain to extract the components
        /// configurations
        /// </summary>
        public class DefaultConfigurationManager : IConfigurationManager
        {
                protected ContainerConfiguration m_config;
  
                public DefaultConfigurationManager()
                {
                        m_config = (ContainerConfiguration) 
ConfigurationSettings.GetConfig( 
                                AvalonConfigurationSectionHandler.Section );
                }
  
                #region IConfigurationManager Members
  
                public IConfiguration GetConfiguration( String componentName )
                {
                        AssertUtil.ArgumentNotNull( componentName, 
"componentName" );
  
                        return m_config.Configuration.GetChild( componentName, 
true );
                }
  
                #endregion
        }
  }
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Avalon/Configuration/IConfigurationManager.cs
  
  Index: IConfigurationManager.cs
  ===================================================================
  // Copyright 2004 The Apache Software Foundation
  // 
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // 
  //     http://www.apache.org/licenses/LICENSE-2.0
  // 
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  namespace Apache.Avalon.Castle.MicroKernel.Configuration
  {
        using System;
  
        using Apache.Avalon.Framework;
        using Apache.Avalon.Castle.MicroKernel.Model;
  
        /// <summary>
        /// Summary description for IConfigurationManager.
        /// </summary>
        public interface IConfigurationManager
        {
                /// <summary>
                /// Implementation should return a configuration for 
                /// the component.
                /// </summary>
                /// <param name="model"></param>
                /// <returns></returns>
                IConfiguration GetConfiguration( String componentName );
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Avalon/Context/Default/ContextManager.cs
  
  Index: ContextManager.cs
  ===================================================================
  // Copyright 2004 The Apache Software Foundation
  // 
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // 
  //     http://www.apache.org/licenses/LICENSE-2.0
  // 
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  namespace Apache.Avalon.Castle.MicroKernel.Context.Default
  {
        using System;
  
        using Apache.Avalon.Framework;
  
        /// <summary>
        /// Summary description for ContextManager.
        /// </summary>
        public class ContextManager : IContextManager
        {
                public ContextManager()
                {
                }
  
                #region IContextManager Members
  
                public IContext CreateContext()
                {
                        return null;
                }
  
                #endregion
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Avalon/Context/IContextManager.cs
  
  Index: IContextManager.cs
  ===================================================================
  // Copyright 2004 The Apache Software Foundation
  // 
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // 
  //     http://www.apache.org/licenses/LICENSE-2.0
  // 
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  namespace Apache.Avalon.Castle.MicroKernel.Context
  {
        using System;
  
        using Apache.Avalon.Framework;
  
        /// <summary>
        /// Summary description for IContextManager.
        /// </summary>
        public interface IContextManager
        {
                IContext CreateContext();
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Avalon/Logger/Default/LoggerManager.cs
  
  Index: LoggerManager.cs
  ===================================================================
  // Copyright 2004 The Apache Software Foundation
  // 
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // 
  //     http://www.apache.org/licenses/LICENSE-2.0
  // 
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  namespace Apache.Avalon.Castle.MicroKernel.Logger.Default
  {
        using System;
  
        using Apache.Avalon.Framework;
  
        /// <summary>
        /// Summary description for LoggerManager.
        /// </summary>
        public class LoggerManager : ILoggerManager
        {
                public LoggerManager()
                {
                }
  
                #region ILoggerManager Members
  
                public ILogger CreateLogger(String loggerName, String 
implementationName, AvalonLoggerAttribute loggerAtt)
                {
                        return null;
                }
  
                #endregion
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Avalon/Logger/ILoggerManager.cs
  
  Index: ILoggerManager.cs
  ===================================================================
  // Copyright 2004 The Apache Software Foundation
  // 
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // 
  //     http://www.apache.org/licenses/LICENSE-2.0
  // 
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  namespace Apache.Avalon.Castle.MicroKernel.Logger
  {
        using System;
  
        using Apache.Avalon.Framework;
        using Apache.Avalon.Castle.MicroKernel.Model;
  
        /// <summary>
        /// Summary description for ILoggerManager.
        /// </summary>
        public interface ILoggerManager
        {
                ILogger CreateLogger( String loggerName, String 
implementationName, AvalonLoggerAttribute loggerAtt );
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Lifestyle/UnsupportedLifestyleException.cs
  
  Index: UnsupportedLifestyleException.cs
  ===================================================================
  // Copyright 2004 The Apache Software Foundation
  // 
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // 
  //     http://www.apache.org/licenses/LICENSE-2.0
  // 
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  namespace Apache.Avalon.Castle.MicroKernel.Lifestyle
  {
        using System;
  
        /// <summary>
        /// Summary description for UnsupportedLifestyleException.
        /// </summary>
        [Serializable]
        public class UnsupportedLifestyleException : System.Exception
        {
                public UnsupportedLifestyleException()
                {
                }
  
                public UnsupportedLifestyleException(String message) : 
base(message)
                {
                }
        }
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to