hammett     2004/04/03 15:18:17

  Added:       avalon-net/Castle/MicroKernel/Handler AbstractHandler.cs
                        HandlerException.cs IHandler.cs IHandlerFactory.cs
                        State.cs
               avalon-net/Castle/MicroKernel/Handler/Default
                        DefaultHandler.cs DefaultHandlerFactory.cs
                        SimpleHandler.cs SimpleHandlerFactory.cs
  Log:
  MicroKernel for Avalon Castle - Improvements.
  
  Revision  Changes    Path
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/AbstractHandler.cs
  
  Index: AbstractHandler.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.Handler
  {
        using System;
        using System.Collections;
  
        using Apache.Avalon.Castle.MicroKernel.Model;
  
        /// <summary>
        /// Summary description for AbstractHandler.
        /// </summary>
        public abstract class AbstractHandler : IHandler
        {
                protected Kernel m_kernel;
  
                protected IComponentModel m_componentModel;
  
                protected State m_state = State.Valid;
  
                protected ArrayList m_dependencies = new ArrayList();
  
                protected Hashtable m_serv2handler = new Hashtable();
  
                protected ILifestyleManager m_lifestyleManager;
  
                private ArrayList m_instances = new ArrayList();
  
                /// <summary>
                /// 
                /// </summary>
                /// <param name="service"></param>
                /// <param name="implementation"></param>
                public AbstractHandler( IComponentModel model )
                {
                        AssertUtil.ArgumentNotNull( model, "model" );
  
                        m_componentModel = model;
                }
  
                #region IHandler Members
  
                public virtual void Init( Kernel kernel )
                {
                        m_kernel = kernel;
                }
  
                public virtual object Resolve()
                {
                        if (m_state == State.WaitingDependency)
                        {
                                throw new HandlerException("Can't Resolve 
component. It has dependencies to be satisfied.");
                        }
  
                        try
                        {
                                object instance = m_lifestyleManager.Resolve();
  
                                RegisterInstance( instance );
  
                                return instance;
                        }
                        catch(Exception ex)
                        {
                                throw new HandlerException("Exception while 
attempting to instantiate type", ex);
                        }
                }
  
                public virtual void Release( object instance )
                {
                        if ( IsOwner(instance) )
                        {
                                UnregisterInstance( instance );
                                m_lifestyleManager.Release( instance );
                        }
                }
  
                public virtual bool IsOwner( object instance )
                {
                        return HasInstance( instance, false );
                }
  
                /// <summary>
                /// 
                /// </summary>
                public virtual State ActualState
                {
                        get
                        {
                                return m_state;
                        }
                }
  
                #endregion
  
                protected virtual void RegisterInstance( object instance )
                {
                        if (!HasInstance( instance, false ))
                        {
                                WeakReference reference = new WeakReference( 
instance );
  
                                m_instances.Add( reference );
                        }
                }
  
                protected virtual void UnregisterInstance( object instance )
                {
                        if (m_instances.Count == 0)
                        {
                                return;
                        }
  
                        HasInstance( instance, true );
                }
  
                protected virtual bool HasInstance( object instance, bool 
removeIfFound )
                {
                        foreach( WeakReference reference in m_instances )
                        {
                                if (reference.Target == null)
                                {
                                        m_instances.Remove( reference );
                                }
  
                                if ( Object.ReferenceEquals( instance, 
reference.Target ) )
                                {
                                        if (removeIfFound)
                                        {
                                                m_instances.Remove( reference );
                                        }
  
                                        return true;
                                }
                        }
  
                        return false;
                }
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/HandlerException.cs
  
  Index: HandlerException.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.Handler
  {
        using System;
  
        /// <summary>
        /// Summary description for HandlerException.
        /// </summary>
        [Serializable]
        public class HandlerException : System.Exception
        {
                public HandlerException( String message ) : base(message)
                {
                }
  
                public HandlerException( String message, Exception ex ) : 
base(message, ex)
                {
                }
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/IHandler.cs
  
  Index: IHandler.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
  {
        using System;
  
        /// <summary>
        /// Summary description for IHandler.
        /// </summary>
        public interface IHandler : IResolver
        {
                /// <summary>
                /// 
                /// </summary>
                /// <param name="kernel"></param>
                void Init( Kernel kernel );
  
                /// <summary>
                /// 
                /// </summary>
                State ActualState
                {
                        get;
                }
  
                /// <summary>
                /// 
                /// </summary>
                /// <param name="instance"></param>
                /// <returns></returns>
                bool IsOwner( object instance );
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/IHandlerFactory.cs
  
  Index: IHandlerFactory.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
  {
        using System;
  
        using Apache.Avalon.Castle.MicroKernel.Model;
  
        /// <summary>
        /// Summary description for IHandlerFactory.
        /// </summary>
        public interface IHandlerFactory
        {
                IHandler CreateHandler( IComponentModel model );
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/State.cs
  
  Index: State.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
  {
        using System;
  
        /// <summary>
        /// Summary description for State.
        /// </summary>
        public enum State
        {
                /// <summary>
                /// 
                /// </summary>
                Valid,
                /// <summary>
                /// 
                /// </summary>
                WaitingDependency
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/Default/DefaultHandler.cs
  
  Index: DefaultHandler.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.Handler.Default
  {
        using System;
  
        using Apache.Avalon.Castle.MicroKernel.Model;
        using Apache.Avalon.Castle.MicroKernel.Concerns;
        using Apache.Avalon.Castle.MicroKernel.Factory.Default;
  
        /// <summary>
        /// Summary description for DefaultHandler.
        /// </summary>
        public class DefaultHandler : SimpleHandler
        {
                public DefaultHandler( IComponentModel model ) : base( model )
                {
                }
  
                protected override void 
CreateComponentFactoryAndLifestyleManager()
                {
                        IComponentFactory innerFactory = new 
Factory.Default.SimpleComponentFactory( 
                                
m_kernel.GetAspects(AspectPointCutFlags.Before), 
                                m_kernel.GetAspects(AspectPointCutFlags.After), 
                                m_componentModel, m_serv2handler);
  
                        if (m_kernel is AvalonKernel)
                        {
                                AvalonKernel kernel = (AvalonKernel) m_kernel;
  
                                IConcern commissionChain = 
kernel.Concerns.GetCommissionChain( kernel );
                                IConcern decommissionChain = 
kernel.Concerns.GetDecommissionChain( kernel );
  
                                ConcernChainComponentFactory factory = 
                                        new ConcernChainComponentFactory( 
                                                commissionChain, 
decommissionChain, 
                                                m_componentModel, innerFactory 
);
  
                                innerFactory = factory;
                        }
  
                        m_lifestyleManager = 
                                m_kernel.LifestyleManagerFactory.Create( 
                                        innerFactory, m_componentModel );
                }
  
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/Default/DefaultHandlerFactory.cs
  
  Index: DefaultHandlerFactory.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.Handler.Default
  {
        using System;
  
        using Apache.Avalon.Castle.MicroKernel.Model;
  
        /// <summary>
        /// Summary description for DefaultHandlerFactory.
        /// </summary>
        public class DefaultHandlerFactory : IHandlerFactory
        {
                public DefaultHandlerFactory()
                {
                }
  
                #region IHandlerFactory Members
  
                public virtual IHandler CreateHandler( IComponentModel model )
                {
                        return new DefaultHandler( model );
                }
  
                #endregion
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/Default/SimpleHandler.cs
  
  Index: SimpleHandler.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.Handler.Default
  {
        using System;
        using System.Collections;
        using System.Reflection;
  
        using Apache.Avalon.Castle.MicroKernel.Model;
  
        /// <summary>
        /// Summary description for SimpleHandler.
        /// </summary>
        public class SimpleHandler : AbstractHandler
        {
                /// <summary>
                /// 
                /// </summary>
                /// <param name="service"></param>
                /// <param name="implementation"></param>
                public SimpleHandler( IComponentModel model ) : base( model )
                {
                }
  
                #region IHandler Members
  
                public override void Init( Kernel kernel )
                {
                        base.Init(kernel);
  
                        // Now we check with the kernel if 
                        // we have the necessary implementations 
                        // for the services requested by the constructor
  
                        EnsureDependenciesCanBeSatisfied();
                        CreateComponentFactoryAndLifestyleManager();
                }
  
                #endregion
  
                protected virtual void EnsureDependenciesCanBeSatisfied()
                {
                        foreach(IDependencyModel dependency in 
m_componentModel.Dependencies )
                        {
                                AddDependency( dependency.Service );
                        }
                }
  
                protected virtual void AddDependency( Type service )
                {
                        if (m_kernel.HasService( service ))
                        {
                                m_serv2handler[ service ] = 
m_kernel.GetHandlerForService( service );
                        }
                        else
                        {
                                // This is handler is considered invalid
                                // until dependencies are satisfied
                                m_state = State.WaitingDependency;
                                m_dependencies.Add( service );
                                                
                                // Register ourself in the kernel
                                // to be notified if the dependency is satified
                                m_kernel.AddDependencyListener( 
                                        service, 
                                        new 
DependencyListenerDelegate(DependencySatisfied) );
                        }
                }
  
                /// <summary>
                /// Delegate implementation invoked by kernel
                /// when one of registered dependencies were satisfied by 
                /// new components registered.
                /// </summary>
                /// <param name="service"></param>
                /// <param name="handler"></param>
                private void DependencySatisfied( Type service, IHandler 
handler )
                {
                        m_serv2handler[ service ] = handler;
  
                        m_dependencies.Remove( service );
  
                        if (m_dependencies.Count == 0)
                        {
                                m_state = State.Valid;
                        }
                }
  
                protected virtual void 
CreateComponentFactoryAndLifestyleManager()
                {
                        IComponentFactory factory = new 
Factory.Default.SimpleComponentFactory( 
                                
m_kernel.GetAspects(AspectPointCutFlags.Before), 
                                m_kernel.GetAspects(AspectPointCutFlags.After), 
                                m_componentModel, m_serv2handler);
  
                        m_lifestyleManager = 
m_kernel.LifestyleManagerFactory.Create( 
                                factory, m_componentModel );
                }
        }
  }
  
  
  
  1.1                  
avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/Default/SimpleHandlerFactory.cs
  
  Index: SimpleHandlerFactory.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.Handler.Default
  {
        using System;
  
        using Apache.Avalon.Castle.MicroKernel.Model;
  
        /// <summary>
        /// Summary description for SimpleHandlerFactory.
        /// </summary>
        public class SimpleHandlerFactory : IHandlerFactory
        {
                public SimpleHandlerFactory()
                {
                }
  
                #region IHandlerFactory Members
  
                public virtual IHandler CreateHandler( IComponentModel model )
                {
                        return new SimpleHandler( model );
                }
  
                #endregion
        }
  }
  
  
  

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

Reply via email to