From 414575a432489206adb9cbaf9496cc51b320239a Mon Sep 17 00:00:00 2001 From: Peter Donald Date: Sun, 3 Jun 2001 05:03:17 +0000 Subject: [PATCH] Update myrmidon to remove dependencies on camelot part of Avalon (which is still alpha and not released). git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269087 13f79535-47bb-0310-9956-ffa450edef68 --- proposal/myrmidon/lib/avalon-container.jar | Bin 26411 -> 0 bytes proposal/myrmidon/lib/avalon-framework.jar | Bin 29306 -> 32635 bytes .../ant/modules/core/RegisterConverter.java | 2 +- .../ant/modules/core/RegisterDataType.java | 7 +- .../ant/modules/core/RegisterTasklet.java | 4 +- .../ant/modules/core/RegisterTasklib.java | 4 +- .../java/org/apache/myrmidon/Constants.java | 2 +- .../deployer/DefaultTskDeployer.java | 190 +++++++++++++++--- .../deployer/DeploymentException.java | 40 ++++ .../components/deployer/TskDeployer.java | 15 +- .../components/embeddor/MyrmidonEmbeddor.java | 55 ++++- .../{Main.java => frontends/CLIMain.java} | 13 +- .../org/apache/myrmidon/launcher/Main.java | 2 +- .../src/manifest/myrmidon-manifest.mf | 3 +- 14 files changed, 283 insertions(+), 54 deletions(-) delete mode 100644 proposal/myrmidon/lib/avalon-container.jar create mode 100644 proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DeploymentException.java rename proposal/myrmidon/src/java/org/apache/myrmidon/{Main.java => frontends/CLIMain.java} (98%) diff --git a/proposal/myrmidon/lib/avalon-container.jar b/proposal/myrmidon/lib/avalon-container.jar deleted file mode 100644 index d5633d25a435beb5ca25b673cf7e0db18ee6a734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26411 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�TamG#M~|=c~sxK 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 Rk;wsnvh0AklO^HT{{WsdAesOG 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 068316bc1..c4dbd601a 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 @@ -10,7 +10,6 @@ package org.apache.ant.modules.core; import java.io.File; import java.net.MalformedURLException; import java.net.URL; -import org.apache.avalon.framework.camelot.DeploymentException; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; @@ -18,6 +17,7 @@ import org.apache.myrmidon.api.AbstractTask; import org.apache.myrmidon.api.TaskException; import org.apache.myrmidon.components.converter.ConverterInfo; import org.apache.myrmidon.components.converter.ConverterRegistry; +import org.apache.myrmidon.components.deployer.DeploymentException; import org.apache.myrmidon.components.deployer.TskDeployer; import org.apache.myrmidon.components.type.DefaultComponentFactory; import org.apache.myrmidon.components.type.TypeManager; 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 871b26a15..e4e78ae7e 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 @@ -8,8 +8,9 @@ package org.apache.ant.modules.core; import java.net.URL; -import org.apache.avalon.framework.camelot.DeploymentException; +import org.apache.myrmidon.api.DataType; import org.apache.myrmidon.api.TaskException; +import org.apache.myrmidon.components.deployer.DeploymentException; import org.apache.myrmidon.components.type.DefaultComponentFactory; /** @@ -35,10 +36,10 @@ public class RegisterDataType } else { - final DefaultComponentFactory factory = + final DefaultComponentFactory factory = new DefaultComponentFactory( new URL[] { url } ); factory.addNameClassMapping( name, className ); - try { getTypeManager().registerType( "org.apache.ant.tasklet.DataType", name, factory ); } + try { getTypeManager().registerType( DataType.ROLE, name, factory ); } catch( final Exception e ) { throw new TaskException( "Failed registering " + name + " from " + url, 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 f235f9087..e24a9bac4 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 @@ -8,9 +8,9 @@ package org.apache.ant.modules.core; import java.net.URL; -import org.apache.avalon.framework.camelot.DeploymentException; import org.apache.myrmidon.api.Task; import org.apache.myrmidon.api.TaskException; +import org.apache.myrmidon.components.deployer.DeploymentException; import org.apache.myrmidon.components.type.DefaultComponentFactory; /** @@ -36,7 +36,7 @@ public class RegisterTasklet } else { - final DefaultComponentFactory factory = + final DefaultComponentFactory factory = new DefaultComponentFactory( new URL[] { url } ); factory.addNameClassMapping( name, className ); try { getTypeManager().registerType( Task.ROLE, name, factory ); } 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 357dec84f..c919defcd 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 @@ -10,12 +10,12 @@ package org.apache.ant.modules.core; import java.io.File; import java.net.MalformedURLException; import java.net.URL; -import org.apache.avalon.framework.camelot.DeploymentException; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; -import org.apache.myrmidon.api.TaskException; import org.apache.myrmidon.api.AbstractTask; +import org.apache.myrmidon.api.TaskException; +import org.apache.myrmidon.components.deployer.DeploymentException; import org.apache.myrmidon.components.deployer.TskDeployer; /** diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/Constants.java b/proposal/myrmidon/src/java/org/apache/myrmidon/Constants.java index c34a06969..45a58eda1 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/Constants.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/Constants.java @@ -12,7 +12,7 @@ package org.apache.myrmidon; * * @author Peter Donald */ -interface Constants +public interface Constants { //Constants to indicate the build of Ant/Myrmidon String BUILD_DATE = "@@DATE@@"; 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 9d9bee705..e014ee872 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 @@ -9,28 +9,23 @@ package org.apache.myrmidon.components.deployer; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.Iterator; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; -import org.apache.avalon.framework.camelot.AbstractDeployer; -import org.apache.avalon.framework.camelot.DefaultLocator; -import org.apache.avalon.framework.camelot.DeployerUtil; -import org.apache.avalon.framework.camelot.DeploymentException; -import org.apache.avalon.framework.camelot.Loader; -import org.apache.avalon.framework.camelot.Registry; -import org.apache.avalon.framework.camelot.RegistryException; import org.apache.avalon.framework.component.Component; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; -import org.apache.avalon.framework.logger.Loggable; -import org.apache.log.Logger; +import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder; +import org.apache.avalon.framework.logger.AbstractLoggable; import org.apache.myrmidon.api.Task; +import org.apache.myrmidon.api.DataType; import org.apache.myrmidon.components.converter.ConverterInfo; import org.apache.myrmidon.components.converter.ConverterRegistry; import org.apache.myrmidon.components.executor.Executor; @@ -38,6 +33,7 @@ import org.apache.myrmidon.components.type.ComponentFactory; import org.apache.myrmidon.components.type.DefaultComponentFactory; import org.apache.myrmidon.components.type.TypeManager; import org.apache.myrmidon.converter.Converter; +import org.xml.sax.SAXException; /** * This class deploys a .tsk file into a registry. @@ -45,21 +41,22 @@ import org.apache.myrmidon.converter.Converter; * @author Peter Donald */ public class DefaultTskDeployer - extends AbstractDeployer - implements Composable, TskDeployer, Loggable + extends AbstractLoggable + implements Composable, TskDeployer { private final static String TSKDEF_FILE = "TASK-LIB/taskdefs.xml"; - private ConverterRegistry m_converterInfoRegistry; - private TypeManager m_typeManager; + private DefaultConfigurationBuilder m_configurationBuilder; + private ConverterRegistry m_converterInfoRegistry; + private TypeManager m_typeManager; /** * Default constructor. */ public DefaultTskDeployer() { - m_autoUndeploy = true; - m_type = "Task"; + //m_autoUndeploy = true; + //m_type = "Task"; } /** @@ -75,6 +72,16 @@ public class DefaultTskDeployer m_typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE ); } + public void deploy( final String location, final URL url ) + throws DeploymentException + { + //checkDeployment( location, url ); + final File file = getFileFor( url ); + + getLogger().info( "Deploying AntLib file (" + file + ") as " + location ); + deployFromFile( location, file ); + } + /** * Deploy a file. * Eventually this should be cached for performance reasons. @@ -86,7 +93,7 @@ public class DefaultTskDeployer protected void deployFromFile( final String location, final File file ) throws DeploymentException { - final ZipFile zipFile = DeployerUtil.getZipFileFor( file ); + final ZipFile zipFile = getZipFileFor( file ); URL url = null; @@ -109,7 +116,7 @@ public class DefaultTskDeployer private void loadResources( final ZipFile zipFile, final String location, final URL url ) throws DeploymentException { - final Configuration taskdefs = DeployerUtil.loadConfiguration( zipFile, TSKDEF_FILE ); + final Configuration taskdefs = loadConfiguration( zipFile, TSKDEF_FILE ); final DefaultComponentFactory factory = new DefaultComponentFactory( new URL[] { url } ); @@ -147,9 +154,9 @@ public class DefaultTskDeployer public void deployConverter( String name, String location, URL url ) throws DeploymentException { - checkDeployment( location, url ); - final ZipFile zipFile = DeployerUtil.getZipFileFor( getFileFor( url ) ); - final Configuration taskdefs = DeployerUtil.loadConfiguration( zipFile, TSKDEF_FILE ); + //checkDeployment( location, url ); + final ZipFile zipFile = getZipFileFor( getFileFor( url ) ); + final Configuration taskdefs = loadConfiguration( zipFile, TSKDEF_FILE ); try { @@ -178,10 +185,10 @@ public class DefaultTskDeployer public void deployDataType( final String name, final String location, final URL url ) throws DeploymentException { - checkDeployment( location, url ); - final ZipFile zipFile = DeployerUtil.getZipFileFor( getFileFor( url ) ); + //checkDeployment( location, url ); + final ZipFile zipFile = getZipFileFor( getFileFor( url ) ); final Configuration datatypedefs = - DeployerUtil.loadConfiguration( zipFile, TSKDEF_FILE ); + loadConfiguration( zipFile, TSKDEF_FILE ); try { @@ -210,9 +217,9 @@ public class DefaultTskDeployer public void deployTask( final String name, final String location, final URL url ) throws DeploymentException { - checkDeployment( location, url ); - final ZipFile zipFile = DeployerUtil.getZipFileFor( getFileFor( url ) ); - final Configuration taskdefs = DeployerUtil.loadConfiguration( zipFile, TSKDEF_FILE ); + //checkDeployment( location, url ); + final ZipFile zipFile = getZipFileFor( getFileFor( url ) ); + final Configuration taskdefs = loadConfiguration( zipFile, TSKDEF_FILE ); try { @@ -238,6 +245,106 @@ public class DefaultTskDeployer } } + private DefaultConfigurationBuilder getBuilder() + { + if( null == m_configurationBuilder ) + { + m_configurationBuilder = new DefaultConfigurationBuilder(); + } + + return m_configurationBuilder; + } + + /** + * Retrieve zip file for file. + * + * @param file the file + * @return the zipFile + * @exception DeploymentException if an error occurs + */ + private ZipFile getZipFileFor( final File file ) + throws DeploymentException + { + try { return new ZipFile( file ); } + catch( final IOException ioe ) + { + throw new DeploymentException( "Error opening " + file + + " due to " + ioe.getMessage(), + ioe ); + } + } + + /** + * Utility method to load configuration from zip. + * + * @param zipFile the zip file + * @param filename the property filename + * @return the Configuration + * @exception DeploymentException if an error occurs + */ + private Configuration loadConfiguration( final ZipFile zipFile, final String filename ) + throws DeploymentException + { + return buildConfiguration( loadResourceStream( zipFile, filename ) ); + } + + /** + * Build a configuration tree based on input stream. + * + * @param input the InputStream + * @return the Configuration tree + * @exception DeploymentException if an error occurs + */ + private Configuration buildConfiguration( final InputStream input ) + throws DeploymentException + { + try { return getBuilder().build( input ); } + catch( final SAXException se ) + { + throw new DeploymentException( "Malformed configuration data", se ); + } + catch( final ConfigurationException ce ) + { + throw new DeploymentException( "Error building configuration", ce ); + } + catch( final IOException ioe ) + { + throw new DeploymentException( "Error reading configuration", ioe ); + } + } + + private File getFileFor( final URL url ) + throws DeploymentException + { + File file = null; + + if( url.getProtocol().equals( "file" ) ) + { + file = new File( url.getFile() ); + } + else + { + throw new DeploymentException( "Currently unable to deploy non-local " + + "archives (" + url + ")" ); + } + + file = file.getAbsoluteFile(); + + if( !file.exists() ) + { + throw new DeploymentException( "Could not find application archive at " + + file ); + } + + if( file.isDirectory() ) + { + throw new DeploymentException( "Could not find application archive at " + + file + " as it is a directory." ); + } + + return file; + } + private void handleConverter( final Configuration converter, final URL url, final DefaultComponentFactory factory ) @@ -281,8 +388,37 @@ public class DefaultTskDeployer final String className = datatype.getAttribute( "classname" ); factory.addNameClassMapping( name, className ); - m_typeManager.registerType( "org.apache.ant.tasklet.DataType", name, factory ); + m_typeManager.registerType( DataType.ROLE, name, factory ); getLogger().debug( "Registered datatype " + name + " as " + className ); } + + + /** + * Load a resource from a zip file. + * + * @param zipFile the ZipFile + * @param filename the filename + * @return the InputStream + * @exception DeploymentException if an error occurs + */ + private InputStream loadResourceStream( final ZipFile zipFile, final String filename ) + throws DeploymentException + { + final ZipEntry entry = zipFile.getEntry( filename ); + + if( null == entry ) + { + throw new DeploymentException( "Unable to locate " + filename + + " in " + zipFile.getName() ); + } + + try { return zipFile.getInputStream( entry ); } + catch( final IOException ioe ) + { + throw new DeploymentException( "Error reading " + filename + + " from " + zipFile.getName(), + ioe ); + } + } } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DeploymentException.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DeploymentException.java new file mode 100644 index 000000000..78881f8da --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DeploymentException.java @@ -0,0 +1,40 @@ +/* + * 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.CascadingException; + +/** + * Exception to indicate error deploying. + * + * @author Peter Donald + */ +public final class DeploymentException + extends CascadingException +{ + /** + * Construct a new DeploymentException instance. + * + * @param message The detail message for this exception. + */ + public DeploymentException( final String message ) + { + this( message, null ); + } + + /** + * Construct a new DeploymentException instance. + * + * @param message The detail message for this exception. + * @param throwable the root cause of the exception + */ + public DeploymentException( final String message, final Throwable throwable ) + { + super( message, throwable ); + } +} 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 d12e79e65..3a7d9cc99 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 @@ -8,8 +8,7 @@ package org.apache.myrmidon.components.deployer; import java.net.URL; -import org.apache.avalon.framework.camelot.Deployer; -import org.apache.avalon.framework.camelot.DeploymentException; +import org.apache.avalon.framework.component.Component; /** * This class deploys a .tsk file into a registry. @@ -17,10 +16,20 @@ import org.apache.avalon.framework.camelot.DeploymentException; * @author Peter Donald */ public interface TskDeployer - extends Deployer + extends Component { String ROLE = "org.apache.myrmidon.components.deployer.TskDeployer"; + /** + * Deploy a resource indicate by url to location. + * + * @param location the location to deploy to + * @param url the url of deployment + * @exception DeploymentException if an error occurs + */ + void deploy( String location, URL url ) + throws DeploymentException; + void deployConverter( String name, String location, URL url ) 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 8bb0fe78d..c7c49b591 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 @@ -7,15 +7,13 @@ */ package org.apache.myrmidon.components.embeddor; +import org.apache.avalon.excalibur.io.ExtensionFileFilter; import java.io.File; +import java.io.FilenameFilter; import org.apache.myrmidon.components.converter.MasterConverter; import org.apache.myrmidon.components.converter.ConverterRegistry; import org.apache.avalon.excalibur.io.FileUtil; import org.apache.avalon.framework.activity.Initializable; -import org.apache.avalon.framework.camelot.CamelotUtil; -import org.apache.avalon.framework.camelot.DefaultFactory; -import org.apache.avalon.framework.camelot.Deployer; -import org.apache.avalon.framework.camelot.Factory; import org.apache.avalon.framework.component.Component; import org.apache.avalon.framework.component.Composable; import org.apache.avalon.framework.component.DefaultComponentManager; @@ -26,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.DeploymentException; import org.apache.myrmidon.components.executor.Executor; import org.apache.myrmidon.components.manager.ProjectManager; import org.apache.myrmidon.components.type.TypeManager; @@ -119,7 +118,8 @@ public class MyrmidonEmbeddor public void start() throws Exception { - CamelotUtil.deployFromDirectory( m_deployer, m_taskLibDir, ".tsk" ); + final ExtensionFileFilter filter = new ExtensionFileFilter( ".tsk" ); + deployFromDirectory( m_deployer, m_taskLibDir, filter ); } public void stop() @@ -228,7 +228,7 @@ public class MyrmidonEmbeddor component = getParameter( ConverterRegistry.ROLE ); m_converterRegistry = (ConverterRegistry)createComponent( component, ConverterRegistry.class ); - component = getParameter( "org.apache.myrmidon.components.converter.MasterConverter" ); + component = getParameter( MasterConverter.ROLE ); m_converter = (MasterConverter)createComponent( component, MasterConverter.class ); component = getParameter( Configurer.ROLE ); @@ -422,4 +422,47 @@ public class MyrmidonEmbeddor " (" + component + ")" ); } } + + + private void deployFromDirectory( final TskDeployer deployer, + final File directory, + final FilenameFilter filter ) + throws DeploymentException + { + final File[] files = directory.listFiles( filter ); + + if( null != files ) + { + deployFiles( deployer, files ); + } + } + + private void deployFiles( final TskDeployer deployer, final File[] files ) + throws DeploymentException + { + for( int i = 0; i < files.length; i++ ) + { + final String filename = files[ i ].getName(); + + int index = filename.lastIndexOf( '.' ); + if( -1 == index ) index = filename.length(); + + final String name = filename.substring( 0, index ); + + try + { + final File file = files[ i ].getCanonicalFile(); + deployer.deploy( name, file.toURL() ); + } + catch( final DeploymentException de ) + { + throw de; + } + catch( final Exception e ) + { + throw new DeploymentException( "Unable to retrieve filename for file " + + files[ i ], e ); + } + } + } } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/Main.java b/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java similarity index 98% rename from proposal/myrmidon/src/java/org/apache/myrmidon/Main.java rename to proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java index 573603f9b..a42157b1b 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/Main.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.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; +package org.apache.myrmidon.frontends; import java.io.BufferedReader; import java.io.File; @@ -32,6 +32,7 @@ import org.apache.log.Hierarchy; import org.apache.log.LogTarget; import org.apache.log.Logger; import org.apache.log.Priority; +import org.apache.myrmidon.Constants; import org.apache.myrmidon.api.DefaultTaskContext; import org.apache.myrmidon.api.TaskContext; import org.apache.myrmidon.api.TaskException; @@ -50,7 +51,7 @@ import org.apache.myrmidon.listeners.ProjectListener; * * @author Peter Donald */ -public class Main +public class CLIMain extends AbstractLoggable { //defines for the Command Line options @@ -98,7 +99,7 @@ public class Main */ public static void main( final String[] args ) { - final Main main = new Main(); + final CLIMain main = new CLIMain(); try { main.execute( args ); } catch( final Throwable throwable ) @@ -225,8 +226,8 @@ public class Main case VERSION_OPT: System.out.println( Constants.BUILD_DESCRIPTION ); return false; case HOME_DIR_OPT: m_parameters.setParameter( "myrmidon.home", option.getArgument() ); break; - case TASKLIB_DIR_OPT: - m_parameters.setParameter( "myrmidon.lib.path", option.getArgument() ); + case TASKLIB_DIR_OPT: + m_parameters.setParameter( "myrmidon.lib.path", option.getArgument() ); break; case LOG_LEVEL_OPT: m_parameters.setParameter( "log.level", option.getArgument() ); break; @@ -323,7 +324,7 @@ public class Main { //actually do the build ... final TaskContext context = new DefaultTaskContext(); - + //Add CLI m_defines addToContext( context, m_defines ); diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/launcher/Main.java b/proposal/myrmidon/src/java/org/apache/myrmidon/launcher/Main.java index 62fd43c55..9249376c4 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/launcher/Main.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/launcher/Main.java @@ -45,7 +45,7 @@ public final class Main final URLClassLoader classLoader = new URLClassLoader( urls ); //load class and retrieve appropriate main method. - final Class clazz = classLoader.loadClass( "org.apache.myrmidon.Main" ); + final Class clazz = classLoader.loadClass( "org.apache.myrmidon.frontends.CLIMain" ); final Method method = clazz.getMethod( "main", new Class[] { args.getClass() } ); Thread.currentThread().setContextClassLoader( classLoader ); diff --git a/proposal/myrmidon/src/manifest/myrmidon-manifest.mf b/proposal/myrmidon/src/manifest/myrmidon-manifest.mf index 5bd286f4e..78fbb354d 100644 --- a/proposal/myrmidon/src/manifest/myrmidon-manifest.mf +++ b/proposal/myrmidon/src/manifest/myrmidon-manifest.mf @@ -1,4 +1,3 @@ Manifest-Version: 1.0 -Main-Class: org.apache.myrmidon.Main -Class-Path: avalonapi.jar +Main-Class: org.apache.myrmidon.frontends.CLIMain Created-By: Apache Ant Project \ No newline at end of file