git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@267950 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -285,6 +285,7 @@ | |||||
| <exclude name="**/PathTest.java" unless="junit.present" /> | <exclude name="**/PathTest.java" unless="junit.present" /> | ||||
| <exclude name="**/CommandlineTest.java" unless="junit.present" /> | <exclude name="**/CommandlineTest.java" unless="junit.present" /> | ||||
| <exclude name="**/CommandlineJavaTest.java" unless="junit.present" /> | <exclude name="**/CommandlineJavaTest.java" unless="junit.present" /> | ||||
| <exclude name="**/ProjectTest.java" unless="junit.present" /> | |||||
| </javac> | </javac> | ||||
| </target> | </target> | ||||
| @@ -98,6 +98,7 @@ public class Project { | |||||
| private Hashtable userProperties = new Hashtable(); | private Hashtable userProperties = new Hashtable(); | ||||
| private Hashtable references = new Hashtable(); | private Hashtable references = new Hashtable(); | ||||
| private String defaultTarget; | private String defaultTarget; | ||||
| private Hashtable dataClassDefinitions = new Hashtable(); | |||||
| private Hashtable taskClassDefinitions = new Hashtable(); | private Hashtable taskClassDefinitions = new Hashtable(); | ||||
| private Hashtable targets = new Hashtable(); | private Hashtable targets = new Hashtable(); | ||||
| private Hashtable filters = new Hashtable(); | private Hashtable filters = new Hashtable(); | ||||
| @@ -160,16 +161,41 @@ public class Project { | |||||
| // ignore... | // ignore... | ||||
| } | } | ||||
| } | } | ||||
| } 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); | |||||
| props.load(in); | |||||
| in.close(); | |||||
| Properties systemP = System.getProperties(); | |||||
| Enumeration e = systemP.keys(); | |||||
| while (e.hasMoreElements()) { | |||||
| String name = (String) e.nextElement(); | |||||
| String value = (String) systemP.get(name); | |||||
| this.setProperty(name, value); | |||||
| Enumeration enum = props.propertyNames(); | |||||
| while (enum.hasMoreElements()) { | |||||
| String key = (String) enum.nextElement(); | |||||
| String value = props.getProperty(key); | |||||
| try { | |||||
| Class dataClass = Class.forName(value); | |||||
| addDataTypeDefinition(key, dataClass); | |||||
| } catch (NoClassDefFoundError ncdfe) { | |||||
| // ignore... | |||||
| } catch (ClassNotFoundException cnfe) { | |||||
| // ignore... | |||||
| } | |||||
| } | } | ||||
| } catch (IOException ioe) { | } catch (IOException ioe) { | ||||
| throw new BuildException("Can't load default task list"); | |||||
| throw new BuildException("Can't load default datatype list"); | |||||
| } | |||||
| Properties systemP = System.getProperties(); | |||||
| Enumeration e = systemP.keys(); | |||||
| while (e.hasMoreElements()) { | |||||
| String name = (String) e.nextElement(); | |||||
| String value = (String) systemP.get(name); | |||||
| this.setProperty(name, value); | |||||
| } | } | ||||
| } | } | ||||
| @@ -326,6 +352,16 @@ public class Project { | |||||
| return taskClassDefinitions; | return taskClassDefinitions; | ||||
| } | } | ||||
| public void addDataTypeDefinition(String typeName, Class typeClass) { | |||||
| String msg = " +User datatype: " + typeName + " " + typeClass.getName(); | |||||
| log(msg, MSG_VERBOSE); | |||||
| dataClassDefinitions.put(typeName, typeClass); | |||||
| } | |||||
| public Hashtable getDataTypeDefinitions() { | |||||
| return dataClassDefinitions; | |||||
| } | |||||
| /** | /** | ||||
| * This call expects to add a <em>new</em> Target. | * This call expects to add a <em>new</em> Target. | ||||
| * @param target is the Target to be added to the current | * @param target is the Target to be added to the current | ||||
| @@ -418,6 +454,46 @@ public class Project { | |||||
| } | } | ||||
| } | } | ||||
| public Object createDataType(String typeName) throws BuildException { | |||||
| Class c = (Class) dataClassDefinitions.get(typeName); | |||||
| if (c == null) | |||||
| return null; | |||||
| try { | |||||
| java.lang.reflect.Constructor ctor = null; | |||||
| boolean noArg = false; | |||||
| // DataType can have a "no arg" constructor or take a single | |||||
| // Project argument. | |||||
| try { | |||||
| ctor = c.getConstructor(new Class[0]); | |||||
| noArg = true; | |||||
| } catch (NoSuchMethodException nse) { | |||||
| ctor = c.getConstructor(new Class[] {getClass()}); | |||||
| noArg = false; | |||||
| } | |||||
| Object o = null; | |||||
| if (noArg) { | |||||
| o = ctor.newInstance(new Object[0]); | |||||
| } else { | |||||
| o = ctor.newInstance(new Object[] {this}); | |||||
| } | |||||
| String msg = " +DataType: " + typeName; | |||||
| log (msg, MSG_VERBOSE); | |||||
| return o; | |||||
| } catch (java.lang.reflect.InvocationTargetException ite) { | |||||
| Throwable t = ite.getTargetException(); | |||||
| String msg = "Could not create datatype of type: " | |||||
| + typeName + " due to " + t; | |||||
| throw new BuildException(msg, t); | |||||
| } catch (Throwable t) { | |||||
| String msg = "Could not create datatype of type: " | |||||
| + typeName + " due to " + t; | |||||
| throw new BuildException(msg, t); | |||||
| } | |||||
| } | |||||
| public void executeTargets(Vector targetNames) throws BuildException { | public void executeTargets(Vector targetNames) throws BuildException { | ||||
| Throwable error = null; | Throwable error = null; | ||||
| @@ -0,0 +1,3 @@ | |||||
| path=org.apache.tools.ant.types.Path | |||||
| fileset=org.apache.tools.ant.types.FileSet | |||||
| patternset=org.apache.tools.ant.types.PatternSet | |||||
| @@ -71,6 +71,7 @@ public class AllJUnitTests extends TestCase { | |||||
| public static Test suite() { | public static Test suite() { | ||||
| TestSuite suite = new TestSuite(IntrospectionHelperTest.class); | TestSuite suite = new TestSuite(IntrospectionHelperTest.class); | ||||
| suite.addTest(new TestSuite(org.apache.tools.ant.ProjectTest.class)); | |||||
| suite.addTest(org.apache.tools.ant.types.AllJUnitTests.suite()); | suite.addTest(org.apache.tools.ant.types.AllJUnitTests.suite()); | ||||
| return suite; | return suite; | ||||
| } | } | ||||
| @@ -0,0 +1,91 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2000 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", "Tomcat", 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 org.apache.tools.ant.types.*; | |||||
| import junit.framework.Test; | |||||
| import junit.framework.TestCase; | |||||
| import junit.framework.TestSuite; | |||||
| /** | |||||
| * Very limited test class for Project. Waiting to be extended. | |||||
| * | |||||
| * @author Stefan Bodewig <a href="mailto:stefan.bodewig@megabit.net">stefan.bodewig@megabit.net</a> | |||||
| */ | |||||
| public class ProjectTest extends TestCase { | |||||
| private Project p; | |||||
| public ProjectTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| public void setUp() { | |||||
| p = new Project(); | |||||
| p.init(); | |||||
| } | |||||
| public void testDataTypes() throws BuildException { | |||||
| assertNull("dummy is not a known data type", | |||||
| p.createDataType("dummy")); | |||||
| Object o = p.createDataType("fileset"); | |||||
| assertNotNull("fileset is a known type", o); | |||||
| assert("fileset creates FileSet", o instanceof FileSet); | |||||
| assert("PatternSet", | |||||
| p.createDataType("patternset") instanceof PatternSet); | |||||
| assert("Path", p.createDataType("path") instanceof Path); | |||||
| } | |||||
| } | |||||