You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by do...@apache.org on 2001/06/03 07:03:17 UTC
cvs commit: jakarta-ant/proposal/myrmidon/src/manifest myrmidon-manifest.mf
donaldp 01/06/02 22:03:17
Modified: proposal/myrmidon/lib avalon-framework.jar
proposal/myrmidon/src/java/org/apache/ant/modules/core
RegisterConverter.java RegisterDataType.java
RegisterTasklet.java RegisterTasklib.java
proposal/myrmidon/src/java/org/apache/myrmidon
Constants.java
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer
DefaultTskDeployer.java TskDeployer.java
proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor
MyrmidonEmbeddor.java
proposal/myrmidon/src/java/org/apache/myrmidon/launcher
Main.java
proposal/myrmidon/src/manifest myrmidon-manifest.mf
Added: proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer
DeploymentException.java
proposal/myrmidon/src/java/org/apache/myrmidon/frontends
CLIMain.java
Removed: proposal/myrmidon/lib avalon-container.jar
proposal/myrmidon/src/java/org/apache/myrmidon Main.java
Log:
Update myrmidon to remove dependencies on camelot part of Avalon (which is still alpha and not released).
Revision Changes Path
1.2 +130 -108 jakarta-ant/proposal/myrmidon/lib/avalon-framework.jar
<<Binary file>>
1.11 +1 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterConverter.java
Index: RegisterConverter.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterConverter.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- RegisterConverter.java 2001/06/02 14:28:41 1.10
+++ RegisterConverter.java 2001/06/03 05:03:14 1.11
@@ -10,7 +10,6 @@
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.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;
1.7 +4 -3 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterDataType.java
Index: RegisterDataType.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterDataType.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- RegisterDataType.java 2001/06/02 08:26:53 1.6
+++ RegisterDataType.java 2001/06/03 05:03:14 1.7
@@ -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 @@
}
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 );
1.8 +2 -2 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklet.java
Index: RegisterTasklet.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklet.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- RegisterTasklet.java 2001/06/02 08:26:53 1.7
+++ RegisterTasklet.java 2001/06/03 05:03:14 1.8
@@ -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 @@
}
else
{
- final DefaultComponentFactory factory =
+ final DefaultComponentFactory factory =
new DefaultComponentFactory( new URL[] { url } );
factory.addNameClassMapping( name, className );
try { getTypeManager().registerType( Task.ROLE, name, factory ); }
1.9 +2 -2 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklib.java
Index: RegisterTasklib.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklib.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- RegisterTasklib.java 2001/05/31 17:19:46 1.8
+++ RegisterTasklib.java 2001/06/03 05:03:14 1.9
@@ -10,12 +10,12 @@
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;
/**
1.3 +1 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/Constants.java
Index: Constants.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/Constants.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Constants.java 2001/05/29 15:24:11 1.2
+++ Constants.java 2001/06/03 05:03:15 1.3
@@ -12,7 +12,7 @@
*
* @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
-interface Constants
+public interface Constants
{
//Constants to indicate the build of Ant/Myrmidon
String BUILD_DATE = "@@DATE@@";
1.8 +163 -27 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultTskDeployer.java
Index: DefaultTskDeployer.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultTskDeployer.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- DefaultTskDeployer.java 2001/06/02 14:28:42 1.7
+++ DefaultTskDeployer.java 2001/06/03 05:03:15 1.8
@@ -9,28 +9,23 @@
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.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 @@
* @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
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 @@
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 @@
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 @@
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 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 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 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 @@
}
}
+ 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 @@
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 );
+ }
}
}
1.3 +12 -3 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/TskDeployer.java
Index: TskDeployer.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/TskDeployer.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TskDeployer.java 2001/05/31 17:20:03 1.2
+++ TskDeployer.java 2001/06/03 05:03:16 1.3
@@ -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,9 +16,19 @@
* @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
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;
1.1 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DeploymentException.java
Index: DeploymentException.java
===================================================================
/*
* 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 <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
public final class DeploymentException
extends CascadingException
{
/**
* Construct a new <code>DeploymentException</code> instance.
*
* @param message The detail message for this exception.
*/
public DeploymentException( final String message )
{
this( message, null );
}
/**
* Construct a new <code>DeploymentException</code> 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 );
}
}
1.16 +49 -6 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/MyrmidonEmbeddor.java
Index: MyrmidonEmbeddor.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/MyrmidonEmbeddor.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- MyrmidonEmbeddor.java 2001/06/02 14:28:43 1.15
+++ MyrmidonEmbeddor.java 2001/06/03 05:03:16 1.16
@@ -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.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 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 @@
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 );
@@ -420,6 +420,49 @@
{
throw new Exception( "Could not find the class for " + clazz +
" (" + 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 );
+ }
}
}
}
1.1 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java
Index: CLIMain.java
===================================================================
/*
* 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.frontends;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.avalon.excalibur.cli.CLArgsParser;
import org.apache.avalon.excalibur.cli.CLOption;
import org.apache.avalon.excalibur.cli.CLOptionDescriptor;
import org.apache.avalon.excalibur.cli.CLUtil;
import org.apache.avalon.excalibur.io.ExtensionFileFilter;
import org.apache.avalon.framework.ExceptionUtil;
import org.apache.avalon.framework.logger.AbstractLoggable;
import org.apache.avalon.framework.parameters.Parameters;
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;
import org.apache.myrmidon.components.builder.ProjectBuilder;
import org.apache.myrmidon.components.embeddor.Embeddor;
import org.apache.myrmidon.components.embeddor.MyrmidonEmbeddor;
import org.apache.myrmidon.components.manager.LogTargetToListenerAdapter;
import org.apache.myrmidon.components.manager.ProjectManager;
import org.apache.myrmidon.components.model.Project;
import org.apache.myrmidon.listeners.ProjectListener;
/**
* The class to kick the tires and light the fires.
* Starts myrmidon, loads ProjectBuilder, builds project then uses ProjectManager
* to run project.
*
* @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
public class CLIMain
extends AbstractLoggable
{
//defines for the Command Line options
private static final int HELP_OPT = 'h';
private static final int QUIET_OPT = 'q';
private static final int VERBOSE_OPT = 'v';
private static final int FILE_OPT = 'f';
private static final int LOG_LEVEL_OPT = 'l';
private static final int DEFINE_OPT = 'D';
private static final int VERSION_OPT = 1;
private static final int LISTENER_OPT = 2;
private static final int TASKLIB_DIR_OPT = 5;
private static final int INCREMENTAL_OPT = 6;
private static final int HOME_DIR_OPT = 7;
//incompatable options for info options
private static final int[] INFO_OPT_INCOMPAT = new int[]
{
HELP_OPT, QUIET_OPT, VERBOSE_OPT, FILE_OPT,
LOG_LEVEL_OPT, VERSION_OPT, LISTENER_OPT,
DEFINE_OPT //TASKLIB_DIR_OPT, HOME_DIR_OPT
};
//incompatable options for other logging options
private static final int[] LOG_OPT_INCOMPAT = new int[]
{
QUIET_OPT, VERBOSE_OPT, LOG_LEVEL_OPT
};
private ProjectListener m_listener;
///Parameters for run of myrmidon
private Parameters m_parameters = new Parameters();
///List of targets supplied on command line to execute
private ArrayList m_targets = new ArrayList();
///List of user supplied defines
private HashMap m_defines = new HashMap();
/**
* Main entry point called to run standard Myrmidon.
*
* @param args the args
*/
public static void main( final String[] args )
{
final CLIMain main = new CLIMain();
try { main.execute( args ); }
catch( final Throwable throwable )
{
System.err.println( "Error: " + ExceptionUtil.printStackTrace( throwable ) );
System.exit( -1 );
}
System.exit( 0 );
}
/**
* Display usage report.
*
*/
private void usage( final CLOptionDescriptor[] options )
{
System.out.println( "java " + getClass().getName() + " [options]" );
System.out.println( "\tAvailable options:");
System.out.println( CLUtil.describeOptions( options ) );
}
/**
* Initialise the options for command line parser.
*/
private CLOptionDescriptor[] createCLOptions()
{
//TODO: localise
final CLOptionDescriptor[] options = new CLOptionDescriptor[ 11 ];
options[0] =
new CLOptionDescriptor( "help",
CLOptionDescriptor.ARGUMENT_DISALLOWED,
HELP_OPT,
"display this help message",
INFO_OPT_INCOMPAT );
options[1] =
new CLOptionDescriptor( "file",
CLOptionDescriptor.ARGUMENT_REQUIRED,
FILE_OPT,
"the build file." );
options[2] =
new CLOptionDescriptor( "log-level",
CLOptionDescriptor.ARGUMENT_REQUIRED,
LOG_LEVEL_OPT,
"the verbosity level at which to log messages. " +
"(DEBUG|INFO|WARN|ERROR|FATAL_ERROR)",
LOG_OPT_INCOMPAT );
options[3] =
new CLOptionDescriptor( "quiet",
CLOptionDescriptor.ARGUMENT_DISALLOWED,
QUIET_OPT,
"equivelent to --log-level=FATAL_ERROR",
LOG_OPT_INCOMPAT );
options[4] =
new CLOptionDescriptor( "verbose",
CLOptionDescriptor.ARGUMENT_DISALLOWED,
VERBOSE_OPT,
"equivelent to --log-level=INFO",
LOG_OPT_INCOMPAT );
options[5] =
new CLOptionDescriptor( "listener",
CLOptionDescriptor.ARGUMENT_REQUIRED,
LISTENER_OPT,
"the listener for log events." );
options[6] =
new CLOptionDescriptor( "version",
CLOptionDescriptor.ARGUMENT_DISALLOWED,
VERSION_OPT,
"display version",
INFO_OPT_INCOMPAT );
options[7] =
new CLOptionDescriptor( "task-lib-dir",
CLOptionDescriptor.ARGUMENT_REQUIRED,
TASKLIB_DIR_OPT,
"the task lib directory to scan for .tsk files." );
options[8] =
new CLOptionDescriptor( "incremental",
CLOptionDescriptor.ARGUMENT_DISALLOWED,
INCREMENTAL_OPT,
"Run in incremental mode" );
options[9] =
new CLOptionDescriptor( "myrmidon-home",
CLOptionDescriptor.ARGUMENT_REQUIRED,
HOME_DIR_OPT,
"Specify myrmidon home directory" );
options[10] =
new CLOptionDescriptor( "define",
CLOptionDescriptor.ARGUMENTS_REQUIRED_2,
DEFINE_OPT,
"Define a variable (ie -Dfoo=var)",
new int[ 0 ] );
return options;
}
private boolean parseCommandLineOptions( final String[] args )
{
final CLOptionDescriptor[] options = createCLOptions();
final CLArgsParser parser = new CLArgsParser( args, options );
if( null != parser.getErrorString() )
{
System.err.println( "Error: " + parser.getErrorString() );
return false;
}
final List clOptions = parser.getArguments();
final int size = clOptions.size();
for( int i = 0; i < size; i++ )
{
final CLOption option = (CLOption)clOptions.get( i );
switch( option.getId() )
{
case HELP_OPT: usage( options ); return false;
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() );
break;
case LOG_LEVEL_OPT: m_parameters.setParameter( "log.level", option.getArgument() ); break;
case VERBOSE_OPT: m_parameters.setParameter( "log.level", "INFO" ); break;
case QUIET_OPT: m_parameters.setParameter( "log.level", "ERROR" ); break;
case INCREMENTAL_OPT: m_parameters.setParameter( "incremental", "true" ); break;
case FILE_OPT: m_parameters.setParameter( "filename", option.getArgument() ); break;
case LISTENER_OPT: m_parameters.setParameter( "listener", option.getArgument() ); break;
case DEFINE_OPT:
m_defines.put( option.getArgument( 0 ), option.getArgument( 1 ) );
break;
case 0: m_targets.add( option.getArgument() ); break;
}
}
return true;
}
private void setupDefaultParameters()
{
//System property set up by launcher
m_parameters.setParameter( "myrmidon.home", System.getProperty( "myrmidon.home", "." ) );
m_parameters.setParameter( "filename", "build.ant" );
m_parameters.setParameter( "log.level", "WARN" );
m_parameters.setParameter( "listener", "org.apache.myrmidon.listeners.DefaultProjectListener" );
m_parameters.setParameter( "incremental", "false" );
}
private void execute( final String[] args )
throws Exception
{
setupDefaultParameters();
if( !parseCommandLineOptions( args ) )
{
return;
}
//handle logging...
final String logLevel = m_parameters.getParameter( "log.level", null );
setLogger( createLogger( logLevel ) );
final String home = m_parameters.getParameter( "myrmidon.home", null );
final File homeDir = (new File( home )).getAbsoluteFile();
if( !homeDir.isDirectory() )
{
throw new Exception( "myrmidon-home (" + homeDir + ") is not a directory" );
}
final String filename = m_parameters.getParameter( "filename", null );
final File buildFile = (new File( filename )).getCanonicalFile();
if( !buildFile.isFile() )
{
throw new Exception( "File " + buildFile + " is not a file or doesn't exist" );
}
//handle listener..
final String listenerName = m_parameters.getParameter( "listener", null );
final ProjectListener listener = createListener( listenerName );
final LogTarget target = new LogTargetToListenerAdapter( listener );
getLogger().setLogTargets( new LogTarget[] { target } );
getLogger().warn( "Ant Build File: " + buildFile );
getLogger().info( "Ant Home Directory: " + homeDir );
//getLogger().info( "Ant Bin Directory: " + m_binDir );
//getLogger().debug( "Ant Lib Directory: " + m_libDir );
//getLogger().debug( "Ant Task Lib Directory: " + m_taskLibDir );
final Embeddor embeddor = new MyrmidonEmbeddor();
setupLogger( embeddor );
embeddor.parameterize( m_parameters );
embeddor.initialize();
embeddor.start();
final ProjectBuilder builder = embeddor.getProjectBuilder();
//create the project
final Project project = builder.build( buildFile );
final ProjectManager manager = embeddor.getProjectManager();
manager.addProjectListener( listener );
BufferedReader reader = null;
//loop over build if we are in incremental mode..
final boolean incremental = m_parameters.getParameterAsBoolean( "incremental", false );
while( true )
{
//actually do the build ...
final TaskContext context = new DefaultTaskContext();
//Add CLI m_defines
addToContext( context, m_defines );
//Add system properties second so that they overide user-defined properties
addToContext( context, System.getProperties() );
context.setProperty( TaskContext.BASE_DIRECTORY, project.getBaseDirectory() );
context.setProperty( Project.PROJECT_FILE, buildFile );
//context.setProperty( Project.PROJECT, project.getName() );
doBuild( manager, project, context, m_targets );
if( !incremental ) break;
System.out.println( "Continue ? (Enter no to stop)" );
if( null == reader )
{
reader = new BufferedReader( new InputStreamReader( System.in ) );
}
String line = reader.readLine();
if( line.equalsIgnoreCase( "no" ) ) break;
}
embeddor.stop();
embeddor.dispose();
}
/**
* Actually do the build.
*
* @param manager the manager
* @param project the project
* @param targets the targets to build as passed by CLI
*/
private void doBuild( final ProjectManager manager,
final Project project,
final TaskContext context,
final ArrayList targets )
{
try
{
final int targetCount = targets.size();
//if we didn't specify a target on CLI then choose default
if( 0 == targetCount )
{
manager.executeTarget( project, project.getDefaultTargetName(), context );
}
else
{
for( int i = 0; i < targetCount; i++ )
{
manager.executeTarget( project, (String)targets.get( i ), context );
}
}
}
catch( final TaskException ae )
{
getLogger().error( "BUILD FAILED" );
getLogger().error( "Reason:\n" + ExceptionUtil.printStackTrace( ae, 5, true ) );
}
}
/**
* Create Logger of appropriate log-level.
*
* @param logLevel the log-level
* @return the logger
* @exception Exception if an error occurs
*/
private Logger createLogger( final String logLevel )
throws Exception
{
final String logLevelCapitalized = logLevel.toUpperCase();
final Priority priority = Priority.getPriorityForName( logLevelCapitalized );
if( !priority.getName().equals( logLevelCapitalized ) )
{
throw new Exception( "Unknown log level - " + logLevel );
}
final Logger logger = Hierarchy.getDefaultHierarchy().getLoggerFor( "myrmidon" );
logger.setPriority( priority );
return logger;
}
/**
* Setup project listener.
*
* @param listener the classname of project listener
*/
private ProjectListener createListener( final String listener )
throws Exception
{
try { return (ProjectListener)Class.forName( listener ).newInstance(); }
catch( final Throwable t )
{
throw new Exception( "Error creating the listener " + listener +
" due to " + ExceptionUtil.printStackTrace( t, 5, true ) );
}
}
/**
* Helper method to add values to a context
*
* @param context the context
* @param map the map of names->values
*/
private void addToContext( final TaskContext context, final Map map )
throws Exception
{
final Iterator keys = map.keySet().iterator();
while( keys.hasNext() )
{
final String key = (String)keys.next();
final Object value = map.get( key );
context.setProperty( key, value );
}
}
}
1.5 +1 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/launcher/Main.java
Index: Main.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/launcher/Main.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- Main.java 2001/05/31 09:25:21 1.4
+++ Main.java 2001/06/03 05:03:16 1.5
@@ -45,7 +45,7 @@
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 );
1.3 +1 -2 jakarta-ant/proposal/myrmidon/src/manifest/myrmidon-manifest.mf
Index: myrmidon-manifest.mf
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/manifest/myrmidon-manifest.mf,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- myrmidon-manifest.mf 2001/05/29 10:47:58 1.2
+++ myrmidon-manifest.mf 2001/06/03 05:03:17 1.3
@@ -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