Browse Source

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
master
Peter Donald 24 years ago
parent
commit
414575a432
14 changed files with 283 additions and 54 deletions
  1. BIN
      proposal/myrmidon/lib/avalon-container.jar
  2. BIN
      proposal/myrmidon/lib/avalon-framework.jar
  3. +1
    -1
      proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterConverter.java
  4. +4
    -3
      proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterDataType.java
  5. +2
    -2
      proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklet.java
  6. +2
    -2
      proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklib.java
  7. +1
    -1
      proposal/myrmidon/src/java/org/apache/myrmidon/Constants.java
  8. +163
    -27
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultTskDeployer.java
  9. +40
    -0
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DeploymentException.java
  10. +12
    -3
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/TskDeployer.java
  11. +49
    -6
      proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/MyrmidonEmbeddor.java
  12. +7
    -6
      proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java
  13. +1
    -1
      proposal/myrmidon/src/java/org/apache/myrmidon/launcher/Main.java
  14. +1
    -2
      proposal/myrmidon/src/manifest/myrmidon-manifest.mf

BIN
proposal/myrmidon/lib/avalon-container.jar View File


BIN
proposal/myrmidon/lib/avalon-framework.jar View File


+ 1
- 1
proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterConverter.java View File

@@ -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;


+ 4
- 3
proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterDataType.java View File

@@ -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 );


+ 2
- 2
proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklet.java View File

@@ -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 ); }


+ 2
- 2
proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklib.java View File

@@ -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;

/**


+ 1
- 1
proposal/myrmidon/src/java/org/apache/myrmidon/Constants.java View File

@@ -12,7 +12,7 @@ package org.apache.myrmidon;
*
* @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@@";


+ 163
- 27
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultTskDeployer.java View File

@@ -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 <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 @@ 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 );
}
}
}

+ 40
- 0
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DeploymentException.java View File

@@ -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 <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 );
}
}

+ 12
- 3
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/TskDeployer.java View File

@@ -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 <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;



+ 49
- 6
proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/MyrmidonEmbeddor.java View File

@@ -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 );
}
}
}
}

proposal/myrmidon/src/java/org/apache/myrmidon/Main.java → proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java View File

@@ -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 <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
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 );


+ 1
- 1
proposal/myrmidon/src/java/org/apache/myrmidon/launcher/Main.java View File

@@ -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 );


+ 1
- 2
proposal/myrmidon/src/manifest/myrmidon-manifest.mf View File

@@ -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

Loading…
Cancel
Save