Browse Source

* New ProjectBuilder which programmatically converts from Ant1 to Myrmidon

project, rather than using a stylesheet. (This is now the default builder for
  ".xml" files.)

* Removed xml-apis.jar and xalan.jar, and added jaxp.jar back in. Hopefully, this
  will keep us out of avoid jar version hell.

* Added more stuff to the ${java.class.path} property available to ant1 tasks.

* Can now fully build Myrmidon using Ant1 compatibility layer. All test bar one
  (Ant1CompatTestCase) pass when run using Myrmidon.


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272123 13f79535-47bb-0310-9956-ffa450edef68
master
Darrell DeBoer 23 years ago
parent
commit
78f2da01c3
7 changed files with 267 additions and 34 deletions
  1. +22
    -18
      proposal/myrmidon/build.xml
  2. BIN
      proposal/myrmidon/lib/xalan.jar
  3. BIN
      proposal/myrmidon/lib/xml-apis.jar
  4. +5
    -14
      proposal/myrmidon/src/ant1compat/org/apache/tools/ant/Ant1CompatProject.java
  5. +2
    -1
      proposal/myrmidon/src/ant1compat/org/apache/tools/ant/types/Path.java
  6. +237
    -0
      proposal/myrmidon/src/java/org/apache/myrmidon/components/builder/ConvertingProjectBuilder.java
  7. +1
    -1
      proposal/myrmidon/src/java/org/apache/myrmidon/components/builder/TransformingProjectBuilder.java

+ 22
- 18
proposal/myrmidon/build.xml View File

@@ -48,6 +48,7 @@ Legal:
<property name="build.ext" value="${build.dir}/ext"/>
<property name="build.src" value="${build.dir}/src"/>
<property name="build.classes" value="${build.dir}/classes"/>
<property name="build.custom-tasks" value="${build.dir}/tasks"/>

<property name="src.base" value="src"/>
<property name="manifest.dir" value="${src.base}/manifest"/>
@@ -70,14 +71,15 @@ Legal:
<property name="constants.file" value="org/apache/myrmidon/Constants.java"/>

<path id="project.class.path">
<pathelement path="${java.class.path}" />
<pathelement location="../../lib/optional/junit.jar" />
<pathelement location="../xdocs/lib/xdoclet.jar" />
<pathelement location="../xdocs/lib/log4j-core.jar" />
<fileset dir="${lib.dir}">
<include name="*.jar" />
</fileset>
<pathelement path="${build.classes}" />
<pathelement location="${build.classes}"/>
<!-- Need this to get tools.jar in the classpath -->
<pathelement path="${java.class.path}"/>
</path>

<!-- Main target -->
@@ -199,7 +201,6 @@ Legal:

<!-- Compiles and installs the custom build tasks -->
<target name="custom-tasks">
<property name="build.custom-tasks" value="${build.dir}/tasks"/>
<property name="custom-package-dir" value="${build.custom-tasks}/org/apache/myrmidon/build"/>
<mkdir dir="${build.custom-tasks}"/>
<javac srcdir="src/make" destdir="${build.custom-tasks}">
@@ -236,7 +237,10 @@ Legal:
<javac
destdir="${build.classes}"
debug="${debug}"
deprecation="${deprecation}" >
deprecation="${deprecation}"
includeAntRuntime="false"
includeJavaRuntime="false">
<classpath refid="project.class.path"/>
<src location="src/todo"/>
<src path="${java.dir}" />
@@ -255,16 +259,6 @@ Legal:
<include name="org/apache/antlib/**"/>
</javac>

<mkdir dir="${test.classes}"/>
<javac srcdir="src/test"
destdir="${test.classes}"
debug="${debug}"
deprecation="${deprecation}">
<classpath refid="project.class.path"/>
<exclude name="**/SmbFileSystemTestCase.java" unless="jcifs.present"/>
<exclude name="**/FtpFileSystemTestCase.java" unless="netcomp.present"/>
</javac>

<copy todir="${build.classes}">
<fileset dir="${java.dir}">
<exclude name="**/*.java"/>
@@ -290,6 +284,7 @@ Legal:
<include name="org/apache/myrmidon/components/**" />
<include name="org/apache/myrmidon/frontends/**" />
<include name="org/apache/myrmidon/*" />
<exclude name="**/TransformingProjectBuilder.java" unless="trax.present"/>
</patternset>

<patternset id="aut.include">
@@ -551,7 +546,12 @@ Legal:
destdir="${test.classes}"
debug="${debug}"
deprecation="${deprecation}">
<classpath refid="project.class.path"/>
<classpath>
<pathelement location="${build.classes}"/>
<path refid="project.class.path"/>
</classpath>
<exclude name="**/SmbFileSystemTestCase.java" unless="jcifs.present"/>
<exclude name="**/FtpFileSystemTestCase.java" unless="netcomp.present"/>
</javac>
@@ -611,12 +611,12 @@ Legal:
tofile="${test.classes}/META-INF/ant-descriptor.xml"/>

<!-- Run all the tests -->
<junit printsummary="on" fork="true" failureProperty="test.failed">
<junit printsummary="on"
fork="true" failureProperty="test.failed">
<formatter type="brief" usefile="false"/>
<classpath location="${build.classes}"/>
<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" excludes="**/crimson.jar"/>
</classpath>
<classpath location="${test.classes}"/>

@@ -767,6 +767,8 @@ Legal:
<exclude name="jdepend.jar"/>
</fileset>
</copy>
<copy todir="${dist.lib}" file="../../lib/optional/junit.jar" />

<copy todir="${dist.bin}">
<fileset dir="${script.dir}"/>
@@ -797,6 +799,8 @@ Legal:
<!-- Cleans up the compiled classes -->
<target name="clean-classes">
<delete dir="${build.classes}"/>
<delete dir="${test.classes}"/>
<delete dir="${build.custom-tasks}"/>
</target>

<!-- Rebuilds the distribution -->


BIN
proposal/myrmidon/lib/xalan.jar View File


BIN
proposal/myrmidon/lib/xml-apis.jar View File


+ 5
- 14
proposal/myrmidon/src/ant1compat/org/apache/tools/ant/Ant1CompatProject.java View File

@@ -10,7 +10,6 @@ package org.apache.tools.ant;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.security.CodeSource;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Hashtable;
@@ -25,6 +24,8 @@ import org.apache.myrmidon.api.TaskException;
import org.apache.myrmidon.interfaces.type.DefaultTypeFactory;
import org.apache.myrmidon.interfaces.type.TypeManager;

import org.apache.tools.ant.types.Path;

/**
* Ant1 Project proxy for Myrmidon. Provides hooks between Myrmidon TaskContext
* and Ant1 project.
@@ -42,19 +43,9 @@ public class Ant1CompatProject extends Project
org.apache.myrmidon.interfaces.model.Project.PROJECT;
public static final String ANT1_PROJECT_PROP = "ant1.project";

private static String javaclasspath;

static
{
// Find the path to the Ant1 antlib file.
CodeSource ant1codesource =
Ant1CompatProject.class.getProtectionDomain().getCodeSource();
String ant1jar = ant1codesource.getLocation().getFile().toString();

// Append this to the java.class.path system property.
javaclasspath = System.getProperty( "java.class.path" );
javaclasspath = javaclasspath + File.pathSeparator + ant1jar;
}
// Add everything in the current classloader to the
// java.class.path property.
private static String javaclasspath = Path.systemClasspath.toString();

private final Converter m_converter;



+ 2
- 1
proposal/myrmidon/src/ant1compat/org/apache/tools/ant/types/Path.java View File

@@ -112,10 +112,11 @@ public class Path extends DataType implements Cloneable {


//Modified from original source.
//Append Ant1 codebase to systemclasspath.
//Append Ant1Compat classpath to systemclasspath.
// ------------------Modified--------------------------------
static
{
// Add Ant1Compat.atl to system classpath.
String classpath = LoaderUtils.getClasspath( Path.class.getClassLoader() );
systemClasspath.append( new Path( null, classpath ) );
}


+ 237
- 0
proposal/myrmidon/src/java/org/apache/myrmidon/components/builder/ConvertingProjectBuilder.java View File

@@ -0,0 +1,237 @@
/*
* 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.myrmidon.components.builder;

import java.util.HashSet;
import java.util.Set;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.DefaultConfiguration;
import org.apache.myrmidon.interfaces.builder.ProjectException;

/**
* A simple ProjectBuilder, which programmatically converts an Ant1 Project
* configuration into a Myrmidon one.
*
* @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a>
* @version $Revision$ $Date$
*
* @ant.type type="project-builder" name="xml"
*/
public class ConvertingProjectBuilder
extends DefaultProjectBuilder
{
private static final String VERSION_ATTRIBUTE = "version";

protected Configuration parseProject( String systemID )
throws ProjectException
{
Configuration originalConfig = super.parseProject( systemID );

// Check the version, if it's present, just use this config.
// TODO: check for version < 2.0
if( originalConfig.getAttribute( VERSION_ATTRIBUTE, null ) != null )
{
return originalConfig;
}

// Convert the config by prepending "ant1." on tasks,
// and using <if> tasks instead of target 'if=' and 'unless='
DefaultConfiguration newConfig = copyConfiguration( originalConfig );

// Put a new version attribute.
newConfig.setAttribute( VERSION_ATTRIBUTE, "2.0" );

// Copy the remaining attributes.
Set omitAttributes = new HashSet();
omitAttributes.add( VERSION_ATTRIBUTE );
copyAttributes( originalConfig, newConfig, omitAttributes );

// Now copy/convert the children
Configuration[] children = originalConfig.getChildren();
for( int i = 0; i < children.length; i++ )
{
Configuration child = children[ i ];

if( child.getName().equals( "target" ) )
{
newConfig.addChild( convertTarget( child ) );
}
else
{
newConfig.addChild( convertTask( child ) );
}
}

return newConfig;
}

/**
* Converts Configuration for an Ant1 Target into a Myrmidon version.
* @param originalTarget The Ant1 Target
* @return the converted target
*/
private Configuration convertTarget( Configuration originalTarget )
{
DefaultConfiguration newTarget = copyConfiguration( originalTarget );

// Copy all attributes except 'if' and 'unless'
Set omitAttributes = new HashSet();
omitAttributes.add( "if" );
omitAttributes.add( "unless" );
copyAttributes( originalTarget, newTarget, omitAttributes );

DefaultConfiguration containerElement = newTarget;

// For 'if="prop-name"', replace with <if> task.
String ifAttrib = originalTarget.getAttribute( "if", null );
if ( ifAttrib != null )
{
DefaultConfiguration ifElement =
buildIfElement( ifAttrib, false, originalTarget.getLocation() );
containerElement.addChild( ifElement );
// Treat the ifElement as the enclosing target.
containerElement = ifElement;
}

// For 'unless="prop-name"', replace with <if> task (negated).
String unlessAttrib = originalTarget.getAttribute( "unless", null );
if ( unlessAttrib != null )
{
DefaultConfiguration unlessElement =
buildIfElement( unlessAttrib, true, originalTarget.getLocation() );
containerElement.addChild( unlessElement );
// Treat the unlessElement as the enclosing target.
containerElement = unlessElement;
}

// Now copy in converted tasks.
Configuration[] tasks = originalTarget.getChildren();
for( int i = 0; i < tasks.length; i++ )
{
containerElement.addChild( convertTask( tasks[ i ] ) );
}

return newTarget;
}

/**
* Builds configuration for an <if> task, to replace a "if" or "unless"
* attribute on a Ant1 target.
* @param ifProperty the name of the property from the Ant1 attribute.
* @param unless if the attribute is actually an "unless" attribute.
* @param location the configuration location to use
* @return The configuration for an <if> task
*/
private DefaultConfiguration buildIfElement( String ifProperty,
boolean unless,
final String location )
{
// <if>
// <condition>
// <is-set property="prop-name"/>
// </condition>
// .. tasks
// </if>
DefaultConfiguration isSetElement =
new DefaultConfiguration( "is-set", location );
isSetElement.setAttribute( "property", ifProperty );

DefaultConfiguration conditionElement =
new DefaultConfiguration( "condition", location );

if ( unless )
{
// Surround <is-set> with <not>
DefaultConfiguration notElement =
new DefaultConfiguration( "not", location );
notElement.addChild( isSetElement );
conditionElement.addChild( notElement );
}
else
{
conditionElement.addChild( isSetElement );
}


DefaultConfiguration ifElement =
new DefaultConfiguration( "if", location );
ifElement.addChild( conditionElement );

return ifElement;
}

/**
* Converts Configuration for an Ant1 Task into a Myrmidon version.
* @param originalTask The Ant1 Task
* @return the converted task
*/
private Configuration convertTask( Configuration originalTask )
{
// Create a new configuration with the "ant1." prefix.
String newTaskName = "ant1." + originalTask.getName();
DefaultConfiguration newTask =
new DefaultConfiguration( newTaskName, originalTask.getLocation() );

// Copy all attributes and elements of the task.
copyAttributes( originalTask, newTask, new HashSet() );
copyChildren( originalTask, newTask );

return newTask;
}

/**
* Copies all child elements from one configuration to another
* @param from Configuration to copy from
* @param to Configuration to copy to
*/
private void copyChildren( Configuration from, DefaultConfiguration to )
{
Configuration[] children = from.getChildren();
for( int i = 0; i < children.length; i++ )
{
to.addChild( children[ i ] );
}
}

/**
* Copies all attributes from one configuration to another, excluding
* specified attribute names.
* @param from Configuration to copy from
* @param to Configuration to copy to
* @param omitAttributes a Set of attribute names to exclude
*/
private void copyAttributes( Configuration from,
DefaultConfiguration to,
Set omitAttributes )
{
// Copy other attributes
String[] attribs = from.getAttributeNames();
for( int i = 0; i < attribs.length; i++ )
{
String name = attribs[ i ];
if( omitAttributes.contains( name ) )
{
continue;
}
String value = from.getAttribute( name, "" );
to.setAttribute( name, value );
}
}

/**
* Creates a DefaultConfiguration with the same name and location as
* the one supplied.
* @param originalConfig the COnfiguration to copy.
* @return the new Configuration
*/
private DefaultConfiguration copyConfiguration( Configuration originalConfig )
{
return new DefaultConfiguration( originalConfig.getName(),
originalConfig.getLocation() );
}
}

+ 1
- 1
proposal/myrmidon/src/java/org/apache/myrmidon/components/builder/TransformingProjectBuilder.java View File

@@ -27,7 +27,7 @@ import org.apache.myrmidon.interfaces.builder.ProjectException;
* @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a>
* @version $Revision$ $Date$
*
* @ant.type type="project-builder" name="xml"
* @ant.type type="project-builder" name="ant-transform"
*/
public class TransformingProjectBuilder
extends DefaultProjectBuilder


Loading…
Cancel
Save