Browse Source

Made unset property behaviour a config item

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-ffa450edef68
master
Conor MacNeill 23 years ago
parent
commit
42d4199104
8 changed files with 234 additions and 76 deletions
  1. +49
    -5
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/config/AntConfig.java
  2. +35
    -2
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/config/AntConfigHandler.java
  3. +15
    -4
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ExecutionDataService.java
  4. +5
    -4
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ExecutionFrame.java
  5. +125
    -56
      proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Project.java
  6. +5
    -3
      proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Task.java
  7. +0
    -1
      proposal/mutant/src/java/cli/org/apache/ant/cli/Commandline.java
  8. +0
    -1
      proposal/mutant/src/java/start/org/apache/ant/start/Main.java

+ 49
- 5
proposal/mutant/src/java/antcore/org/apache/ant/antcore/config/AntConfig.java View File

@@ -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;
} }


/** /**


+ 35
- 2
proposal/mutant/src/java/antcore/org/apache/ant/antcore/config/AntConfigHandler.java View File

@@ -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);
}
} }





+ 15
- 4
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ExecutionDataService.java View File

@@ -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);
} }


+ 5
- 4
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ExecutionFrame.java View File

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


+ 125
- 56
proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Project.java View File

@@ -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;
}
} }



+ 5
- 3
proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Task.java View File

@@ -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;
}
} }
/** /**


+ 0
- 1
proposal/mutant/src/java/cli/org/apache/ant/cli/Commandline.java View File

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




+ 0
- 1
proposal/mutant/src/java/start/org/apache/ant/start/Main.java View File

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


Loading…
Cancel
Save