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(); | |||
| /** Indicates if remote libraries may be used */ | |||
| private boolean allowRemoteLibs = false; | |||
| private boolean remoteLibs = false; | |||
| /** 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. | |||
| @@ -93,16 +105,16 @@ public class AntConfig { | |||
| * @return true if this config allows the use of remote libraries, | |||
| */ | |||
| 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 | |||
| */ | |||
| public boolean isRemoteProjectAllowed() { | |||
| return allowRemoteProjects; | |||
| return remoteProjects; | |||
| } | |||
| /** | |||
| @@ -140,6 +152,34 @@ public class AntConfig { | |||
| 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. | |||
| * | |||
| @@ -207,6 +247,10 @@ public class AntConfig { | |||
| combined.addAll(currentList); | |||
| 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 | |||
| */ | |||
| 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 | |||
| @@ -89,8 +101,11 @@ public class AntConfigHandler extends ElementHandler { | |||
| public void processElement(String elementName) | |||
| throws SAXParseException { | |||
| 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. | |||
| * | |||
| @@ -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 */ | |||
| private ExecutionFrame frame; | |||
| /** all properties to be unset without throwing an exception */ | |||
| private boolean allowUnsetProperties; | |||
| /** | |||
| * Constructor | |||
| * | |||
| * @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.allowUnsetProperties = allowUnsetProperties; | |||
| } | |||
| /** | |||
| @@ -169,10 +176,14 @@ public class ExecutionDataService implements DataService { | |||
| if (fragment == null) { | |||
| String propertyName = (String)j.next(); | |||
| 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); | |||
| } | |||
| @@ -168,9 +168,6 @@ public class ExecutionFrame { | |||
| this.standardLibs = standardLibs; | |||
| this.config = config; | |||
| this.initConfig = initConfig; | |||
| configureServices(); | |||
| componentManager.setStandardLibraries(standardLibs); | |||
| } | |||
| /** | |||
| @@ -206,6 +203,9 @@ public class ExecutionFrame { | |||
| referencedFrames.put(referenceName, referencedFrame); | |||
| } | |||
| configureServices(); | |||
| componentManager.setStandardLibraries(standardLibs); | |||
| } | |||
| /** | |||
| @@ -747,7 +747,8 @@ public class ExecutionFrame { | |||
| fileService = new ExecutionFileService(this); | |||
| componentManager | |||
| = new ComponentManager(this, config.isRemoteLibAllowed()); | |||
| dataService = new ExecutionDataService(this); | |||
| dataService = new ExecutionDataService(this, | |||
| config.isUnsetPropertiesAllowed()); | |||
| services.put(FileService.class, fileService); | |||
| services.put(ComponentService.class, componentManager); | |||
| @@ -54,17 +54,18 @@ | |||
| package org.apache.tools.ant; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.util.Enumeration; | |||
| import java.util.Hashtable; | |||
| import java.util.Map; | |||
| import java.util.Iterator; | |||
| import java.util.Map; | |||
| import java.util.Properties; | |||
| import org.apache.ant.common.antlib.AntContext; | |||
| import org.apache.ant.common.service.DataService; | |||
| import org.apache.ant.common.service.FileService; | |||
| import org.apache.ant.common.util.ExecutionException; | |||
| import org.apache.ant.common.util.PropertyUtils; | |||
| 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.FilterSetCollection; | |||
| import org.apache.tools.ant.util.FileUtils; | |||
| @@ -112,6 +113,11 @@ public class Project { | |||
| /** The java version detected that Ant is running on */ | |||
| 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 */ | |||
| private String description; | |||
| @@ -356,6 +362,53 @@ public class Project { | |||
| 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 | |||
| * properties occupy the same namespace. | |||
| @@ -524,6 +577,66 @@ public class Project { | |||
| this.context = context; | |||
| fileService = (FileService)context.getCoreService(FileService.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 | |||
| * 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 | |||
| */ | |||
| public Task createTask(String taskName) { | |||
| public Task createTask(String taskType) { | |||
| // we piggy back the task onto the current context | |||
| 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; | |||
| } | |||
| try { | |||
| task = (Task)c.newInstance(); | |||
| task.setProject(this); | |||
| task.init(context); | |||
| return task; | |||
| } catch (ExecutionException e) { | |||
| } catch (Throwable 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 { | |||
| 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) { | |||
| this.initConfig = initConfig; | |||
| System.out.println("Ant Home is " + initConfig.getAntHome()); | |||
| try { | |||
| parseArguments(args); | |||
| @@ -196,7 +196,6 @@ public class Main { | |||
| InitConfig config = new InitConfig(); | |||
| URL libraryURL = getLibraryURL(); | |||
| System.out.println("Library URL is " + libraryURL); | |||
| config.setLibraryURL(libraryURL); | |||
| URL antHome = getAntHome(); | |||