Browse Source

Changes to DefaultDeployer:

* Parses services descriptors (META-INF/ant-services.xml).  Does not do anything
  with them yet.

* Enforces that the version attribute in type, role, and service descriptors
  is present, and compatible with the current version.

* Moved descriptor construction from DefaultDeployer into separate
  DescriptorBuilder classes, one for each type of descriptor.

* Detection of whether a descriptor is present in a file, was not portable across
  XML parser implementations.


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271294 13f79535-47bb-0310-9956-ffa450edef68
master
adammurdoch 23 years ago
parent
commit
5307209831
13 changed files with 617 additions and 173 deletions
  1. +1
    -1
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/ClassLoaderManager.java
  2. +31
    -57
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultDeployer.java
  3. +119
    -113
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/Deployment.java
  4. +27
    -0
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DescriptorBuilder.java
  5. +8
    -2
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/Resources.properties
  6. +44
    -0
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/RoleDescriptor.java
  7. +69
    -0
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/RoleDescriptorBuilder.java
  8. +56
    -0
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/ServiceDefinition.java
  9. +38
    -0
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/ServiceDescriptor.java
  10. +58
    -0
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/ServiceDescriptorBuilder.java
  11. +39
    -0
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/TypeDescriptor.java
  12. +95
    -0
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/TypeDescriptorBuilder.java
  13. +32
    -0
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/TypelibDescriptor.java

+ 1
- 1
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/ClassLoaderManager.java View File

@@ -8,8 +8,8 @@
package org.apache.myrmidon.components.deployer; package org.apache.myrmidon.components.deployer;


import java.io.File; import java.io.File;
import org.apache.myrmidon.interfaces.deployer.DeploymentException;
import org.apache.avalon.framework.component.Component; import org.apache.avalon.framework.component.Component;
import org.apache.myrmidon.interfaces.deployer.DeploymentException;


/** /**
* Manages a classloader hierarchy. * Manages a classloader hierarchy.


+ 31
- 57
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultDeployer.java View File

@@ -17,23 +17,22 @@ import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.component.Composable; import org.apache.avalon.framework.component.Composable;
import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.myrmidon.converter.Converter;
import org.apache.myrmidon.interfaces.converter.ConverterRegistry;
import org.apache.myrmidon.interfaces.deployer.ConverterDefinition;
import org.apache.myrmidon.interfaces.deployer.Deployer; import org.apache.myrmidon.interfaces.deployer.Deployer;
import org.apache.myrmidon.interfaces.deployer.DeploymentException; import org.apache.myrmidon.interfaces.deployer.DeploymentException;
import org.apache.myrmidon.interfaces.deployer.TypeDeployer;
import org.apache.myrmidon.interfaces.deployer.TypeDefinition; import org.apache.myrmidon.interfaces.deployer.TypeDefinition;
import org.apache.myrmidon.interfaces.deployer.ConverterDefinition;
import org.apache.myrmidon.interfaces.converter.ConverterRegistry;
import org.apache.myrmidon.interfaces.type.TypeManager;
import org.apache.myrmidon.interfaces.type.DefaultTypeFactory;
import org.apache.myrmidon.interfaces.deployer.TypeDeployer;
import org.apache.myrmidon.interfaces.role.RoleManager; import org.apache.myrmidon.interfaces.role.RoleManager;
import org.apache.myrmidon.converter.Converter;
import org.apache.myrmidon.interfaces.type.DefaultTypeFactory;
import org.apache.myrmidon.interfaces.type.TypeManager;


/** /**
* This class deploys roles, types and services from a typelib. * This class deploys roles, types and services from a typelib.
* *
* @author <a href="mailto:peter@apache.org">Peter Donald</a> * @author <a href="mailto:peter@apache.org">Peter Donald</a>
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$ * @version $Revision$ $Date$
*/ */
public class DefaultDeployer public class DefaultDeployer
@@ -136,57 +135,10 @@ public class DefaultDeployer
return deployment; return deployment;
} }


/**
* Creates a type definition.
*/
public TypeDefinition createTypeDefinition( final Configuration configuration )
throws ConfigurationException
{
final String converterShorthand = m_roleManager.getNameForRole( Converter.ROLE );
final String roleShorthand = configuration.getName();
if( roleShorthand.equals( converterShorthand ) )
{
// A converter definition
final String className = configuration.getAttribute( "classname" );
final String source = configuration.getAttribute( "source" );
final String destination = configuration.getAttribute( "destination" );
return new ConverterDefinition( className, source, destination );
}
else
{
// A type definition
final String typeName = configuration.getAttribute( "name" );
final String className = configuration.getAttribute( "classname" );
return new TypeDefinition( typeName, roleShorthand, className );
}
}

/**
* Handles a converter definition.
*/
private void handleConverter( final Deployment deployment,
final String className,
final String source,
final String destination )
throws Exception
{
m_converterRegistry.registerConverter( className, source, destination );
final DefaultTypeFactory factory = deployment.getFactory( Converter.class );
factory.addNameClassMapping( className, className );
m_typeManager.registerType( Converter.class, className, factory );

if( getLogger().isDebugEnabled() )
{
final String message =
REZ.getString( "register-converter.notice", source, destination );
getLogger().debug( message );
}
}

/** /**
* Handles a type definition. * Handles a type definition.
*/ */
public void handleType( final Deployment deployment,
public void deployType( final Deployment deployment,
final TypeDefinition typeDef ) final TypeDefinition typeDef )
throws Exception throws Exception
{ {
@@ -263,10 +215,32 @@ public class DefaultDeployer
} }
} }


/**
* Handles a converter definition.
*/
private void handleConverter( final Deployment deployment,
final String className,
final String source,
final String destination )
throws Exception
{
m_converterRegistry.registerConverter( className, source, destination );
final DefaultTypeFactory factory = deployment.getFactory( Converter.class );
factory.addNameClassMapping( className, className );
m_typeManager.registerType( Converter.class, className, factory );

if( getLogger().isDebugEnabled() )
{
final String message =
REZ.getString( "register-converter.notice", source, destination );
getLogger().debug( message );
}
}

/** /**
* Handles a role definition. * Handles a role definition.
*/ */
public void handleRole( final Deployment deployment,
public void deployRole( final Deployment deployment,
final RoleDefinition roleDef ) final RoleDefinition roleDef )
{ {
final String name = roleDef.getShortHand(); final String name = roleDef.getShortHand();


+ 119
- 113
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/Deployment.java View File

@@ -12,34 +12,24 @@ import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import java.util.Map;
import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.SAXParserFactory;
import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources; import org.apache.avalon.excalibur.i18n.Resources;
import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.configuration.SAXConfigurationHandler; import org.apache.avalon.framework.configuration.SAXConfigurationHandler;
import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.myrmidon.converter.Converter;
import org.apache.myrmidon.interfaces.converter.ConverterRegistry;
import org.apache.myrmidon.interfaces.deployer.ConverterDefinition;
import org.apache.myrmidon.interfaces.deployer.DeploymentException; import org.apache.myrmidon.interfaces.deployer.DeploymentException;
import org.apache.myrmidon.interfaces.deployer.TypeDefinition; import org.apache.myrmidon.interfaces.deployer.TypeDefinition;
import org.apache.myrmidon.interfaces.deployer.TypeDeployer; import org.apache.myrmidon.interfaces.deployer.TypeDeployer;
import org.apache.myrmidon.interfaces.role.RoleManager;
import org.apache.myrmidon.interfaces.type.DefaultTypeFactory; import org.apache.myrmidon.interfaces.type.DefaultTypeFactory;
import org.apache.myrmidon.interfaces.type.TypeManager;
import org.xml.sax.XMLReader; import org.xml.sax.XMLReader;


/** /**
* This class deploys type libraries from a ClassLoader into a registry. * This class deploys type libraries from a ClassLoader into a registry.
* *
* @author <a href="mailto:peter@apache.org">Peter Donald</a> * @author <a href="mailto:peter@apache.org">Peter Donald</a>
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$ * @version $Revision$ $Date$
*/ */
class Deployment class Deployment
@@ -49,13 +39,19 @@ class Deployment
private final static Resources REZ = private final static Resources REZ =
ResourceManager.getPackageResources( Deployment.class ); ResourceManager.getPackageResources( Deployment.class );


private final static String DESCRIPTOR_NAME = "META-INF/ant-descriptor.xml";
private final static String TYPE_DESCRIPTOR_NAME = "META-INF/ant-descriptor.xml";
private final static String ROLE_DESCRIPTOR_NAME = "META-INF/ant-roles.xml"; private final static String ROLE_DESCRIPTOR_NAME = "META-INF/ant-roles.xml";
private final static String SERVICE_DESCRIPTOR_NAME = "META-INF/ant-services.xml";


private ClassLoader m_classLoader; private ClassLoader m_classLoader;
private DefaultDeployer m_deployer; private DefaultDeployer m_deployer;
private String[] m_descriptorUrls;
private Configuration[] m_descriptors;
private TypeDescriptor[] m_descriptors;
private ServiceDescriptor[] m_services;

// TODO - create and configure these in DefaultDeployer
private DescriptorBuilder m_roleBuilder = new RoleDescriptorBuilder();
private DescriptorBuilder m_typeBuilder = new TypeDescriptorBuilder();
private DescriptorBuilder m_serviceBuilder = new ServiceDescriptorBuilder();


/** Map from role Class -> DefaultTypeFactory for that role. */ /** Map from role Class -> DefaultTypeFactory for that role. */
private Map m_factories = new HashMap(); private Map m_factories = new HashMap();
@@ -69,12 +65,13 @@ class Deployment
/** /**
* Load the descriptors. Deploys all roles, then loads the descriptors * Load the descriptors. Deploys all roles, then loads the descriptors
* for, but does not deploy, all the types. * for, but does not deploy, all the types.
*
* @param jarUrl The URL for the typelib, used to locate the descriptors.
* If null, the resources from the classloader are used.
*/ */
public void loadDescriptors( final URL jarUrl ) public void loadDescriptors( final URL jarUrl )
throws Exception throws Exception
{ {
final ArrayList descriptors = new ArrayList();

// Create a SAX parser to assemble the descriptors into Configuration // Create a SAX parser to assemble the descriptors into Configuration
// objects // objects
final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
@@ -86,45 +83,51 @@ class Deployment
parser.setContentHandler( handler ); parser.setContentHandler( handler );
parser.setErrorHandler( handler ); parser.setErrorHandler( handler );


// Load the role descriptors, and deploy all roles
final List roleUrls = locateResources( ROLE_DESCRIPTOR_NAME, jarUrl );
for( Iterator iterator = roleUrls.iterator(); iterator.hasNext(); )
{
String url = (String)iterator.next();
try
{
parser.parse( url );
}
catch( FileNotFoundException e )
{
// Ignore - this happens when jarUrl != null and the Jar does
// not contain a role descriptor.
continue;
}
// Build the role descriptors
final ArrayList roleUrls = locateResources( ROLE_DESCRIPTOR_NAME, jarUrl );
final ArrayList roleDescriptors = buildDescriptors( roleUrls, m_roleBuilder, parser, handler );


handleRoleDescriptor( handler.getConfiguration(), url );
// Deploy the roles
// TODO - need to defer this
for( int i = 0; i < roleDescriptors.size(); i++ )
{
final RoleDescriptor descriptor = (RoleDescriptor)roleDescriptors.get( i );
deployRoles( descriptor );
} }


// Load type descriptors
final List typeUrls = locateResources( DESCRIPTOR_NAME, jarUrl );
for( Iterator iterator = typeUrls.iterator(); iterator.hasNext(); )
{
String url = (String)iterator.next();
try
{
parser.parse( url.toString() );
}
catch( FileNotFoundException e )
{
// Ignore - this happens when jarUrl != null and the Jar does
// not contain a type descriptor
continue;
}
// Build the type descriptors
final ArrayList typeUrls = locateResources( TYPE_DESCRIPTOR_NAME, jarUrl );
final ArrayList typeDescriptors = buildDescriptors( typeUrls, m_typeBuilder, parser, handler );
m_descriptors = (TypeDescriptor[])typeDescriptors.toArray( new TypeDescriptor[ typeDescriptors.size() ] );


descriptors.add( handler.getConfiguration() );
// Build the service descriptors
final ArrayList serviceUrls = locateResources( SERVICE_DESCRIPTOR_NAME, jarUrl );
final ArrayList serviceDescriptors = buildDescriptors( serviceUrls, m_serviceBuilder, parser, handler );
m_services = (ServiceDescriptor[])serviceDescriptors.toArray( new ServiceDescriptor[ serviceDescriptors.size() ] );
}

/**
* Returns the type factory for a role.
*/
public DefaultTypeFactory getFactory( final Class roleType )
{
DefaultTypeFactory factory = (DefaultTypeFactory)m_factories.get( roleType );

if( null == factory )
{
factory = new DefaultTypeFactory( m_classLoader );
m_factories.put( roleType, factory );
} }
m_descriptorUrls = (String[])typeUrls.toArray( new String[ typeUrls.size() ] );
m_descriptors = (Configuration[])descriptors.toArray( new Configuration[ descriptors.size() ] );

return factory;
}

/**
* Returns the classloader for this deployment.
*/
public ClassLoader getClassLoader()
{
return m_classLoader;
} }


/** /**
@@ -135,8 +138,8 @@ class Deployment
{ {
for( int i = 0; i < m_descriptors.length; i++ ) for( int i = 0; i < m_descriptors.length; i++ )
{ {
Configuration descriptor = m_descriptors[ i ];
deployFromDescriptor( descriptor, m_descriptorUrls[ i ] );
TypeDescriptor descriptor = m_descriptors[ i ];
deployTypes( descriptor );
} }
} }


@@ -148,19 +151,21 @@ class Deployment
{ {
try try
{ {
// Locate the entry for the type
// Locate the definition for the type
for( int i = 0; i < m_descriptors.length; i++ ) for( int i = 0; i < m_descriptors.length; i++ )
{ {
Configuration descriptor = m_descriptors[ i ];
final Configuration[] datatypes =
descriptor.getChild( "types" ).getChildren( roleShorthand );
for( int j = 0; j < datatypes.length; j++ )
final TypeDescriptor descriptor = m_descriptors[ i ];
final TypeDefinition[] definitions = descriptor.getDefinitions();
for( int j = 0; j < definitions.length; j++ )
{ {
Configuration datatype = datatypes[ j ];
if( datatype.getAttribute( "name" ).equals( typeName ) )
TypeDefinition definition = definitions[ j ];
if( definition.getRole().equals( roleShorthand )
&& definition.getName().equals( typeName ) )
{ {
final TypeDefinition typeDef = m_deployer.createTypeDefinition( datatype );
m_deployer.handleType( this, typeDef );
// Found the definition - deploy it. Note that we
// keep looking for matching types, and let the deployer
// deal with duplicates
m_deployer.deployType( this, definition );
} }
} }
} }
@@ -178,30 +183,63 @@ class Deployment
public void deployType( final TypeDefinition typeDef ) public void deployType( final TypeDefinition typeDef )
throws DeploymentException throws DeploymentException
{ {
final String typeName = typeDef.getName();
final String roleShorthand = typeDef.getRole();
try try
{ {
m_deployer.handleType( this, typeDef );
m_deployer.deployType( this, typeDef );
} }
catch( Exception e ) catch( Exception e )
{ {
final String message = REZ.getString( "deploy-type.error", roleShorthand, typeName );
final String message = REZ.getString( "deploy-type.error", typeDef.getRole(), typeDef.getName() );
throw new DeploymentException( message, e ); throw new DeploymentException( message, e );
} }
} }


/**
* Builds descriptors.
*/
private ArrayList buildDescriptors( final ArrayList urls,
final DescriptorBuilder builder,
final XMLReader parser,
final SAXConfigurationHandler handler )
throws Exception
{
final ArrayList descriptors = new ArrayList();
for( int i = 0; i < urls.size(); i++ )
{
final String url = (String)urls.get( i );

// Parse the file
parser.parse( url );
final TypelibDescriptor descriptor = builder.createDescriptor( handler.getConfiguration(), url );
descriptors.add( descriptor );
}

return descriptors;
}

/** /**
* Locates all resources of a particular name. * Locates all resources of a particular name.
*/ */
private List locateResources( final String resource, final URL jarUrl )
private ArrayList locateResources( final String resource, final URL jarUrl )
throws Exception throws Exception
{ {
final ArrayList urls = new ArrayList(); final ArrayList urls = new ArrayList();
if( null != jarUrl ) if( null != jarUrl )
{ {
final String systemID = "jar:" + jarUrl + "!/" + resource; final String systemID = "jar:" + jarUrl + "!/" + resource;
urls.add( systemID );
try
{
// Probe the resource
final URL url = new URL( systemID );
url.openStream().close();

// Add to the list
urls.add( systemID );
}
catch( FileNotFoundException e )
{
// Ignore
}
} }
else else
{ {
@@ -216,77 +254,45 @@ class Deployment
} }


/** /**
* Configure RoleManager based on contents of single descriptor.
*
* @param descriptor the descriptor
* @exception ConfigurationException if an error occurs
* Deploys the roles from a role descriptor.
*/ */
private void handleRoleDescriptor( final Configuration descriptor,
final String url )
throws ConfigurationException
private void deployRoles( final RoleDescriptor descriptor )
{ {
final String message = REZ.getString( "url-deploy-roles.notice", url );
final String message = REZ.getString( "url-deploy-roles.notice", descriptor.getUrl() );
getLogger().info( message ); getLogger().info( message );


final Configuration[] types = descriptor.getChildren( "role" );
for( int i = 0; i < types.length; i++ )
final RoleDefinition[] definitions = descriptor.getDefinitions();
for( int i = 0; i < definitions.length; i++ )
{ {
final String name = types[ i ].getAttribute( "shorthand" );
final String role = types[ i ].getAttribute( "name" );
final RoleDefinition roleDef = new RoleDefinition( role, name );
m_deployer.handleRole( this, roleDef );
final RoleDefinition definition = definitions[ i ];
m_deployer.deployRole( this, definition );
} }
} }


/** /**
* Deploys all types from a typelib descriptor. * Deploys all types from a typelib descriptor.
*/ */
private void deployFromDescriptor( final Configuration descriptor,
final String url )
private void deployTypes( final TypeDescriptor descriptor )
throws DeploymentException throws DeploymentException
{ {
try try
{ {
final String message = REZ.getString( "url-deploy-types.notice", url );
final String message = REZ.getString( "url-deploy-types.notice", descriptor.getUrl() );
getLogger().info( message ); getLogger().info( message );


// Deploy all the types // Deploy all the types
final Configuration[] typeEntries = descriptor.getChild( "types" ).getChildren();
for( int i = 0; i < typeEntries.length; i++ )
final TypeDefinition[] definitions = descriptor.getDefinitions();
for( int i = 0; i < definitions.length; i++ )
{ {
final Configuration typeEntry = typeEntries[ i ];
final TypeDefinition typeDef = m_deployer.createTypeDefinition( typeEntry );
m_deployer.handleType( this, typeDef );
final TypeDefinition definition = definitions[ i ];
m_deployer.deployType( this, definition );
} }
} }
catch( final Exception e ) catch( final Exception e )
{ {
final String message = REZ.getString( "deploy-lib.error", url );
final String message = REZ.getString( "deploy-types.error", descriptor.getUrl() );
throw new DeploymentException( message, e ); throw new DeploymentException( message, e );
} }
} }


/**
* Returns the type factory for a role.
*/
public DefaultTypeFactory getFactory( final Class roleType )
{
DefaultTypeFactory factory = (DefaultTypeFactory)m_factories.get( roleType );

if( null == factory )
{
factory = new DefaultTypeFactory( m_classLoader );
m_factories.put( roleType, factory );
}

return factory;
}

/**
* Returns the classloader for this deployment.
*/
public ClassLoader getClassLoader()
{
return m_classLoader;
}
} }

+ 27
- 0
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DescriptorBuilder.java View File

@@ -0,0 +1,27 @@
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.myrmidon.components.deployer;

import org.apache.avalon.framework.configuration.Configuration;
import org.apache.myrmidon.interfaces.deployer.DeploymentException;

/**
* Builds a descriptor.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$
*/
interface DescriptorBuilder
{
/**
* Builds a descriptor from a set of configuration.
*/
TypelibDescriptor createDescriptor( Configuration config,
String descriptorUrl )
throws DeploymentException;
}

+ 8
- 2
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/Resources.properties View File

@@ -4,9 +4,9 @@ register-role.notice=Registered role {0} with shorthand name {1}.
url-deploy-types.notice=Registering types from "{0}". url-deploy-types.notice=Registering types from "{0}".
url-deploy-roles.notice=Registering roles from "{0}". url-deploy-roles.notice=Registering roles from "{0}".


deploy-from-classloader.error=Could not register types from ClassLoader {0}.
deploy-from-classloader.error=Could not register types from ClassLoader.
deploy-from-file.error=Could not register types from type library "{0}". deploy-from-file.error=Could not register types from type library "{0}".
deploy-lib.error=Could not register types from "{0}".
deploy-types.error=Could not register types from "{0}".
deploy-converter.error=Could not register converter that converts from {0} to {1}. deploy-converter.error=Could not register converter that converts from {0} to {1}.
deploy-type.error=Could not register type {0}/{1}. deploy-type.error=Could not register type {0}/{1}.
unknown-role4name.error=Unknown role "{0}". unknown-role4name.error=Unknown role "{0}".
@@ -17,6 +17,12 @@ typedef.no-name.error=Must specify name parameter.
typedef.no-role.error=Must specify type parameter. typedef.no-role.error=Must specify type parameter.
converterdef.no-source.error=Must specify the source-type parameter. converterdef.no-source.error=Must specify the source-type parameter.
converterdef.no-destination.error=Must specify the destination-type parameter. converterdef.no-destination.error=Must specify the destination-type parameter.
role-descriptor-version.error=Role descriptor version {0} is incompatible with current version {1}.
build-role-descriptor.error=Could not build role descriptor from "{0}".
type-descriptor-version.error=Type library descriptor version {0} is incompatible with current version {1}.
build-type-descriptor.error=Could not build type library descriptor from "{0}".
service-descriptor-version.error=Service descriptor version {0} is incompatible with current version {1}.
build-service-descriptor.error=Could not build service descriptor from "{0}".


available-extensions.notice=The list of available extensions for type library includes; {0} available-extensions.notice=The list of available extensions for type library includes; {0}
required-extensions.notice=The list of required extensions for type library includes; {0} required-extensions.notice=The list of required extensions for type library includes; {0}


+ 44
- 0
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/RoleDescriptor.java View File

@@ -0,0 +1,44 @@
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.myrmidon.components.deployer;

import java.util.ArrayList;
import java.util.List;

/**
* A typelib role descriptor, which defines a set of roles.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$
*/
class RoleDescriptor
extends TypelibDescriptor
{
private final List m_definitions = new ArrayList();

public RoleDescriptor( final String url )
{
super( url );
}

/**
* Returns the role definitions in the descriptor.
*/
public RoleDefinition[] getDefinitions()
{
return (RoleDefinition[])m_definitions.toArray( new RoleDefinition[ m_definitions.size() ] );
}

/**
* Adds a role definition to the descriptor.
*/
public void addDefinition( final RoleDefinition def )
{
m_definitions.add( def );
}
}

+ 69
- 0
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/RoleDescriptorBuilder.java View File

@@ -0,0 +1,69 @@
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.myrmidon.components.deployer;

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.myrmidon.interfaces.deployer.DeploymentException;

/**
* Builds typelib role descriptors.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$
*/
class RoleDescriptorBuilder
implements DescriptorBuilder
{
private final static Resources REZ =
ResourceManager.getPackageResources( RoleDescriptorBuilder.class );

private final static Version ROLE_DESCRIPTOR_VERSION = new Version( 1, 0, 0 );

/**
* Builds a descriptor from a set of configuration.
*/
public TypelibDescriptor createDescriptor( final Configuration config,
final String url )
throws DeploymentException
{
try
{
// Check version
final String versionString = config.getAttribute( "version" );
final Version version = Version.getVersion( versionString );
if( ! ROLE_DESCRIPTOR_VERSION.complies( version ) )
{
final String message = REZ.getString( "role-descriptor-version.error", version, ROLE_DESCRIPTOR_VERSION );
throw new DeploymentException( message );
}

// Assemble the descriptor
final RoleDescriptor descriptor = new RoleDescriptor( url );

// Extract each of the role elements
final Configuration[] types = config.getChildren( "role" );
for( int i = 0; i < types.length; i++ )
{
final String name = types[ i ].getAttribute( "shorthand" );
final String role = types[ i ].getAttribute( "name" );
final RoleDefinition roleDef = new RoleDefinition( role, name );
descriptor.addDefinition( roleDef );
}

return descriptor;
}
catch( Exception e )
{
final String message = REZ.getString( "build-role-descriptor.error", url );
throw new DeploymentException( message, e );
}
}
}

+ 56
- 0
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/ServiceDefinition.java View File

@@ -0,0 +1,56 @@
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.myrmidon.components.deployer;

import org.apache.avalon.framework.configuration.Configuration;

/**
* A service definition.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$
*/
class ServiceDefinition
{
private final String m_roleShorthand;
private final String m_factoryClass;
private final Configuration m_config;

public ServiceDefinition( final String roleShorthand,
final String factoryClass,
final Configuration config )
{
m_roleShorthand = roleShorthand;
m_factoryClass = factoryClass;
m_config = config;
}

/**
* Returns the role that the service implements.
*/
public String getRoleShorthand()
{
return m_roleShorthand;
}

/**
* Returns the name of the factory class for creating the service.
*/
public String getFactoryClass()
{
return m_factoryClass;
}

/**
* Returns the service configuration.
*/
public Configuration getConfig()
{
return m_config;
}
}

+ 38
- 0
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/ServiceDescriptor.java View File

@@ -0,0 +1,38 @@
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.myrmidon.components.deployer;

import java.util.ArrayList;
import java.util.List;

/**
* A typelib service descriptor, which defines a set of services.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$
*/
class ServiceDescriptor
extends TypelibDescriptor
{
private final List m_services = new ArrayList();

public ServiceDescriptor( final String url )
{
super( url );
}

public ServiceDefinition[] getDefinitions()
{
return (ServiceDefinition[])m_services.toArray( new ServiceDefinition[ m_services.size() ] );
}

public void addDefinition( final ServiceDefinition definition )
{
m_services.add( definition );
}
}

+ 58
- 0
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/ServiceDescriptorBuilder.java View File

@@ -0,0 +1,58 @@
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.myrmidon.components.deployer;

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.myrmidon.interfaces.deployer.DeploymentException;

/**
* Builds typelib service descriptors.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$
*/
class ServiceDescriptorBuilder
implements DescriptorBuilder
{
private final static Resources REZ =
ResourceManager.getPackageResources( ServiceDescriptorBuilder.class );

private final static Version SERVICE_DESCRIPTOR_VERSION = new Version( 1, 0, 0 );

/**
* Builds a descriptor from a set of configuration.
*/
public TypelibDescriptor createDescriptor( final Configuration config,
final String url )
throws DeploymentException
{
try
{
// Check version
final String versionString = config.getAttribute( "version" );
final Version version = Version.getVersion( versionString );
if( ! SERVICE_DESCRIPTOR_VERSION.complies( version ) )
{
final String message = REZ.getString( "service-descriptor-version.error", version, SERVICE_DESCRIPTOR_VERSION );
throw new DeploymentException( message );
}

// TODO - populate the descriptor

return new ServiceDescriptor( url );
}
catch( Exception e )
{
final String message = REZ.getString( "build-service-descriptor.error", url );
throw new DeploymentException( message, e );
}
}
}

+ 39
- 0
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/TypeDescriptor.java View File

@@ -0,0 +1,39 @@
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.myrmidon.components.deployer;

import java.util.ArrayList;
import java.util.List;
import org.apache.myrmidon.interfaces.deployer.TypeDefinition;

/**
* A typelib type descriptor, which defines a set of types.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$
*/
class TypeDescriptor
extends TypelibDescriptor
{
private final List m_definitions = new ArrayList();

public TypeDescriptor( final String url )
{
super( url );
}

public TypeDefinition[] getDefinitions()
{
return (TypeDefinition[])m_definitions.toArray( new TypeDefinition[ m_definitions.size() ] );
}

public void addDefinition( final TypeDefinition def )
{
m_definitions.add( def );
}
}

+ 95
- 0
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/TypeDescriptorBuilder.java View File

@@ -0,0 +1,95 @@
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.myrmidon.components.deployer;

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.myrmidon.interfaces.deployer.ConverterDefinition;
import org.apache.myrmidon.interfaces.deployer.DeploymentException;
import org.apache.myrmidon.interfaces.deployer.TypeDefinition;

/**
* Builds typelib type descriptors.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$
*/
class TypeDescriptorBuilder
implements DescriptorBuilder
{
private final static Resources REZ =
ResourceManager.getPackageResources( TypeDescriptorBuilder.class );

private final static Version TYPE_DESCRIPTOR_VERSION = new Version( 1, 0, 0 );

/**
* Builds a descriptor from a set of configuration.
*/
public TypelibDescriptor createDescriptor( final Configuration config,
final String url )
throws DeploymentException
{
try
{
// Check version
final String versionString = config.getAttribute( "version" );
final Version version = Version.getVersion( versionString );
if( ! TYPE_DESCRIPTOR_VERSION.complies( version ) )
{
final String message = REZ.getString( "type-descriptor-version.error", version, TYPE_DESCRIPTOR_VERSION );
throw new DeploymentException( message );
}

// Assemble the descriptor
final TypeDescriptor descriptor = new TypeDescriptor( url );

// Extract each of the types elements
final Configuration[] typeEntries = config.getChild( "types" ).getChildren();
for( int i = 0; i < typeEntries.length; i++ )
{
final Configuration typeEntry = typeEntries[ i ];
final TypeDefinition typeDef = createTypeDefinition( typeEntry );
descriptor.addDefinition( typeDef );
}

return descriptor;
}
catch( Exception e )
{
final String message = REZ.getString( "build-type-descriptor.error", url );
throw new DeploymentException( message, e );
}
}

/**
* Creates a type definition.
*/
public TypeDefinition createTypeDefinition( final Configuration configuration )
throws ConfigurationException
{
final String roleShorthand = configuration.getName();
if( roleShorthand.equals( "converter" ) )
{
// A converter definition
final String className = configuration.getAttribute( "classname" );
final String source = configuration.getAttribute( "source" );
final String destination = configuration.getAttribute( "destination" );
return new ConverterDefinition( className, source, destination );
}
else
{
// A type definition
final String typeName = configuration.getAttribute( "name" );
final String className = configuration.getAttribute( "classname" );
return new TypeDefinition( typeName, roleShorthand, className );
}
}
}

+ 32
- 0
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/TypelibDescriptor.java View File

@@ -0,0 +1,32 @@
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.myrmidon.components.deployer;

/**
* A descriptor from a typelib.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$
*/
class TypelibDescriptor
{
private final String m_url;

public TypelibDescriptor( final String url )
{
m_url = url;
}

/**
* Returns the descriptor URL.
*/
public String getUrl()
{
return m_url;
}
}

Loading…
Cancel
Save