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