You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

SystemPath.java 7.5 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /*
  2. * The Apache Software License, Version 1.1
  3. *
  4. * Copyright (c) 2000-2002 The Apache Software Foundation. All rights
  5. * reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. *
  11. * 1. Redistributions of source code must retain the above copyright
  12. * notice, this list of conditions and the following disclaimer.
  13. *
  14. * 2. Redistributions in binary form must reproduce the above copyright
  15. * notice, this list of conditions and the following disclaimer in
  16. * the documentation and/or other materials provided with the
  17. * distribution.
  18. *
  19. * 3. The end-user documentation included with the redistribution, if
  20. * any, must include the following acknowlegement:
  21. * "This product includes software developed by the
  22. * Apache Software Foundation (http://www.apache.org/)."
  23. * Alternately, this acknowlegement may appear in the software itself,
  24. * if and wherever such third-party acknowlegements normally appear.
  25. *
  26. * 4. The names "The Jakarta Project", "Ant", and "Apache Software
  27. * Foundation" must not be used to endorse or promote products derived
  28. * from this software without prior written permission. For written
  29. * permission, please contact apache@apache.org.
  30. *
  31. * 5. Products derived from this software may not be called "Apache"
  32. * nor may "Apache" appear in their names without prior written
  33. * permission of the Apache Group.
  34. *
  35. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38. * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42. * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45. * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46. * SUCH DAMAGE.
  47. * ====================================================================
  48. *
  49. * This software consists of voluntary contributions made by many
  50. * individuals on behalf of the Apache Software Foundation. For more
  51. * information on the Apache Software Foundation, please see
  52. * <http://www.apache.org/>.
  53. */
  54. package org.apache.tools.ant.types;
  55. import org.apache.tools.ant.*;
  56. import java.io.*;
  57. import java.util.*;
  58. import org.xml.sax.Locator;
  59. import org.xml.sax.InputSource;
  60. //import org.xml.sax.HandlerBase;
  61. import org.xml.sax.SAXParseException;
  62. import org.xml.sax.XMLReader;
  63. import org.xml.sax.SAXException;
  64. import org.xml.sax.DocumentHandler;
  65. import org.xml.sax.Attributes;
  66. import org.xml.sax.AttributeList;
  67. import org.xml.sax.helpers.XMLReaderAdapter;
  68. import org.xml.sax.helpers.DefaultHandler;
  69. import org.xml.sax.helpers.AttributeListImpl;
  70. import javax.xml.parsers.SAXParserFactory;
  71. import javax.xml.parsers.SAXParser;
  72. import javax.xml.parsers.ParserConfigurationException;
  73. /**
  74. * Specify a system path, to be used to load optional.jar and all
  75. * related libraries.
  76. *
  77. * Using the specified path it'll try to load or reload all optional
  78. * tasks. The typical use is:
  79. * <pre>
  80. * &lt;path id="ant.deps" &gt;
  81. * &lt;fileset ... /&gt;
  82. * &lt;/path&gt;
  83. *
  84. * &lt;systemPath pathRef="ant.deps" /&gt;
  85. *
  86. * &lt;junit ... /&gt;
  87. * </pre>
  88. *
  89. * This requires that ant-sax2.jar is included in ant/lib.
  90. *
  91. * It has a single property, a reference to a &lt;path&gt; containing all
  92. * the jars that you need. It'll automatically reload optional.jar
  93. * tasks in a different (non-delegating) loader.
  94. *
  95. * @author Costin Manolache
  96. */
  97. public class SystemPath extends DataType {
  98. public static final String SYSTEM_LOADER_REF="ant.system.loader";
  99. public SystemPath() {
  100. }
  101. /** Specify which path will be used.
  102. */
  103. public void setPathRef( Reference pathRef ) throws BuildException {
  104. Path path=(Path)pathRef.getReferencedObject(project);
  105. initSystemLoader(path);
  106. }
  107. /** Will prepare the class loader to allow dynamic modifications
  108. * of the classpath. Optional tasks are loaded in a different loader.
  109. */
  110. private void initSystemLoader(Path path) {
  111. try {
  112. if( project.getReference( SYSTEM_LOADER_REF ) != null )
  113. return; // already done that.
  114. // reverse loader
  115. AntClassLoader acl=new AntClassLoader( this.getClass().getClassLoader(), true );
  116. acl.addLoaderPackageRoot( "org.apache.tools.ant.taskdefs.optional");
  117. project.addReference( SYSTEM_LOADER_REF, acl );
  118. String list[]=path.list();
  119. for( int i=0; i<list.length; i++ ) {
  120. File f= new File( list[i] );
  121. if( f.exists() ) {
  122. acl.addPathElement(f.getAbsolutePath());
  123. }
  124. }
  125. // XXX find the classpath
  126. String antHome=project.getProperty( "ant.home" );
  127. File optionalJar=new File( antHome + "/lib/optional.jar" );
  128. if( optionalJar.exists() )
  129. acl.addPathElement(optionalJar.getAbsolutePath() );
  130. // reinit the loader for optional, if they were in /lib/
  131. Hashtable tasks=project.getTaskDefinitions();
  132. //System.out.println("Replacing jars" );
  133. // reload all optional tasks in this loader.
  134. // Some tasks weren't defined by the normal init(), since deps were missing.
  135. String defs = "/org/apache/tools/ant/taskdefs/defaults.properties";
  136. try {
  137. Properties props = new Properties();
  138. InputStream in = this.getClass().getResourceAsStream(defs);
  139. if (in == null) {
  140. throw new BuildException("Can't load default task list");
  141. }
  142. props.load(in);
  143. in.close();
  144. Enumeration enum = props.propertyNames();
  145. while (enum.hasMoreElements()) {
  146. String key = (String) enum.nextElement();
  147. String value = props.getProperty(key);
  148. if( ! value.startsWith( "org.apache.tools.ant.taskdefs.optional" ))
  149. continue;
  150. // other classes that needs to be replaced ??
  151. try {
  152. Class taskClass = acl.loadClass(value);
  153. project.addTaskDefinition(key, taskClass);
  154. //System.out.println("Loaded " + key + " " + taskClass.getClassLoader() );
  155. } catch (NoClassDefFoundError ncdfe) {
  156. log("Could not load a dependent class ("
  157. + ncdfe.getMessage() + ") for task " + key, Project.MSG_DEBUG);
  158. } catch (ClassNotFoundException cnfe) {
  159. log("Could not load class (" + value
  160. + ") for task " + key, Project.MSG_DEBUG);
  161. } catch (Exception ex) {
  162. ex.printStackTrace();
  163. }
  164. }
  165. } catch (IOException ioe) {
  166. throw new BuildException("Can't load default task list");
  167. }
  168. } catch( Exception ex ) {
  169. ex.printStackTrace();
  170. }
  171. }
  172. }