Have just about finished a refactored version of repository.  It's
smaller, cleaner, and most importantly - more futureproof.  Unlike the
current implementation, the package is broken down into two sub-projects
- main and plugin.
  
The main package (metro-transit-main) contains the bootstrap loader and
a command line handler with a classic main method. The main method is
responsible for the following set of actions:

1. Loading of metro.properties from the following sources:

    ${user.dir}
    ${user.home}
    ${metro.home}

2. Handling of proxy settings has been moved out of the repository
system 
   itself and is now handled by the main class using the following 
   property keys:

    metro.proxy.host
    metro.proxy.port
    metro.proxy.username
    metro.proxy.password

3. Creation of a bootstrap repository cache and loader that can be 
   customized with the following properties:

    metro.cache
    metro.hosts
    metro.online
    metro.timestamp

4. Creation of a repository cache controller using a plugin artifact
   declared under the property key:

    metro.controller

5. The plugin is supplied with the command line arguments as part of 
   the instantiation process (using patterns based on the experience 
   with instantiation under the logging package). In a break from the 
   existing repository model a plugin is not a factory but is 
   responsible for its own initialization (made possible by a stronger 
   constructor management model).

>From here on the behavior of the system is a function of the plugin that
is loaded. A default repository cache controller plugin is provided
(metro-transit-plugin).  It is important to note that cli argument
passing is handled by the plugin (as opposed to the current model where
cli passing is handled prior to application loading).  This means that
future versions of the plugin may expose different cli arguments and
implementation - but moving from one version to another does not require
modification of the bootstrap system.

The metro-transit-plugin is in fact just another repository
implementation but unlike the existing model, it can have whatever
dependencies it wants (such as logging, i18n, and all of those other
utilities we have) - and furthermore, these dependencies can evolve over
time.  With command line handling under the control of the plugin there
is no longer a need for the criteria management model we currently use
or the Factory and Builder interfaces and patterns.  In the case of
metro-transit-plugin I've added some special handling for a '-load' cli
option.  This is equivalent to the creation of a repository and the
subsequent loading of a number of artifacts (which is exactly what we do
currently to load logging systems, the merlin kernel, activation runtime
etc.).

The -load argument takes a comma separated sequence of artifact uris
that reference other plugins - and this is where things get into that
fun area.  Given a set of plugin refs, by implication we have a set of
services, and logically this means we have an assembly scenario.  I.e.
we could order the -load arguments based on declared plugin services and
constructor dependencies and then .. apply some execution logic to the
respective plugins.

Currently I'm just loading the load arguments as classic artifacts (e.g.
jar files) - however, I've just created a fork of magic with the
intention of creating an antlib for metro, and from that antlib, booting
'magic' as a plugin.  The implications of this are interesting -
firstly, the magic version is no longer in .ant/lib which means we
re-gain version control.  Secondly, we can start doing things like
adding a jmx server to the controller plugin and from that, start
playing with remote controlling the controller, which implies remote
controlling the magic build system. With remote control of magic - we
can think about a suite of possibilities:

 1. building/debugging client builds remotely
 2. dynamic upgrading of magic on remote sites
 3. using remote sites for platform dependent builds

Does this sound like something we should be considering?

Steve.



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

Reply via email to