diff --git a/proposal/myrmidon/src/java/org/apache/ant/modules/core/AbstractTypeDefinition.java b/proposal/myrmidon/src/java/org/apache/ant/modules/core/AbstractTypeDefinition.java index 7ea962a00..66b12e655 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/modules/core/AbstractTypeDefinition.java +++ b/proposal/myrmidon/src/java/org/apache/ant/modules/core/AbstractTypeDefinition.java @@ -8,8 +8,6 @@ package org.apache.ant.modules.core; import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; @@ -69,9 +67,9 @@ public abstract class AbstractTypeDefinition "lib parameter" ); } - final URL url = getURL( m_lib ); + final File file = getFile( m_lib ); - registerResource( m_name, m_classname, url ); + registerResource( m_name, m_classname, file ); } protected final TskDeployer getDeployer() @@ -84,17 +82,12 @@ public abstract class AbstractTypeDefinition return m_typeManager; } - private final URL getURL( final String libName ) + private final File getFile( final String libName ) throws TaskException { if( null != libName ) { - final File lib = getContext().resolveFile( libName ); - try { return lib.toURL(); } - catch( final MalformedURLException mue ) - { - throw new TaskException( "Malformed task-lib parameter " + m_lib, mue ); - } + return getContext().resolveFile( libName ); } else { @@ -102,6 +95,6 @@ public abstract class AbstractTypeDefinition } } - protected abstract void registerResource( String name, String classname, URL url ) + protected abstract void registerResource( String name, String classname, File file ) throws TaskException; } diff --git a/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterConverter.java b/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterConverter.java index a6ddce7ad..970b0e039 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterConverter.java +++ b/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterConverter.java @@ -76,10 +76,10 @@ public class RegisterConverter throw new TaskException( "Must specify classname parameter" ); } - final URL url = getURL( m_lib ); - boolean isFullyDefined = true; + final File file = getFile( m_lib ); + if( null == m_sourceType && null == m_destinationType ) { isFullyDefined = false; @@ -90,7 +90,7 @@ public class RegisterConverter "parameters when supplying a name" ); } - if( !isFullyDefined && null == url ) + if( !isFullyDefined && null == file ) { throw new TaskException( "Must supply parameter if not fully specifying converter" ); } @@ -99,22 +99,26 @@ public class RegisterConverter { try { - m_tskDeployer.deployConverter( m_classname, url.toString(), url ); + m_tskDeployer.deployConverter( m_classname, file ); } catch( final DeploymentException de ) { throw new TaskException( "Failed deploying " + m_classname + - " from " + url, de ); + " from " + file, de ); } } else { - m_converterRegistry.registerConverter( m_classname, m_sourceType, m_destinationType ); - - final DefaultTypeFactory factory = new DefaultTypeFactory( new URL[] { url } ); - factory.addNameClassMapping( m_classname, m_classname ); + try + { + m_converterRegistry.registerConverter( m_classname, m_sourceType, m_destinationType ); - try { m_typeManager.registerType( Converter.ROLE, m_classname, factory ); } + final URL url = file.toURL(); + final DefaultTypeFactory factory = new DefaultTypeFactory( new URL[] { url } ); + factory.addNameClassMapping( m_classname, m_classname ); + + m_typeManager.registerType( Converter.ROLE, m_classname, factory ); + } catch( final Exception e ) { throw new TaskException( "Failed to register converter " + m_classname, e ); @@ -122,17 +126,12 @@ public class RegisterConverter } } - private URL getURL( final String libName ) + private File getFile( final String libName ) throws TaskException { if( null != libName ) { - final File lib = getContext().resolveFile( libName ); - try { return lib.toURL(); } - catch( final MalformedURLException mue ) - { - throw new TaskException( "Malformed task-lib parameter " + m_lib, mue ); - } + return getContext().resolveFile( libName ); } else { diff --git a/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterDataType.java b/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterDataType.java index 232ab0d4c..ee562842d 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterDataType.java +++ b/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterDataType.java @@ -7,6 +7,7 @@ */ package org.apache.ant.modules.core; +import java.io.File; import java.net.URL; import org.apache.myrmidon.api.DataType; import org.apache.myrmidon.api.TaskException; @@ -23,25 +24,29 @@ public class RegisterDataType { protected void registerResource( final String name, final String className, - final URL url ) + final File file ) throws TaskException { if( null == className ) { - try { getDeployer().deployDataType( name, url.toString(), url ); } + try { getDeployer().deployDataType( name, file ); } catch( final DeploymentException de ) { - throw new TaskException( "Failed deploying " + name + " from " + url, de ); + throw new TaskException( "Failed deploying " + name + " from " + file, de ); } } else { - final DefaultTypeFactory factory = new DefaultTypeFactory( new URL[] { url } ); - factory.addNameClassMapping( name, className ); - try { getTypeManager().registerType( DataType.ROLE, name, factory ); } + try + { + final URL url = file.toURL(); + final DefaultTypeFactory factory = new DefaultTypeFactory( new URL[] { url } ); + factory.addNameClassMapping( name, className ); + getTypeManager().registerType( DataType.ROLE, name, factory ); + } catch( final Exception e ) { - throw new TaskException( "Failed registering " + name + " from " + url, e ); + throw new TaskException( "Failed registering " + name + " from " + file, e ); } } } diff --git a/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklet.java b/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklet.java index 4e91ebd27..20fbcee58 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklet.java +++ b/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklet.java @@ -7,6 +7,7 @@ */ package org.apache.ant.modules.core; +import java.io.File; import java.net.URL; import org.apache.myrmidon.api.Task; import org.apache.myrmidon.api.TaskException; @@ -23,25 +24,29 @@ public class RegisterTasklet { protected void registerResource( final String name, final String className, - final URL url ) + final File file ) throws TaskException { if( null == className ) { - try { getDeployer().deployTask( name, url.toString(), url ); } + try { getDeployer().deployTask( name, file ); } catch( final DeploymentException de ) { - throw new TaskException( "Failed deploying " + name + " from " + url, de ); + throw new TaskException( "Failed deploying " + name + " from " + file, de ); } } else { - final DefaultTypeFactory factory = new DefaultTypeFactory( new URL[] { url } ); - factory.addNameClassMapping( name, className ); - try { getTypeManager().registerType( Task.ROLE, name, factory ); } + try + { + final URL url = file.toURL(); + final DefaultTypeFactory factory = new DefaultTypeFactory( new URL[] { url } ); + factory.addNameClassMapping( name, className ); + getTypeManager().registerType( Task.ROLE, name, factory ); + } catch( final Exception e ) { - throw new TaskException( "Failed registering " + name + " from " + url, e ); + throw new TaskException( "Failed registering " + name + " from " + file, e ); } } } diff --git a/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklib.java b/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklib.java index c919defcd..b04457c73 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklib.java +++ b/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklib.java @@ -51,16 +51,11 @@ public class RegisterTasklib URL url = null; - final File lib = getContext().resolveFile( m_lib ); - try { url = lib.toURL(); } - catch( final MalformedURLException mue ) - { - throw new TaskException( "Malformed task-lib parameter " + m_lib, mue ); - } + final File file = getContext().resolveFile( m_lib ); try { - m_tskDeployer.deploy( url.toString(), url ); + m_tskDeployer.deploy( file ); } catch( final DeploymentException de ) { diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/RoleManager.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultRoleManager.java similarity index 57% rename from proposal/myrmidon/src/java/org/apache/myrmidon/components/type/RoleManager.java rename to proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultRoleManager.java index c87639752..49ee45435 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/RoleManager.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultRoleManager.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE file. */ -package org.apache.myrmidon.components.type; +package org.apache.myrmidon.components.deployer; import java.util.HashMap; @@ -18,18 +18,22 @@ import java.util.HashMap; * @author Peter Donald * @version CVS $Revision$ $Date$ */ -public class RoleManager +public class DefaultRoleManager + implements RoleManager { /** Parent RoleManager for nested resolution */ private final RoleManager m_parent; - /** Map for shorthand to role mapping */ - private final HashMap m_shorthands = new HashMap(); + /** Map for name to role mapping */ + private final HashMap m_names = new HashMap(); + + /** Map for role to name mapping */ + private final HashMap m_roles = new HashMap(); /** * constructor--this RoleManager has no parent. */ - public RoleManager() + public DefaultRoleManager() { this( null ); } @@ -40,7 +44,7 @@ public class RoleManager * * @param parent The parent RoleManager. */ - public RoleManager( final RoleManager parent ) + public DefaultRoleManager( final RoleManager parent ) { m_parent = parent; } @@ -48,32 +52,50 @@ public class RoleManager /** * Find Role name based on shorthand name. * - * @param shorthandName the shorthand name + * @param name the shorthand name * @return the role */ - public String getRoleForName( final String shorthandName ) + public String getRoleForName( final String name ) { - final String role = (String)m_shorthands.get( shorthandName ); + final String role = (String)m_names.get( name ); if( null == role && null != m_parent ) { - return m_parent.getRoleForName( shorthandName ); + return m_parent.getRoleForName( name ); } return role; } /** - * Add a mapping between shorthand name and role + * Find name based on role. + * + * @param role the role + * @return the name + */ + public String getNameForRole( final String role ) + { + final String name = (String)m_roles.get( role ); + + if( null == name && null != m_parent ) + { + return m_parent.getNameForRole( name ); + } + + return name; + } + + /** + * Add a mapping between name and role * - * @param shorthandName the shorthand name + * @param name the shorthand name * @param role the role * @exception IllegalArgumentException if an name is already mapped to a different role */ - public void addNameRoleMapping( final String shorthandName, final String role ) + public void addNameRoleMapping( final String name, final String role ) throws IllegalArgumentException { - final String oldRole = (String)m_shorthands.get( shorthandName ); + final String oldRole = (String)m_names.get( name ); if( null != oldRole && oldRole.equals( role ) ) { @@ -81,6 +103,7 @@ public class RoleManager oldRole + ")" ); } - m_shorthands.put( shorthandName, role ); + m_names.put( name, role ); + m_roles.put( role, name ); } } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultTskDeployer.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultTskDeployer.java index 1941c0e8b..c384b642a 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultTskDeployer.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultTskDeployer.java @@ -47,15 +47,7 @@ public class DefaultTskDeployer private DefaultConfigurationBuilder m_configurationBuilder = new DefaultConfigurationBuilder(); private ConverterRegistry m_converterRegistry; private TypeManager m_typeManager; - - /** - * Default constructor. - */ - public DefaultTskDeployer() - { - //m_autoUndeploy = true; - //m_type = "Task"; - } + private RoleManager m_roleManager; /** * Retrieve relevent services needed to deploy. @@ -68,42 +60,29 @@ public class DefaultTskDeployer { m_converterRegistry = (ConverterRegistry)componentManager.lookup( ConverterRegistry.ROLE ); m_typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE ); + m_roleManager = (RoleManager)componentManager.lookup( RoleManager.ROLE ); } - public void deploy( final String location, final URL url ) + public void deploy( final File file ) throws DeploymentException { - //checkDeployment( location, url ); - final File file = getFileFor( url ); + getLogger().info( "Deploying AntLib file (" + file + ")" ); - getLogger().info( "Deploying AntLib file (" + file + ") as " + location ); - deployFromFile( location, file ); - } + final URL url = getURL( file ); - /** - * Deploy a file. - * Eventually this should be cached for performance reasons. - * - * @param location the location - * @param file the file - * @exception DeploymentException if an error occurs - */ - protected void deployFromFile( final String location, final File file ) - throws DeploymentException - { final ZipFile zipFile = getZipFileFor( file ); - - URL url = null; - try { - try { url = file.toURL(); } - catch( final MalformedURLException mue ) - { - throw new DeploymentException( "Unable to form url", mue ); - } - loadResources( zipFile, location, url ); + loadResources( zipFile, url ); } + catch( final DeploymentException de ) + { + throw de; + } + catch( final Exception e ) + { + throw new DeploymentException( "Error deploying library", e ); + } finally { try { zipFile.close(); } @@ -111,10 +90,10 @@ public class DefaultTskDeployer } } - private void loadResources( final ZipFile zipFile, final String location, final URL url ) - throws DeploymentException + private void loadResources( final ZipFile zipFile, final URL url ) + throws Exception { - final Configuration taskdefs = loadConfiguration( zipFile, TSKDEF_FILE ); + final Configuration taskdefs = getDescriptor( zipFile ); final DefaultTypeFactory factory = new DefaultTypeFactory( new URL[] { url } ); try @@ -141,18 +120,13 @@ public class DefaultTskDeployer { throw new DeploymentException( "Malformed taskdefs.xml", ce ); } - catch( final Exception e ) - { - throw new DeploymentException( "Failed to deploy " + location, e ); - } } - public void deployConverter( String name, String location, URL url ) + public void deployConverter( final String name, final File file ) throws DeploymentException { - //checkDeployment( location, url ); - final ZipFile zipFile = getZipFileFor( getFileFor( url ) ); - final Configuration taskdefs = loadConfiguration( zipFile, TSKDEF_FILE ); + final ZipFile zipFile = getZipFileFor( file ); + final Configuration taskdefs = getDescriptor( zipFile ); try { @@ -161,6 +135,7 @@ public class DefaultTskDeployer { if( converters[ i ].getAttribute( "classname" ).equals( name ) ) { + final URL url = getURL( file ); final DefaultTypeFactory factory = new DefaultTypeFactory( new URL[] { url } ); handleConverter( converters[ i ], url, factory ); break; @@ -177,13 +152,11 @@ public class DefaultTskDeployer } } - public void deployDataType( final String name, final String location, final URL url ) + public void deployDataType( final String name, final File file ) throws DeploymentException { - //checkDeployment( location, url ); - final ZipFile zipFile = getZipFileFor( getFileFor( url ) ); - final Configuration datatypedefs = - loadConfiguration( zipFile, TSKDEF_FILE ); + final ZipFile zipFile = getZipFileFor( file ); + final Configuration datatypedefs = getDescriptor( zipFile ); try { @@ -192,6 +165,7 @@ public class DefaultTskDeployer { if( datatypes[ i ].getAttribute( "name" ).equals( name ) ) { + final URL url = getURL( file ); final DefaultTypeFactory factory = new DefaultTypeFactory( new URL[] { url } ); handleDataType( datatypes[ i ], url, factory ); break; @@ -208,12 +182,11 @@ public class DefaultTskDeployer } } - public void deployTask( final String name, final String location, final URL url ) + public void deployTask( final String name, final File file ) throws DeploymentException { - //checkDeployment( location, url ); - final ZipFile zipFile = getZipFileFor( getFileFor( url ) ); - final Configuration taskdefs = loadConfiguration( zipFile, TSKDEF_FILE ); + final ZipFile zipFile = getZipFileFor( file ); + final Configuration taskdefs = getDescriptor( zipFile ); try { @@ -222,6 +195,7 @@ public class DefaultTskDeployer { if( tasks[ i ].getAttribute( "name" ).equals( name ) ) { + final URL url = getURL( file ); final DefaultTypeFactory factory = new DefaultTypeFactory( new URL[] { url } ); handleTask( tasks[ i ], url, factory ); break; @@ -265,10 +239,10 @@ public class DefaultTskDeployer * @return the Configuration * @exception DeploymentException if an error occurs */ - private Configuration loadConfiguration( final ZipFile zipFile, final String filename ) + private Configuration getDescriptor( final ZipFile zipFile ) throws DeploymentException { - return buildConfiguration( loadResourceStream( zipFile, filename ) ); + return buildConfiguration( loadResourceStream( zipFile, TSKDEF_FILE ) ); } /** @@ -403,4 +377,14 @@ public class DefaultTskDeployer ioe ); } } + + private URL getURL( final File file ) + throws DeploymentException + { + try { return file.toURL(); } + catch( final MalformedURLException mue ) + { + throw new DeploymentException( "Unable to form url", mue ); + } + } } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/RoleManager.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/RoleManager.java new file mode 100644 index 000000000..908b7f393 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/RoleManager.java @@ -0,0 +1,41 @@ +/* + * 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 file. + */ +package org.apache.myrmidon.components.deployer; + +import org.apache.avalon.framework.component.Component; + +/** + * Interface to manage roles and mapping to shorthand names. + * + * @author Berin Loritsch + * @author Ricardo Rocha + * @author Giacomo Pati + * @author Peter Donald + * @version CVS $Revision$ $Date$ + */ +public interface RoleManager + extends Component +{ + String ROLE = "org.apache.myrmidon.components.deployer.RoleManager"; + + /** + * Find Role name based on shorthand name. + * + * @param shorthandName the shorthand name + * @return the role + */ + String getRoleForName( String shorthandName ); + + /** + * Find name based on role. + * + * @param role the role + * @return the name + */ + String getNameForRole( String role ); +} diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/TskDeployer.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/TskDeployer.java index 3a7d9cc99..b7dec4c8b 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/TskDeployer.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/TskDeployer.java @@ -7,7 +7,7 @@ */ package org.apache.myrmidon.components.deployer; -import java.net.URL; +import java.io.File; import org.apache.avalon.framework.component.Component; /** @@ -21,22 +21,21 @@ public interface TskDeployer String ROLE = "org.apache.myrmidon.components.deployer.TskDeployer"; /** - * Deploy a resource indicate by url to location. + * Deploy a library. * - * @param location the location to deploy to - * @param url the url of deployment + * @param file the file deployment * @exception DeploymentException if an error occurs */ - void deploy( String location, URL url ) + void deploy( File file ) throws DeploymentException; - void deployConverter( String name, String location, URL url ) + void deployConverter( String name, File file ) throws DeploymentException; - void deployDataType( String name, String location, URL url ) + void deployDataType( String name, File file ) throws DeploymentException; - void deployTask( String name, String location, URL url ) + void deployTask( String name, File file ) throws DeploymentException; } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/MyrmidonEmbeddor.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/MyrmidonEmbeddor.java index c7c49b591..9914cb52e 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/MyrmidonEmbeddor.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/MyrmidonEmbeddor.java @@ -24,6 +24,7 @@ import org.apache.myrmidon.api.JavaVersion; import org.apache.myrmidon.components.builder.ProjectBuilder; import org.apache.myrmidon.components.configurer.Configurer; import org.apache.myrmidon.components.deployer.TskDeployer; +import org.apache.myrmidon.components.deployer.RoleManager; import org.apache.myrmidon.components.deployer.DeploymentException; import org.apache.myrmidon.components.executor.Executor; import org.apache.myrmidon.components.manager.ProjectManager; @@ -42,6 +43,7 @@ public class MyrmidonEmbeddor private ProjectManager m_projectManager; private ProjectBuilder m_builder; private TskDeployer m_deployer; + private RoleManager m_roleManager; private TypeManager m_typeManager; private MasterConverter m_converter; @@ -133,8 +135,8 @@ public class MyrmidonEmbeddor * @exception Exception if an error occurs */ public void dispose() - throws Exception { + m_roleManager = null; m_converterRegistry = null; m_converter = null; m_executor = null; @@ -166,6 +168,8 @@ public class MyrmidonEmbeddor defaults.setParameter( "myrmidon.lib.path", "lib" ); //create all the default properties for components + defaults.setParameter( RoleManager.ROLE, + "org.apache.myrmidon.components.deployer.DefaultRoleManager" ); defaults.setParameter( MasterConverter.ROLE, "org.apache.myrmidon.components.converter.DefaultMasterConverter" ); defaults.setParameter( ConverterRegistry.ROLE, @@ -202,6 +206,7 @@ public class MyrmidonEmbeddor componentManager.put( ProjectBuilder.ROLE, m_builder ); //Following components required when Myrmidon allows user deployment of tasks etal. + componentManager.put( RoleManager.ROLE, m_roleManager ); componentManager.put( TskDeployer.ROLE, m_deployer ); //Following components used when want to types (ie tasks/mappers etc) @@ -237,6 +242,9 @@ public class MyrmidonEmbeddor component = getParameter( TypeManager.ROLE ); m_typeManager = (TypeManager)createComponent( component, TypeManager.class ); + component = getParameter( RoleManager.ROLE ); + m_roleManager = (RoleManager)createComponent( component, RoleManager.class ); + component = getParameter( TskDeployer.ROLE ); m_deployer = (TskDeployer)createComponent( component, TskDeployer.class ); @@ -258,6 +266,7 @@ public class MyrmidonEmbeddor private void setupComponents() throws Exception { + setupComponent( m_roleManager ); setupComponent( m_converterRegistry ); setupComponent( m_converter ); setupComponent( m_executor ); @@ -452,7 +461,7 @@ public class MyrmidonEmbeddor try { final File file = files[ i ].getCanonicalFile(); - deployer.deploy( name, file.toURL() ); + deployer.deploy( file ); } catch( final DeploymentException de ) {