mcconnell 2003/01/15 01:21:04
Added: meta/src/java/org/apache/avalon/meta/info/builder
XMLLegacyCreator.java
Log:
Support for the create of Type meta-info descriptor from the Phoenix <blockinfo>
descriptor.
Revision Changes Path
1.1
avalon-sandbox/meta/src/java/org/apache/avalon/meta/info/builder/XMLLegacyCreator.java
Index: XMLLegacyCreator.java
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software
* itself, if and wherever such third-party acknowledgments
* normally appear.
*
* 4. The names "Jakarta", "Avalon", and "Apache Software Foundation"
* must not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.avalon.meta.info.builder;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Properties;
import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources;
import org.apache.avalon.framework.Version;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.meta.ConfigurationBuilder;
import org.apache.avalon.meta.info.InfoDescriptor;
import org.apache.avalon.meta.info.ContextDescriptor;
import org.apache.avalon.meta.info.EntryDescriptor;
import org.apache.avalon.meta.info.DependencyDescriptor;
import org.apache.avalon.meta.info.ExtensionDescriptor;
import org.apache.avalon.meta.info.LoggerDescriptor;
import org.apache.avalon.meta.info.ReferenceDescriptor;
import org.apache.avalon.meta.info.ServiceDescriptor;
import org.apache.avalon.meta.info.StageDescriptor;
import org.apache.avalon.meta.info.Type;
import org.apache.excalibur.configuration.ConfigurationUtil;
import org.xml.sax.InputSource;
/**
* Handles internalization of a legacy Poenix XML based description of a {@link Type}
* from a Configuration object.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Avalon Development Team</a>
* @version $Revision: 1.1 $ $Date: 2003/01/15 09:21:04 $
*/
public class XMLLegacyCreator
extends XMLTypeCreator
implements TypeCreator
{
private static final Resources REZ =
ResourceManager.getPackageResources( XMLLegacyCreator.class );
/**
* Create a {@link Type} object for specified
* classname, loaded from specified {@link InputStream}.
*
* @param implementationKey The classname of Component
* @param inputStream the InputStream to load Type from
* @return the created Type
* @throws Exception if an error occurs
*/
public Type createType( String implementationKey,
InputStream inputStream )
throws Exception
{
if( inputStream == null )
{
throw new NullPointerException( "input" );
}
final InputSource input = new InputSource( inputStream );
final String classname = implementationKey;
final Configuration xinfo = ConfigurationBuilder.build( input );
return build( classname, xinfo );
}
/**
* Create a {@link Type} object for specified
* classname and configuration.
*
* @param classname The classname of the component
* @param config the meta info configuration fragment
* @return the created Type
* @throws Exception if an error occurs
*/
public Type createType( String classname, Configuration config )
throws Exception
{
return build( classname, config );
}
/**
* Create a {@link Type} object for specified classname from
* specified configuration data.
*
* @param classname The classname of Component
* @param info the Type configuration
* @return the created Type
* @throws ConfigurationException if an error occurs
*/
private Type build( final String classname, final Configuration info )
throws Exception
{
final String topLevelName = info.getName();
if( !topLevelName.equals( "type" ) )
{
if( !topLevelName.equals( "blockinfo" ) )
{
final String message =
REZ.getString( "builder.bad-toplevel-block-element.error",
classname,
topLevelName );
throw new ConfigurationException( message );
}
}
Configuration configuration = null;
configuration = info.getChild( "block" );
final InfoDescriptor descriptor =
buildInfoDescriptor( classname, configuration );
configuration = info.getChild( "loggers" );
final LoggerDescriptor[] loggers = buildLoggers( configuration );
final ContextDescriptor context = buildPhoenixContext( );
configuration = info.getChild( "services" );
final ServiceDescriptor[] services = buildBlockServices( configuration );
configuration = info.getChild( "dependencies" );
final DependencyDescriptor[] dependencies = buildDependencies( classname,
configuration );
configuration = info.getChild( "stages" );
final StageDescriptor[] phases = buildPhases( configuration );
configuration = info.getChild( "extensions" );
final ExtensionDescriptor[] extensions = buildExtensions( configuration );
return new Type(
descriptor, loggers, context, services, dependencies, phases, extensions
);
}
private ContextDescriptor buildPhoenixContext()
{
ReferenceDescriptor reference =
createReference( "org.apache.avalon.framework.context.Context" );
EntryDescriptor name = new EntryDescriptor( "urn:avalon:name", "block.name",
"java.lang.String", false );
EntryDescriptor home = new EntryDescriptor( "urn:avalon:home", "app.home",
"java.io.File", false );
return new ContextDescriptor( reference, new EntryDescriptor[]{ name, home
}, null );
}
/**
* A utility method to build an array of {@link ServiceDescriptor}
* objects from specified configuraiton.
*
* @param servicesSet the services configuration
* @return the created ServiceDescriptor
* @throws ConfigurationException if an error occurs
*/
protected ServiceDescriptor[] buildBlockServices( final Configuration
servicesSet )
throws ConfigurationException
{
final Configuration[] elements = servicesSet.getChildren( "service" );
final ArrayList services = new ArrayList();
for( int i = 0; i < elements.length; i++ )
{
final ServiceDescriptor service = buildBlockService( elements[ i ] );
services.add( service );
}
return (ServiceDescriptor[])services.toArray( new ServiceDescriptor[ 0 ] );
}
/**
* A utility method to build a <code>ServiceDescriptor</code>
* object from specified configuraiton data.
*
* @param service the service Configuration
* @return the created ServiceDescriptor
* @throws ConfigurationException if an error occurs
*/
protected ServiceDescriptor buildBlockService( final Configuration service )
throws ConfigurationException
{
final ReferenceDescriptor designator = buildReferenceDescriptor( service );
final Properties attributes =
buildAttributes( service.getChild( "attributes" ) );
return new ServiceDescriptor( designator, attributes );
}
/**
* A utility method to build a {@link ReferenceDescriptor}
* object from specified configuraiton data.
*
* @param service the service Configuration
* @return the created ReferenceDescriptor
* @throws ConfigurationException if an error occurs
*/
protected ReferenceDescriptor buildReferenceDescriptor( final Configuration
service )
throws ConfigurationException
{
try
{
final String type = service.getAttribute( "name" );
final String versionString = service.getAttribute( "version", "1.0" );
final Version version = buildVersion( versionString );
return new ReferenceDescriptor( type, version );
}
catch( Throwable e )
{
final String error =
"Error occured while attempting to build reference descriptor from
configuration: "
+ ConfigurationUtil.list( service );
throw new ConfigurationException( error, e );
}
}
/**
* A utility method to build a {@link DependencyDescriptor}
* object from specified configuraiton.
*
* @param classname The classname of Component (used for logging purposes)
* @param dependency the dependency configuration
* @return the created DependencyDescriptor
* @throws ConfigurationException if an error occurs
*/
protected DependencyDescriptor buildDependency( final String classname,
final Configuration dependency )
throws ConfigurationException
{
Configuration serviceRef = dependency.getChild( "service" );
final ReferenceDescriptor service =
buildReferenceDescriptor( serviceRef );
final boolean optional =
dependency.getAttributeAsBoolean( "optional", false );
final Properties attributes =
buildAttributes( dependency.getChild( "attributes" ) );
String role = dependency.getChild( "role" ).getValue( null );
// default to name of service if role unspecified
if( null == role )
{
role = service.getClassname();
}
return new DependencyDescriptor( role, service, optional, attributes );
}
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>