* TransformingProjectBuilder - Performs an XSL transform on all ".xml" build files. - Identity transform is used for projects with "version" attribute. - Added xalan.jar to lib - replaced jaxp.jar with xml-apis.jar * Compatibility Layer - Described more fully in src/ant1compat/README.txt - Uses pre-compiled Ant1 jar files for Ant1 code-base. Insulates from changes in the main tree, and simplifies build. - "ant." prefix used for all ant1 tasks git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271884 13f79535-47bb-0310-9956-ffa450edef68master
@@ -0,0 +1,96 @@ | |||||
<project name="ant1-compatibility" default="main"> | |||||
<property name="ant1compat.source" value="src/ant1compat"/> | |||||
<property name="manifest.dir" value="src/manifest"/> | |||||
<property name="java.dir" value="src/java"/> | |||||
<property name="build.dir" value="build/ant1compat"/> | |||||
<property name="build.lib" value="${build.dir}/lib"/> | |||||
<property name="build.classes" value="${build.dir}/classes"/> | |||||
<property name="custom-tasks-dir" value="build/tasks"/> | |||||
<path id="project.class.path"> | |||||
<pathelement location="build/classes"/> | |||||
<fileset dir="lib"> | |||||
<include name="*.jar"/> | |||||
</fileset> | |||||
</path> | |||||
<taskdef name="antlib-jar" classname="org.apache.myrmidon.build.AntlibJarTask"> | |||||
<classpath location="${custom-tasks-dir}"/> | |||||
</taskdef> | |||||
<target name="main" depends="antlib"/> | |||||
<target name="clean"> | |||||
<delete dir="${build.dir}"/> | |||||
</target> | |||||
<!-- Builds the Ant1 compatibility layer --> | |||||
<target name="antlib" | |||||
description="Builds the Ant1 compatibility layer."> | |||||
<property name="ant1compat.dir" value="src/ant1compat"/> | |||||
<property name="ant1.jar" value="${ant1compat.dir}/jar/ant.jar"/> | |||||
<property name="ant1optional.jar" value="${ant1compat.dir}/jar/optional.jar"/> | |||||
<property name="ant1.package" value="org/apache/tools"/> | |||||
<property name="build.ant1classes" value="${build.dir}/ant1classes"/> | |||||
<mkdir dir="${build.ant1classes}"/> | |||||
<mkdir dir="${build.classes}"/> | |||||
<mkdir dir="${build.lib}"/> | |||||
<unjar src="${ant1.jar}" dest="${build.ant1classes}" overwrite="no"/> | |||||
<unjar src="${ant1optional.jar}" dest="${build.ant1classes}" overwrite="no"/> | |||||
<javac destdir="${build.classes}" | |||||
debug="on" | |||||
includeAntRuntime="false"> | |||||
<classpath> | |||||
<path refid="project.class.path"/> | |||||
<pathelement location="${build.ant1classes}"/> | |||||
</classpath> | |||||
<src location="${ant1compat.dir}"/> | |||||
<include name="${ant1.package}/**"/> | |||||
</javac> | |||||
<patternset id="ant1.omit"> | |||||
<exclude name="${ant1.package}/ant/Main.class"/> | |||||
<exclude name="${ant1.package}/ant/Task.class"/> | |||||
<exclude name="${ant1.package}/ant/taskdefs/Ant.class"/> | |||||
<exclude name="${ant1.package}/ant/taskdefs/CallTarget.class"/> | |||||
</patternset> | |||||
<!-- Create the ant1compat antlib --> | |||||
<antlib-jar jarfile="${build.lib}/ant1compat.atl" | |||||
descriptor="${ant1compat.dir}/ant-descriptor.xml" | |||||
rolesDescriptor="${manifest.dir}/empty-roles.xml" | |||||
manifest="${ant1compat.dir}/ant1compat.mf"> | |||||
<fileset dir="${build.ant1classes}"> | |||||
<include name="${ant1.package}/**"/> | |||||
<patternset refid="ant1.omit"/> | |||||
</fileset> | |||||
<fileset dir="${build.classes}"> | |||||
<include name="${ant1.package}/**"/> | |||||
</fileset> | |||||
</antlib-jar> | |||||
<copy todir="dist/lib" file="${build.lib}/ant1compat.atl"/> | |||||
</target> | |||||
<!-- Runs the supplied build file through the XSL converter --> | |||||
<target name="ant1convert" | |||||
description="Converts an Ant1 build file into a Myrmidon build file."> | |||||
<property name="ant1file" value="build.xml"/> | |||||
<style | |||||
style="${java.dir}/org/apache/myrmidon/components/builder/ant1convert.xsl" | |||||
in="${ant1file}" | |||||
out="${ant1file}.ant"/> | |||||
</target> | |||||
</project> |
@@ -200,7 +200,8 @@ Legal: | |||||
<classpath location="${custom-tasks-dir}"/> | <classpath location="${custom-tasks-dir}"/> | ||||
</taskdef> | </taskdef> | ||||
<taskdef name="antlib-descriptor" classname="org.apache.myrmidon.build.AntlibDescriptorTask"> | |||||
<taskdef name="antlib-descriptor" | |||||
classname="org.apache.myrmidon.build.AntlibDescriptorTask"> | |||||
<classpath> | <classpath> | ||||
<pathelement location="${custom-tasks-dir}"/> | <pathelement location="${custom-tasks-dir}"/> | ||||
<path refid="project.class.path"/> | <path refid="project.class.path"/> | ||||
@@ -0,0 +1,60 @@ | |||||
Myrmidon Ant1 compatibility layer. | |||||
This directory contains the source for the Ant1 compatibility layer. | |||||
DESCRIPTION | |||||
----------- | |||||
The layer works by reusing most of the Ant1 code, with tasks and datatypes | |||||
being prefixed with "ant1." in build files. Almost all of the main Ant1 tree | |||||
is included in the compatibility layer antlib. To insulate from changes in | |||||
the Ant1 tree, Ant1 class files are extracted from a jar, rather than | |||||
being compiled from scratch. | |||||
Here's how it works: The first time an Ant1 task is encountered, an Ant1 | |||||
project is created, and stored in the TaskContext. The Ant1 versions of Task | |||||
and Project have been extended, with Task implementing Configurable so that | |||||
it may can mimic the Ant1 configuration policy using the IntrospectionHelper. | |||||
The idea is to provide hooks between the Ant1 project and the Myrmidon | |||||
project, eg | |||||
logging: done | |||||
properties: done but not quite working | |||||
references: not done | |||||
Task definitions: done. | |||||
So at present, while a <ant1:path> reference works fine in other <ant1:xxx> | |||||
tasks, it's not visible to the rest of the build, and vice-versa. | |||||
The <taskdef> task works ok, registering the task with the TypeManager using the | |||||
"ant1." prefix. Only a couple of DataTypes (Path and Patternset) are working | |||||
as top-level types, but this should be just a matter of adding references to | |||||
the Ant1 version of TypeInstanceTask in the descriptor. | |||||
The TransformingProjectBuilder (which is now the default builder for files | |||||
of type ".xml", applies a transformation stylesheet to the file, prefixing select | |||||
tasks (all at present) with "ant.". If a version attribute is encountered, the | |||||
file is not transformed | |||||
USAGE INSTRUCTIONS | |||||
------------------ | |||||
Myrmidon will automatically attempt to upgrade any ".xml" build file that | |||||
doesn't have a version attribute on the root element. So, using an Ant1 build | |||||
file with Myrmidon should be as simple as: | |||||
[myrmidon-command] -f ant1-build-file.xml | |||||
BUILD INSTRUCTIONS | |||||
------------------ | |||||
* It is required that Myrmidon is first build by running the default target | |||||
in the Myrmidon directory. | |||||
* Run "ant -f ant1compat.xml" | |||||
TODO | |||||
---- | |||||
* Convert this to an Xdoc document | |||||
* Try out automatic registration of tasks - remove everything | |||||
from ant-descriptor.xml and just use Project.addTaskDefinition() | |||||
to register tasks? (similar for DataTypes) | |||||
* Get a version of <ant> and <antcall> working | |||||
* Test heaps more tasks | |||||
* Fix problem with classloaders and <taskdef> | |||||
@@ -0,0 +1,310 @@ | |||||
<ant-lib version="1.0"> | |||||
<types> | |||||
<!-- Type instance tasks --> | |||||
<task name="ant1.path" | |||||
classname="org.apache.tools.ant.Ant1CompatTypeInstanceTask" /> | |||||
<task name="ant1.patternset" | |||||
classname="org.apache.tools.ant.Ant1CompatTypeInstanceTask" /> | |||||
<!-- TaskAdapter tasks --> | |||||
<task name="ant1.condition" | |||||
classname="org.apache.tools.ant.Ant1CompatTaskAdapter" /> | |||||
<!-- standard ant tasks --> | |||||
<task name="ant1.mkdir" | |||||
classname="org.apache.tools.ant.taskdefs.Mkdir" /> | |||||
<task name="ant1.javac" | |||||
classname="org.apache.tools.ant.taskdefs.Javac" /> | |||||
<task name="ant1.chmod" | |||||
classname="org.apache.tools.ant.taskdefs.Chmod" /> | |||||
<task name="ant1.delete" | |||||
classname="org.apache.tools.ant.taskdefs.Delete" /> | |||||
<task name="ant1.copy" | |||||
classname="org.apache.tools.ant.taskdefs.Copy" /> | |||||
<task name="ant1.move" | |||||
classname="org.apache.tools.ant.taskdefs.Move" /> | |||||
<task name="ant1.jar" | |||||
classname="org.apache.tools.ant.taskdefs.Jar" /> | |||||
<task name="ant1.rmic" | |||||
classname="org.apache.tools.ant.taskdefs.Rmic" /> | |||||
<task name="ant1.cvs" | |||||
classname="org.apache.tools.ant.taskdefs.Cvs" /> | |||||
<task name="ant1.get" | |||||
classname="org.apache.tools.ant.taskdefs.Get" /> | |||||
<task name="ant1.unzip" | |||||
classname="org.apache.tools.ant.taskdefs.Expand" /> | |||||
<task name="ant1.unjar" | |||||
classname="org.apache.tools.ant.taskdefs.Expand" /> | |||||
<task name="ant1.unwar" | |||||
classname="org.apache.tools.ant.taskdefs.Expand" /> | |||||
<task name="ant1.echo" | |||||
classname="org.apache.tools.ant.taskdefs.Echo" /> | |||||
<task name="ant1.javadoc" | |||||
classname="org.apache.tools.ant.taskdefs.Javadoc" /> | |||||
<task name="ant1.zip" | |||||
classname="org.apache.tools.ant.taskdefs.Zip" /> | |||||
<task name="ant1.gzip" | |||||
classname="org.apache.tools.ant.taskdefs.GZip" /> | |||||
<task name="ant1.gunzip" | |||||
classname="org.apache.tools.ant.taskdefs.GUnzip" /> | |||||
<task name="ant1.replace" | |||||
classname="org.apache.tools.ant.taskdefs.Replace" /> | |||||
<task name="ant1.java" | |||||
classname="org.apache.tools.ant.taskdefs.Java" /> | |||||
<task name="ant1.tstamp" | |||||
classname="org.apache.tools.ant.taskdefs.Tstamp" /> | |||||
<task name="ant1.property" | |||||
classname="org.apache.tools.ant.taskdefs.Property" /> | |||||
<task name="ant1.taskdef" | |||||
classname="org.apache.tools.ant.taskdefs.Taskdef" /> | |||||
<task name="ant1.ant" | |||||
classname="org.apache.tools.ant.taskdefs.Ant" /> | |||||
<task name="ant1.exec" | |||||
classname="org.apache.tools.ant.taskdefs.ExecTask" /> | |||||
<task name="ant1.tar" | |||||
classname="org.apache.tools.ant.taskdefs.Tar" /> | |||||
<task name="ant1.untar" | |||||
classname="org.apache.tools.ant.taskdefs.Untar" /> | |||||
<task name="ant1.available" | |||||
classname="org.apache.tools.ant.taskdefs.Available" /> | |||||
<task name="ant1.filter" | |||||
classname="org.apache.tools.ant.taskdefs.Filter" /> | |||||
<task name="ant1.fixcrlf" | |||||
classname="org.apache.tools.ant.taskdefs.FixCRLF" /> | |||||
<task name="ant1.patch" | |||||
classname="org.apache.tools.ant.taskdefs.Patch" /> | |||||
<task name="ant1.style" | |||||
classname="org.apache.tools.ant.taskdefs.XSLTProcess" /> | |||||
<task name="ant1.touch" | |||||
classname="org.apache.tools.ant.taskdefs.Touch" /> | |||||
<task name="ant1.signjar" | |||||
classname="org.apache.tools.ant.taskdefs.SignJar" /> | |||||
<task name="ant1.genkey" | |||||
classname="org.apache.tools.ant.taskdefs.GenerateKey" /> | |||||
<task name="ant1.antstructure" | |||||
classname="org.apache.tools.ant.taskdefs.AntStructure" /> | |||||
<task name="ant1.execon" | |||||
classname="org.apache.tools.ant.taskdefs.ExecuteOn" /> | |||||
<task name="ant1.antcall" | |||||
classname="org.apache.tools.ant.taskdefs.CallTarget" /> | |||||
<task name="ant1.sql" | |||||
classname="org.apache.tools.ant.taskdefs.SQLExec" /> | |||||
<task name="ant1.mail" | |||||
classname="org.apache.tools.ant.taskdefs.email.EmailTask" /> | |||||
<task name="ant1.fail" | |||||
classname="org.apache.tools.ant.taskdefs.Exit" /> | |||||
<task name="ant1.war" | |||||
classname="org.apache.tools.ant.taskdefs.War" /> | |||||
<task name="ant1.uptodate" | |||||
classname="org.apache.tools.ant.taskdefs.UpToDate" /> | |||||
<task name="ant1.apply" | |||||
classname="org.apache.tools.ant.taskdefs.Transform" /> | |||||
<task name="ant1.record" | |||||
classname="org.apache.tools.ant.taskdefs.Recorder" /> | |||||
<task name="ant1.cvspass" | |||||
classname="org.apache.tools.ant.taskdefs.CVSPass" /> | |||||
<task name="ant1.typedef" | |||||
classname="org.apache.tools.ant.taskdefs.Typedef" /> | |||||
<task name="ant1.sleep" | |||||
classname="org.apache.tools.ant.taskdefs.Sleep" /> | |||||
<task name="ant1.pathconvert" | |||||
classname="org.apache.tools.ant.taskdefs.PathConvert" /> | |||||
<task name="ant1.ear" | |||||
classname="org.apache.tools.ant.taskdefs.Ear" /> | |||||
<task name="ant1.parallel" | |||||
classname="org.apache.tools.ant.taskdefs.Parallel" /> | |||||
<task name="ant1.sequential" | |||||
classname="org.apache.tools.ant.taskdefs.Sequential" /> | |||||
<task name="ant1.dependset" | |||||
classname="org.apache.tools.ant.taskdefs.DependSet" /> | |||||
<task name="ant1.bzip2" | |||||
classname="org.apache.tools.ant.taskdefs.BZip2" /> | |||||
<task name="ant1.bunzip2" | |||||
classname="org.apache.tools.ant.taskdefs.BUnzip2" /> | |||||
<task name="ant1.checksum" | |||||
classname="org.apache.tools.ant.taskdefs.Checksum" /> | |||||
<task name="ant1.waitfor" | |||||
classname="org.apache.tools.ant.taskdefs.WaitFor" /> | |||||
<task name="ant1.input" | |||||
classname="org.apache.tools.ant.taskdefs.Input" /> | |||||
<task name="ant1.loadfile" | |||||
classname="org.apache.tools.ant.taskdefs.LoadFile" /> | |||||
<task name="ant1.manifest" | |||||
classname="org.apache.tools.ant.taskdefs.Manifest" /> | |||||
<task name="ant1.loadproperties" | |||||
classname="org.apache.tools.ant.taskdefs.LoadProperties" /> | |||||
<!-- optional tasks --> | |||||
<task name="ant1.script" | |||||
classname="org.apache.tools.ant.taskdefs.optional.Script" /> | |||||
<task name="ant1.netrexxc" | |||||
classname="org.apache.tools.ant.taskdefs.optional.NetRexxC" /> | |||||
<task name="ant1.renameext" | |||||
classname="org.apache.tools.ant.taskdefs.optional.RenameExtensions" /> | |||||
<task name="ant1.ejbc" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ejb.Ejbc" /> | |||||
<task name="ant1.ddcreator" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ejb.DDCreator" /> | |||||
<task name="ant1.wlrun" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ejb.WLRun" /> | |||||
<task name="ant1.wlstop" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ejb.WLStop" /> | |||||
<task name="ant1.vssget" | |||||
classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSGET" /> | |||||
<task name="ant1.ejbjar" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ejb.EjbJar" /> | |||||
<task name="ant1.mparse" | |||||
classname="org.apache.tools.ant.taskdefs.optional.metamata.MParse" /> | |||||
<task name="ant1.mmetrics" | |||||
classname="org.apache.tools.ant.taskdefs.optional.metamata.MMetrics" /> | |||||
<task name="ant1.maudit" | |||||
classname="org.apache.tools.ant.taskdefs.optional.metamata.MAudit" /> | |||||
<task name="ant1.junit" | |||||
classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask" /> | |||||
<task name="ant1.cab" | |||||
classname="org.apache.tools.ant.taskdefs.optional.Cab" /> | |||||
<task name="ant1.ftp" | |||||
classname="org.apache.tools.ant.taskdefs.optional.net.FTP" /> | |||||
<task name="ant1.icontract" | |||||
classname="org.apache.tools.ant.taskdefs.optional.IContract" /> | |||||
<task name="ant1.javacc" | |||||
classname="org.apache.tools.ant.taskdefs.optional.javacc.JavaCC" /> | |||||
<task name="ant1.jjtree" | |||||
classname="org.apache.tools.ant.taskdefs.optional.javacc.JJTree" /> | |||||
<task name="ant1.stcheckout" | |||||
classname="org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckout" /> | |||||
<task name="ant1.stcheckin" | |||||
classname="org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckin" /> | |||||
<task name="ant1.stlabel" | |||||
classname="org.apache.tools.ant.taskdefs.optional.starteam.StarTeamLabel" /> | |||||
<task name="ant1.stlist" | |||||
classname="org.apache.tools.ant.taskdefs.optional.starteam.StarTeamList" /> | |||||
<task name="ant1.wljspc" | |||||
classname="org.apache.tools.ant.taskdefs.optional.jsp.WLJspc" /> | |||||
<task name="ant1.jlink" | |||||
classname="org.apache.tools.ant.taskdefs.optional.jlink.JlinkTask" /> | |||||
<task name="ant1.native2ascii" | |||||
classname="org.apache.tools.ant.taskdefs.optional.Native2Ascii" /> | |||||
<task name="ant1.propertyfile" | |||||
classname="org.apache.tools.ant.taskdefs.optional.PropertyFile" /> | |||||
<task name="ant1.depend" | |||||
classname="org.apache.tools.ant.taskdefs.optional.depend.Depend" /> | |||||
<task name="ant1.antlr" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ANTLR" /> | |||||
<task name="ant1.vajload" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ide.VAJLoadProjects" /> | |||||
<task name="ant1.vajexport" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ide.VAJExport" /> | |||||
<task name="ant1.vajimport" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ide.VAJImport" /> | |||||
<task name="ant1.telnet" | |||||
classname="org.apache.tools.ant.taskdefs.optional.net.TelnetTask" /> | |||||
<task name="ant1.csc" | |||||
classname="org.apache.tools.ant.taskdefs.optional.dotnet.CSharp" /> | |||||
<task name="ant1.ilasm" | |||||
classname="org.apache.tools.ant.taskdefs.optional.dotnet.Ilasm" /> | |||||
<task name="ant1.stylebook" | |||||
classname="org.apache.tools.ant.taskdefs.optional.StyleBook" /> | |||||
<task name="ant1.test" | |||||
classname="org.apache.tools.ant.taskdefs.optional.Test" /> | |||||
<task name="ant1.pvcs" | |||||
classname="org.apache.tools.ant.taskdefs.optional.pvcs.Pvcs" /> | |||||
<task name="ant1.p4change" | |||||
classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Change" /> | |||||
<task name="ant1.p4label" | |||||
classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Label" /> | |||||
<task name="ant1.p4have" | |||||
classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Have" /> | |||||
<task name="ant1.p4sync" | |||||
classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Sync" /> | |||||
<task name="ant1.p4edit" | |||||
classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Edit" /> | |||||
<task name="ant1.p4submit" | |||||
classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Submit" /> | |||||
<task name="ant1.p4counter" | |||||
classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Counter" /> | |||||
<task name="ant1.javah" | |||||
classname="org.apache.tools.ant.taskdefs.optional.Javah" /> | |||||
<task name="ant1.ccupdate" | |||||
classname="org.apache.tools.ant.taskdefs.optional.clearcase.CCUpdate" /> | |||||
<task name="ant1.cccheckout" | |||||
classname="org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckout" /> | |||||
<task name="ant1.cccheckin" | |||||
classname="org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckin" /> | |||||
<task name="ant1.ccuncheckout" | |||||
classname="org.apache.tools.ant.taskdefs.optional.clearcase.CCUnCheckout" /> | |||||
<task name="ant1.sound" | |||||
classname="org.apache.tools.ant.taskdefs.optional.sound.SoundTask" /> | |||||
<task name="ant1.junitreport" | |||||
classname="org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator" /> | |||||
<task name="ant1.vsslabel" | |||||
classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSLABEL" /> | |||||
<task name="ant1.vsshistory" | |||||
classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSHISTORY" /> | |||||
<task name="ant1.blgenclient" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ejb.BorlandGenerateClient" /> | |||||
<task name="ant1.rpm" | |||||
classname="org.apache.tools.ant.taskdefs.optional.Rpm" /> | |||||
<task name="ant1.xmlvalidate" | |||||
classname="org.apache.tools.ant.taskdefs.optional.XMLValidateTask" /> | |||||
<task name="ant1.vsscheckin" | |||||
classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKIN" /> | |||||
<task name="ant1.vsscheckout" | |||||
classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKOUT" /> | |||||
<task name="ant1.iplanet-ejbc" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ejb.IPlanetEjbcTask" /> | |||||
<task name="ant1.jdepend" | |||||
classname="org.apache.tools.ant.taskdefs.optional.jdepend.JDependTask" /> | |||||
<task name="ant1.mimemail" | |||||
classname="org.apache.tools.ant.taskdefs.optional.net.MimeMail" /> | |||||
<task name="ant1.ccmcheckin" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckin" /> | |||||
<task name="ant1.ccmcheckout" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckout" /> | |||||
<task name="ant1.ccmcheckintask" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckinDefault" /> | |||||
<task name="ant1.ccmreconfigure" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMReconfigure" /> | |||||
<task name="ant1.ccmcreatetask" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMCreateTask" /> | |||||
<task name="ant1.jpcoverage" | |||||
classname="org.apache.tools.ant.taskdefs.optional.sitraka.Coverage" /> | |||||
<task name="ant1.jpcovmerge" | |||||
classname="org.apache.tools.ant.taskdefs.optional.sitraka.CovMerge" /> | |||||
<task name="ant1.jpcovreport" | |||||
classname="org.apache.tools.ant.taskdefs.optional.sitraka.CovReport" /> | |||||
<task name="ant1.p4add" | |||||
classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Add" /> | |||||
<task name="ant1.jspc" | |||||
classname="org.apache.tools.ant.taskdefs.optional.jsp.JspC" /> | |||||
<task name="ant1.replaceregexp" | |||||
classname="org.apache.tools.ant.taskdefs.optional.ReplaceRegExp" /> | |||||
<task name="ant1.translate" | |||||
classname="org.apache.tools.ant.taskdefs.optional.i18n.Translate" /> | |||||
<task name="ant1.sosget" | |||||
classname="org.apache.tools.ant.taskdefs.optional.sos.SOSGet" /> | |||||
<task name="ant1.soscheckin" | |||||
classname="org.apache.tools.ant.taskdefs.optional.sos.SOSCheckin" /> | |||||
<task name="ant1.soscheckout" | |||||
classname="org.apache.tools.ant.taskdefs.optional.sos.SOSCheckout" /> | |||||
<task name="ant1.soslabel" | |||||
classname="org.apache.tools.ant.taskdefs.optional.sos.SOSLabel" /> | |||||
<task name="ant1.echoproperties" | |||||
classname="org.apache.tools.ant.taskdefs.optional.EchoProperties" /> | |||||
<!-- deprecated ant tasks (kept for back compatibility) --> | |||||
<task name="ant1.starteam" | |||||
classname="org.apache.tools.ant.taskdefs.optional.scm.AntStarTeamCheckOut" /> | |||||
<task name="ant1.javadoc2" | |||||
classname="org.apache.tools.ant.taskdefs.Javadoc" /> | |||||
<task name="ant1.copydir" | |||||
classname="org.apache.tools.ant.taskdefs.Copydir" /> | |||||
<task name="ant1.copyfile" | |||||
classname="org.apache.tools.ant.taskdefs.Copyfile" /> | |||||
<task name="ant1.deltree" | |||||
classname="org.apache.tools.ant.taskdefs.Deltree" /> | |||||
<task name="ant1.rename" | |||||
classname="org.apache.tools.ant.taskdefs.Rename" /> | |||||
</types> | |||||
</ant-lib> |
@@ -0,0 +1,12 @@ | |||||
Manifest-Version: 1.0 | |||||
Created-By: Apache Ant Project | |||||
Extension-Name: ant1.compat | |||||
Specification-Title: Myrmidon Ant1 Compatibility Layer | |||||
Specification-Version: 0.01 | |||||
Specification-Vendor: Jakarta Apache | |||||
Implementation-Vendor-Id: org.apache.jakarta | |||||
Implementation-Vendor: Jakarta Apache Project | |||||
Implementation-Version: 0.01 | |||||
Extension-List: tools | |||||
tools-Extension-Name: com.sun.tools | |||||
tools-Specification-Version: 1.0 |
@@ -0,0 +1,342 @@ | |||||
/* | |||||
* 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.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.util.Enumeration; | |||||
import java.util.Properties; | |||||
import org.apache.myrmidon.api.TaskContext; | |||||
import org.apache.myrmidon.interfaces.type.DefaultTypeFactory; | |||||
import org.apache.myrmidon.interfaces.type.TypeManager; | |||||
/** | |||||
* Ant1 Project proxy for Myrmidon. Provides hooks between Myrmidon TaskContext | |||||
* and Ant1 project. | |||||
* Note that there is no logical separation between Ant1Project and this extension - | |||||
* they could easily be flattened. Ant1Project is barely modified from the | |||||
* Ant1 original, this class contains the extensions. | |||||
* | |||||
* @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||||
* @version $Revision$ $Date$ | |||||
*/ | |||||
public class Ant1CompatProject extends Project | |||||
{ | |||||
private TaskContext m_context; | |||||
public static final String ANT1_TASK_PREFIX = "ant1."; | |||||
public Ant1CompatProject( TaskContext context ) | |||||
{ | |||||
super(); | |||||
m_context = context; | |||||
setBaseDir( m_context.getBaseDirectory() ); | |||||
} | |||||
/** | |||||
* Writes a project level message to the log with the given log level. | |||||
* @param msg The text to log. Should not be <code>null</code>. | |||||
* @param msgLevel The priority level to log at. | |||||
*/ | |||||
public void log( String msg, int msgLevel ) | |||||
{ | |||||
doLog( msg, msgLevel ); | |||||
super.log( msg, msgLevel ); | |||||
} | |||||
/** | |||||
* Writes a task level message to the log with the given log level. | |||||
* @param task The task to use in the log. Must not be <code>null</code>. | |||||
* @param msg The text to log. Should not be <code>null</code>. | |||||
* @param msgLevel The priority level to log at. | |||||
*/ | |||||
public void log( Task task, String msg, int msgLevel ) | |||||
{ | |||||
doLog( msg, msgLevel ); | |||||
super.log( task, msg, msgLevel ); | |||||
} | |||||
/** | |||||
* Writes a target level message to the log with the given log level. | |||||
* @param target The target to use in the log. | |||||
* Must not be <code>null</code>. | |||||
* @param msg The text to log. Should not be <code>null</code>. | |||||
* @param msgLevel The priority level to log at. | |||||
*/ | |||||
public void log( Target target, String msg, int msgLevel ) | |||||
{ | |||||
doLog( msg, msgLevel ); | |||||
super.log( target, msg, msgLevel ); | |||||
} | |||||
private void doLog( String msg, int msgLevel ) | |||||
{ | |||||
switch( msgLevel ) | |||||
{ | |||||
case Ant1CompatProject.MSG_ERR: | |||||
m_context.error( msg ); | |||||
break; | |||||
case Ant1CompatProject.MSG_WARN: | |||||
m_context.warn( msg ); | |||||
break; | |||||
case Ant1CompatProject.MSG_INFO: | |||||
m_context.info( msg ); | |||||
break; | |||||
case Ant1CompatProject.MSG_VERBOSE: | |||||
case Ant1CompatProject.MSG_DEBUG: | |||||
m_context.debug( msg ); | |||||
} | |||||
} | |||||
/** | |||||
* This is a copy of init() from the Ant1 Project, which adds Ant1 tasks and | |||||
* DataTypes to the underlying Ant1 Project, but calling add methods on the | |||||
* superclass to avoid adding everything to the TypeManager. | |||||
* | |||||
* @exception BuildException if the default task list cannot be loaded | |||||
*/ | |||||
public void init() throws BuildException | |||||
{ | |||||
setJavaVersionProperty(); | |||||
String defs = "/org/apache/tools/ant/taskdefs/defaults.properties"; | |||||
try | |||||
{ | |||||
Properties props = new Properties(); | |||||
InputStream in = this.getClass().getResourceAsStream( defs ); | |||||
if( in == null ) | |||||
{ | |||||
throw new BuildException( "Can't load default task list" ); | |||||
} | |||||
props.load( in ); | |||||
in.close(); | |||||
Enumeration enum = props.propertyNames(); | |||||
while( enum.hasMoreElements() ) | |||||
{ | |||||
String key = (String)enum.nextElement(); | |||||
String value = props.getProperty( key ); | |||||
try | |||||
{ | |||||
Class taskClass = Class.forName( value ); | |||||
// NOTE: Line modified from Ant1 Project. | |||||
super.addTaskDefinition( key, taskClass ); | |||||
} | |||||
catch( NoClassDefFoundError ncdfe ) | |||||
{ | |||||
log( "Could not load a dependent class (" | |||||
+ ncdfe.getMessage() + ") for task " + key, MSG_DEBUG ); | |||||
} | |||||
catch( ClassNotFoundException cnfe ) | |||||
{ | |||||
log( "Could not load class (" + value | |||||
+ ") for task " + key, MSG_DEBUG ); | |||||
} | |||||
} | |||||
} | |||||
catch( IOException ioe ) | |||||
{ | |||||
throw new BuildException( "Can't load default task list" ); | |||||
} | |||||
String dataDefs = "/org/apache/tools/ant/types/defaults.properties"; | |||||
try | |||||
{ | |||||
Properties props = new Properties(); | |||||
InputStream in = this.getClass().getResourceAsStream( dataDefs ); | |||||
if( in == null ) | |||||
{ | |||||
throw new BuildException( "Can't load default datatype list" ); | |||||
} | |||||
props.load( in ); | |||||
in.close(); | |||||
Enumeration enum = props.propertyNames(); | |||||
while( enum.hasMoreElements() ) | |||||
{ | |||||
String key = (String)enum.nextElement(); | |||||
String value = props.getProperty( key ); | |||||
try | |||||
{ | |||||
Class dataClass = Class.forName( value ); | |||||
// NOTE: Line modified from Ant1 Project. | |||||
super.addDataTypeDefinition( key, dataClass ); | |||||
} | |||||
catch( NoClassDefFoundError ncdfe ) | |||||
{ | |||||
// ignore... | |||||
} | |||||
catch( ClassNotFoundException cnfe ) | |||||
{ | |||||
// ignore... | |||||
} | |||||
} | |||||
} | |||||
catch( IOException ioe ) | |||||
{ | |||||
throw new BuildException( "Can't load default datatype list" ); | |||||
} | |||||
setSystemProperties(); | |||||
} | |||||
/** | |||||
* Adds a new task definition to the project, registering it with the | |||||
* TypeManager, as well as the underlying Ant1 Project. | |||||
* | |||||
* @param taskName The name of the task to add. | |||||
* Must not be <code>null</code>. | |||||
* @param taskClass The full name of the class implementing the task. | |||||
* Must not be <code>null</code>. | |||||
* | |||||
* @exception BuildException if the class is unsuitable for being an Ant | |||||
* task. An error level message is logged before | |||||
* this exception is thrown. | |||||
* | |||||
* @see #checkTaskClass(Class) | |||||
*/ | |||||
public void addTaskDefinition( String taskName, Class taskClass ) | |||||
throws BuildException | |||||
{ | |||||
String ant2name = ANT1_TASK_PREFIX + taskName; | |||||
try | |||||
{ | |||||
registerType( org.apache.myrmidon.api.Task.ROLE, ant2name, taskClass ); | |||||
} | |||||
catch( Exception e ) | |||||
{ | |||||
throw new BuildException( e ); | |||||
} | |||||
super.addTaskDefinition( taskName, taskClass ); | |||||
} | |||||
/** | |||||
* Utility method to register a type. | |||||
*/ | |||||
protected void registerType( final String roleType, | |||||
final String typeName, | |||||
final Class type ) | |||||
throws Exception | |||||
{ | |||||
final ClassLoader loader = type.getClassLoader(); | |||||
final DefaultTypeFactory factory = new DefaultTypeFactory( loader ); | |||||
factory.addNameClassMapping( typeName, type.getName() ); | |||||
TypeManager typeManager = (TypeManager)m_context.getService( TypeManager.class ); | |||||
typeManager.registerType( roleType, typeName, factory ); | |||||
} | |||||
// /** | |||||
// * Sets a property. Any existing property of the same name | |||||
// * is overwritten, unless it is a user property. | |||||
// * @param name The name of property to set. | |||||
// * Must not be <code>null</code>. | |||||
// * @param value The new value of the property. | |||||
// * Must not be <code>null</code>. | |||||
// */ | |||||
// public void setProperty( String name, String value ) | |||||
// { | |||||
// if( null != getProperty( name ) ) | |||||
// { | |||||
// log( "Overriding previous definition of property " + name, | |||||
// MSG_VERBOSE ); | |||||
// } | |||||
// | |||||
// doSetProperty( name, value ); | |||||
// } | |||||
// | |||||
// /** | |||||
// * Sets a property if no value currently exists. If the property | |||||
// * exists already, a message is logged and the method returns with | |||||
// * no other effect. | |||||
// * | |||||
// * @param name The name of property to set. | |||||
// * Must not be <code>null</code>. | |||||
// * @param value The new value of the property. | |||||
// * Must not be <code>null</code>. | |||||
// * @since 1.5 | |||||
// */ | |||||
// public void setNewProperty( String name, String value ) | |||||
// { | |||||
// if( null != getProperty( name ) ) | |||||
// { | |||||
// log( "Override ignored for property " + name, MSG_VERBOSE ); | |||||
// return; | |||||
// } | |||||
// log( "Setting project property: " + name + " -> " + | |||||
// value, MSG_DEBUG ); | |||||
// doSetProperty( name, value ); | |||||
// } | |||||
// | |||||
// private void doSetProperty( String name, String value ) | |||||
// { | |||||
// try | |||||
// { | |||||
// m_context.setProperty( name, value ); | |||||
// } | |||||
// catch( TaskException e ) | |||||
// { | |||||
// throw new BuildException( e ); | |||||
// } | |||||
// } | |||||
// | |||||
// /** | |||||
// * Returns the value of a property, if it is set. | |||||
// * | |||||
// * @param name The name of the property. | |||||
// * May be <code>null</code>, in which case | |||||
// * the return value is also <code>null</code>. | |||||
// * @return the property value, or <code>null</code> for no match | |||||
// * or if a <code>null</code> name is provided. | |||||
// */ | |||||
// public String getProperty( String name ) | |||||
// { | |||||
// if( name == null ) | |||||
// { | |||||
// return null; | |||||
// } | |||||
// Object value = m_context.getProperty( name ); | |||||
// if( value == null ) | |||||
// { | |||||
// return null; | |||||
// } | |||||
// return String.valueOf( value ); | |||||
// } | |||||
// | |||||
// /** | |||||
// * Returns a copy of the properties table. | |||||
// * @return a hashtable containing all properties | |||||
// * (including user properties). | |||||
// */ | |||||
// public Hashtable getProperties() | |||||
// { | |||||
// Map properties = m_context.getProperties(); | |||||
// Hashtable propertiesCopy = new Hashtable(); | |||||
// | |||||
// Iterator iterator = properties.keySet().iterator(); | |||||
// while( iterator.hasNext() ) | |||||
// { | |||||
// String key = (String)iterator.next(); | |||||
// String value = (String)properties.get( key ); | |||||
// | |||||
// propertiesCopy.put( key, value ); | |||||
// | |||||
// } | |||||
// | |||||
// return propertiesCopy; | |||||
// } | |||||
} |
@@ -0,0 +1,49 @@ | |||||
/* | |||||
* 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 org.apache.avalon.framework.configuration.Configuration; | |||||
import org.apache.avalon.framework.configuration.ConfigurationException; | |||||
/** | |||||
* An adapter for running (in Myrmidon) Ant1 tasks which do not extend Task | |||||
* | |||||
* @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||||
* @version $Revision$ $Date$ | |||||
*/ | |||||
public class Ant1CompatTaskAdapter | |||||
extends TaskAdapter | |||||
{ | |||||
public void configure( Configuration configuration ) throws ConfigurationException | |||||
{ | |||||
// Create a new instance of the proxy object, | |||||
// and configure it. | |||||
String taskName = getAnt1Name( configuration.getName() ); | |||||
Class taskClass = (Class)project.getTaskDefinitions().get( taskName ); | |||||
if( taskClass == null ) | |||||
{ | |||||
throw new ConfigurationException( "Invalid task name for TaskAdapter: " + taskName ); | |||||
} | |||||
Object adaptedTask = null; | |||||
try | |||||
{ | |||||
adaptedTask = taskClass.newInstance(); | |||||
} | |||||
catch( Exception e ) | |||||
{ | |||||
throw new ConfigurationException( "Could not instantiate adapted task: " + taskClass.getName() ); | |||||
} | |||||
configure( adaptedTask, configuration ); | |||||
setProxy( adaptedTask ); | |||||
} | |||||
} |
@@ -0,0 +1,45 @@ | |||||
/* | |||||
* 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 org.apache.avalon.framework.configuration.Configuration; | |||||
import org.apache.avalon.framework.configuration.ConfigurationException; | |||||
/** | |||||
* A task for instantiating Ant1 datatypes. | |||||
* | |||||
* @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||||
* @version $Revision$ $Date$ | |||||
*/ | |||||
public class Ant1CompatTypeInstanceTask | |||||
extends Task | |||||
{ | |||||
public void configure( Configuration configuration ) throws ConfigurationException | |||||
{ | |||||
if( configuration.getAttribute( "id", null ) == null ) | |||||
{ | |||||
final String message = "id is required."; | |||||
throw new ConfigurationException( message ); | |||||
} | |||||
String typeName = configuration.getName(); | |||||
Object datatype = project.createDataType( getAnt1Name( typeName ) ); | |||||
// Configure the datatype. The type is added to the project | |||||
// as a reference during configuration. | |||||
configure( datatype, configuration ); | |||||
} | |||||
/** | |||||
* Execute task. Don't do anything. | |||||
*/ | |||||
public void execute() | |||||
{ | |||||
// Everything is done during configuration. | |||||
} | |||||
} |
@@ -0,0 +1,374 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2000-2002 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
* Foundation" must not be used to endorse or promote products derived | |||||
* from this software without prior written permission. For written | |||||
* permission, please contact apache@apache.org. | |||||
* | |||||
* 5. Products derived from this software may not be called "Apache" | |||||
* nor may "Apache" appear in their names without prior written | |||||
* permission of the Apache Group. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
* SUCH DAMAGE. | |||||
* ==================================================================== | |||||
* | |||||
* This software consists of voluntary contributions made by many | |||||
* individuals on behalf of the Apache Software Foundation. For more | |||||
* information on the Apache Software Foundation, please see | |||||
* <http://www.apache.org/>. | |||||
*/ | |||||
package org.apache.tools.ant; | |||||
/** | |||||
* Base class for all tasks. | |||||
* | |||||
* Use Project.createTask to create a new task instance rather than | |||||
* using this class directly for construction. | |||||
* | |||||
* @see Project#createTask | |||||
*/ | |||||
public abstract class OriginalAnt1Task extends ProjectComponent { | |||||
/** Target this task belongs to, if any. */ | |||||
protected Target target = null; | |||||
/** Description of this task, if any. */ | |||||
protected String description = null; | |||||
/** Location within the build file of this task definition. */ | |||||
protected Location location = Location.UNKNOWN_LOCATION; | |||||
/** | |||||
* Name of this task to be used for logging purposes. | |||||
* This defaults to the same as the type, but may be | |||||
* overridden by the user. For instance, the name "java" | |||||
* isn't terribly descriptive for a task used within | |||||
* another task - the outer task code can probably | |||||
* provide a better one. | |||||
*/ | |||||
protected String taskName = null; | |||||
/** Type of this task. */ | |||||
protected String taskType = null; | |||||
/** Wrapper for this object, used to configure it at runtime. */ | |||||
protected RuntimeConfigurable wrapper; | |||||
/** | |||||
* Whether or not this task is invalid. A task becomes invalid | |||||
* if a conflicting class is specified as the implementation for | |||||
* its type. | |||||
*/ | |||||
private boolean invalid = false; | |||||
/** Sole constructor. */ | |||||
public OriginalAnt1Task() { | |||||
} | |||||
/** | |||||
* Sets the target container of this task. | |||||
* | |||||
* @param target Target in whose scope this task belongs. | |||||
* May be <code>null</code>, indicating a top-level task. | |||||
*/ | |||||
public void setOwningTarget(Target target) { | |||||
this.target = target; | |||||
} | |||||
/** | |||||
* Returns the container target of this task. | |||||
* | |||||
* @return The target containing this task, or <code>null</code> if | |||||
* this task is a top-level task. | |||||
*/ | |||||
public Target getOwningTarget() { | |||||
return target; | |||||
} | |||||
/** | |||||
* Sets the name to use in logging messages. | |||||
* | |||||
* @param name The name to use in logging messages. | |||||
* Should not be <code>null</code>. | |||||
*/ | |||||
public void setTaskName(String name) { | |||||
this.taskName = name; | |||||
} | |||||
/** | |||||
* Returns the name to use in logging messages. | |||||
* | |||||
* @return the name to use in logging messages. | |||||
*/ | |||||
public String getTaskName() { | |||||
return taskName; | |||||
} | |||||
/** | |||||
* Sets the name with which the task has been invoked. | |||||
* | |||||
* @param type The name the task has been invoked as. | |||||
* Should not be <code>null</code>. | |||||
*/ | |||||
void setTaskType(String type) { | |||||
this.taskType = type; | |||||
} | |||||
/** | |||||
* Sets a description of the current action. This may be used for logging | |||||
* purposes. | |||||
* | |||||
* @param desc Description of the current action. | |||||
* May be <code>null</code>, indicating that no description is | |||||
* available. | |||||
* | |||||
*/ | |||||
public void setDescription( String desc ) { | |||||
description = desc; | |||||
} | |||||
/** | |||||
* Returns the description of the current action. | |||||
* | |||||
* @return the description of the current action, or <code>null</code> if | |||||
* no description is available. | |||||
*/ | |||||
public String getDescription() { | |||||
return description; | |||||
} | |||||
/** | |||||
* Called by the project to let the task initialize properly. | |||||
* The default implementation is a no-op. | |||||
* | |||||
* @exception BuildException if someting goes wrong with the build | |||||
*/ | |||||
public void init() throws BuildException {} | |||||
/** | |||||
* Called by the project to let the task do its work. This method may be | |||||
* called more than once, if the task is invoked more than once. | |||||
* For example, | |||||
* if target1 and target2 both depend on target3, then running | |||||
* "ant target1 target2" will run all tasks in target3 twice. | |||||
* | |||||
* @exception BuildException if something goes wrong with the build | |||||
*/ | |||||
public void execute() throws BuildException {} | |||||
/** | |||||
* Returns the file/location where this task was defined. | |||||
* | |||||
* @return the file/location where this task was defined. | |||||
* Should not return <code>null</code>. Location.UNKNOWN_LOCATION | |||||
* is used for unknown locations. | |||||
* | |||||
* @see Location#UNKNOWN_LOCATION | |||||
*/ | |||||
public Location getLocation() { | |||||
return location; | |||||
} | |||||
/** | |||||
* Sets the file/location where this task was defined. | |||||
* | |||||
* @param location The file/location where this task was defined. | |||||
* Should not be <code>null</code> - use | |||||
* Location.UNKNOWN_LOCATION if the location isn't known. | |||||
* | |||||
* @see Location#UNKNOWN_LOCATION | |||||
*/ | |||||
public void setLocation(Location location) { | |||||
this.location = location; | |||||
} | |||||
/** | |||||
* Returns the wrapper used for runtime configuration. | |||||
* | |||||
* @return the wrapper used for runtime configuration. This | |||||
* method will generate a new wrapper (and cache it) | |||||
* if one isn't set already. | |||||
*/ | |||||
public RuntimeConfigurable getRuntimeConfigurableWrapper() { | |||||
if (wrapper == null) { | |||||
wrapper = new RuntimeConfigurable(this, getTaskName()); | |||||
} | |||||
return wrapper; | |||||
} | |||||
/** | |||||
* Sets the wrapper to be used for runtime configuration. | |||||
* | |||||
* @param wrapper The wrapper to be used for runtime configuration. | |||||
* May be <code>null</code>, in which case the next call | |||||
* to getRuntimeConfigurableWrapper will generate a new | |||||
* wrapper. | |||||
*/ | |||||
protected void setRuntimeConfigurableWrapper(RuntimeConfigurable wrapper) { | |||||
this.wrapper = wrapper; | |||||
} | |||||
// XXX: (Jon Skeet) The comment "if it hasn't been done already" may | |||||
// not be strictly true. wrapper.maybeConfigure() won't configure the same | |||||
// attributes/text more than once, but it may well add the children again, | |||||
// unless I've missed something. | |||||
/** | |||||
* Configures this task - if it hasn't been done already. | |||||
* If the task has been invalidated, it is replaced with an | |||||
* UnknownElement task which uses the new definition in the project. | |||||
* | |||||
* @exception BuildException if the task cannot be configured. | |||||
*/ | |||||
public void maybeConfigure() throws BuildException { | |||||
if (!invalid) { | |||||
if (wrapper != null) { | |||||
wrapper.maybeConfigure(project); | |||||
} | |||||
} else { | |||||
getReplacement(); | |||||
} | |||||
} | |||||
/** | |||||
* Handles a line of output by logging it with the INFO priority. | |||||
* | |||||
* @param line The line of output to log. Should not be <code>null</code>. | |||||
*/ | |||||
protected void handleOutput(String line) { | |||||
log(line, Project.MSG_INFO); | |||||
} | |||||
/** | |||||
* Handles an error line by logging it with the INFO priority. | |||||
* | |||||
* @param line The error line to log. Should not be <code>null</code>. | |||||
*/ | |||||
protected void handleErrorOutput(String line) { | |||||
log(line, Project.MSG_ERR); | |||||
} | |||||
/** | |||||
* Logs a message with the default (INFO) priority. | |||||
* | |||||
* @param msg The message to be logged. Should not be <code>null</code>. | |||||
*/ | |||||
public void log(String msg) { | |||||
log(msg, Project.MSG_INFO); | |||||
} | |||||
/** | |||||
* Logs a mesage with the given priority. This delegates | |||||
* the actual logging to the project. | |||||
* | |||||
* @param msg The message to be logged. Should not be <code>null</code>. | |||||
* @param msgLevel The message priority at which this message is to | |||||
* be logged. | |||||
*/ | |||||
public void log(String msg, int msgLevel) { | |||||
project.log(getThis(), msg, msgLevel); | |||||
} | |||||
/** | |||||
* Performs this task if it's still valid, or gets a replacement | |||||
* version and performs that otherwise. | |||||
* | |||||
* Performing a task consists of firing a task started event, | |||||
* configuring the task, executing it, and then firing task finished | |||||
* event. If a runtime exception is thrown, the task finished event | |||||
* is still fired, but with the exception as the cause. | |||||
*/ | |||||
public final void perform() { | |||||
if (!invalid) { | |||||
try { | |||||
project.fireTaskStarted(getThis()); | |||||
maybeConfigure(); | |||||
execute(); | |||||
project.fireTaskFinished(getThis(), null); | |||||
} | |||||
catch (RuntimeException exc) { | |||||
if (exc instanceof BuildException) { | |||||
BuildException be = (BuildException) exc; | |||||
if (be.getLocation() == Location.UNKNOWN_LOCATION) { | |||||
be.setLocation(getLocation()); | |||||
} | |||||
} | |||||
project.fireTaskFinished(getThis(), exc); | |||||
throw exc; | |||||
} | |||||
} else { | |||||
UnknownElement ue = getReplacement(); | |||||
Task task = ue.getTask(); | |||||
task.perform(); | |||||
} | |||||
} | |||||
/** | |||||
* Marks this task as invalid. Any further use of this task | |||||
* will go through a replacement with the updated definition. | |||||
*/ | |||||
final void markInvalid() { | |||||
invalid = true; | |||||
} | |||||
/** | |||||
* Replacement element used if this task is invalidated. | |||||
*/ | |||||
private UnknownElement replacement; | |||||
/** | |||||
* Creates an UnknownElement that can be used to replace this task. | |||||
* Once this has been created once, it is cached and returned by | |||||
* future calls. | |||||
* | |||||
* @return the UnknownElement instance for the new definition of this task. | |||||
*/ | |||||
private UnknownElement getReplacement() { | |||||
if (replacement == null) { | |||||
replacement = new UnknownElement(taskType); | |||||
replacement.setProject(project); | |||||
replacement.setTaskType(taskType); | |||||
replacement.setTaskName(taskName); | |||||
replacement.setLocation(location); | |||||
replacement.setOwningTarget(target); | |||||
replacement.setRuntimeConfigurableWrapper(wrapper); | |||||
wrapper.setProxy(replacement); | |||||
target.replaceChild(getThis(), replacement); | |||||
replacement.maybeConfigure(); | |||||
} | |||||
return replacement; | |||||
} | |||||
private Task getThis() | |||||
{ | |||||
return (Task) this; | |||||
} | |||||
} |
@@ -0,0 +1,148 @@ | |||||
/* | |||||
* 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.Configurable; | |||||
import org.apache.avalon.framework.configuration.Configuration; | |||||
import org.apache.avalon.framework.configuration.ConfigurationException; | |||||
import org.apache.myrmidon.api.TaskContext; | |||||
import org.apache.myrmidon.api.TaskException; | |||||
/** | |||||
* Ant1 Task proxy for Myrmidon. | |||||
* Note that this class and OriginalAnt1Task (superclass) comprise a single logical | |||||
* class, but the code is kept separate for ease of development. OriginalAnt1Task | |||||
* is barely modified from the Ant1 original, whereas this class contains | |||||
* all of the Myrmidon-specific adaptations. | |||||
* | |||||
* @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||||
* @version $Revision$ $Date$ | |||||
*/ | |||||
public class Task extends OriginalAnt1Task | |||||
implements org.apache.myrmidon.api.Task, Configurable | |||||
{ | |||||
private TaskContext m_context; | |||||
/** | |||||
* Specify the context in which the task operates in. | |||||
* The Task will use the TaskContext to receive information | |||||
* about it's environment. | |||||
*/ | |||||
public void contextualize( TaskContext context ) | |||||
throws TaskException | |||||
{ | |||||
m_context = context; | |||||
this.setTaskType( context.getName() ); | |||||
this.setTaskName( context.getName() ); | |||||
Project project = (Project)context.getProperty( "ant1.project" ); | |||||
if( project == null ) | |||||
{ | |||||
project = createProject(); | |||||
m_context.setProperty( "ant1.project", project ); | |||||
} | |||||
this.setProject( project ); | |||||
} | |||||
private Project createProject() | |||||
throws TaskException | |||||
{ | |||||
Project project = new Ant1CompatProject( m_context ); | |||||
project.init(); | |||||
return project; | |||||
} | |||||
public void configure( Configuration configuration ) throws ConfigurationException | |||||
{ | |||||
configure( this, configuration ); | |||||
} | |||||
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 ); | |||||
} | |||||
/* | |||||
task.setLocation(new Location(helperImpl.buildFile.toString(), helperImpl.locator.getLineNumber(), | |||||
helperImpl.locator.getColumnNumber())); | |||||
String id = attr.getValue("id"); | |||||
if (id != null) { | |||||
project.addReference(id, target); | |||||
} | |||||
// Top level tasks don't have associated targets | |||||
if (target != null) { | |||||
task.setOwningTarget(target); | |||||
container.addTask(task); | |||||
task.init(); | |||||
wrapper = task.getRuntimeConfigurableWrapper(); | |||||
wrapper.setAttributes(attrs); | |||||
if (parentWrapper != null) { | |||||
parentWrapper.addChild(wrapper); | |||||
} | |||||
} else { | |||||
task.init(); | |||||
configure(task, attrs, helperImpl.project); | |||||
} | |||||
*/ | |||||
} | |||||
protected String getAnt1Name( String fullName ) | |||||
{ | |||||
return fullName.substring( Ant1CompatProject.ANT1_TASK_PREFIX.length() ); | |||||
} | |||||
} |
@@ -36,7 +36,6 @@ import org.xml.sax.XMLReader; | |||||
* @author <a href="mailto:peter@apache.org">Peter Donald</a> | * @author <a href="mailto:peter@apache.org">Peter Donald</a> | ||||
* @version $Revision$ $Date$ | * @version $Revision$ $Date$ | ||||
* | * | ||||
* @ant:type type="project-builder" name="xml" | |||||
* @ant:type type="project-builder" name="ant" | * @ant:type type="project-builder" name="ant" | ||||
*/ | */ | ||||
public class DefaultProjectBuilder | public class DefaultProjectBuilder | ||||
@@ -105,7 +104,7 @@ public class DefaultProjectBuilder | |||||
/** | /** | ||||
* Parses the project. | * Parses the project. | ||||
*/ | */ | ||||
private Configuration parseProject( final String systemID ) | |||||
protected Configuration parseProject( final String systemID ) | |||||
throws ProjectException | throws ProjectException | ||||
{ | { | ||||
try | try | ||||
@@ -30,5 +30,8 @@ ant.version-missing.error=Project has no version attribute. | |||||
ant.bad-version.error=Incompatible build file version detected. Expected version {0} but found version {1}. | ant.bad-version.error=Incompatible build file version detected. Expected version {0} but found version {1}. | ||||
ant.no-project-file.error=Project file does not exist, or is not a file. | ant.no-project-file.error=Project file does not exist, or is not a file. | ||||
ant.project-convert.notice=Applying compatibility stylesheet to project file. | |||||
ant.project-convert.error=Error converting build file. | |||||
duplicate-project.error=Can not have two projects referenced in a file with the name {0}. | duplicate-project.error=Can not have two projects referenced in a file with the name {0}. | ||||
duplicate-target.error=Can not have two targets in a file with the name {0}. | duplicate-target.error=Can not have two targets in a file with the name {0}. |
@@ -0,0 +1,90 @@ | |||||
/* | |||||
* 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.io.InputStream; | |||||
import javax.xml.transform.Result; | |||||
import javax.xml.transform.Source; | |||||
import javax.xml.transform.Transformer; | |||||
import javax.xml.transform.TransformerConfigurationException; | |||||
import javax.xml.transform.TransformerFactory; | |||||
import javax.xml.transform.sax.SAXResult; | |||||
import javax.xml.transform.stream.StreamSource; | |||||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||||
import org.apache.avalon.excalibur.i18n.Resources; | |||||
import org.apache.avalon.framework.configuration.Configuration; | |||||
import org.apache.avalon.framework.configuration.SAXConfigurationHandler; | |||||
import org.apache.myrmidon.interfaces.builder.ProjectException; | |||||
/** | |||||
* A Project Builder which performs an XSL transformation on a project. | |||||
* | |||||
* @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||||
* @version $Revision$ $Date$ | |||||
* | |||||
* @ant:type type="project-builder" name="xml" | |||||
*/ | |||||
public class TransformingProjectBuilder | |||||
extends DefaultProjectBuilder | |||||
{ | |||||
private final static Resources REZ = | |||||
ResourceManager.getPackageResources( TransformingProjectBuilder.class ); | |||||
private final static String STYLESHEET = "ant1convert.xsl"; | |||||
private Transformer m_transformer; | |||||
protected Configuration parseProject( String systemID ) | |||||
throws ProjectException | |||||
{ | |||||
if( getLogger().isDebugEnabled() ) | |||||
{ | |||||
final String message = REZ.getString( "ant.project-convert.notice" ); | |||||
getLogger().debug( message ); | |||||
} | |||||
try | |||||
{ | |||||
// Create a XSLT source for the build file. | |||||
Source source = new StreamSource( systemID ); | |||||
// Create a configuration handler for the output. | |||||
final SAXConfigurationHandler handler = new SAXConfigurationHandler(); | |||||
Result result = new SAXResult( handler ); | |||||
// Perform the transformation. | |||||
getTransformer().transform( source, result ); | |||||
return handler.getConfiguration(); | |||||
} | |||||
catch( Exception e ) | |||||
{ | |||||
throw new ProjectException( REZ.getString( "ant.project-convert.error" ), | |||||
e ); | |||||
} | |||||
} | |||||
/** | |||||
* Lazy load a Transformer with the conversion stylesheet. | |||||
* @return the initialised Transformer | |||||
* @throws TransformerConfigurationException | |||||
*/ | |||||
private Transformer getTransformer() | |||||
throws TransformerConfigurationException | |||||
{ | |||||
// Lazy loading of stylesheet source. | |||||
if( m_transformer == null ) | |||||
{ | |||||
InputStream stylesheet = | |||||
this.getClass().getResourceAsStream( STYLESHEET ); | |||||
StreamSource stylesheetSource = new StreamSource( stylesheet ); | |||||
TransformerFactory xformFactory = TransformerFactory.newInstance(); | |||||
m_transformer = xformFactory.newTransformer( stylesheetSource ); | |||||
} | |||||
return m_transformer; | |||||
} | |||||
} |
@@ -0,0 +1,115 @@ | |||||
<?xml version="1.0"?> | |||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> | |||||
<xsl:output method="xml" indent="yes"/> | |||||
<xsl:template match="/project"> | |||||
<xsl:comment>Converted Project file.</xsl:comment> | |||||
<xsl:copy> | |||||
<xsl:attribute name="version">2.0</xsl:attribute> | |||||
<xsl:apply-templates select="@*[name() != 'version']" mode="copy"/> | |||||
<xsl:apply-templates/> | |||||
</xsl:copy> | |||||
</xsl:template> | |||||
<!-- For projects with a version attribute, simply copy the entire tree. --> | |||||
<!-- TODO check for version >= 2.0.0 --> | |||||
<xsl:template match="/project[@version]"> | |||||
<xsl:comment>Copied Project file.</xsl:comment> | |||||
<xsl:copy> | |||||
<xsl:apply-templates select="@*"/> | |||||
<xsl:apply-templates mode="copy"/> | |||||
</xsl:copy> | |||||
</xsl:template> | |||||
<!-- Handle simple target nodes --> | |||||
<xsl:template match="/project/target"> | |||||
<xsl:copy> | |||||
<xsl:apply-templates select="@*"/> | |||||
<xsl:apply-templates/> | |||||
</xsl:copy> | |||||
</xsl:template> | |||||
<!-- Handle target nodes with 'if' --> | |||||
<xsl:template match="/project/target[@if]"> | |||||
<xsl:copy> | |||||
<xsl:apply-templates select="@*[name() != 'if']"/> | |||||
<!-- Put in the condition --> | |||||
<xsl:element name="if"> | |||||
<xsl:attribute name="test"><xsl:value-of select="@if"/></xsl:attribute> | |||||
<xsl:apply-templates/> | |||||
</xsl:element> | |||||
</xsl:copy> | |||||
</xsl:template> | |||||
<!-- Handle target nodes with 'unless' --> | |||||
<xsl:template match="/project/target[@unless]"> | |||||
<xsl:copy> | |||||
<xsl:apply-templates select="@*[name() != 'unless']"/> | |||||
<!-- Put in the condition --> | |||||
<xsl:element name="if"> | |||||
<xsl:attribute name="not-test"> | |||||
<xsl:value-of select="@unless"/> | |||||
</xsl:attribute> | |||||
<xsl:apply-templates/> | |||||
</xsl:element> | |||||
</xsl:copy> | |||||
</xsl:template> | |||||
<!-- Handle target nodes with 'if' and 'unless' --> | |||||
<xsl:template match="/project/target[@if and @unless]"> | |||||
<xsl:copy> | |||||
<xsl:apply-templates select="@*[name()!='if' and name()!='unless']"/> | |||||
<!-- Put in the 'if' condition --> | |||||
<xsl:element name="if"> | |||||
<xsl:attribute name="test"><xsl:value-of select="@if"/></xsl:attribute> | |||||
<!-- Put in the 'unless' condition --> | |||||
<xsl:element name="if"> | |||||
<xsl:attribute name="not-test"><xsl:value-of select="@unless"/></xsl:attribute> | |||||
<xsl:apply-templates/> | |||||
</xsl:element> | |||||
</xsl:element> | |||||
</xsl:copy> | |||||
</xsl:template> | |||||
<!-- Handle task nodes --> | |||||
<xsl:template match="*"> | |||||
<xsl:element name="ant1.{name()}"> | |||||
<xsl:apply-templates select="@*"/> | |||||
<xsl:apply-templates mode="copy"/> | |||||
</xsl:element> | |||||
</xsl:template> | |||||
<!-- Copy all elements in copy-mode --> | |||||
<xsl:template match="*" mode="copy"> | |||||
<xsl:copy> | |||||
<xsl:apply-templates select="@*"/> | |||||
<xsl:apply-templates mode="copy"/> | |||||
</xsl:copy> | |||||
</xsl:template> | |||||
<!-- Always copy attributes --> | |||||
<xsl:template match="@*"> | |||||
<xsl:copy/> | |||||
</xsl:template> | |||||
<xsl:template match="@*" mode="copy"> | |||||
<xsl:copy/> | |||||
</xsl:template> | |||||
<!-- Always copy comments --> | |||||
<xsl:template match="comment()"> | |||||
<xsl:copy/> | |||||
</xsl:template> | |||||
<xsl:template match="comment()" mode="copy"> | |||||
<xsl:copy/> | |||||
</xsl:template> | |||||
</xsl:stylesheet> | |||||