Browse Source

Broke up large method into multiple methods. Update descriptor format into two sections to make converters and types separate.

Also scan base classloader for any default types defined by runtime. use ClassLoader.getResources() to scan for all descriptors to process.


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269126 13f79535-47bb-0310-9956-ffa450edef68
master
Peter Donald 24 years ago
parent
commit
1a4fd4f86a
1 changed files with 112 additions and 31 deletions
  1. +112
    -31
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultDeployer.java

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

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


import java.io.File; import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.HashMap;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.component.ComponentException; 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.configuration.Configuration; import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.configuration.SAXConfigurationHandler;
import org.apache.avalon.framework.logger.AbstractLoggable; import org.apache.avalon.framework.logger.AbstractLoggable;
import org.apache.myrmidon.api.DataType;
import org.apache.myrmidon.api.Task;
import org.apache.myrmidon.components.converter.ConverterRegistry; import org.apache.myrmidon.components.converter.ConverterRegistry;
import org.apache.myrmidon.components.executor.Executor;
import org.apache.myrmidon.components.type.DefaultTypeFactory; import org.apache.myrmidon.components.type.DefaultTypeFactory;
import org.apache.myrmidon.components.type.TypeManager; import org.apache.myrmidon.components.type.TypeManager;
import org.apache.myrmidon.converter.Converter; import org.apache.myrmidon.converter.Converter;
import org.apache.myrmidon.api.DataType;
import org.apache.myrmidon.api.Task;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;


/** /**
* This class deploys a .tsk file into a registry. * This class deploys a .tsk file into a registry.
@@ -29,8 +38,10 @@ import org.apache.myrmidon.api.Task;
*/ */
public class DefaultDeployer public class DefaultDeployer
extends AbstractLoggable extends AbstractLoggable
implements Composable, Deployer
implements Deployer, Initializable, Composable
{ {
private final static String TYPE_DESCRIPTOR = "META-INF/ant-types.xml";

private ConverterRegistry m_converterRegistry; private ConverterRegistry m_converterRegistry;
private TypeManager m_typeManager; private TypeManager m_typeManager;
private RoleManager m_roleManager; private RoleManager m_roleManager;
@@ -49,34 +60,47 @@ public class DefaultDeployer
m_roleManager = (RoleManager)componentManager.lookup( RoleManager.ROLE ); m_roleManager = (RoleManager)componentManager.lookup( RoleManager.ROLE );
} }


public void initialize()
throws Exception
{
final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
final SAXParser saxParser = saxParserFactory.newSAXParser();
final XMLReader parser = saxParser.getXMLReader();
//parser.setFeature( "http://xml.org/sax/features/namespace-prefixes", false );

final SAXConfigurationHandler handler = new SAXConfigurationHandler();
parser.setContentHandler( handler );
parser.setErrorHandler( handler );

final ClassLoader classLoader = getClass().getClassLoader();
final DefaultTypeFactory factory = new DefaultTypeFactory( classLoader );

final Enumeration enum = classLoader.getResources( Deployment.DESCRIPTOR_NAME );
while( enum.hasMoreElements() )
{
final URL url = (URL)enum.nextElement();
parser.parse( url.toString() );
getLogger().debug( "deploying " + url );
deployFromDescriptor( handler.getConfiguration(), classLoader, url );
}
}

public void deploy( final File file ) public void deploy( final File file )
throws DeploymentException throws DeploymentException
{ {
getLogger().info( "Deploying AntLib file (" + file + ")" ); getLogger().info( "Deploying AntLib file (" + file + ")" );


try
{
checkFile( file );
checkFile( file );


final Deployment deployment = new Deployment( file );
final Configuration descriptor = deployment.getDescriptor();
final DefaultTypeFactory factory = new DefaultTypeFactory( deployment.getURL() );
final Deployment deployment = new Deployment( file );
final Configuration descriptor = deployment.getDescriptor();
final URL[] urls = new URL[] { deployment.getURL() };
final URLClassLoader classLoader =
new URLClassLoader( urls, Thread.currentThread().getContextClassLoader() );


final Configuration[] children = descriptor.getChildren();
for( int i = 0; i < children.length; i++ )
{
final String name = children[ i ].getName();
if( name.equals( "converter" ) )
{
handleConverter( children[ i ], factory );
}
else
{
final String role = getRoleForName( name );
handleType( role, children[ i ], factory );
}
}
try
{
deployFromDescriptor( descriptor, classLoader, deployment.getURL() );
} }
catch( final DeploymentException de ) catch( final DeploymentException de )
{ {
@@ -85,7 +109,7 @@ public class DefaultDeployer
catch( final Exception e ) catch( final Exception e )
{ {
throw new DeploymentException( "Error deploying library", e ); throw new DeploymentException( "Error deploying library", e );
}
}
} }


public void deployConverter( final String name, final File file ) public void deployConverter( final String name, final File file )
@@ -99,7 +123,9 @@ public class DefaultDeployer


try try
{ {
final Configuration[] converters = descriptor.getChildren( "converter" );
final Configuration[] converters =
descriptor.getChild( "converters" ).getChildren( "converter" );

for( int i = 0; i < converters.length; i++ ) for( int i = 0; i < converters.length; i++ )
{ {
if( converters[ i ].getAttribute( "classname" ).equals( name ) ) if( converters[ i ].getAttribute( "classname" ).equals( name ) )
@@ -128,10 +154,12 @@ public class DefaultDeployer
final Deployment deployment = new Deployment( file ); final Deployment deployment = new Deployment( file );
final Configuration descriptor = deployment.getDescriptor(); final Configuration descriptor = deployment.getDescriptor();
final DefaultTypeFactory factory = new DefaultTypeFactory( deployment.getURL() ); final DefaultTypeFactory factory = new DefaultTypeFactory( deployment.getURL() );
try try
{ {
final Configuration[] datatypes = descriptor.getChildren( shorthand );
final Configuration[] datatypes =
descriptor.getChild( "types" ).getChildren( shorthand );

for( int i = 0; i < datatypes.length; i++ ) for( int i = 0; i < datatypes.length; i++ )
{ {
if( datatypes[ i ].getAttribute( "name" ).equals( name ) ) if( datatypes[ i ].getAttribute( "name" ).equals( name ) )
@@ -151,6 +179,59 @@ public class DefaultDeployer
} }
} }


private void deployFromDescriptor( final Configuration descriptor,
final ClassLoader classLoader,
final URL url )
throws DeploymentException, Exception
{
try
{
//Have to keep a new factory per role
//To avoid name clashes (ie a datatype and task with same name)
final HashMap factorys = new HashMap();

final Configuration[] types = descriptor.getChild( "types" ).getChildren();
for( int i = 0; i < types.length; i++ )
{
final String name = types[ i ].getName();
final String role = getRoleForName( name );
final DefaultTypeFactory factory = getFactory( role, classLoader, factorys );
handleType( role, types[ i ], factory );
}

final DefaultTypeFactory factory = new DefaultTypeFactory( classLoader );
final Configuration[] converters = descriptor.getChild( "converters" ).getChildren();
for( int i = 0; i < converters.length; i++ )
{
final String name = converters[ i ].getName();
handleConverter( converters[ i ], factory );
}
}
catch( final DeploymentException de )
{
throw de;
}
catch( final Exception e )
{
throw new DeploymentException( "Error deploying library from " + url, e );
}
}

private DefaultTypeFactory getFactory( final String role,
final ClassLoader classLoader,
final HashMap factorys )
{
DefaultTypeFactory factory = (DefaultTypeFactory)factorys.get( role );

if( null == factory )
{
factory = new DefaultTypeFactory( classLoader );
factorys.put( role, factory );
}

return factory;
}

private String getNameForRole( final String role ) private String getNameForRole( final String role )
throws DeploymentException throws DeploymentException
{ {
@@ -160,7 +241,7 @@ public class DefaultDeployer
{ {
throw new DeploymentException( "RoleManager does not know name for role " + role ); throw new DeploymentException( "RoleManager does not know name for role " + role );
} }
return name; return name;
} }


@@ -173,7 +254,7 @@ public class DefaultDeployer
{ {
throw new DeploymentException( "RoleManager does not know role for name " + name ); throw new DeploymentException( "RoleManager does not know role for name " + name );
} }
return role; return role;
} }




Loading…
Cancel
Save