Browse Source

Cleanup of ProjectHelper bits - many to go.

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271819 13f79535-47bb-0310-9956-ffa450edef68
master
Conor MacNeill 23 years ago
parent
commit
314a73ff1e
2 changed files with 109 additions and 101 deletions
  1. +53
    -51
      src/main/org/apache/tools/ant/ProjectHelper.java
  2. +56
    -50
      src/main/org/apache/tools/ant/helper/ProjectHelperImpl.java

+ 53
- 51
src/main/org/apache/tools/ant/ProjectHelper.java View File

@@ -55,9 +55,6 @@
package org.apache.tools.ant;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
@@ -65,8 +62,6 @@ import java.util.Hashtable;
import java.util.Vector;
import java.util.Enumeration;
import java.util.Locale;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.xml.sax.AttributeList;
import org.apache.tools.ant.helper.ProjectHelperImpl;
@@ -92,6 +87,19 @@ import org.apache.tools.ant.util.LoaderUtils;
* @author duncan@x180.com
*/
public class ProjectHelper {
/**
* Name of JVM system property which provides the name of the
* ProjectHelper class to use.
*/
public static final String HELPER_PROPERTY =
"org.apache.tools.ant.ProjectHelper";
/**
* The service identifier in jars which provide Project Helper
* implementations.
*/
public static final String SERVICE_ID =
"/META-INF/services/org.apache.tools.ant.ProjectHelper";

/**
* Configures the project with the contents of the specified XML file.
@@ -103,11 +111,13 @@ public class ProjectHelper {
* @exception BuildException if the configuration is invalid or cannot
* be read
*/
public static void configureProject(Project project, File buildFile) throws BuildException {
ProjectHelper helper=ProjectHelper.getProjectHelper();
public static void configureProject(Project project, File buildFile)
throws BuildException {
ProjectHelper helper = ProjectHelper.getProjectHelper();
helper.parse(project, buildFile);
}

/** Default constructor */
public ProjectHelper() {
}

@@ -125,28 +135,20 @@ public class ProjectHelper {
* be read
*/
public void parse(Project project, Object source) throws BuildException {
throw new BuildException("ProjectHelper.parse() must be implemented in a helper plugin "
+ this.getClass().getName());
throw new BuildException("ProjectHelper.parse() must be implemented "
+ "in a helper plugin " + this.getClass().getName());
}

/* -------------------- Helper discovery -------------------- */
public static final String HELPER_PROPERTY =
"org.apache.tools.ant.ProjectHelper";
public static final String SERVICE_ID =
"/META-INF/services/org.apache.tools.ant.ProjectHelper";

/** Discover a project helper instance. Uses the same patterns
* as JAXP, commons-logging, etc: a system property, a JDK1.3
* service discovery, default.
*/
public static ProjectHelper getProjectHelper()
throws BuildException
{
throws BuildException {
// Identify the class loader we will be using. Ant may be
// in a webapp or embeded in a different app
ProjectHelper helper=null;
ProjectHelper helper = null;
// First, try the system property
try {
@@ -161,18 +163,18 @@ public class ProjectHelper {

// A JDK1.3 'service' ( like in JAXP ). That will plug a helper
// automatically if in CLASSPATH, with the right META-INF/services.
if( helper==null ) {
if (helper == null) {
try {
ClassLoader classLoader=getContextClassLoader();
InputStream is=null;
ClassLoader classLoader = getContextClassLoader();
InputStream is = null;
if (classLoader != null) {
is=classLoader.getResourceAsStream( SERVICE_ID );
is = classLoader.getResourceAsStream(SERVICE_ID);
}
if( is==null ) {
is=ClassLoader.getSystemResourceAsStream( SERVICE_ID );
if (is == null) {
is = ClassLoader.getSystemResourceAsStream(SERVICE_ID);
}
if( is != null ) {
if (is != null) {
// This code is needed by EBCDIC and other strange systems.
// It's a fix for bugs reported in xerces
BufferedReader rd;
@@ -186,17 +188,17 @@ public class ProjectHelper {
rd.close();
if (helperClassName != null &&
! "".equals(helperClassName)) {
!"".equals(helperClassName)) {
helper= newHelper( helperClassName );
helper = newHelper( helperClassName );
}
}
} catch( Exception ex ) {
} catch (Exception ex) {
;
}
}

if( helper!=null ) {
if (helper != null) {
return helper;
} else {
// Default
@@ -209,19 +211,18 @@ public class ProjectHelper {
* loaded this class.
*/
private static ProjectHelper newHelper(String helperClass)
throws BuildException
{
throws BuildException {
ClassLoader classLoader = getContextClassLoader();
try {
Class clazz = null;
if (classLoader != null) {
try {
clazz = classLoader.loadClass(helperClass);
} catch( ClassNotFoundException ex ) {
} catch (ClassNotFoundException ex) {
// try next method
}
}
if( clazz==null ) {
if (clazz == null) {
clazz = Class.forName(helperClass);
}
return ((ProjectHelper) clazz.newInstance());
@@ -235,8 +236,7 @@ public class ProjectHelper {
* Cut&paste from Jaxp.
*/
public static ClassLoader getContextClassLoader()
throws BuildException
{
throws BuildException {
if (!LoaderUtils.isContextLoaderAvailable()) {
return null;
}
@@ -244,7 +244,7 @@ public class ProjectHelper {
return LoaderUtils.getContextClassLoader();
}

// -------------------- Static utils, used by most helpers --------------------
// -------------------- Static utils, used by most helpers ----------------

/**
* Configures an object using an introspection handler.
@@ -261,8 +261,8 @@ public class ProjectHelper {
*/
public static void configure(Object target, AttributeList attrs,
Project project) throws BuildException {
if( target instanceof TaskAdapter ) {
target=((TaskAdapter)target).getProxy();
if (target instanceof TaskAdapter) {
target = ((TaskAdapter)target).getProxy();
}

IntrospectionHelper ih =
@@ -272,7 +272,7 @@ public class ProjectHelper {

for (int i = 0; i < attrs.getLength(); i++) {
// reflect these into the target
String value=replaceProperties(project, attrs.getValue(i),
String value = replaceProperties(project, attrs.getValue(i),
project.getProperties() );
try {
ih.setAttribute(project, target,
@@ -301,8 +301,8 @@ public class ProjectHelper {
*
* @exception BuildException if the target object doesn't accept text
*/
public static void addText(Project project, Object target, char[] buf, int start, int count)
throws BuildException {
public static void addText(Project project, Object target, char[] buf,
int start, int count) throws BuildException {
addText(project, target, new String(buf, start, count));
}

@@ -326,11 +326,12 @@ public class ProjectHelper {
return;
}

if(target instanceof TaskAdapter) {
if (target instanceof TaskAdapter) {
target = ((TaskAdapter) target).getProxy();
}

IntrospectionHelper.getHelper(target.getClass()).addText(project, target, text);
IntrospectionHelper.getHelper(target.getClass()).addText(project,
target, text);
}

/**
@@ -346,7 +347,8 @@ public class ProjectHelper {
* May be <code>null</code>, in which case
* the child is not stored.
*/
public static void storeChild(Project project, Object parent, Object child, String tag) {
public static void storeChild(Project project, Object parent,
Object child, String tag) {
IntrospectionHelper ih = IntrospectionHelper.getHelper(parent.getClass());
ih.storeElement(project, parent, child, tag);
}
@@ -389,8 +391,8 @@ public class ProjectHelper {
* @return the original string with the properties replaced, or
* <code>null</code> if the original string is <code>null</code>.
*/
public static String replaceProperties(Project project, String value, Hashtable keys)
throws BuildException {
public static String replaceProperties(Project project, String value,
Hashtable keys) throws BuildException {
if (value == null) {
return null;
}
@@ -407,7 +409,8 @@ public class ProjectHelper {
if (fragment == null) {
String propertyName = (String)j.nextElement();
if (!keys.containsKey(propertyName)) {
project.log("Property ${" + propertyName + "} has not been set", Project.MSG_VERBOSE);
project.log("Property ${" + propertyName
+ "} has not been set", Project.MSG_VERBOSE);
}
fragment = (keys.containsKey(propertyName)) ? (String) keys.get(propertyName)
: "${" + propertyName + "}";
@@ -444,11 +447,10 @@ public class ProjectHelper {
fragments.addElement(value.substring(prev, pos));
}

if( pos == (value.length() - 1)) {
if (pos == (value.length() - 1)) {
fragments.addElement("$");
prev = pos + 1;
}
else if (value.charAt(pos + 1) != '{' ) {
} else if (value.charAt(pos + 1) != '{' ) {
fragments.addElement(value.substring(pos + 1, pos + 2));
prev = pos + 2;
} else {


+ 56
- 50
src/main/org/apache/tools/ant/helper/ProjectHelperImpl.java View File

@@ -54,15 +54,10 @@

package org.apache.tools.ant.helper;

import org.apache.tools.ant.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Vector;
import java.util.Enumeration;
import java.util.Locale;
import org.xml.sax.Locator;
import org.xml.sax.InputSource;
@@ -72,11 +67,22 @@ import org.xml.sax.SAXException;
import org.xml.sax.DocumentHandler;
import org.xml.sax.AttributeList;
import org.xml.sax.helpers.XMLReaderAdapter;

import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.tools.ant.ProjectHelper;
import org.apache.tools.ant.UnknownElement;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Target;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.RuntimeConfigurable;
import org.apache.tools.ant.IntrospectionHelper;
import org.apache.tools.ant.TaskContainer;
import org.apache.tools.ant.Location;
import org.apache.tools.ant.TaskAdapter;

/**
* Original helper.
*
@@ -94,33 +100,36 @@ public class ProjectHelperImpl extends ProjectHelper {
* SAX 1 style parser used to parse the given file. This may
* in fact be a SAX 2 XMLReader wrapped in an XMLReaderAdapter.
*/
org.xml.sax.Parser parser;
private org.xml.sax.Parser parser;
/** The project to configure. */
Project project;
private Project project;
/** The configuration file to parse. */
File buildFile;
private File buildFile;
/**
* Parent directory of the build file. Used for resolving entities
* and setting the project's base directory.
*/
File buildFileParent;
private File buildFileParent;
/**
* Locator for the configuration file parser.
* Used for giving locations of errors etc.
*/
Locator locator;
private Locator locator;

/**
* Parses the project file, configuring the project as it goes.
*
* @param project project instance to be configured.
* @param source the source from which the project is read.
* @exception BuildException if the configuration is invalid or cannot
* be read
* be read.
*/
public void parse(Project project, Object source) throws BuildException {
if( ! (source instanceof File) )
if (!(source instanceof File)) {
throw new BuildException( "Only File source supported by default plugin" );
File buildFile=(File)source;
}
File buildFile = (File)source;
FileInputStream inputStream = null;
InputSource inputSource = null;

@@ -136,28 +145,29 @@ public class ProjectHelperImpl extends ProjectHelper {
parser = new XMLReaderAdapter(saxParser.getXMLReader());
}

String uri = "file:" + buildFile.getAbsolutePath().replace('\\', '/');
for (int index = uri.indexOf('#'); index != -1; index = uri.indexOf('#')) {
uri = uri.substring(0, index) + "%23" + uri.substring(index+1);
uri = uri.substring(0, index) + "%23" + uri.substring(index + 1);
}
inputStream = new FileInputStream(buildFile);
inputSource = new InputSource(inputStream);
inputSource.setSystemId(uri);
project.log("parsing buildfile " + buildFile + " with URI = " + uri, Project.MSG_VERBOSE);
project.log("parsing buildfile " + buildFile + " with URI = "
+ uri, Project.MSG_VERBOSE);
HandlerBase hb = new RootHandler(this);
parser.setDocumentHandler(hb);
parser.setEntityResolver(hb);
parser.setErrorHandler(hb);
parser.setDTDHandler(hb);
parser.parse(inputSource);
}
catch(ParserConfigurationException exc) {
} catch (ParserConfigurationException exc) {
throw new BuildException("Parser has not been configured correctly", exc);
}
catch(SAXParseException exc) {
} catch (SAXParseException exc) {
Location location =
new Location(buildFile.toString(), exc.getLineNumber(), exc.getColumnNumber());
new Location(buildFile.toString(), exc.getLineNumber(),
exc.getColumnNumber());

Throwable t = exc.getException();
if (t instanceof BuildException) {
@@ -169,26 +179,21 @@ public class ProjectHelperImpl extends ProjectHelper {
}
throw new BuildException(exc.getMessage(), t, location);
}
catch(SAXException exc) {
} catch (SAXException exc) {
Throwable t = exc.getException();
if (t instanceof BuildException) {
throw (BuildException) t;
}
throw new BuildException(exc.getMessage(), t);
}
catch(FileNotFoundException exc) {
} catch (FileNotFoundException exc) {
throw new BuildException(exc);
}
catch(IOException exc) {
} catch (IOException exc) {
throw new BuildException("Error reading project file", exc);
}
finally {
} finally {
if (inputStream != null) {
try {
inputStream.close();
}
catch (IOException ioe) {
} catch (IOException ioe) {
// ignore this
}
}
@@ -227,13 +232,16 @@ public class ProjectHelperImpl extends ProjectHelper {
* Creates a handler and sets the parser to use it
* for the current element.
*
* @param helperImpl the ProjectHelperImpl instance associated
* with this handler.
*
* @param parentHandler The handler which should be restored to the
* parser at the end of the element.
* Must not be <code>null</code>.
*/
public AbstractHandler(ProjectHelperImpl helperImpl, DocumentHandler parentHandler) {
this.parentHandler = parentHandler;
this.helperImpl=helperImpl;
this.helperImpl = helperImpl;

// Start handling SAX events
helperImpl.parser.setDocumentHandler(this);
@@ -309,7 +317,7 @@ public class ProjectHelperImpl extends ProjectHelper {
ProjectHelperImpl helperImpl;
public RootHandler( ProjectHelperImpl helperImpl ) {
this.helperImpl=helperImpl;
this.helperImpl = helperImpl;
}
/**
@@ -355,7 +363,7 @@ public class ProjectHelperImpl extends ProjectHelper {
inputSource.setSystemId("file:" + entitySystemId);
return inputSource;
} catch (FileNotFoundException fne) {
helperImpl.project.log(file.getAbsolutePath()+" could not be found",
helperImpl.project.log(file.getAbsolutePath() + " could not be found",
Project.MSG_WARN);
}
}
@@ -490,7 +498,7 @@ public class ProjectHelperImpl extends ProjectHelper {
* appropriate handler is created and initialised with the details
* of the element.
*
* @param tag The name of the element being started.
* @param name The name of the element being started.
* Will not be <code>null</code>.
* @param attrs Attributes of the element being started.
* Will not be <code>null</code>.
@@ -520,7 +528,7 @@ public class ProjectHelperImpl extends ProjectHelper {
* Handles a task defintion element by creating a task handler
* and initialising is with the details of the element.
*
* @param tag The name of the element to be handled.
* @param name The name of the element to be handled.
* Will not be <code>null</code>.
* @param attrs Attributes of the element to be handled.
* Will not be <code>null</code>.
@@ -537,7 +545,7 @@ public class ProjectHelperImpl extends ProjectHelper {
* Handles a type defintion element by creating a task handler
* and initialising is with the details of the element.
*
* @param tag The name of the element to be handled.
* @param name The name of the element to be handled.
* Will not be <code>null</code>.
* @param attrs Attributes of the element to be handled.
* Will not be <code>null</code>.
@@ -553,7 +561,7 @@ public class ProjectHelperImpl extends ProjectHelper {
* Handles a property defintion element by creating a task handler
* and initialising is with the details of the element.
*
* @param tag The name of the element to be handled.
* @param name The name of the element to be handled.
* Will not be <code>null</code>.
* @param attrs Attributes of the element to be handled.
* Will not be <code>null</code>.
@@ -584,7 +592,7 @@ public class ProjectHelperImpl extends ProjectHelper {
* Handles a data type defintion element by creating a data type
* handler and initialising is with the details of the element.
*
* @param tag The name of the element to be handled.
* @param name The name of the element to be handled.
* Will not be <code>null</code>.
* @param attrs Attributes of the element to be handled.
* Will not be <code>null</code>.
@@ -687,7 +695,7 @@ public class ProjectHelperImpl extends ProjectHelper {
/**
* Handles the start of an element within a target.
*
* @param tag The name of the element being started.
* @param name The name of the element being started.
* Will not be <code>null</code>.
* @param attrs Attributes of the element being started.
* Will not be <code>null</code>.
@@ -852,7 +860,7 @@ public class ProjectHelperImpl extends ProjectHelper {
* will always use another task handler, and all other tasks
* will always use a nested element handler.
*
* @param tag The name of the element being started.
* @param name The name of the element being started.
* Will not be <code>null</code>.
* @param attrs Attributes of the element being started.
* Will not be <code>null</code>.
@@ -864,8 +872,7 @@ public class ProjectHelperImpl extends ProjectHelper {
if (task instanceof TaskContainer) {
// task can contain other tasks - no other nested elements possible
new TaskHandler(helperImpl, this, (TaskContainer)task, wrapper, target).init(name, attrs);
}
else {
} else {
new NestedElementHandler(helperImpl, this, task, wrapper, target).init(name, attrs);
}
}
@@ -933,7 +940,7 @@ public class ProjectHelperImpl extends ProjectHelper {
* its parent container (if any). Nested elements are then
* added later as the parser encounters them.
*
* @param tag Name of the element which caused this handler
* @param propType Name of the element which caused this handler
* to be created. Must not be <code>null</code>.
*
* @param attrs Attributes of the element which caused this
@@ -1003,7 +1010,7 @@ public class ProjectHelperImpl extends ProjectHelper {
* will always use a task handler, and all other elements
* will always use another nested element handler.
*
* @param tag The name of the element being started.
* @param name The name of the element being started.
* Will not be <code>null</code>.
* @param attrs Attributes of the element being started.
* Will not be <code>null</code>.
@@ -1016,8 +1023,7 @@ public class ProjectHelperImpl extends ProjectHelper {
// taskcontainer nested element can contain other tasks - no other
// nested elements possible
new TaskHandler(helperImpl, this, (TaskContainer)child, childWrapper, target).init(name, attrs);
}
else {
} else {
new NestedElementHandler(helperImpl, this, child, childWrapper, target).init(name, attrs);
}
}
@@ -1067,7 +1073,7 @@ public class ProjectHelperImpl extends ProjectHelper {
* its parent container (if any). Nested elements are then
* added later as the parser encounters them.
*
* @param tag Name of the element which caused this handler
* @param propType Name of the element which caused this handler
* to be created. Must not be <code>null</code>.
*
* @param attrs Attributes of the element which caused this
@@ -1080,7 +1086,7 @@ public class ProjectHelperImpl extends ProjectHelper {
try {
element = helperImpl.project.createDataType(propType);
if (element == null) {
throw new BuildException("Unknown data type "+propType);
throw new BuildException("Unknown data type " + propType);
}
if (target != null) {
@@ -1122,7 +1128,7 @@ public class ProjectHelperImpl extends ProjectHelper {
* Handles the start of an element within this one.
* This will always use a nested element handler.
*
* @param tag The name of the element being started.
* @param name The name of the element being started.
* Will not be <code>null</code>.
* @param attrs Attributes of the element being started.
* Will not be <code>null</code>.


Loading…
Cancel
Save