Re: [Avalon4:PROPOSAL] Context Consensus (version 2)

Stephen McConnell <[email protected]>
Newsgroups gmane.comp.jakarta.avalon.apps.devel
Message-ID <[email protected]>

Leo Sutic wrote:

>All,
>
>I hope I have incorporated all comments. Here's the latest draft
>of the proposal. I'd like to go for a vote on this next Tuesday,
>and I would appreciate if anyone not satisfied with it could say
>so now, so the concerns can be addressed while it is still a 
>[PROPOSAL] and not a [VOTE]. I know that the proposal as it
>stands is less-than-optimal for everyone, but it is my gut
>feeling that it is also at least acceptable to everyone, which
>is why I'm going forward with it.
>

Leo:

More notes in-line.

>
>                           -oOo-
>
>Proposal: The following text should (after being HTML-ized) replace
>the current documentation for the Context interface:
>
>NOTE: In the text below there are several requirements that a 
>      component may set up for a container. It is understood that 
>      a container does not have to satisfy those requirements in 
>      order to be Avalon-compliant. If a component says "I require 
>      X to run" a container may reply with "I don't have any X, so 
>      I'm not running you". The requirements here are the maximum 
>      that a component may ask for, not the minimum a container must
>      deliver. However, a container should document what it is and
>      isn't capable of delivering.
>
>The context is the interface through which the component and its
>container communicate. Each Container-Component relationship involves
>defining a contract between the two entities. A Context contract is
>defined by two parameters, both of which are requirements the component
>set up for the container in its metadata:
>

I making the assumption here that the two entities refered to in the 
above paragraph are (a) context type, and (b) context entries. While I 
can read on to confirm this, I think we can improve the wording so that 
this is clear in the summary.

Here is a suggested replacement of the above paragraph:

   The context is the interface through which the component and its
   container communicate. Each Container-Component relationship involves
   defining a contract between the two entities. A Context contract is
   defined by (1) an optional target class, and (2) a set of context 
   entries. Both parameters may be declared using metainfo.

There are two changes I have made - firstly the explicit statement of the two parameters that define the context contract, and secondly, stating that this information may be declared in metainfo (not metadata).


>
>1. The first is an interface or a class, called T below. It is 
>   required that the component should be able to perform the 
>   following operation:
>
>    public void contextualize( Context context ) 
>        throws ContextException 
>    {
>        T tContext = (T) context;
>    }
>

Here is a revised version of the above:

   1. Context target class or interface

      A container shall ensure that a context object supplied 
      to a component shall be castable to a target class or 
      interface (T).  The default target class is Context. A 
      target class must be derived from or implement the 
      Context interface.
      
      Usage:

      public void contextualize( Context context ) 
        throws ContextException 
      {
         T tContext = (T) context;
      }


>
>   This case has two variants:
>
>    a. T is an interface. In this case, the container may choose
>       any method to supply the component with a context instance
>       cast-able to T.
>
>       The container must supply an implementation for all methods 
>       in the interface. This may be done via a dynamic proxy 
>       that routes calls to appropriate handlers or by any 
>       other method. The set of methods that a container must 
>       support is defined by the standard context interfaces in 
>       Framework (currently none).
>
>    b. T is a class. In this case, the class must be instantiated 
>       with the T(Map,Context) constructor, and the instance 
>       then be passed to the component's contextualize method.
>
>   WARNING: A component that specifies this requirement will not
>            be as portable as one that doesn't. Few containers 
>            support it. It is therefore discouraged for components 
>            to require a castable context.
>

I think all of the text related to the "two variants" should be removed. 
 Point (a) is simply saying that this is a container implemetation issue 
and that the object must respect the interface.  Both of these are 
implicit if (a) is removed.  Point (b) is convention that can be used by 
a container to create a context implementation - it has nothing to do 
with the T parameter as far as the context interface is concerned. 
 Secondly, it mixes the notion of T as a cast criteria with the notion 
of T as a directive for context creation.  T as a criteria is 
appropriate within the scope of metainfo.  T as a directive is 
appropriate within the scope of metadata. I don't think we should 
documeting directive under Context interface specification as directives 
are related to implemetation, not contract.  However, I do think we can 
provide a link to this sort of information - for example, it would be 
appropriate to include this under the DefaultContext implementation spec 
or as part of a metadata for context specification included in the 
context package documentation.

>
>2. The second parameter is a set of entries accessible via the
>   Context.get() method and their types. The class/interface T 
>   above may also have associated metadata that specifies entries,
>   in which case these entries must be supplied by the container 
>   in addition to any entries the component itself requires.
>
>   Each entry requirement must specify the canonical key name, may
>   specify a name that the canonical key should be remapped to, 
>   and must specify the expected type of the value:
>
>   For an example, where the data is specified in XML:
>
>    <entry intent="avalon:work" type="java.io.File"/>
>
>    <entry key="work" intent="avalon:work" type="java.io.File"/>
>

No too happy with the example XML.  For me "intent" does not convey the 
semntics here.  I would suggest "alias".  Secondly, I think the example 
should use full URN naming convensions. Thirdly, the example shows a 
entry without a key which does not compute from my understanding of the 
example.

Here is suggested replacement:


    <entry key="urn:avalon:work" type="java.io.File"/>

    <entry key="work" alias="urn:avalon:work" type="java.io.File"/>

>
>   NOTE: The proposal does not cover the DTD, nor does it require 
>         that the entries are defined in XML. However, it does 
>         require that the above three things *can* be specified.
>

I think we are so close to being able to close the defintion of 
<context/> that it would be worth doing this as part of the proposal. 
 The two thing not addressed in the above. One is the "optional" 
attribute that is available in both the meta and info packages, and the 
second is semantics that can be applied to the "type" attibute value 
concerning interface/class version.

E.g.:

    <entry key="urn:avalon:classloader" type="ComponentClassLoader:1.2"/>

Doing a DTD for <context/> allows us to be precise about the meaning of "type", "alias", "key", and "optional".


>
>   The current list of canonical keys are (taken from
>   http://jakarta.apache.org/avalon/excalibur/info/context.html):
>

This needs to be normalized with the context keys defined under:

  http://jakarta.apache.org/avalon/excalibur/container/attributes.html

>
>   component.name         java.lang.String  
>   This entry defines the name of the component.  
>

Suggestion:

     urn:avalon:name

>
>   component.classloader  java.lang.ClassLoader  
>   The classloader via which the component was loaded. May differ 
>   from the ClassLoader returned by getClass().getClassLoader() if 
>   the component was loaded from parent classloader.  
>

Suggestion:

     urn:avalon:classloader
 

>
>   partition.name         java.lang.String  
>   This entry defines the name of the partition.  
>

Suggestion:

     urn:avalon:partition.name

>
>   application.name       java.lang.String  
>   This entry defines the name of the application.  
>
Suggestion:

     urn:avalon:application.name

>
>   component.home         java.io.File  
>   The location in which the component to store persistent data 
>   relevent to the component.  
>
Suggestion:

     urn:avalon:home

or:

     urn:avalon:home.directory

>
>
>   component.work         java.io.File  
>   This directory in which to store temporary or working 
>   information. It may not persist over restarts of the component.
>

Suggestion:

     urn:avalon:work

or:

     urn:avalon:work.directory

>   
>   The values placed in the context are runtime values that 
>   can only be provided by the container. The Context should 
>   NOT be used to retrieve configuration values or services 
>   that can be provided by peer components.
>

I think the last sentense should be removed.  If a container provides a 
classloader that is a full component - its in conflict with the notion 
that a  standard avalon context entry included classloader.  I do not 
think we should be introducing statements that are implemetation 
concerns.  If I supply a context entry value that meets the entry 
contract, the client should not know or be concerned about the 
mechansisms used to construct that value.  The "configuration values" 
and "services provided by peers" are mechanisms - and that's orthoginal 
to the contract.

Cheers, Steve.

-- 

Stephen J. McConnell

OSM SARL
digital products for a global economy
mailto:[email protected]
http://www.osm.net
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.