* 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-ffa450edef68
master
| @@ -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}"/> | |||
| </taskdef> | |||
| <taskdef name="antlib-descriptor" classname="org.apache.myrmidon.build.AntlibDescriptorTask"> | |||
| <taskdef name="antlib-descriptor" | |||
| classname="org.apache.myrmidon.build.AntlibDescriptorTask"> | |||
| <classpath> | |||
| <pathelement location="${custom-tasks-dir}"/> | |||
| <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> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant:type type="project-builder" name="xml" | |||
| * @ant:type type="project-builder" name="ant" | |||
| */ | |||
| public class DefaultProjectBuilder | |||
| @@ -105,7 +104,7 @@ public class DefaultProjectBuilder | |||
| /** | |||
| * Parses the project. | |||
| */ | |||
| private Configuration parseProject( final String systemID ) | |||
| protected Configuration parseProject( final String systemID ) | |||
| throws ProjectException | |||
| { | |||
| 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.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-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> | |||