git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272461 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -1,314 +0,0 @@ | |||
| <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" /> | |||
| <task name="ant1.filterset" | |||
| classname="org.apache.tools.ant.Ant1CompatTypeInstanceTask" /> | |||
| <!-- TaskAdapter tasks --> | |||
| <task name="ant1.condition" | |||
| classname="org.apache.tools.ant.Ant1CompatTaskAdapter" /> | |||
| <!-- Tasks specialised for myrmidon --> | |||
| <task name="ant1.ant" | |||
| classname="org.apache.tools.ant.taskdefs.Ant" /> | |||
| <task name="ant1.antcall" | |||
| classname="org.apache.tools.ant.taskdefs.CallTarget" /> | |||
| <!-- 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.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.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> | |||
| @@ -1,12 +0,0 @@ | |||
| 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 | |||
| @@ -1,125 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.tools.ant; | |||
| import java.util.Locale; | |||
| import org.apache.avalon.framework.configuration.Configuration; | |||
| import org.apache.avalon.framework.configuration.ConfigurationException; | |||
| /** | |||
| * A helper class which uses reflection to configure any Object, | |||
| * with the help of the Ant1 IntrospectionHelper. | |||
| * This aims to mimic (to some extent) the Ant1-style configuration rules | |||
| * implemented by ProjectHelperImpl. | |||
| * | |||
| * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| class Ant1CompatConfigurer | |||
| { | |||
| private final Object m_configuredObject; | |||
| private Configuration m_configuration; | |||
| private final Project m_project; | |||
| private final IntrospectionHelper m_helper; | |||
| private Object[] m_childObjects; | |||
| private Ant1CompatConfigurer[] m_childConfigurers; | |||
| private String[] m_childNames; | |||
| Ant1CompatConfigurer( Object configuredObject, | |||
| Configuration config, | |||
| Project project ) | |||
| { | |||
| m_configuredObject = configuredObject; | |||
| m_configuration = config; | |||
| m_project = project; | |||
| m_helper = IntrospectionHelper.getHelper( m_configuredObject.getClass() ); | |||
| } | |||
| /** | |||
| * Create all child elements, recursively. | |||
| */ | |||
| void createChildren() throws ConfigurationException | |||
| { | |||
| Configuration[] childConfigs = m_configuration.getChildren(); | |||
| m_childObjects = new Object[ childConfigs.length ]; | |||
| m_childConfigurers = new Ant1CompatConfigurer[ childConfigs.length ]; | |||
| m_childNames = new String[ childConfigs.length ]; | |||
| for( int i = 0; i < childConfigs.length; i++ ) | |||
| { | |||
| Configuration childConfig = childConfigs[ i ]; | |||
| String name = childConfig.getName(); | |||
| Object childObject = | |||
| m_helper.createElement( m_project, m_configuredObject, name ); | |||
| Ant1CompatConfigurer childConfigurer = | |||
| new Ant1CompatConfigurer( childObject, childConfig, m_project ); | |||
| m_childObjects[ i ] = childObject; | |||
| m_childNames[ i ] = name; | |||
| m_childConfigurers[ i ] = childConfigurer; | |||
| // Recursively create children | |||
| childConfigurer.createChildren(); | |||
| } | |||
| } | |||
| /** | |||
| * Configure attributes and text, recursively. | |||
| */ | |||
| void configure() throws ConfigurationException | |||
| { | |||
| // Configure the attributes. | |||
| final String[] attribs = m_configuration.getAttributeNames(); | |||
| for( int i = 0; i < attribs.length; i++ ) | |||
| { | |||
| final String name = attribs[ i ]; | |||
| final String value = | |||
| m_project.replaceProperties( m_configuration.getAttribute( name ) ); | |||
| try | |||
| { | |||
| m_helper.setAttribute( m_project, m_configuredObject, | |||
| name.toLowerCase( Locale.US ), value ); | |||
| } | |||
| catch( BuildException be ) | |||
| { | |||
| // id attribute must be set externally | |||
| if( !name.equals( "id" ) ) | |||
| { | |||
| throw be; | |||
| } | |||
| } | |||
| } | |||
| // Configure the text content. | |||
| String text = m_configuration.getValue( null ); | |||
| if( text != null ) | |||
| { | |||
| m_helper.addText( m_project, m_configuredObject, text ); | |||
| } | |||
| // Configure and add all children | |||
| for( int i = 0; i < m_childConfigurers.length; i++ ) | |||
| { | |||
| m_childConfigurers[ i ].configure(); | |||
| // Store child if neccessary (addConfigured) | |||
| m_helper.storeElement( m_project, m_configuredObject, | |||
| m_childObjects[ i ], m_childNames[ i ] ); | |||
| } | |||
| // Set the reference, if id was specified. | |||
| String id = m_configuration.getAttribute( "id", null ); | |||
| if( id != null ) | |||
| { | |||
| m_project.addReference( id, m_configuredObject ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,549 +0,0 @@ | |||
| /* | |||
| * 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.File; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.util.Enumeration; | |||
| import java.util.HashSet; | |||
| import java.util.Hashtable; | |||
| import java.util.Iterator; | |||
| import java.util.Map; | |||
| import java.util.Properties; | |||
| import java.util.Set; | |||
| import org.apache.aut.converter.Converter; | |||
| import org.apache.aut.converter.ConverterException; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.interfaces.type.DefaultTypeFactory; | |||
| import org.apache.myrmidon.interfaces.type.TypeManager; | |||
| import org.apache.tools.ant.types.Path; | |||
| /** | |||
| * Ant1 Project proxy for Myrmidon. Provides hooks between Myrmidon TaskContext | |||
| * and Ant1 project. | |||
| * 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 | |||
| { | |||
| public static final String ANT1_TASK_PREFIX = "ant1."; | |||
| public static final String MYRMIDON_PROJECT_PROP = | |||
| org.apache.myrmidon.interfaces.model.Project.PROJECT; | |||
| public static final String ANT1_PROJECT_PROP = "ant1.project"; | |||
| // Add everything in the current classloader to the | |||
| // java.class.path property. | |||
| private static String javaclasspath = Path.systemClasspath.toString(); | |||
| private final Converter m_converter; | |||
| private Set m_userProperties = new HashSet(); | |||
| private TaskContext m_context; | |||
| private TaskContext m_underlyingContext; | |||
| /** | |||
| * Create an Ant1 project. | |||
| * @param context The context for the first Ant1 Task loaded. | |||
| */ | |||
| public Ant1CompatProject( TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| super(); | |||
| recontextulize( context ); | |||
| setBaseDir( m_context.getBaseDirectory() ); | |||
| String projectName = | |||
| (String)m_context.getProperty( MYRMIDON_PROJECT_PROP ); | |||
| if( projectName != null ) | |||
| { | |||
| setName( projectName ); | |||
| } | |||
| m_converter = (Converter)m_context.getService( Converter.class ); | |||
| } | |||
| /** | |||
| * Update the TaskContext for the current task. | |||
| * @param context The TaskContext for the currently executing Task. | |||
| */ | |||
| void recontextulize( TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| // Only reset the context if it is a different instance. | |||
| if( m_underlyingContext == context ) | |||
| { | |||
| return; | |||
| } | |||
| // Need the underlying context for setting properties which | |||
| // should be propogated to other Tasks. | |||
| m_underlyingContext = context; | |||
| // The main context allows Ant1 specific property overrides. | |||
| m_context = context.createSubContext( "ant1-overrides" ); | |||
| m_context.setProperty( "java.class.path", javaclasspath ); | |||
| } | |||
| /** | |||
| * 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: | |||
| m_context.verbose( msg ); | |||
| break; | |||
| 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( m_userProperties.contains( name ) ) | |||
| { | |||
| log( "Override ignored for user property " + name, MSG_VERBOSE ); | |||
| return; | |||
| } | |||
| if( null != m_context.getProperty( name ) ) | |||
| { | |||
| log( "Overriding previous definition of property " + name, | |||
| MSG_VERBOSE ); | |||
| } | |||
| log( "Setting project property: " + name + " -> " + | |||
| value, MSG_DEBUG ); | |||
| 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 != m_context.getProperty( name ) ) | |||
| { | |||
| log( "Override ignored for property " + name, MSG_VERBOSE ); | |||
| return; | |||
| } | |||
| log( "Setting project property: " + name + " -> " + | |||
| value, MSG_DEBUG ); | |||
| doSetProperty( name, value ); | |||
| } | |||
| /** | |||
| * Sets a user property, which cannot be overwritten by | |||
| * set/unset property calls. Any previous value is overwritten. | |||
| * @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>. | |||
| * @see #setProperty(String,String) | |||
| */ | |||
| public void setUserProperty( String name, String value ) | |||
| { | |||
| log( "Setting ro project property: " + name + " -> " + | |||
| value, MSG_DEBUG ); | |||
| m_userProperties.add( name ); | |||
| doSetProperty( name, value ); | |||
| } | |||
| /** | |||
| * Sets a property value in the underlying context, wrapping exceptions as | |||
| * Ant1 BuildExceptions. | |||
| * @param name property name | |||
| * @param value property value | |||
| */ | |||
| private void doSetProperty( String name, String value ) | |||
| { | |||
| try | |||
| { | |||
| m_underlyingContext.setProperty( name, value ); | |||
| } | |||
| catch( TaskException e ) | |||
| { | |||
| throw new BuildException( "Could not set property: " + name, 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 ) | |||
| { | |||
| Object value = m_context.getProperty( name ); | |||
| if( value == null ) | |||
| { | |||
| return null; | |||
| } | |||
| else if( value instanceof String ) | |||
| { | |||
| return (String)value; | |||
| } | |||
| else | |||
| { | |||
| try | |||
| { | |||
| return (String)m_converter.convert( String.class, value, m_context ); | |||
| } | |||
| catch( ConverterException e ) | |||
| { | |||
| throw new BuildException( e ); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Returns the value of a user 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 getUserProperty( String name ) | |||
| { | |||
| if( m_userProperties.contains( name ) ) | |||
| { | |||
| return getProperty( name ); | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * Returns a copy of the properties table. | |||
| * @return a hashtable containing all properties | |||
| * (including user properties). | |||
| */ | |||
| public Hashtable getProperties() | |||
| { | |||
| final Hashtable propsCopy = new Hashtable(); | |||
| final Map contextProps; | |||
| try | |||
| { | |||
| contextProps = m_context.getProperties(); | |||
| } | |||
| catch( final TaskException e ) | |||
| { | |||
| throw new BuildException( e ); | |||
| } | |||
| final Iterator propNames = contextProps.keySet().iterator(); | |||
| while( propNames.hasNext() ) | |||
| { | |||
| final String name = (String)propNames.next(); | |||
| final String value = getProperty( name ); | |||
| if( value != null ) | |||
| { | |||
| propsCopy.put( name, value ); | |||
| } | |||
| } | |||
| return propsCopy; | |||
| } | |||
| /** | |||
| * Returns a copy of the user property hashtable | |||
| * @return a hashtable containing just the user properties | |||
| */ | |||
| public Hashtable getUserProperties() | |||
| { | |||
| Hashtable propsCopy = new Hashtable(); | |||
| Iterator userPropNames = m_userProperties.iterator(); | |||
| while( userPropNames.hasNext() ) | |||
| { | |||
| String name = (String)userPropNames.next(); | |||
| String value = getProperty( name ); | |||
| propsCopy.put( name, value ); | |||
| } | |||
| return propsCopy; | |||
| } | |||
| /** | |||
| * Replaces ${} style constructions in the given value with the | |||
| * string value of the corresponding data types. | |||
| * | |||
| * @param value The string to be scanned for property references. | |||
| * May be <code>null</code>. | |||
| * | |||
| * @return the given string with embedded property names replaced | |||
| * by values, or <code>null</code> if the given string is | |||
| * <code>null</code>. | |||
| * | |||
| * @exception BuildException if the given value has an unclosed | |||
| * property name, e.g. <code>${xxx</code> | |||
| */ | |||
| public String replaceProperties( String value ) | |||
| throws BuildException | |||
| { | |||
| return ProjectHelper.replaceProperties( this, value, | |||
| this.getProperties() ); | |||
| } | |||
| /** | |||
| * Make the Ant1 project set the java version property, and then | |||
| * copy it into the context properties. | |||
| * | |||
| * @exception BuildException if this Java version is not supported | |||
| * | |||
| * @see #getJavaVersion() | |||
| */ | |||
| public void setJavaVersionProperty() throws BuildException | |||
| { | |||
| String javaVersion = getJavaVersion(); | |||
| doSetProperty( "ant.java.version", javaVersion ); | |||
| log( "Detected Java version: " + javaVersion + " in: " | |||
| + System.getProperty( "java.home" ), MSG_VERBOSE ); | |||
| log( "Detected OS: " + System.getProperty( "os.name" ), MSG_VERBOSE ); | |||
| } | |||
| /** | |||
| * Sets the base directory for the project, checking that | |||
| * the given filename exists and is a directory. | |||
| * | |||
| * @param baseD The project base directory. | |||
| * Must not be <code>null</code>. | |||
| * | |||
| * @exception BuildException if the directory if invalid | |||
| */ | |||
| public void setBaseDir( File baseD ) throws BuildException | |||
| { | |||
| super.setBaseDir( baseD ); | |||
| doSetProperty( "basedir", super.getProperty( "basedir" ) ); | |||
| } | |||
| } | |||
| @@ -1,66 +0,0 @@ | |||
| /* | |||
| * 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; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| /** | |||
| * 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 | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( Ant1CompatTaskAdapter.class ); | |||
| /** | |||
| * Gets the adapted task name from the configuration, and looks up the | |||
| * Class for the adapted task. The adapted task is then instantiated and | |||
| * configured. | |||
| * @param configuration The Task Model | |||
| * @throws ConfigurationException If the configuration is invalid. | |||
| */ | |||
| 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 ) | |||
| { | |||
| String message = | |||
| REZ.getString( "taskadapter.invalid-task-name.error", taskName ); | |||
| throw new ConfigurationException( message ); | |||
| } | |||
| Object adaptedTask = null; | |||
| try | |||
| { | |||
| adaptedTask = taskClass.newInstance(); | |||
| } | |||
| catch( Exception e ) | |||
| { | |||
| String message = | |||
| REZ.getString( "taskadapter.no-create.error", taskClass.getName() ); | |||
| throw new ConfigurationException( message ); | |||
| } | |||
| configure( adaptedTask, configuration ); | |||
| setProxy( adaptedTask ); | |||
| } | |||
| } | |||
| @@ -1,50 +0,0 @@ | |||
| /* | |||
| * 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; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| /** | |||
| * A task for instantiating Ant1 datatypes. | |||
| * | |||
| * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class Ant1CompatTypeInstanceTask | |||
| extends Task | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( Ant1CompatTypeInstanceTask.class ); | |||
| public void configure( Configuration configuration ) throws ConfigurationException | |||
| { | |||
| if( configuration.getAttribute( "id", null ) == null ) | |||
| { | |||
| final String message = REZ.getString( "type.no-id.error" ); | |||
| 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. | |||
| } | |||
| } | |||
| @@ -1,253 +0,0 @@ | |||
| /* | |||
| * 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; | |||
| import java.io.PrintWriter; | |||
| import java.io.PrintStream; | |||
| import org.apache.tools.ant.Location; | |||
| /** | |||
| *----------------------------------------------------------------- | |||
| * Ant1Compatability layer version of BuildException, modified slightly | |||
| * from original Ant1 BuildException, to provide a Myrmidon-friendly | |||
| * getCause(), so that cascading exceptions are followed. | |||
| * ----------------------------------------------------------------- | |||
| * | |||
| * Signals an error condition during a build | |||
| * | |||
| * @author James Duncan Davidson | |||
| */ | |||
| public class BuildException extends RuntimeException { | |||
| /** Exception that might have caused this one. */ | |||
| private Throwable m_cause; | |||
| /** Location in the build file where the exception occured */ | |||
| private Location m_location = Location.UNKNOWN_LOCATION; | |||
| /** | |||
| * Constructs a build exception with no descriptive information. | |||
| */ | |||
| public BuildException() { | |||
| } | |||
| /** | |||
| * Constructs an exception with the given descriptive message. | |||
| * | |||
| * @param msg A description of or information about the exception. | |||
| * Should not be <code>null</code>. | |||
| */ | |||
| public BuildException(final String msg) { | |||
| super(msg); | |||
| } | |||
| /** | |||
| * Constructs an exception with the given message and exception as | |||
| * a root cause. | |||
| * | |||
| * @param msg A description of or information about the exception. | |||
| * Should not be <code>null</code> unless a cause is specified. | |||
| * @param cause The exception that might have caused this one. | |||
| * May be <code>null</code>. | |||
| */ | |||
| public BuildException(final String msg, final Throwable cause) { | |||
| super(msg); | |||
| m_cause = cause; | |||
| } | |||
| /** | |||
| * Constructs an exception with the given message and exception as | |||
| * a root cause and a location in a file. | |||
| * | |||
| * @param msg A description of or information about the exception. | |||
| * Should not be <code>null</code> unless a cause is specified. | |||
| * @param cause The exception that might have caused this one. | |||
| * May be <code>null</code>. | |||
| * @param location The location in the project file where the error | |||
| * occurred. Must not be <code>null</code>. | |||
| */ | |||
| public BuildException( final String msg, | |||
| final Throwable cause, | |||
| final Location location) { | |||
| this(msg, cause); | |||
| m_location = location; | |||
| } | |||
| /** | |||
| * Constructs an exception with the given exception as a root cause. | |||
| * | |||
| * @param cause The exception that might have caused this one. | |||
| * Should not be <code>null</code>. | |||
| */ | |||
| public BuildException(final Throwable cause ) { | |||
| this(cause.getMessage(), cause); | |||
| } | |||
| /** | |||
| * Constructs an exception with the given descriptive message and a | |||
| * location in a file. | |||
| * | |||
| * @param msg A description of or information about the exception. | |||
| * Should not be <code>null</code>. | |||
| * @param location The location in the project file where the error | |||
| * occurred. Must not be <code>null</code>. | |||
| */ | |||
| public BuildException(final String msg, final Location location) { | |||
| super(msg); | |||
| m_location = location; | |||
| } | |||
| /** | |||
| * Constructs an exception with the given exception as | |||
| * a root cause and a location in a file. | |||
| * | |||
| * @param cause The exception that might have caused this one. | |||
| * Should not be <code>null</code>. | |||
| * @param location The location in the project file where the error | |||
| * occurred. Must not be <code>null</code>. | |||
| */ | |||
| public BuildException(final Throwable cause, final Location location) { | |||
| this(cause); | |||
| m_location = location; | |||
| } | |||
| /** | |||
| * Returns the nested exception, if any. | |||
| * | |||
| * @return the nested exception, or <code>null</code> if no | |||
| * exception is associated with this one | |||
| */ | |||
| public Throwable getException() { | |||
| return m_cause; | |||
| } | |||
| /** | |||
| * Returns the location of the error and the error message. | |||
| * | |||
| * @return the location of the error and the error message | |||
| */ | |||
| public String toString() { | |||
| return m_location.toString() + getMessage(); | |||
| } | |||
| /** | |||
| * Sets the file location where the error occurred. | |||
| * | |||
| * @param location The file location where the error occurred. | |||
| * Must not be <code>null</code>. | |||
| */ | |||
| public void setLocation(final Location location) { | |||
| m_location = location; | |||
| } | |||
| /** | |||
| * Returns the file location where the error occurred. | |||
| * | |||
| * @return the file location where the error occurred. | |||
| */ | |||
| public Location getLocation() { | |||
| return m_location; | |||
| } | |||
| /** | |||
| * Prints the stack trace for this exception and any | |||
| * nested exception to <code>System.err</code>. | |||
| */ | |||
| public void printStackTrace() { | |||
| printStackTrace(System.err); | |||
| } | |||
| /** | |||
| * Prints the stack trace of this exception and any nested | |||
| * exception to the specified PrintStream. | |||
| * | |||
| * @param ps The PrintStream to print the stack trace to. | |||
| * Must not be <code>null</code>. | |||
| */ | |||
| public void printStackTrace(PrintStream ps) { | |||
| synchronized (ps) { | |||
| super.printStackTrace(ps); | |||
| if (m_cause != null) { | |||
| ps.println("--- Nested Exception ---"); | |||
| m_cause.printStackTrace(ps); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Prints the stack trace of this exception and any nested | |||
| * exception to the specified PrintWriter. | |||
| * | |||
| * @param pw The PrintWriter to print the stack trace to. | |||
| * Must not be <code>null</code>. | |||
| */ | |||
| public void printStackTrace(PrintWriter pw) { | |||
| synchronized (pw) { | |||
| super.printStackTrace(pw); | |||
| if (m_cause != null) { | |||
| pw.println("--- Nested Exception ---"); | |||
| m_cause.printStackTrace(pw); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Myrmidon-friendly cascading exception method. | |||
| * @return the cascading cause of this exception. | |||
| */ | |||
| public Throwable getCause() | |||
| { | |||
| return m_cause; | |||
| } | |||
| } | |||
| @@ -1,286 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 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; | |||
| import java.io.BufferedReader; | |||
| import java.io.File; | |||
| import java.io.FilenameFilter; | |||
| import java.io.IOException; | |||
| import java.io.InputStreamReader; | |||
| import java.io.PrintStream; | |||
| import java.net.MalformedURLException; | |||
| import java.net.URL; | |||
| import java.net.URLClassLoader; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| /** | |||
| * LoaderUtils is a utility class with methods for configuring a class | |||
| * loader from a URL. | |||
| * | |||
| * @author Conor MacNeill | |||
| * @created 9 January 2002 | |||
| */ | |||
| public class LoaderUtils { | |||
| /** | |||
| * This is the file that is consulted on remote systems to specify | |||
| * available jars | |||
| */ | |||
| public static final String LIST_FILE = "file.list"; | |||
| /** | |||
| * Get the URLs of a set of libraries in the given location | |||
| * | |||
| * @param location the location to be searched | |||
| * @param defaultFile default file if none can be found | |||
| * @return an array of URLs for the relevant jars | |||
| * @exception MalformedURLException the URLs cannot be created | |||
| */ | |||
| public static URL[] getLocationURLs(URL location, String defaultFile) | |||
| throws MalformedURLException { | |||
| return getLocationURLs(location, defaultFile, new String[]{".jar"}); | |||
| } | |||
| /** | |||
| * Get the URLs of a set of libraries in the given location | |||
| * | |||
| * @param location the location to be searched | |||
| * @param extensions array of allowable file extensions | |||
| * @param defaultFile default file if none can be found | |||
| * @return an array of URLs for the relevant jars | |||
| * @exception MalformedURLException if the URL to the jars could not be | |||
| * formed | |||
| */ | |||
| public static URL[] getLocationURLs(URL location, String defaultFile, | |||
| String[] extensions) | |||
| throws MalformedURLException { | |||
| URL[] urls = null; | |||
| if (location.getProtocol().equals("file")) { | |||
| // URL is local filesystem. | |||
| urls = getLocalURLs(new File(location.getFile()), extensions); | |||
| } else { | |||
| // URL is remote - try to read a file with the list of jars | |||
| URL jarListURL = new URL(location, LIST_FILE); | |||
| BufferedReader reader = null; | |||
| List jarList = new ArrayList(); | |||
| try { | |||
| InputStreamReader isr | |||
| = new InputStreamReader(jarListURL.openStream()); | |||
| reader = new BufferedReader(isr); | |||
| String line = null; | |||
| while ((line = reader.readLine().trim()) != null) { | |||
| for (int i = 0; i < extensions.length; ++i) { | |||
| if (line.endsWith(extensions[i])) { | |||
| jarList.add(new URL(location, line)); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| urls = (URL[])jarList.toArray(new URL[0]); | |||
| } catch (IOException e) { | |||
| // use the default location | |||
| if (defaultFile != null) { | |||
| urls = new URL[]{new URL(location, defaultFile)}; | |||
| } | |||
| } finally { | |||
| if (reader != null) { | |||
| try { | |||
| reader.close(); | |||
| } catch (IOException e) { | |||
| } | |||
| } | |||
| } | |||
| } | |||
| return urls; | |||
| } | |||
| /** | |||
| * Get the classpath from a classloader. This can only extract path | |||
| * components from the loaders which are instances of URLClassLoaders | |||
| * | |||
| * @param loader the loader whose path is required | |||
| * @return the loader's configuration expressed as a classpath | |||
| */ | |||
| public static String getClasspath(ClassLoader loader) { | |||
| StringBuffer pathBuffer = null; | |||
| if (loader instanceof URLClassLoader) { | |||
| URLClassLoader urlLoader = (URLClassLoader)loader; | |||
| URL[] urls = urlLoader.getURLs(); | |||
| for (int i = 0; i < urls.length; ++i) { | |||
| if (!urls[i].getProtocol().equals("file")) { | |||
| continue; | |||
| } | |||
| String pathElement = urls[i].getFile(); | |||
| if (pathBuffer == null) { | |||
| pathBuffer = new StringBuffer(pathElement); | |||
| } else { | |||
| pathBuffer.append(File.pathSeparatorChar); | |||
| pathBuffer.append(pathElement); | |||
| } | |||
| } | |||
| } | |||
| String path = pathBuffer == null ? "" : pathBuffer.toString(); | |||
| ClassLoader parentLoader = loader.getParent(); | |||
| if (parentLoader != null) { | |||
| String parentPath = getClasspath(parentLoader); | |||
| if (parentPath.length() != 0) { | |||
| path = parentPath + File.pathSeparator + path; | |||
| } | |||
| } | |||
| return path; | |||
| } | |||
| /** | |||
| * Debug method to dump a class loader hierarchy to a PrintStream | |||
| * URLClassLoaders dump their URLs | |||
| * | |||
| * @param loader the class loaders whose configuration is dumped | |||
| * @param ps PrintStream to which info is sent | |||
| */ | |||
| public static void dumpLoader(PrintStream ps, ClassLoader loader) { | |||
| if (loader instanceof URLClassLoader) { | |||
| URLClassLoader urlLoader = (URLClassLoader)loader; | |||
| URL[] urls = urlLoader.getURLs(); | |||
| if (urls.length == 0) { | |||
| ps.println(" No URLs"); | |||
| } else { | |||
| for (int i = 0; i < urls.length; ++i) { | |||
| ps.println(" URL: " + urls[i]); | |||
| } | |||
| } | |||
| } else { | |||
| ps.println("Class Loader: " + loader.getClass().getName()); | |||
| } | |||
| ps.println(); | |||
| ClassLoader parentLoader = loader.getParent(); | |||
| if (parentLoader != null) { | |||
| ps.println("Parent Loader:"); | |||
| dumpLoader(ps, parentLoader); | |||
| } | |||
| } | |||
| /** | |||
| * Get an array of URLs for each file in the filesystem. If the given | |||
| * location is a directory, it is searched for files of the given | |||
| * extension. If it is a file, it is returned as a URL if it matches the | |||
| * given extension list. | |||
| * | |||
| * @param location the location within the local filesystem to be | |||
| * searched | |||
| * @param extensions an array of file extensions to be considered in the | |||
| * search | |||
| * @return an array of URLs for the file found in the directory. | |||
| * @exception MalformedURLException if the URLs to the jars cannot be | |||
| * formed | |||
| */ | |||
| private static URL[] getLocalURLs(File location, | |||
| final String[] extensions) | |||
| throws MalformedURLException { | |||
| URL[] urls = new URL[0]; | |||
| if (!location.exists()) { | |||
| return urls; | |||
| } | |||
| if (!location.isDirectory()) { | |||
| String path = location.getPath(); | |||
| for (int i = 0; i < extensions.length; ++i) { | |||
| if (path.endsWith(extensions[i])) { | |||
| urls[0] = location.toURL(); | |||
| break; | |||
| } | |||
| } | |||
| return urls; | |||
| } | |||
| File[] jars = location.listFiles( | |||
| new FilenameFilter() { | |||
| public boolean accept(File dir, String name) { | |||
| for (int i = 0; i < extensions.length; ++i) { | |||
| if (name.endsWith(extensions[i])) { | |||
| return true; | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| }); | |||
| urls = new URL[jars.length]; | |||
| for (int i = 0; i < jars.length; ++i) { | |||
| urls[i] = jars[i].toURL(); | |||
| } | |||
| return urls; | |||
| } | |||
| /** | |||
| * Set the context loader of the current thread and returns the existing | |||
| * classloader | |||
| * | |||
| * @param newLoader the new context loader | |||
| * @return the old context loader | |||
| */ | |||
| public static ClassLoader setContextLoader(ClassLoader newLoader) { | |||
| Thread thread = Thread.currentThread(); | |||
| ClassLoader currentLoader = thread.getContextClassLoader(); | |||
| thread.setContextClassLoader(newLoader); | |||
| return currentLoader; | |||
| } | |||
| } | |||
| @@ -1,374 +0,0 @@ | |||
| /* | |||
| * 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; | |||
| } | |||
| } | |||
| @@ -1,4 +0,0 @@ | |||
| type.no-id.error=Id must be specified. | |||
| taskadapter.invalid-task-name.error=Invalid task name for TaskAdapter: {0}. | |||
| taskadapter.no-create.error=Could not instantiate adapted task: {0}. | |||
| @@ -1,117 +0,0 @@ | |||
| /* | |||
| * 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 | |||
| { | |||
| protected 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() ); | |||
| // Create/recontextualise the Ant1 Project. | |||
| Ant1CompatProject project = | |||
| (Ant1CompatProject)context.getProperty( Ant1CompatProject.ANT1_PROJECT_PROP ); | |||
| if( project == null ) | |||
| { | |||
| project = createProject(); | |||
| m_context.setProperty( Ant1CompatProject.ANT1_PROJECT_PROP, project ); | |||
| } | |||
| else | |||
| { | |||
| project.recontextulize( context ); | |||
| } | |||
| this.setProject( project ); | |||
| } | |||
| /** | |||
| * Create and initialise an Ant1CompatProject | |||
| */ | |||
| private Ant1CompatProject createProject() | |||
| throws TaskException | |||
| { | |||
| Ant1CompatProject project = new Ant1CompatProject( m_context ); | |||
| project.init(); | |||
| return project; | |||
| } | |||
| /** | |||
| * Uses the task Configuration to perform Ant1-style configuration | |||
| * on the Ant1 task. This method configures *all* tasks the way Ant1 | |||
| * configures tasks inside a target. | |||
| * | |||
| * @param configuration The TaskModel for this Ant1 Task. | |||
| * @throws ConfigurationException if the Configuration supplied is not valid | |||
| */ | |||
| public void configure( Configuration configuration ) throws ConfigurationException | |||
| { | |||
| configure( this, configuration ); | |||
| } | |||
| /** | |||
| * Uses reflection to configure any Object, with the help of the Ant1 | |||
| * IntrospectionHelper. using . This aims to mimic (to some extent) the | |||
| * Ant1-style configuration rules implemented by ProjectHelperImpl. | |||
| * @param target | |||
| * The object to be configured. | |||
| * @param configuration | |||
| * The data to configure the object with. | |||
| * @throws ConfigurationException | |||
| * If the Configuration is not valid for the configured object | |||
| */ | |||
| protected void configure( Object target, Configuration configuration ) throws ConfigurationException | |||
| { | |||
| //TODO Maybe provide different configuration order for tasks not in a target, | |||
| // elements in a TaskContainer etc... | |||
| Ant1CompatConfigurer configurer = | |||
| new Ant1CompatConfigurer( target, configuration, project ); | |||
| configurer.createChildren(); | |||
| configurer.configure(); | |||
| this.init(); | |||
| } | |||
| /** | |||
| * Returns the name of a Task/Datatype as referred to by Ant1 code, without | |||
| * the "ant1." prefix. | |||
| * @param fullName The full name as known by Myrmidon. | |||
| * @return the name without the Ant1 prefix. | |||
| */ | |||
| protected String getAnt1Name( String fullName ) | |||
| { | |||
| return fullName.substring( Ant1CompatProject.ANT1_TASK_PREFIX.length() ); | |||
| } | |||
| } | |||
| @@ -1,238 +0,0 @@ | |||
| /* | |||
| * 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.taskdefs; | |||
| import java.util.Iterator; | |||
| import java.util.Vector; | |||
| import org.apache.avalon.framework.configuration.Configuration; | |||
| import org.apache.avalon.framework.configuration.DefaultConfiguration; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.interfaces.executor.ExecutionFrame; | |||
| import org.apache.myrmidon.interfaces.executor.Executor; | |||
| import org.apache.tools.ant.Ant1CompatProject; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Task; | |||
| /** | |||
| * A base class for Ant1 versions of <ant> and <antcall> tasks, | |||
| * which delegate to the Myrmidon versions of these tasks. | |||
| * | |||
| * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public abstract class AbstractAnt1AntTask | |||
| extends Task | |||
| { | |||
| /** the target to call if any */ | |||
| private String target = null; | |||
| /** should we inherit properties from the parent ? */ | |||
| private boolean inheritAll = true; | |||
| /** the properties to pass to the new project */ | |||
| private Vector properties = new Vector(); | |||
| /** the references to pass to the new project */ | |||
| private Vector references = new Vector(); | |||
| /** | |||
| * If true, inherit all properties from parent Project | |||
| * If false, inherit only userProperties and those defined | |||
| * inside the ant call itself | |||
| */ | |||
| public void setInheritAll( boolean value ) | |||
| { | |||
| inheritAll = value; | |||
| } | |||
| /** | |||
| * set the target to execute. If none is defined it will | |||
| * execute the default target of the build file | |||
| */ | |||
| public void setTarget( String s ) | |||
| { | |||
| this.target = s; | |||
| } | |||
| /** | |||
| * Create a nested property (ant) or param (antcall) element. | |||
| */ | |||
| protected Property doCreateProperty() | |||
| { | |||
| Property p = new Property( true ); | |||
| properties.addElement( p ); | |||
| return p; | |||
| } | |||
| /** | |||
| * create a reference element that identifies a data type that | |||
| * should be carried over to the new project. | |||
| */ | |||
| public void addReference( Reference r ) | |||
| { | |||
| references.addElement( r ); | |||
| } | |||
| /** | |||
| * Helper class that implements the nested <reference> | |||
| * element of <ant> and <antcall>. | |||
| */ | |||
| public static class Reference | |||
| extends org.apache.tools.ant.types.Reference | |||
| { | |||
| public Reference() | |||
| { | |||
| super(); | |||
| } | |||
| private String targetid = null; | |||
| public void setToRefid( String targetid ) | |||
| { | |||
| this.targetid = targetid; | |||
| } | |||
| public String getToRefid() | |||
| { | |||
| return targetid; | |||
| } | |||
| } | |||
| /** | |||
| * Removes the Ant1CompatProject from the properties, builds a TaskModel for | |||
| * executing the Myrmidon task, and executes that TaskModel. | |||
| * @throws BuildException on error | |||
| */ | |||
| public void execute() throws BuildException | |||
| { | |||
| Object ant1project = unsetAnt1Project(); | |||
| try | |||
| { | |||
| Configuration antConfig = constructTaskModel(); | |||
| executeTask( antConfig ); | |||
| } | |||
| finally | |||
| { | |||
| resetAnt1Project( ant1project ); | |||
| } | |||
| } | |||
| /** | |||
| * Executes the Myrmidon task detailed in the TaskModel provided. | |||
| * @param taskModel the TaskModel for the task to execute. | |||
| */ | |||
| private void executeTask( Configuration taskModel ) | |||
| { | |||
| try | |||
| { | |||
| Executor executor = (Executor)m_context.getService( Executor.class ); | |||
| ExecutionFrame frame = | |||
| (ExecutionFrame)m_context.getService( ExecutionFrame.class ); | |||
| executor.execute( taskModel, frame ); | |||
| } | |||
| catch( TaskException e ) | |||
| { | |||
| throw new BuildException( e ); | |||
| } | |||
| } | |||
| /** | |||
| * Removes the Ant1CompatProject from the TaskContext properties. | |||
| * @return the removed project | |||
| * @throws BuildException | |||
| */ | |||
| private Object unsetAnt1Project() throws BuildException | |||
| { | |||
| Object ant1project = null; | |||
| try | |||
| { | |||
| ant1project = | |||
| m_context.getProperty( Ant1CompatProject.ANT1_PROJECT_PROP ); | |||
| m_context.setProperty( Ant1CompatProject.ANT1_PROJECT_PROP, null ); | |||
| } | |||
| catch( TaskException e ) | |||
| { | |||
| throw new BuildException( e ); | |||
| } | |||
| return ant1project; | |||
| } | |||
| /** | |||
| * Adds the Ant1CompatProject back into the TaskContext properties. | |||
| * @param ant1project the project to add. | |||
| * @throws BuildException | |||
| */ | |||
| private void resetAnt1Project( Object ant1project ) throws BuildException | |||
| { | |||
| try | |||
| { | |||
| m_context.setProperty( Ant1CompatProject.ANT1_PROJECT_PROP, | |||
| ant1project ); | |||
| } | |||
| catch( TaskException e ) | |||
| { | |||
| throw new BuildException( e ); | |||
| } | |||
| } | |||
| /** | |||
| * Builds the TaskModel for executing the Myrmidon version of a task. | |||
| * @return a Configuration containing the TaskModel | |||
| */ | |||
| protected Configuration constructTaskModel() | |||
| { | |||
| DefaultConfiguration antConfig = buildTaskModel(); | |||
| antConfig.setAttribute( "inherit-all", String.valueOf( inheritAll ) ); | |||
| // Ignore inheritRefs for now ( inheritAll == inheritRefs ) | |||
| if( target != null ) | |||
| { | |||
| antConfig.setAttribute( "target", target ); | |||
| } | |||
| addProperties( antConfig ); | |||
| addReferences( antConfig ); | |||
| return antConfig; | |||
| } | |||
| /** | |||
| * Create the Myrmidon TaskModel, and configure with subclass-specific config. | |||
| */ | |||
| protected abstract DefaultConfiguration buildTaskModel(); | |||
| /** | |||
| * Adds all defined properties to the supplied Task model. | |||
| * @param taskModel | |||
| */ | |||
| protected void addProperties( DefaultConfiguration taskModel ) | |||
| { | |||
| // Add all of the properties. | |||
| Iterator iter = properties.iterator(); | |||
| while( iter.hasNext() ) | |||
| { | |||
| DefaultConfiguration param = new DefaultConfiguration( "param", "" ); | |||
| Property property = (Property)iter.next(); | |||
| param.setAttribute( "name", property.getName() ); | |||
| param.setAttribute( "value", property.getValue() ); | |||
| taskModel.addChild( param ); | |||
| } | |||
| } | |||
| /** | |||
| * Adds all defined references to the supplied Task model. | |||
| * @param taskModel | |||
| */ | |||
| protected void addReferences( DefaultConfiguration taskModel ) | |||
| { | |||
| // TODO: Handle references. | |||
| } | |||
| } | |||
| @@ -1,152 +0,0 @@ | |||
| /* | |||
| * 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.taskdefs; | |||
| import java.io.File; | |||
| import org.apache.avalon.framework.configuration.DefaultConfiguration; | |||
| import org.apache.tools.ant.util.FileUtils; | |||
| /** | |||
| * Ant1Compat version of <ant>, which delegates to the Myrmidon version. | |||
| * | |||
| * @author costin@dnt.ro | |||
| * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||
| */ | |||
| public class Ant | |||
| extends AbstractAnt1AntTask | |||
| { | |||
| /** the basedir where is executed the build file */ | |||
| private File dir = null; | |||
| /** the build.xml file (can be absolute) in this case dir will be ignored */ | |||
| private String antFile = null; | |||
| /** the output */ | |||
| private String output = null; | |||
| /** should we inherit references from the parent ? */ | |||
| private boolean inheritRefs = false; | |||
| /** | |||
| * If true, inherit all references from parent Project | |||
| * If false, inherit only those defined | |||
| * inside the ant call itself | |||
| */ | |||
| public void setInheritRefs( boolean value ) | |||
| { | |||
| inheritRefs = value; | |||
| } | |||
| /** | |||
| * ... | |||
| */ | |||
| public void setDir( File d ) | |||
| { | |||
| this.dir = d; | |||
| } | |||
| /** | |||
| * set the build file, it can be either absolute or relative. | |||
| * If it is absolute, <tt>dir</tt> will be ignored, if it is | |||
| * relative it will be resolved relative to <tt>dir</tt>. | |||
| */ | |||
| public void setAntfile( String s ) | |||
| { | |||
| // @note: it is a string and not a file to handle relative/absolute | |||
| // otherwise a relative file will be resolved based on the current | |||
| // basedir. | |||
| this.antFile = s; | |||
| } | |||
| public void setOutput( String s ) | |||
| { | |||
| this.output = s; | |||
| } | |||
| /** create a property to pass to the new project as a 'user property' */ | |||
| public Property createProperty() | |||
| { | |||
| return doCreateProperty(); | |||
| } | |||
| /** | |||
| * Construct a TaskModel for the Myrmidon <ant> task, and configure it | |||
| * with sub-class specific values (antfile). | |||
| * @return the TaskModel | |||
| */ | |||
| protected DefaultConfiguration buildTaskModel() | |||
| { | |||
| DefaultConfiguration antConfig = new DefaultConfiguration( "ant", "" ); | |||
| // Get the "file" value. | |||
| if( antFile == null ) | |||
| { | |||
| antFile = "build.xml"; | |||
| } | |||
| if( dir == null ) | |||
| { | |||
| dir = project.getBaseDir(); | |||
| } | |||
| File file = FileUtils.newFileUtils().resolveFile( dir, antFile ); | |||
| antFile = file.getAbsolutePath(); | |||
| antConfig.setAttribute( "file", antFile ); | |||
| return antConfig; | |||
| } | |||
| } | |||
| @@ -1,36 +0,0 @@ | |||
| /* | |||
| * 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.taskdefs; | |||
| import org.apache.avalon.framework.configuration.DefaultConfiguration; | |||
| /** | |||
| * The Ant1Compat version of the <antcall> task, which delegates to the | |||
| * Myrmidon version. | |||
| * | |||
| * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class CallTarget extends AbstractAnt1AntTask | |||
| { | |||
| /** | |||
| * Properties are referred to as Parameters in <antcall> | |||
| */ | |||
| public Property createParam() | |||
| { | |||
| return doCreateProperty(); | |||
| } | |||
| /** | |||
| * The only configuration not done by base class is the task name. | |||
| */ | |||
| protected DefaultConfiguration buildTaskModel() | |||
| { | |||
| return new DefaultConfiguration( "ant-call", "" ); | |||
| } | |||
| } | |||
| @@ -1,626 +0,0 @@ | |||
| /* | |||
| * 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.types; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.DirectoryScanner; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.PathTokenizer; | |||
| import org.apache.tools.ant.LoaderUtils; | |||
| import java.io.File; | |||
| import java.util.Enumeration; | |||
| import java.util.Locale; | |||
| import java.util.Stack; | |||
| import java.util.Vector; | |||
| /** | |||
| * *********************************************************************** | |||
| * Ant1Compatibility Layer version of Path, hacked to provide Ant1 runtime | |||
| * files in System Classpath. | |||
| * *********************************************************************** | |||
| * | |||
| * This object represents a path as used by CLASSPATH or PATH | |||
| * environment variable. | |||
| * <p> | |||
| * <code> | |||
| * <sometask><br> | |||
| * <somepath><br> | |||
| * <pathelement location="/path/to/file.jar" /><br> | |||
| * <pathelement path="/path/to/file2.jar:/path/to/class2;/path/to/class3" /><br> | |||
| * <pathelement location="/path/to/file3.jar" /><br> | |||
| * <pathelement location="/path/to/file4.jar" /><br> | |||
| * </somepath><br> | |||
| * </sometask><br> | |||
| * </code> | |||
| * <p> | |||
| * The object implemention <code>sometask</code> must provide a method called | |||
| * <code>createSomepath</code> which returns an instance of <code>Path</code>. | |||
| * Nested path definitions are handled by the Path object and must be labeled | |||
| * <code>pathelement</code>.<p> | |||
| * | |||
| * The path element takes a parameter <code>path</code> which will be parsed | |||
| * and split into single elements. It will usually be used | |||
| * to define a path from an environment variable. | |||
| * | |||
| * @author Thomas.Haas@softwired-inc.com | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| */ | |||
| public class Path extends DataType implements Cloneable { | |||
| private Vector elements; | |||
| public static Path systemClasspath = | |||
| new Path(null, System.getProperty("java.class.path")); | |||
| //Modified from original source. | |||
| //Append Ant1Compat classpath to systemclasspath. | |||
| // ------------------Modified-------------------------------- | |||
| static | |||
| { | |||
| // Add Ant1Compat.atl to system classpath. | |||
| String classpath = LoaderUtils.getClasspath( Path.class.getClassLoader() ); | |||
| systemClasspath.append( new Path( null, classpath ) ); | |||
| } | |||
| //-----------------End Modified------------------------------ | |||
| /** | |||
| * Helper class, holds the nested <code><pathelement></code> values. | |||
| */ | |||
| public class PathElement { | |||
| private String[] parts; | |||
| public void setLocation(File loc) { | |||
| parts = new String[] {translateFile(loc.getAbsolutePath())}; | |||
| } | |||
| public void setPath(String path) { | |||
| parts = Path.translatePath(getProject(), path); | |||
| } | |||
| public String[] getParts() { | |||
| return parts; | |||
| } | |||
| } | |||
| /** | |||
| * Invoked by IntrospectionHelper for <code>setXXX(Path p)</code> | |||
| * attribute setters. | |||
| */ | |||
| public Path(Project p, String path) { | |||
| this(p); | |||
| createPathElement().setPath(path); | |||
| } | |||
| public Path(Project project) { | |||
| setProject(project); | |||
| elements = new Vector(); | |||
| } | |||
| /** | |||
| * Adds a element definition to the path. | |||
| * @param location the location of the element to add (must not be | |||
| * <code>null</code> nor empty. | |||
| */ | |||
| public void setLocation(File location) throws BuildException { | |||
| if (isReference()) { | |||
| throw tooManyAttributes(); | |||
| } | |||
| createPathElement().setLocation(location); | |||
| } | |||
| /** | |||
| * Parses a path definition and creates single PathElements. | |||
| * @param path the path definition. | |||
| */ | |||
| public void setPath(String path) throws BuildException { | |||
| if (isReference()) { | |||
| throw tooManyAttributes(); | |||
| } | |||
| createPathElement().setPath(path); | |||
| } | |||
| /** | |||
| * Makes this instance in effect a reference to another Path instance. | |||
| * | |||
| * <p>You must not set another attribute or nest elements inside | |||
| * this element if you make it a reference.</p> | |||
| */ | |||
| public void setRefid(Reference r) throws BuildException { | |||
| if (!elements.isEmpty()) { | |||
| throw tooManyAttributes(); | |||
| } | |||
| elements.addElement(r); | |||
| super.setRefid(r); | |||
| } | |||
| /** | |||
| * Creates the nested <code><pathelement></code> element. | |||
| */ | |||
| public PathElement createPathElement() throws BuildException { | |||
| if (isReference()) { | |||
| throw noChildrenAllowed(); | |||
| } | |||
| PathElement pe = new PathElement(); | |||
| elements.addElement(pe); | |||
| return pe; | |||
| } | |||
| /** | |||
| * Adds a nested <code><fileset></code> element. | |||
| */ | |||
| public void addFileset(FileSet fs) throws BuildException { | |||
| if (isReference()) { | |||
| throw noChildrenAllowed(); | |||
| } | |||
| elements.addElement(fs); | |||
| checked = false; | |||
| } | |||
| /** | |||
| * Creates a nested <code><path></code> element. | |||
| */ | |||
| public Path createPath() throws BuildException { | |||
| if (isReference()) { | |||
| throw noChildrenAllowed(); | |||
| } | |||
| Path p = new Path(getProject()); | |||
| elements.addElement(p); | |||
| checked = false; | |||
| return p; | |||
| } | |||
| /** | |||
| * Append the contents of the other Path instance to this. | |||
| */ | |||
| public void append(Path other) { | |||
| if (other == null) { | |||
| return; | |||
| } | |||
| String[] l = other.list(); | |||
| for (int i=0; i<l.length; i++) { | |||
| if (elements.indexOf(l[i]) == -1) { | |||
| elements.addElement(l[i]); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Adds the components on the given path which exist to this | |||
| * Path. Components that don't exist, aren't added. | |||
| * | |||
| * @param source - source path whose components are examined for existence | |||
| */ | |||
| public void addExisting(Path source) { | |||
| String[] list = source.list(); | |||
| for (int i=0; i<list.length; i++) { | |||
| File f = null; | |||
| if (getProject() != null) { | |||
| f = getProject().resolveFile(list[i]); | |||
| } | |||
| else { | |||
| f = new File(list[i]); | |||
| } | |||
| if (f.exists()) { | |||
| setLocation(f); | |||
| } else { | |||
| log("dropping " + f + " from path as it doesn't exist", | |||
| Project.MSG_VERBOSE); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Returns all path elements defined by this and nested path objects. | |||
| * @return list of path elements. | |||
| */ | |||
| public String[] list() { | |||
| if (!checked) { | |||
| // make sure we don't have a circular reference here | |||
| Stack stk = new Stack(); | |||
| stk.push(this); | |||
| dieOnCircularReference(stk, getProject()); | |||
| } | |||
| Vector result = new Vector(2*elements.size()); | |||
| for (int i=0; i<elements.size(); i++) { | |||
| Object o = elements.elementAt(i); | |||
| if (o instanceof Reference) { | |||
| Reference r = (Reference) o; | |||
| o = r.getReferencedObject(getProject()); | |||
| // we only support references to paths right now | |||
| if (!(o instanceof Path)) { | |||
| String msg = r.getRefId()+" doesn\'t denote a path"; | |||
| throw new BuildException(msg); | |||
| } | |||
| } | |||
| if (o instanceof String) { | |||
| // obtained via append | |||
| addUnlessPresent(result, (String) o); | |||
| } else if (o instanceof PathElement) { | |||
| String[] parts = ((PathElement) o).getParts(); | |||
| if (parts == null) { | |||
| throw new BuildException("You must either set location or path on <pathelement>"); | |||
| } | |||
| for (int j=0; j<parts.length; j++) { | |||
| addUnlessPresent(result, parts[j]); | |||
| } | |||
| } else if (o instanceof Path) { | |||
| Path p = (Path) o; | |||
| if (p.getProject() == null) { | |||
| p.setProject(getProject()); | |||
| } | |||
| String[] parts = p.list(); | |||
| for (int j=0; j<parts.length; j++) { | |||
| addUnlessPresent(result, parts[j]); | |||
| } | |||
| } else if (o instanceof FileSet) { | |||
| FileSet fs = (FileSet) o; | |||
| DirectoryScanner ds = fs.getDirectoryScanner(getProject()); | |||
| String[] s = ds.getIncludedFiles(); | |||
| File dir = fs.getDir(getProject()); | |||
| for (int j=0; j<s.length; j++) { | |||
| File f = new File(dir, s[j]); | |||
| String absolutePath = f.getAbsolutePath(); | |||
| addUnlessPresent(result, translateFile(absolutePath)); | |||
| } | |||
| } | |||
| } | |||
| String[] res = new String[result.size()]; | |||
| result.copyInto(res); | |||
| return res; | |||
| } | |||
| /** | |||
| * Returns a textual representation of the path, which can be used as | |||
| * CLASSPATH or PATH environment variable definition. | |||
| * @return a textual representation of the path. | |||
| */ | |||
| public String toString() { | |||
| final String[] list = list(); | |||
| // empty path return empty string | |||
| if (list.length == 0) { | |||
| return ""; | |||
| } | |||
| // path containing one or more elements | |||
| final StringBuffer result = new StringBuffer(list[0].toString()); | |||
| for (int i=1; i < list.length; i++) { | |||
| result.append(File.pathSeparatorChar); | |||
| result.append(list[i]); | |||
| } | |||
| return result.toString(); | |||
| } | |||
| /** | |||
| * Splits a PATH (with : or ; as separators) into its parts. | |||
| */ | |||
| public static String[] translatePath(Project project, String source) { | |||
| final Vector result = new Vector(); | |||
| if (source == null) { | |||
| return new String[0]; | |||
| } | |||
| PathTokenizer tok = new PathTokenizer(source); | |||
| StringBuffer element = new StringBuffer(); | |||
| while (tok.hasMoreTokens()) { | |||
| element.setLength(0); | |||
| String pathElement = tok.nextToken(); | |||
| try { | |||
| element.append(resolveFile(project, pathElement)); | |||
| } | |||
| catch (BuildException e) { | |||
| project.log("Dropping path element " + pathElement + " as it is not valid relative to the project", | |||
| Project.MSG_VERBOSE); | |||
| } | |||
| for (int i=0; i<element.length(); i++) { | |||
| translateFileSep(element, i); | |||
| } | |||
| result.addElement(element.toString()); | |||
| } | |||
| String[] res = new String[result.size()]; | |||
| result.copyInto(res); | |||
| return res; | |||
| } | |||
| /** | |||
| * Returns its argument with all file separator characters | |||
| * replaced so that they match the local OS conventions. | |||
| */ | |||
| public static String translateFile(String source) { | |||
| if (source == null) { | |||
| return ""; | |||
| } | |||
| final StringBuffer result = new StringBuffer(source); | |||
| for (int i=0; i < result.length(); i++) { | |||
| translateFileSep(result, i); | |||
| } | |||
| return result.toString(); | |||
| } | |||
| /** | |||
| * Translates all occurrences of / or \ to correct separator of the | |||
| * current platform and returns whether it had to do any | |||
| * replacements. | |||
| */ | |||
| protected static boolean translateFileSep(StringBuffer buffer, int pos) { | |||
| if (buffer.charAt(pos) == '/' || buffer.charAt(pos) == '\\') { | |||
| buffer.setCharAt(pos, File.separatorChar); | |||
| return true; | |||
| } | |||
| return false; | |||
| } | |||
| /** | |||
| * How many parts does this Path instance consist of. | |||
| */ | |||
| public int size() { | |||
| return list().length; | |||
| } | |||
| /** | |||
| * Return a Path that holds the same elements as this instance. | |||
| */ | |||
| public Object clone() { | |||
| Path p = new Path(getProject()); | |||
| p.append(this); | |||
| return p; | |||
| } | |||
| /** | |||
| * Overrides the version of DataType to recurse on all DataType | |||
| * child elements that may have been added. | |||
| */ | |||
| protected void dieOnCircularReference(Stack stk, Project p) | |||
| throws BuildException { | |||
| if (checked) { | |||
| return; | |||
| } | |||
| Enumeration enum = elements.elements(); | |||
| while (enum.hasMoreElements()) { | |||
| Object o = enum.nextElement(); | |||
| if (o instanceof Reference) { | |||
| o = ((Reference) o).getReferencedObject(p); | |||
| } | |||
| if (o instanceof DataType) { | |||
| if (stk.contains(o)) { | |||
| throw circularReference(); | |||
| } else { | |||
| stk.push(o); | |||
| ((DataType) o).dieOnCircularReference(stk, p); | |||
| stk.pop(); | |||
| } | |||
| } | |||
| } | |||
| checked = true; | |||
| } | |||
| /** | |||
| * Resolve a filename with Project's help - if we know one that is. | |||
| * | |||
| * <p>Assume the filename is absolute if project is null.</p> | |||
| */ | |||
| private static String resolveFile(Project project, String relativeName) { | |||
| if (project != null) { | |||
| File f = project.resolveFile(relativeName); | |||
| return f.getAbsolutePath(); | |||
| } | |||
| return relativeName; | |||
| } | |||
| /** | |||
| * Adds a String to the Vector if it isn't already included. | |||
| */ | |||
| private static void addUnlessPresent(Vector v, String s) { | |||
| if (v.indexOf(s) == -1) { | |||
| v.addElement(s); | |||
| } | |||
| } | |||
| /** | |||
| * Concatenates the system class path in the order specified by | |||
| * the ${build.sysclasspath} property - using "last" as | |||
| * default value. | |||
| */ | |||
| public Path concatSystemClasspath() { | |||
| return concatSystemClasspath("last"); | |||
| } | |||
| /** | |||
| * Concatenates the system class path in the order specified by | |||
| * the ${build.sysclasspath} property - using the supplied value | |||
| * if ${build.sysclasspath} has not been set. | |||
| */ | |||
| public Path concatSystemClasspath(String defValue) { | |||
| Path result = new Path(getProject()); | |||
| String order = defValue; | |||
| if (getProject() != null) { | |||
| String o = getProject().getProperty("build.sysclasspath"); | |||
| if (o != null) { | |||
| order = o; | |||
| } | |||
| } | |||
| if (order.equals("only")) { | |||
| // only: the developer knows what (s)he is doing | |||
| result.addExisting(Path.systemClasspath); | |||
| } else if (order.equals("first")) { | |||
| // first: developer could use a little help | |||
| result.addExisting(Path.systemClasspath); | |||
| result.addExisting(this); | |||
| } else if (order.equals("ignore")) { | |||
| // ignore: don't trust anyone | |||
| result.addExisting(this); | |||
| } else { | |||
| // last: don't trust the developer | |||
| if (!order.equals("last")) { | |||
| log("invalid value for build.sysclasspath: " + order, | |||
| Project.MSG_WARN); | |||
| } | |||
| result.addExisting(this); | |||
| result.addExisting(Path.systemClasspath); | |||
| } | |||
| return result; | |||
| } | |||
| /** | |||
| * Add the Java Runtime classes to this Path instance. | |||
| */ | |||
| public void addJavaRuntime() { | |||
| if (System.getProperty("java.vendor").toLowerCase(Locale.US).indexOf("microsoft") >= 0) { | |||
| // Pull in *.zip from packages directory | |||
| FileSet msZipFiles = new FileSet(); | |||
| msZipFiles.setDir(new File(System.getProperty("java.home") + File.separator + "Packages")); | |||
| msZipFiles.setIncludes("*.ZIP"); | |||
| addFileset(msZipFiles); | |||
| } else if("Kaffe".equals(System.getProperty("java.vm.name"))) { | |||
| FileSet kaffeJarFiles = new FileSet(); | |||
| kaffeJarFiles.setDir(new File(System.getProperty("java.home") | |||
| + File.separator + "share" | |||
| + File.separator + "kaffe")); | |||
| kaffeJarFiles.setIncludes("*.jar"); | |||
| addFileset(kaffeJarFiles); | |||
| } | |||
| else if (Project.getJavaVersion() == Project.JAVA_1_1) { | |||
| addExisting(new Path(null, | |||
| System.getProperty("java.home") | |||
| + File.separator + "lib" | |||
| + File.separator | |||
| + "classes.zip")); | |||
| } else { | |||
| // JDK > 1.1 seems to set java.home to the JRE directory. | |||
| addExisting(new Path(null, | |||
| System.getProperty("java.home") | |||
| + File.separator + "lib" | |||
| + File.separator + "rt.jar")); | |||
| // Just keep the old version as well and let addExisting | |||
| // sort it out. | |||
| addExisting(new Path(null, | |||
| System.getProperty("java.home") | |||
| + File.separator +"jre" | |||
| + File.separator + "lib" | |||
| + File.separator + "rt.jar")); | |||
| // Added for MacOS X | |||
| addExisting(new Path(null, | |||
| System.getProperty("java.home") | |||
| + File.separator + ".." | |||
| + File.separator + "Classes" | |||
| + File.separator + "classes.jar")); | |||
| addExisting(new Path(null, | |||
| System.getProperty("java.home") | |||
| + File.separator + ".." | |||
| + File.separator + "Classes" | |||
| + File.separator + "ui.jar")); | |||
| } | |||
| } | |||
| /** | |||
| * Emulation of extdirs feature in java >= 1.2. | |||
| * This method adds all files in the given | |||
| * directories (but not in sub-directories!) to the classpath, | |||
| * so that you don't have to specify them all one by one. | |||
| * @param extdirs - Path to append files to | |||
| */ | |||
| public void addExtdirs(Path extdirs) { | |||
| if (extdirs == null) { | |||
| String extProp = System.getProperty("java.ext.dirs"); | |||
| if (extProp != null) { | |||
| extdirs = new Path(getProject(), extProp); | |||
| } else { | |||
| return; | |||
| } | |||
| } | |||
| String[] dirs = extdirs.list(); | |||
| for (int i=0; i<dirs.length; i++) { | |||
| File dir = getProject().resolveFile(dirs[i]); | |||
| if (dir.exists() && dir.isDirectory()) { | |||
| FileSet fs = new FileSet(); | |||
| fs.setDir(dir); | |||
| fs.setIncludes("*"); | |||
| addFileset(fs); | |||
| } | |||
| } | |||
| } | |||
| } | |||