Allowed Ant1 compat layer to create current Ant1 tasks git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271178 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -82,10 +82,22 @@ public class AntConfig { | |||||
| private Map libPaths = new HashMap(); | private Map libPaths = new HashMap(); | ||||
| /** Indicates if remote libraries may be used */ | /** Indicates if remote libraries may be used */ | ||||
| private boolean allowRemoteLibs = false; | |||||
| private boolean remoteLibs = false; | |||||
| /** Indicates if remote projects may be used */ | /** Indicates if remote projects may be used */ | ||||
| private boolean allowRemoteProjects = false; | |||||
| private boolean remoteProjects = false; | |||||
| /** Indicates if unset properties are ignored */ | |||||
| private boolean unsetProperties = true; | |||||
| /** | |||||
| * Indicate if unset properties are OK. | |||||
| * | |||||
| * @return true if unset properties will not cause an exception | |||||
| */ | |||||
| public boolean isUnsetPropertiesAllowed() { | |||||
| return unsetProperties; | |||||
| } | |||||
| /** | /** | ||||
| * Indicate if the use of remote library's is allowe dby this config. | * Indicate if the use of remote library's is allowe dby this config. | ||||
| @@ -93,16 +105,16 @@ public class AntConfig { | |||||
| * @return true if this config allows the use of remote libraries, | * @return true if this config allows the use of remote libraries, | ||||
| */ | */ | ||||
| public boolean isRemoteLibAllowed() { | public boolean isRemoteLibAllowed() { | ||||
| return allowRemoteLibs; | |||||
| return remoteLibs; | |||||
| } | } | ||||
| /** | /** | ||||
| * Indicate if this config allows the execution of a remote project | |||||
| * Indicate if this config allows the execution of a remote project | |||||
| * | * | ||||
| * @return true if remote projects are allowed | * @return true if remote projects are allowed | ||||
| */ | */ | ||||
| public boolean isRemoteProjectAllowed() { | public boolean isRemoteProjectAllowed() { | ||||
| return allowRemoteProjects; | |||||
| return remoteProjects; | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -140,6 +152,34 @@ public class AntConfig { | |||||
| return libPaths.keySet().iterator(); | return libPaths.keySet().iterator(); | ||||
| } | } | ||||
| /** | |||||
| * Allow remote libraries to be used | |||||
| * | |||||
| * @param allowRemoteLibs true if remote libraries may be used. | |||||
| */ | |||||
| public void allowRemoteLibs(boolean allowRemoteLibs) { | |||||
| this.remoteLibs = allowRemoteLibs; | |||||
| } | |||||
| /** | |||||
| * Allow remote projects to be used | |||||
| * | |||||
| * @param allowRemoteProjects true if remote projects may be executed. | |||||
| */ | |||||
| public void allowRemoteProjects(boolean allowRemoteProjects) { | |||||
| this.remoteProjects = allowRemoteProjects; | |||||
| } | |||||
| /** | |||||
| * Allow properties to be used even when they have not been set | |||||
| * | |||||
| * @param allowUnsetProperties true if un set properties should not | |||||
| * cause an exception | |||||
| */ | |||||
| public void allowUnsetProperties(boolean allowUnsetProperties) { | |||||
| this.unsetProperties = allowUnsetProperties; | |||||
| } | |||||
| /** | /** | ||||
| * Add an additional set of paths for the given library. | * Add an additional set of paths for the given library. | ||||
| * | * | ||||
| @@ -207,6 +247,10 @@ public class AntConfig { | |||||
| combined.addAll(currentList); | combined.addAll(currentList); | ||||
| libPaths.put(libraryId, combined); | libPaths.put(libraryId, combined); | ||||
| } | } | ||||
| remoteLibs = otherConfig.remoteLibs; | |||||
| remoteProjects = otherConfig.remoteProjects; | |||||
| unsetProperties = otherConfig.unsetProperties; | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -64,6 +64,18 @@ import org.xml.sax.SAXParseException; | |||||
| * @created 20 January 2002 | * @created 20 January 2002 | ||||
| */ | */ | ||||
| public class AntConfigHandler extends ElementHandler { | public class AntConfigHandler extends ElementHandler { | ||||
| /** The allowRemoteProject attribute name */ | |||||
| public final static String REMOTE_PROJECT_ATTR = "allow-remote-project"; | |||||
| /** The allowRemoteLibrary attribute name */ | |||||
| public final static String REMOTE_LIBRARY_ATTR = "allow-remote-library"; | |||||
| /** The allowReportProject attribute name */ | |||||
| public final static String UNSET_PROPS_ATTR = "allow-unset-properties"; | |||||
| /** The list of allowed Attributes */ | |||||
| public final static String[] ALLOWED_ATTRIBUTES | |||||
| = {REMOTE_PROJECT_ATTR, REMOTE_LIBRARY_ATTR, UNSET_PROPS_ATTR}; | |||||
| /** | /** | ||||
| * The config object which is contructed from the XML representation of | * The config object which is contructed from the XML representation of | ||||
| * the config | * the config | ||||
| @@ -89,8 +101,11 @@ public class AntConfigHandler extends ElementHandler { | |||||
| public void processElement(String elementName) | public void processElement(String elementName) | ||||
| throws SAXParseException { | throws SAXParseException { | ||||
| config = new AntConfig(); | config = new AntConfig(); | ||||
| } | |||||
| config.allowRemoteLibs(getBooleanAttribute(REMOTE_LIBRARY_ATTR)); | |||||
| config.allowRemoteProjects(getBooleanAttribute(REMOTE_PROJECT_ATTR)); | |||||
| config.allowUnsetProperties(getBooleanAttribute(UNSET_PROPS_ATTR)); | |||||
| } | |||||
| /** | /** | ||||
| * Start a new element in the ant config. | * Start a new element in the ant config. | ||||
| * | * | ||||
| @@ -136,6 +151,24 @@ public class AntConfigHandler extends ElementHandler { | |||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * Validate that the given attribute and value are valid. | |||||
| * | |||||
| * @param attributeName The name of the attributes | |||||
| * @param attributeValue The value of the attributes | |||||
| * @exception SAXParseException if the attribute is not allowed on the | |||||
| * element. | |||||
| */ | |||||
| protected void validateAttribute(String attributeName, | |||||
| String attributeValue) | |||||
| throws SAXParseException { | |||||
| for (int i = 0; i < ALLOWED_ATTRIBUTES.length; ++i) { | |||||
| if (attributeName.equals(ALLOWED_ATTRIBUTES[i])) { | |||||
| return; | |||||
| } | |||||
| } | |||||
| throwInvalidAttribute(attributeName); | |||||
| } | |||||
| } | } | ||||
| @@ -72,13 +72,20 @@ public class ExecutionDataService implements DataService { | |||||
| /** The ExecutionFrame this service instance is working for */ | /** The ExecutionFrame this service instance is working for */ | ||||
| private ExecutionFrame frame; | private ExecutionFrame frame; | ||||
| /** all properties to be unset without throwing an exception */ | |||||
| private boolean allowUnsetProperties; | |||||
| /** | /** | ||||
| * Constructor | * Constructor | ||||
| * | * | ||||
| * @param frame the frame containing this context | * @param frame the frame containing this context | ||||
| * @param allowUnsetProperties true if the reference to an unset | |||||
| * property should not throw an exception | |||||
| */ | */ | ||||
| public ExecutionDataService(ExecutionFrame frame) { | |||||
| public ExecutionDataService(ExecutionFrame frame, | |||||
| boolean allowUnsetProperties) { | |||||
| this.frame = frame; | this.frame = frame; | ||||
| this.allowUnsetProperties = allowUnsetProperties; | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -169,10 +176,14 @@ public class ExecutionDataService implements DataService { | |||||
| if (fragment == null) { | if (fragment == null) { | ||||
| String propertyName = (String)j.next(); | String propertyName = (String)j.next(); | ||||
| if (!isDataValueSet(propertyName)) { | if (!isDataValueSet(propertyName)) { | ||||
| throw new ExecutionException("Property \"" + propertyName | |||||
| + "\" has not been set"); | |||||
| if (!allowUnsetProperties) { | |||||
| throw new ExecutionException("Property \"" | |||||
| + propertyName + "\" has not been set"); | |||||
| } | |||||
| fragment = "${" + propertyName + "}"; | |||||
| } else { | |||||
| fragment = getDataValue(propertyName).toString(); | |||||
| } | } | ||||
| fragment = getDataValue(propertyName).toString(); | |||||
| } | } | ||||
| sb.append(fragment); | sb.append(fragment); | ||||
| } | } | ||||
| @@ -168,9 +168,6 @@ public class ExecutionFrame { | |||||
| this.standardLibs = standardLibs; | this.standardLibs = standardLibs; | ||||
| this.config = config; | this.config = config; | ||||
| this.initConfig = initConfig; | this.initConfig = initConfig; | ||||
| configureServices(); | |||||
| componentManager.setStandardLibraries(standardLibs); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -206,6 +203,9 @@ public class ExecutionFrame { | |||||
| referencedFrames.put(referenceName, referencedFrame); | referencedFrames.put(referenceName, referencedFrame); | ||||
| } | } | ||||
| configureServices(); | |||||
| componentManager.setStandardLibraries(standardLibs); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -747,7 +747,8 @@ public class ExecutionFrame { | |||||
| fileService = new ExecutionFileService(this); | fileService = new ExecutionFileService(this); | ||||
| componentManager | componentManager | ||||
| = new ComponentManager(this, config.isRemoteLibAllowed()); | = new ComponentManager(this, config.isRemoteLibAllowed()); | ||||
| dataService = new ExecutionDataService(this); | |||||
| dataService = new ExecutionDataService(this, | |||||
| config.isUnsetPropertiesAllowed()); | |||||
| services.put(FileService.class, fileService); | services.put(FileService.class, fileService); | ||||
| services.put(ComponentService.class, componentManager); | services.put(ComponentService.class, componentManager); | ||||
| @@ -54,17 +54,18 @@ | |||||
| package org.apache.tools.ant; | package org.apache.tools.ant; | ||||
| import java.io.File; | import java.io.File; | ||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.io.InputStream; | |||||
| import java.util.Enumeration; | |||||
| import java.util.Hashtable; | import java.util.Hashtable; | ||||
| import java.util.Map; | |||||
| import java.util.Iterator; | import java.util.Iterator; | ||||
| import java.util.Map; | |||||
| import java.util.Properties; | |||||
| import org.apache.ant.common.antlib.AntContext; | import org.apache.ant.common.antlib.AntContext; | ||||
| import org.apache.ant.common.service.DataService; | import org.apache.ant.common.service.DataService; | ||||
| import org.apache.ant.common.service.FileService; | import org.apache.ant.common.service.FileService; | ||||
| import org.apache.ant.common.util.ExecutionException; | import org.apache.ant.common.util.ExecutionException; | ||||
| import org.apache.ant.common.util.PropertyUtils; | |||||
| import org.apache.ant.common.util.MessageLevel; | import org.apache.ant.common.util.MessageLevel; | ||||
| import org.apache.tools.ant.taskdefs.ExecTask; | |||||
| import org.apache.tools.ant.taskdefs.Java; | |||||
| import org.apache.ant.common.util.PropertyUtils; | |||||
| import org.apache.tools.ant.types.FilterSet; | import org.apache.tools.ant.types.FilterSet; | ||||
| import org.apache.tools.ant.types.FilterSetCollection; | import org.apache.tools.ant.types.FilterSetCollection; | ||||
| import org.apache.tools.ant.util.FileUtils; | import org.apache.tools.ant.util.FileUtils; | ||||
| @@ -112,6 +113,11 @@ public class Project { | |||||
| /** The java version detected that Ant is running on */ | /** The java version detected that Ant is running on */ | ||||
| private static String javaVersion; | private static String javaVersion; | ||||
| /** Collection of Ant1 type definitions */ | |||||
| private Hashtable dataClassDefinitions = new Hashtable(); | |||||
| /** Collection of Ant1 task definitions */ | |||||
| private Hashtable taskClassDefinitions = new Hashtable(); | |||||
| /** The project description */ | /** The project description */ | ||||
| private String description; | private String description; | ||||
| @@ -356,6 +362,53 @@ public class Project { | |||||
| return getClass().getClassLoader(); | return getClass().getClassLoader(); | ||||
| } | } | ||||
| /** | |||||
| * get a copy of the property hashtable | |||||
| * | |||||
| * @return the hashtable containing all properties, user included | |||||
| */ | |||||
| public Hashtable getProperties() { | |||||
| Map properties = dataService.getAllProperties(); | |||||
| Hashtable result = new Hashtable(); | |||||
| for (Iterator i = properties.keySet().iterator(); i.hasNext(); ) { | |||||
| String name = (String)i.next(); | |||||
| Object value = properties.get(name); | |||||
| if (value instanceof String) { | |||||
| result.put(name, value); | |||||
| } | |||||
| } | |||||
| return result; | |||||
| } | |||||
| /** | |||||
| * get a copy of the property hashtable | |||||
| * | |||||
| * @return the hashtable containing all properties, user included | |||||
| */ | |||||
| public Hashtable getUserProperties() { | |||||
| return getProperties(); | |||||
| } | |||||
| /** | |||||
| * Get all references in the project | |||||
| * | |||||
| * @return the hashtable containing all references | |||||
| */ | |||||
| public Hashtable getReferences() { | |||||
| Map properties = dataService.getAllProperties(); | |||||
| Hashtable result = new Hashtable(); | |||||
| for (Iterator i = properties.keySet().iterator(); i.hasNext(); ) { | |||||
| String name = (String)i.next(); | |||||
| Object value = properties.get(name); | |||||
| if (!(value instanceof String)) { | |||||
| result.put(name, value); | |||||
| } | |||||
| } | |||||
| return result; | |||||
| } | |||||
| /** | /** | ||||
| * Add a reference to an object. NOte that in Ant2 objects and | * Add a reference to an object. NOte that in Ant2 objects and | ||||
| * properties occupy the same namespace. | * properties occupy the same namespace. | ||||
| @@ -524,6 +577,66 @@ public class Project { | |||||
| this.context = context; | this.context = context; | ||||
| fileService = (FileService)context.getCoreService(FileService.class); | fileService = (FileService)context.getCoreService(FileService.class); | ||||
| dataService = (DataService)context.getCoreService(DataService.class); | dataService = (DataService)context.getCoreService(DataService.class); | ||||
| 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); | |||||
| taskClassDefinitions.put(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); | |||||
| dataClassDefinitions.put(key, dataClass); | |||||
| } catch (NoClassDefFoundError ncdfe) { | |||||
| log("Could not load a dependent class (" | |||||
| + ncdfe.getMessage() + ") for type " + key, MSG_DEBUG); | |||||
| } catch (ClassNotFoundException cnfe) { | |||||
| log("Could not load class (" + value | |||||
| + ") for type " + key, MSG_DEBUG); | |||||
| } | |||||
| } | |||||
| } catch (IOException ioe) { | |||||
| throw new BuildException("Can't load default datatype list"); | |||||
| } | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -600,70 +713,26 @@ public class Project { | |||||
| * Create a Task. This faced hard codes a few well known tasks at this | * Create a Task. This faced hard codes a few well known tasks at this | ||||
| * time | * time | ||||
| * | * | ||||
| * @param taskName the name of the task to be created. | |||||
| * @param taskType the name of the task to be created. | |||||
| * @return the created task instance | * @return the created task instance | ||||
| */ | */ | ||||
| public Task createTask(String taskName) { | |||||
| public Task createTask(String taskType) { | |||||
| // we piggy back the task onto the current context | // we piggy back the task onto the current context | ||||
| Task task = null; | Task task = null; | ||||
| if (taskName.equals("java")) { | |||||
| task = new Java(); | |||||
| } else if (taskName.equals("exec")) { | |||||
| task = new ExecTask(); | |||||
| } else { | |||||
| Class c = (Class) taskClassDefinitions.get(taskType); | |||||
| if (c == null) { | |||||
| return null; | return null; | ||||
| } | } | ||||
| try { | try { | ||||
| task = (Task)c.newInstance(); | |||||
| task.setProject(this); | task.setProject(this); | ||||
| task.init(context); | task.init(context); | ||||
| return task; | return task; | ||||
| } catch (ExecutionException e) { | |||||
| } catch (Throwable e) { | |||||
| throw new BuildException(e); | throw new BuildException(e); | ||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * get a copy of the property hashtable | |||||
| * @return the hashtable containing all properties, user included | |||||
| */ | |||||
| public Hashtable getProperties() { | |||||
| Map properties = dataService.getAllProperties(); | |||||
| Hashtable result = new Hashtable(); | |||||
| for (Iterator i = properties.keySet().iterator(); i.hasNext(); ) { | |||||
| String name = (String)i.next(); | |||||
| Object value = properties.get(name); | |||||
| if (value instanceof String) { | |||||
| result.put(name, value); | |||||
| } | |||||
| } | |||||
| return result; | |||||
| } | |||||
| /** | |||||
| * get a copy of the property hashtable | |||||
| * @return the hashtable containing all properties, user included | |||||
| */ | |||||
| public Hashtable getUserProperties() { | |||||
| return getProperties(); | |||||
| } | |||||
| /** | |||||
| * Get all references in the project | |||||
| * @return the hashtable containing all references | |||||
| */ | |||||
| public Hashtable getReferences() { | |||||
| Map properties = dataService.getAllProperties(); | |||||
| Hashtable result = new Hashtable(); | |||||
| for (Iterator i = properties.keySet().iterator(); i.hasNext(); ) { | |||||
| String name = (String)i.next(); | |||||
| Object value = properties.get(name); | |||||
| if (!(value instanceof String)) { | |||||
| result.put(name, value); | |||||
| } | |||||
| } | |||||
| return result; | |||||
| } | |||||
| } | } | ||||
| @@ -83,9 +83,11 @@ public abstract class Task extends ProjectComponent | |||||
| public void init(AntContext context) throws ExecutionException { | public void init(AntContext context) throws ExecutionException { | ||||
| super.init(context); | super.init(context); | ||||
| BuildElement buildElement = (BuildElement)context.getModelElement(); | |||||
| taskType = buildElement.getType(); | |||||
| taskName = taskType; | |||||
| if (context.getModelElement() instanceof BuildElement) { | |||||
| BuildElement buildElement = (BuildElement)context.getModelElement(); | |||||
| taskType = buildElement.getType(); | |||||
| taskName = taskType; | |||||
| } | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -260,7 +260,6 @@ public class Commandline { | |||||
| */ | */ | ||||
| private void process(String[] args, InitConfig initConfig) { | private void process(String[] args, InitConfig initConfig) { | ||||
| this.initConfig = initConfig; | this.initConfig = initConfig; | ||||
| System.out.println("Ant Home is " + initConfig.getAntHome()); | |||||
| try { | try { | ||||
| parseArguments(args); | parseArguments(args); | ||||
| @@ -196,7 +196,6 @@ public class Main { | |||||
| InitConfig config = new InitConfig(); | InitConfig config = new InitConfig(); | ||||
| URL libraryURL = getLibraryURL(); | URL libraryURL = getLibraryURL(); | ||||
| System.out.println("Library URL is " + libraryURL); | |||||
| config.setLibraryURL(libraryURL); | config.setLibraryURL(libraryURL); | ||||
| URL antHome = getAntHome(); | URL antHome = getAntHome(); | ||||