[EMAIL PROTECTED] wrote:

Hello,

My questions regard the use of the Context interface. I have used the less portable means for getting a context object from the contextualize method in the past when using phoenix for my components - namely the following form:

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

As you can see the BlockContext is from phoenix. I found myself doing this because I could get a path to the base phoenix directory via the getBaseDirectory() method. I would like to use the recommended portable mechanism now that LDAPd is going to use more than one container. The question is how do I make the container add the appropriate Context entry. I would image that would be container implementation specific. So how would I add this entry using say Merlin and Fortress:

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


If you declare the following <entry/> declaration in a type descriptor (manually or via an @avalon.entry) then Merlin will take care of this for you. This declaration is based on the meta-info model declarations which means its as close as you can get to an Avalon standard.


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

Please note that the following two file related keys are available (which is slighlty different to what you described above):

 "urn:avalon:work" - a transient directory that will be desoyed
                     following decommissioning of the component
 "urn:avalon:home" - persistent directory for the component


to be able to get

File workDirectory = ( File ) context.get( "avalon:work" ) ;

as is the recommended way in the javadocs page for the Context interface here:

http://avalon.apache.org/framework/api/org/apache/avalon/framework/context/Context.html


If you want to use a friendly castable context interface then you need to declare this under the @avalon.context type="MyContextInterface" tag which generates the following:


 <context type="MyContextInterface">
   <!-- plus any entries -->
 </context>

In your code you can safely case the supplied context to the declared interface just like you do in Phoenix. This is also covered by the meta-info model but Merlin is probably the only container to provide support for this capability at this time.

  public void contextualize( Context context )
  {
      MyContextInterface myContext = (MyContextInterface) context;
      File file = myContext.getMyFile();
  }

There is also a working demonstration of this in the merlin tutorial content.

$ cd merlin-platform\tutorials\context_casting
$ maven
$ merlin -execute target\classes

[INFO ] (tutorial.hello): listing values resolved from domain specific context
[INFO ] (tutorial.hello): supplied context class: tutorial.DemoContextProvider
[INFO ] (tutorial.hello): name: hello
[INFO ] (tutorial.hello): partition: /tutorial/
[INFO ] (tutorial.hello): home: [you-directory]\home\tutorial\hello
[INFO ] (tutorial.hello): temp: C:\TEMP\tutorial\hello


Stephen.


Thanks much, Alex




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






--


Stephen J. McConnell
mailto:[EMAIL PROTECTED]
http://www.osm.net

Sent via James running under Merlin as an NT service.
http://avalon.apache.org/sandbox/merlin




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



Reply via email to