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); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||