mcconnell 2003/01/06 22:26:37 Modified: merlin/src/java/org/apache/avalon/merlin/kernel DefaultKernel.java merlin/src/test/config block.xml Added: merlin external.xml Log: Added support for optional loading of an external block implementation configuration file. Revision Changes Path 1.1 avalon-sandbox/merlin/external.xml Index: external.xml =================================================================== <!-- Demonstration of an external block implementation configuration file. To use an external file, the packaged block.xml "implementation" element must contain a file name of the external source under an attibute named "src". --> <implementation> <container name="test"> <appliance name="standard" class="org.apache.avalon.playground.StandardComponent" activation="startup"> <context class="org.apache.avalon.playground.StandardContextImp"/> </appliance> </container> </implementation> 1.20 +44 -3 avalon-sandbox/merlin/src/java/org/apache/avalon/merlin/kernel/DefaultKernel.java Index: DefaultKernel.java =================================================================== RCS file: /home/cvs/avalon-sandbox/merlin/src/java/org/apache/avalon/merlin/kernel/DefaultKernel.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- DefaultKernel.java 6 Jan 2003 01:05:53 -0000 1.19 +++ DefaultKernel.java 7 Jan 2003 06:26:37 -0000 1.20 @@ -646,7 +646,8 @@ // String partition = name + Container.PATH_SEPERATOR; - Configuration containment = base.getChild( "implementation" ); + Configuration containment = + getImplementationConfiguration( base.getChild( "implementation" ) ); ContainerDescriptor descriptor = createContainerDescriptor( name, engine, containment ); Registry registry = m_registry.createChild( name ); List list = createChildContainers( engine, registry, partition, containment, config, logger ); @@ -656,7 +657,6 @@ // return createBlock( engine, list, descriptor, name, registry, Container.PATH_SEPERATOR, config ); - } /** @@ -1065,6 +1065,47 @@ { final String error = "Unable to create configuration from jar file: " + jar.getName(); throw new BlockException( error, e ); + } + } + + /** + * Check the implementation configuration for a src attribute and if not null + * load an external implememntation configuration. + * + * @param implementation the block implementation configuration + * @return the resolved implementation configuration + */ + private Configuration getImplementationConfiguration( Configuration implementation ) + throws ConfigurationException + { + String path = implementation.getAttribute( "src", null ); + if( path == null ) + { + getLogger().info( "loading block implementation" ); + return implementation; + } + else + { + File file = new File( m_home, path ); + try + { + DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder(); + getLogger().info( "loading external block implementation from: " + file ); + InputStream input = new FileInputStream( file ); + if( input == null ) + { + final String error = + "Null stream returned from path: " + file; + throw new IllegalArgumentException( error ); + } + return builder.build( input ); + } + catch( Throwable e ) + { + final String error = + "Unable to load extenal block implementation configuration from src: " + file; + throw new ConfigurationException( error, e ); + } } } } 1.10 +4 -1 avalon-sandbox/merlin/src/test/config/block.xml Index: block.xml =================================================================== RCS file: /home/cvs/avalon-sandbox/merlin/src/test/config/block.xml,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- block.xml 27 Dec 2002 16:46:43 -0000 1.9 +++ block.xml 7 Jan 2003 06:26:37 -0000 1.10 @@ -17,13 +17,16 @@ and container entities. The block implementation statement is equivalent to a root container who's name is implied by the name of the block. --> - <implementation> + <implementation src="external.xml"> + <!-- use external file or embedded defintion --> + <!-- <container name="test"> <appliance name="standard" class="org.apache.avalon.playground.StandardComponent" activation="startup"> <context class="org.apache.avalon.playground.StandardContextImp"/> </appliance> </container> + --> </implementation>
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>