Browse Source

Better Ant1-style configuration in compatibility layer,

as JUnit task relies on child elements being created before,
but configured after, the parent.
Build "test" target now passes when run through Myrmidon.


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272136 13f79535-47bb-0310-9956-ffa450edef68
master
Darrell DeBoer 23 years ago
parent
commit
66d9400a3b
3 changed files with 136 additions and 52 deletions
  1. +1
    -1
      proposal/myrmidon/build.xml
  2. +125
    -0
      proposal/myrmidon/src/ant1compat/org/apache/tools/ant/Ant1CompatConfigurer.java
  3. +10
    -51
      proposal/myrmidon/src/ant1compat/org/apache/tools/ant/Task.java

+ 1
- 1
proposal/myrmidon/build.xml View File

@@ -616,7 +616,7 @@ Legal:
<formatter type="brief" usefile="false"/>
<classpath>
<fileset dir="${test.working.dir}/dist/bin/lib" includes="**/*.jar"/>
<fileset dir="${test.working.dir}/dist/lib" includes="**/*.jar, **/*.atl" excludes="**/crimson.jar"/>
<fileset dir="${test.working.dir}/dist/lib" includes="**/*.jar, **/*.atl"/>
</classpath>
<classpath location="${test.classes}"/>



+ 125
- 0
proposal/myrmidon/src/ant1compat/org/apache/tools/ant/Ant1CompatConfigurer.java View File

@@ -0,0 +1,125 @@
/*
* 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.txt file.
*/
package org.apache.tools.ant;

import java.util.Locale;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;

/**
* A helper class which uses reflection to configure any Object,
* with the help of the Ant1 IntrospectionHelper.
* This aims to mimic (to some extent) the Ant1-style configuration rules
* implemented by ProjectHelperImpl.
*
* @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a>
* @version $Revision$ $Date$
*/
class Ant1CompatConfigurer
{
private final Object m_configuredObject;
private Configuration m_configuration;
private final Project m_project;
private final IntrospectionHelper m_helper;

private Object[] m_childObjects;
private Ant1CompatConfigurer[] m_childConfigurers;
private String[] m_childNames;

Ant1CompatConfigurer( Object configuredObject,
Configuration config,
Project project )
{
m_configuredObject = configuredObject;
m_configuration = config;
m_project = project;
m_helper = IntrospectionHelper.getHelper( m_configuredObject.getClass() );
}

/**
* Create all child elements, recursively.
*/
void createChildren() throws ConfigurationException
{
Configuration[] childConfigs = m_configuration.getChildren();

m_childObjects = new Object[ childConfigs.length ];
m_childConfigurers = new Ant1CompatConfigurer[ childConfigs.length ];
m_childNames = new String[ childConfigs.length ];

for( int i = 0; i < childConfigs.length; i++ )
{
Configuration childConfig = childConfigs[ i ];
String name = childConfig.getName();
Object childObject =
m_helper.createElement( m_project, m_configuredObject, name );
Ant1CompatConfigurer childConfigurer =
new Ant1CompatConfigurer( childObject, childConfig, m_project );

m_childObjects[ i ] = childObject;
m_childNames[ i ] = name;
m_childConfigurers[ i ] = childConfigurer;

// Recursively create children
childConfigurer.createChildren();
}
}

/**
* Configure attributes and text, recursively.
*/
void configure() throws ConfigurationException
{
// Configure the attributes.
final String[] attribs = m_configuration.getAttributeNames();
for( int i = 0; i < attribs.length; i++ )
{
final String name = attribs[ i ];
final String value =
m_project.replaceProperties( m_configuration.getAttribute( name ) );
try
{
m_helper.setAttribute( m_project, m_configuredObject,
name.toLowerCase( Locale.US ), value );
}
catch( BuildException be )
{
// id attribute must be set externally
if( !name.equals( "id" ) )
{
throw be;
}
}
}

// Configure the text content.
String text = m_configuration.getValue( null );
if( text != null )
{
m_helper.addText( m_project, m_configuredObject, text );
}

// Configure and add all children
for( int i = 0; i < m_childConfigurers.length; i++ )
{
m_childConfigurers[ i ].configure();

// Store child if neccessary (addConfigured)
m_helper.storeElement( m_project, m_configuredObject,
m_childObjects[ i ], m_childNames[ i ] );
}

// Set the reference, if id was specified.
String id = m_configuration.getAttribute( "id", null );
if( id != null )
{
m_project.addReference( id, m_configuredObject );
}

}
}

+ 10
- 51
proposal/myrmidon/src/ant1compat/org/apache/tools/ant/Task.java View File

@@ -71,14 +71,15 @@ public class Task extends OriginalAnt1Task

/**
* Uses the task Configuration to perform Ant1-style configuration
* on the Ant1 task.
* on the Ant1 task. This method configures *all* tasks the way Ant1
* configures tasks inside a target.
*
* @param configuration The TaskModel for this Ant1 Task.
* @throws ConfigurationException if the Configuration supplied is not valid
*/
public void configure( Configuration configuration ) throws ConfigurationException
{
configure( this, configuration );
this.init();
}

/**
@@ -94,55 +95,13 @@ public class Task extends OriginalAnt1Task
*/
protected void configure( Object target, Configuration configuration ) throws ConfigurationException
{
IntrospectionHelper helper = IntrospectionHelper.getHelper( target.getClass() );

// Configure the id.
String id = configuration.getAttribute( "id", null );
if( id != null )
{
project.addReference( id, target );
}

// Configure the attributes.
final String[] attribs = configuration.getAttributeNames();
for( int i = 0; i < attribs.length; i++ )
{
final String name = attribs[ i ];
final String value =
project.replaceProperties( configuration.getAttribute( name ) );
try
{
helper.setAttribute( project, target,
name.toLowerCase( Locale.US ), value );
}
catch( BuildException be )
{
// id attribute must be set externally
if( !name.equals( "id" ) )
{
throw be;
}
}
}

// Configure the text content.
String text = configuration.getValue( null );
if( text != null )
{
helper.addText( project, target, text );
}

// Configure the nested elements
Configuration[] nestedConfigs = configuration.getChildren();
for( int i = 0; i < nestedConfigs.length; i++ )
{
Configuration nestedConfig = nestedConfigs[ i ];
String name = nestedConfig.getName();
Object nestedElement = helper.createElement( project, target, name );
configure( nestedElement, nestedConfig );
helper.storeElement( project, target, nestedElement, name );
}

//TODO Maybe provide different configuration order for tasks not in a target,
// elements in a TaskContainer etc...
Ant1CompatConfigurer configurer =
new Ant1CompatConfigurer( target, configuration, project );
configurer.createChildren();
configurer.configure();
this.init();
}

/**


Loading…
Cancel
Save