ymikulski    2002/08/19 11:44:30

  Added:       csframework/src/cs/Service ServiceException.cs
                        IServiceSelector.cs IServiceManager.cs
                        IServiceable.cs DefaultServiceSelector.cs
                        DefaultServiceManager.cs
  Log:
  no message
  
  Revision  Changes    Path
  1.1                  
jakarta-avalon-excalibur/csframework/src/cs/Service/ServiceException.cs
  
  Index: ServiceException.cs
  ===================================================================
  ///
  /// Copyright (C) The Apache Software Foundation. All rights reserved.
  ///
  /// This software is published under the terms of the Apache Software License
  /// version 1.1, a copy of which has been included  with this distribution in
  /// the LICENSE.txt file.
  ///
  using System;
  
  namespace Apache.Avalon.Service
  {
        /// <summary>
        /// The Exception thrown to indicate a problem with service.
        /// </summary>
        /// <remarks>
        /// It is usually thrown by <see cref="IServiceManager"/>
        /// or <see cref="IServiceSelector"/>.
        /// </remarks> 
        public class ServiceException: Exception
        {
                private string role;            
                
                /// <summary>
                /// Constructs a new <c>ServiceException</c> instance.
                /// </summary>
                public ServiceException(): this(null)
                {
                }
  
                /// <summary>
                /// Constructs a new <c>ServiceException</c> instance.
                /// </summary>
                /// <param name="message">The Detail message for this 
exception.</param>
                public ServiceException(string message): this(null, message)
                {
                }
  
                /// <summary>
                /// Constructs a new <c>ServiceException</c> instance.
                /// </summary>
                /// <param name="role">The Role that caused the exception.</param>
                /// <param name="message">The Detail message for this 
exception.</param>
                public ServiceException(string role, string message): this(role, 
message, null)
                {
                }
  
                /// <summary>
                /// Constructs a new <c>ServiceException</c> instance.
                /// </summary>
                /// <param name="message">The Detail message for this 
exception.</param>
                /// <param name="inner">The Root cause of the exception.</param>
                public ServiceException(string message, Exception inner): this(null, 
message, inner)
                {
                }
  
                /// <summary>
                /// Constructs a new <c>ServiceException</c> instance.
                /// </summary>
                /// <param name="role">The Role that caused the exception.</param>
                /// <param name="message">The Detail message for this 
exception.</param>
                /// <param name="inner">The Root cause of the exception.</param>
                public ServiceException(string role, string message, Exception inner): 
base(message, inner)
                {
                        this.role = role;
                }
  
                /// <summary>
                /// Gets the role that caused the exception.
                /// </summary>
                /// <value>The Role that caused the exception.</value> 
                public string Role
                {
                        get
                        {
                                return role;
                        }
                }
        }
  }
  
  
  
  1.1                  
jakarta-avalon-excalibur/csframework/src/cs/Service/IServiceSelector.cs
  
  Index: IServiceSelector.cs
  ===================================================================
  ///
  /// Copyright (C) The Apache Software Foundation. All rights reserved.
  ///
  /// This software is published under the terms of the Apache Software License
  /// version 1.1, a copy of which has been included  with this distribution in
  /// the LICENSE.txt file.
  ///
  using System;
  
  namespace Apache.Avalon.Service
  {
        /// <summary>
        ///     A <code>IServiceSelector</code> selects components based on a
        /// supplied policy.  The contract is that all the components implement the
        /// same role.
        /// </summary>
        public interface IServiceSelector
        {
                /// <summary>
                /// Gets the component associated with the given policy.
                /// </summary>
                /// <exception cref="ServiceException"></exception>
                object this[object policy] 
                {
                        get; 
                }
  
                /// <summary>
                /// Check to see if a component exists relative to the supplied policy.
                /// </summary>
                /// <param name="policy">the selection criteria</param>
                /// <returns>True if the component is available, false if it 
not.</returns>
                bool Contains(object policy);
  
                /// <summary>
                /// Return the component when you are finished with it.
                /// This allows the <see cref="IServiceSelector"/> to handle 
                /// the End-Of-Life Lifecycle events associated with the component.
                /// </summary>
                /// <remarks>
                /// Please note, that no Exceptions should be thrown at this point.
                /// This is to allow easy use of the <see cref="IServiceSelector"/> 
system without
                /// having to trap Exceptions on a release.
                /// </remarks>
                /// <param name="component">The component we are releasing.</param>
                void Release(object component);
        }
  }
  
  
  
  1.1                  
jakarta-avalon-excalibur/csframework/src/cs/Service/IServiceManager.cs
  
  Index: IServiceManager.cs
  ===================================================================
  ///
  /// Copyright (C) The Apache Software Foundation. All rights reserved.
  ///
  /// This software is published under the terms of the Apache Software License
  /// version 1.1, a copy of which has been included  with this distribution in
  /// the LICENSE.txt file.
  ///
  using System;
  
  namespace Apache.Avalon.Service
  {
        /// <summary>
        /// A <c>IServiceManager</c> selects components based on a
        /// role. The contract is that all the components implement the
        /// differing roles and there is one component per role.
        /// <para>
        /// Roles are usually the full interface name. A role is better understood 
        /// by the analogy of a play. There are many different roles in a script.
        /// Any actor or actress can play any given part and you get 
        /// the same results (phrases said, movements made, etc.). The exact
        /// nuances of the performance is different.
        /// </para>
        /// </summary>
        public interface IServiceManager
        {
                /// <summary>
                /// Gets the component associated with the given role.
                /// </summary>
                object this[string role] 
                {
                        get; 
                }
  
                /// <summary>
                /// Checks to see if a component exists for a role.
                /// </summary>
                /// <param name="role">A String identifying the role to check.</param>
                /// <returns>True if the component exists; otherwise, false.</returns>
                bool Contains(string role);
  
                /// <summary>
                /// Return the component when you are finished with it.
                /// This allows the <see cref="IServiceManager"/> to handle 
                /// the End-Of-Life Lifecycle events associated with the component.
                /// </summary>
                /// <remarks>
                /// Please note, that no Exceptions should be thrown at this point.
                /// This is to allow easy use of the <see cref="IServiceManager"/> 
system without
                /// having to trap Exceptions on a release.
                /// </remarks>
                /// <param name="component">The component we are releasing.</param>
                void Release(object component);
        }
  }
  
  
  
  1.1                  
jakarta-avalon-excalibur/csframework/src/cs/Service/IServiceable.cs
  
  Index: IServiceable.cs
  ===================================================================
  ///
  /// Copyright (C) The Apache Software Foundation. All rights reserved.
  ///
  /// This software is published under the terms of the Apache Software License
  /// version 1.1, a copy of which has been included  with this distribution in
  /// the LICENSE.txt file.
  ///
  using System;
  
  namespace Apache.Avalon.Service
  {
        /// <summary>
        /// A Composable is a class that need to connect to software components using
        /// "role" abstraction, thus not depending on particular implementations
        /// but on behavioral interfaces.
        /// 
        /// The contract surrounding a <c>IServiceable</c> is that it is a user.
        ///     The <c>IServiceable</c> is able to use <c>object</c>s managed
        /// by the <see cref="IServiceManager"/>IServiceManager</see> it was 
initialized with. 
        /// As part of the contract with the system, the instantiating entity must call
        /// the <c>Service( IServiceManager manager )</c> method before the 
<c>IServiceable</c>
        /// can be considered valid.
        /// </summary>
        public interface IServiceable
        {
                /// <summary>
                /// Pass the <see cref="IServiceManager"/>IServiceManager</see> 
                /// to the <code>IServiceable</code>. 
                /// 
                /// The <code>IServiceable</code> implementation should use the 
specified
                /// <see cref="IServiceManager"/>IServiceManager</see> 
                /// to acquire the components it needs for execution.
                /// </summary>
                /// <param name="manager">
                /// The <see cref="IServiceManager"/>IServiceManager</see> which 
                /// this <code>IServiceable</code> uses.
                /// </param>
                /// <exception cref="ServiceException">if an error occurs</exception>
                void Service( IServiceManager manager );
        }
  }
  
  
  
  1.1                  
jakarta-avalon-excalibur/csframework/src/cs/Service/DefaultServiceSelector.cs
  
  Index: DefaultServiceSelector.cs
  ===================================================================
  ///
  /// Copyright (C) The Apache Software Foundation. All rights reserved.
  ///
  /// This software is published under the terms of the Apache Software License
  /// version 1.1, a copy of which has been included  with this distribution in
  /// the LICENSE.txt file.
  ///
  using System;
  using System.Collections;
  using System.Text;
  
  namespace Apache.Avalon.Service
  {
        
        /// <summary>
        /// This is the default implementation of the <see cref="IServiceSelector"/>.
        /// </summary>
        public class DefaultServiceSelector: IServiceSelector, IEnumerable
        {
                private Hashtable components = new Hashtable();
                private bool readOnly;
  
                public DefaultServiceSelector() 
                {
                }
  
                /// <summary>
                /// Gets a value indicating whether the <see cref="IServiceSelector"/> 
is read-only.
                /// </summary>
                /// <value>True if the <see cref="IServiceSelector"/> is read-only; 
otherwise, false.</value>
                public bool IsReadOnly
                {
                        get
                        {
                                return readOnly;
                        }
                }
  
                public object this[object policy]
                {
                        get
                        {
                                object component = components[policy];
  
                                if (component == null)
                                {
                                        throw new 
ServiceException(string.Format("Unable to provide implementation for {0}.", policy));
                                }
                                return component;
                        }
  
                        set 
                        {
                                CheckReadOnly();
                                components[policy] = value;
                        }
                }
                
                /// <summary>
                /// Returns whether a component exists or not.
                /// </summary>
                /// <param name="policy">The policy to retrieve a component</param>
                /// <returns>True if the component is available, false if it 
not.</returns>
                public bool Contains(object policy) 
                {
                        bool componentContains = false;
  
                        try
                        {
                                Release(this[policy]);
                                componentContains = true;
                        }
                        catch (Exception)
                        {
                                // Ignore all exceptions -- we want to know a yes or 
no answer.
                        }
                
                        return componentContains;
                }
  
                /// <summary>
                /// Return the component when you are finished with it.
                /// This allows the <see cref="IServiceManager"/> to handle 
                /// the End-Of-Life Lifecycle events associated with the component.
                /// </summary>
                /// <remarks>
                /// Please note, that no Exceptions should be thrown at this point.
                /// This is to allow easy use of the <see cref="IServiceManager"/> 
system without
                /// having to trap Exceptions on a release.
                /// </remarks>
                /// <param name="component">The component we are releasing.</param>
                public void Release(object component)
                {
                        // If the IServiceManager handled pooling, it would be
                        // returned to the pool here.
                }
  
                public void MakeReadOnly()
                {
                        readOnly = true;
                }
  
                protected void CheckReadOnly()
                {
                        if( IsReadOnly )
                        {
                                throw new ServiceException( "ServiceSelector is read 
only and can not be modified" );
                        }
                }
  
                public IEnumerator GetEnumerator()
                {
                        return components.GetEnumerator(); 
                }
  
                public override string ToString()
                {
                        StringBuilder buffer = new StringBuilder();
                        buffer.Append("Services: ");
                        
                        foreach( object component in components.Values) 
                        {
                                buffer.AppendFormat( "[ {0} ]", component);
                        }
  
                        return buffer.ToString();
                }
        }
  }
  
  
  1.1                  
jakarta-avalon-excalibur/csframework/src/cs/Service/DefaultServiceManager.cs
  
  Index: DefaultServiceManager.cs
  ===================================================================
  ///
  /// Copyright (C) The Apache Software Foundation. All rights reserved.
  ///
  /// This software is published under the terms of the Apache Software License
  /// version 1.1, a copy of which has been included  with this distribution in
  /// the LICENSE.txt file.
  ///
  using System;
  using System.Collections;
  using System.Text;
  
  namespace Apache.Avalon.Service
  {
        
        /// <summary>
        /// This class is a static implementation of a <see cref="IServiceManager"/>.
        /// Allow ineritance and extension so you can generate a tree of
        /// <see cref="IServiceManager"/> each defining object scope.
        /// </summary>
        public class DefaultServiceManager: IServiceManager, IEnumerable
        {
                private Hashtable components = new Hashtable();
                private IServiceManager parent;
                private bool readOnly;
  
                /// <summary>
                /// Constructs <see cref="IServiceManager"/> with no parent.
                /// </summary>
                public DefaultServiceManager(): this(null)
                {
                }
                
                /// <summary>
                /// Constructs <see cref="IServiceManager"/> with specified parent.
                /// </summary>
                /// <param name="parent">The <see cref="IServiceManager"/>'s 
parent</param>
                public DefaultServiceManager(IServiceManager parent)
                {
                        this.parent = parent;
                }
                
                /// <summary>
                /// Gets parent.
                /// </summary>
                /// <value>The Parent component manager of this <see 
cref="IServiceManager"/> instance.</value>
                protected IServiceManager Parent
                {
                        get
                        {
                                return parent;
                        }
                }
  
                /// <summary>
                /// Gets a value indicating whether the <see cref="IServiceManager"/> 
is read-only.
                /// </summary>
                /// <value>True if the <see cref="IServiceManager"/> is read-only; 
otherwise, false.</value>
                public bool IsReadOnly
                {
                        get
                        {
                                return readOnly;
                        }
                }
  
                /// <summary>
                /// Gets the component associated with the given role.
                /// </summary>
                public object this[string role]
                {
                        get
                        {
                                object component = components[role];
  
                                if (component == null)
                                {
                                        if (Parent == null)
                                        {
                                                throw new ServiceException(role, 
string.Format("Unable to provide implementation for {0}.", role));
                                        }
                                        else
                                        {
                                                component = Parent[role];
                                        }
                                }
                                return component;
                        }
  
                        set 
                        {
                                CheckReadOnly();
                                components[role] = value;
                        }
                }
                
                /// <summary>
                /// Checks to see if a component exists for a role.
                /// </summary>
                /// <param name="role">A String identifying the role to check.</param>
                /// <returns>True if the component exists; otherwise, false.</returns>
                public bool Contains(string role) 
                {
                        bool componentContains = false;
  
                        try
                        {
                                object component = this[role];
                                componentContains = true;
                        }
                        catch (Exception)
                        {
                                // Ignore all exceptions -- we want to know a yes or 
no answer.
                        }
                
                        return componentContains;
                }
  
                /// <summary>
                /// Return the component when you are finished with it.
                /// This allows the <see cref="IServiceManager"/> to handle 
                /// the End-Of-Life Lifecycle events associated with the component.
                /// </summary>
                /// <remarks>
                /// Please note, that no Exceptions should be thrown at this point.
                /// This is to allow easy use of the <see cref="IServiceManager"/> 
system without
                /// having to trap Exceptions on a release.
                /// </remarks>
                /// <param name="component">The component we are releasing.</param>
                public void Release(object component)
                {
                        // If the IServiceManager handled pooling, it would be
                        // returned to the pool here.
                }
  
                public void MakeReadOnly()
                {
                        readOnly = true;
                }
  
                protected void CheckReadOnly()
                {
                        if( IsReadOnly )
                        {
                                throw new ServiceException( "ServiceManager is read 
only and can not be modified" );
                        }
                }
  
                public IEnumerator GetEnumerator()
                {
                        return components.GetEnumerator(); 
                }
  
                /// <summary>
                /// Build a human readable representation of <see 
cref="IServiceManager"/>.
                /// </summary>
                /// <returns>
                /// A Human readable representation of <see cref="IServiceManager"/>.
                /// </returns>
                public override string ToString()
                {
                        StringBuilder buffer = new StringBuilder();
                        buffer.Append("Services: ");
                        
                        foreach( object component in components.Values) 
                        {
                                buffer.AppendFormat( "[ {0} ]", component);
                        }
  
                        return buffer.ToString();
                }
        }
  }
  
  

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

Reply via email to