diff --git a/proposal/sandbox/embed/ProjectHelperImpl2.java b/proposal/sandbox/embed/ProjectHelperImpl2.java index 2b4534471..9d03a85f6 100644 --- a/proposal/sandbox/embed/ProjectHelperImpl2.java +++ b/proposal/sandbox/embed/ProjectHelperImpl2.java @@ -60,6 +60,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.util.Hashtable; import java.util.Vector; import java.util.Enumeration; @@ -67,7 +68,6 @@ import java.util.Locale; import java.util.Stack; import org.xml.sax.Locator; import org.xml.sax.InputSource; -//import org.xml.sax.HandlerBase; import org.xml.sax.SAXParseException; import org.xml.sax.XMLReader; import org.xml.sax.SAXException; @@ -78,11 +78,8 @@ import org.xml.sax.helpers.XMLReaderAdapter; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.AttributeListImpl; -import javax.xml.parsers.SAXParserFactory; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.ParserConfigurationException; +import org.apache.tools.ant.util.JAXPUtils; -import org.apache.tools.ant.types.SystemPath; /** * Sax2 based project reader * @@ -92,12 +89,6 @@ import org.apache.tools.ant.types.SystemPath; public class ProjectHelperImpl2 extends ProjectHelper { /* Stateless */ - /** - * Parser factory to use to create parsers. - * @see #getParserFactory - */ - private static SAXParserFactory parserFactory = null; - /** * Parses the project file, configuring the project as it goes. * @@ -106,7 +97,11 @@ public class ProjectHelperImpl2 extends ProjectHelper { */ public void parse(Project project, Object source) throws BuildException { // Hook our one tasks. - project.addDataTypeDefinition( "systemPath" , SystemPath.class ); + try { + Class c=Class.forName("org.apache.tools.ant.types.SystemPath"); + project.addDataTypeDefinition( "systemPath" , c ); + } catch (Exception ex ) { + } AntXmlContext context=new AntXmlContext(); if(source instanceof File) { @@ -132,12 +127,7 @@ public class ProjectHelperImpl2 extends ProjectHelper { */ org.xml.sax.XMLReader parser; - if (parserFactory == null) { - parserFactory = SAXParserFactory.newInstance(); - } - - SAXParser saxParser = parserFactory.newSAXParser(); - parser =saxParser.getXMLReader(); + parser =JAXPUtils.getXMLReader(); String uri = "file:" + context.buildFile.getAbsolutePath().replace('\\', '/'); for (int index = uri.indexOf('#'); index != -1; index = uri.indexOf('#')) { @@ -156,13 +146,9 @@ public class ProjectHelperImpl2 extends ProjectHelper { parser.setErrorHandler(hb); parser.setDTDHandler(hb); parser.parse(inputSource); - } - catch(ParserConfigurationException exc) { - throw new BuildException("Parser has not been configured correctly", exc); - } - catch(SAXParseException exc) { + } catch(SAXParseException exc) { Location location = - new Location(context.buildFile.toString(), exc.getLineNumber(), exc.getColumnNumber()); + new Location(exc.getSystemId(), exc.getLineNumber(), exc.getColumnNumber()); Throwable t = exc.getException(); if (t instanceof BuildException) { @@ -185,8 +171,11 @@ public class ProjectHelperImpl2 extends ProjectHelper { catch(FileNotFoundException exc) { throw new BuildException(exc); } + catch(UnsupportedEncodingException exc) { + throw new BuildException("Encoding of project file is invalid.",exc); + } catch(IOException exc) { - throw new BuildException("Error reading project file", exc); + throw new BuildException("Error reading project file: " +exc.getMessage(), exc); } finally { if (inputStream != null) { @@ -301,6 +290,18 @@ public class ProjectHelperImpl2 extends ProjectHelper { */ Locator locator; + /** + * Target that all other targets will depend upon implicitly. + * + *

This holds all tasks and data type definitions that have + * been placed outside of targets.

+ */ + Target implicitTarget = new Target(); + + public AntXmlContext() { + implicitTarget.setName(""); + } + /** * Scans an attribute list for the id attribute and * stores a reference to the target object in the project if an @@ -431,7 +432,6 @@ public class ProjectHelperImpl2 extends ProjectHelper { * @exception SAXException in case of error (not thrown in * this implementation) * - * @see #finished() */ public void endElement(String uri, String name, String qName) throws SAXException { currentHandler.onEndElement(uri, name, context); @@ -521,14 +521,12 @@ public class ProjectHelperImpl2 extends ProjectHelper { } } - if (def == null) { - throw new SAXParseException("The default attribute of project is required", - context.locator); - } - Project project=context.project; - project.setDefaultTarget(def); + if (def != null && !def.equals("")) { + project.setDefaultTarget(def); + } + if (name != null) { project.setName(name); project.addReference(name, project); @@ -553,7 +551,7 @@ public class ProjectHelperImpl2 extends ProjectHelper { } } } - + project.addTarget("", context.implicitTarget); } /** @@ -576,16 +574,12 @@ public class ProjectHelperImpl2 extends ProjectHelper { AntXmlContext context) throws SAXParseException { - if (qname.equals("taskdef")) { - return new TaskHandler(null, null, null); - } else if (qname.equals("typedef")) { - return new TaskHandler(null, null, null); - } else if (qname.equals("property")) { - return new TaskHandler(null, null, null); - } else if (qname.equals("target")) { + if (qname.equals("target")) { return new TargetHandler(); } else if (context.project.getDataTypeDefinitions().get(qname) != null) { - return new DataTypeHandler(null); + return new DataTypeHandler(context.implicitTarget); + } else if (context.project.getTaskDefinitions().get(qname) != null) { + return new TaskHandler(context.implicitTarget,null,context.implicitTarget); } else { throw new SAXParseException("Unexpected element \"" + qname + "\" " + name, context.locator); } @@ -633,6 +627,8 @@ public class ProjectHelperImpl2 extends ProjectHelper { if (key.equals("name")) { name = value; + if( "".equals( name ) ) + throw new BuildException("name attribute must not be empty"); } else if (key.equals("depends")) { depends = value; } else if (key.equals("if")) { @@ -654,6 +650,7 @@ public class ProjectHelperImpl2 extends ProjectHelper { } target = new Target(); + target.addDependency( "" ); target.setName(name); target.setIf(ifCond); target.setUnless(unlessCond); @@ -731,18 +728,13 @@ public class ProjectHelperImpl2 extends ProjectHelper { * Must not be null. * * @param container Container for the element. - * May be null if the target is - * null as well. If the - * target is null, this parameter - * is effectively ignored. + * Must not be null * * @param parentWrapper Wrapper for the parent element, if any. - * May be null. If the - * target is null, this parameter - * is effectively ignored. + * May be null. * * @param target Target this element is part of. - * May be null. + * Must not be null. */ public TaskHandler(TaskContainer container, RuntimeConfigurable2 parentWrapper, Target target) { this.container = container; @@ -785,13 +777,11 @@ public class ProjectHelperImpl2 extends ProjectHelper { task.setTaskName(qname); } - task.setLocation(new Location(context.buildFile.toString(), + task.setLocation(new Location(context.locator.getSystemId(), context.locator.getLineNumber(), context.locator.getColumnNumber())); context.configureId(task, attrs); - // Top level tasks don't have associated targets - if (target != null) { task.setOwningTarget(target); container.addTask(task); task.init(); @@ -801,25 +791,11 @@ public class ProjectHelperImpl2 extends ProjectHelper { if (parentWrapper != null) { parentWrapper.addChild(wrapper); } - } else { - task.init(); - PropertyHelper.getPropertyHelper(context.project).configure(task, attrs, context.project); - } } - /** - * Executes the task if it is a top-level one. - */ - public void onEndElement(String uri, String tag, AntXmlContext context) { - if (task != null && target == null) { - task.execute(); - } - } /** - * Adds text to the task, using the wrapper if one is - * available (in other words if the task is within a target) - * or using addText otherwise. + * Adds text to the task, using the wrapper * * @param buf A character array of the text within the element. * Will not be null. @@ -834,15 +810,7 @@ public class ProjectHelperImpl2 extends ProjectHelper { AntXmlContext context) throws SAXParseException { - if (wrapper == null) { - try { - ProjectHelper.addText(context.project, task, buf, start, count); - } catch (BuildException exc) { - throw new SAXParseException(exc.getMessage(), context.locator, exc); - } - } else { wrapper.addText(buf, start, count); - } } /** @@ -907,10 +875,10 @@ public class ProjectHelperImpl2 extends ProjectHelper { * Must not be null. * * @param parentWrapper Wrapper for the parent element, if any. - * May be null. + * Must not be null. * * @param target Target this element is part of. - * May be null. + * Must not be null. */ public NestedElementHandler(Object parent, RuntimeConfigurable2 parentWrapper, @@ -962,14 +930,9 @@ public class ProjectHelperImpl2 extends ProjectHelper { context.configureId(child, attrs); - if (parentWrapper != null) { childWrapper = new RuntimeConfigurable2(child, qname); childWrapper.setAttributes2(attrs); parentWrapper.addChild(childWrapper); - } else { - PropertyHelper.getPropertyHelper(context.project).configure(child, attrs, context.project); - ih.storeElement(context.project, parent, child, elementName); - } } catch (BuildException exc) { throw new SAXParseException(exc.getMessage(), context.locator, exc); } @@ -992,15 +955,7 @@ public class ProjectHelperImpl2 extends ProjectHelper { AntXmlContext context) throws SAXParseException { - if (parentWrapper == null) { - try { - ProjectHelper.addText(context.project, child, buf, start, count); - } catch (BuildException exc) { - throw new SAXParseException(exc.getMessage(), context.locator, exc); - } - } else { childWrapper.addText(buf, start, count); - } } /** @@ -1080,14 +1035,9 @@ public class ProjectHelperImpl2 extends ProjectHelper { throw new BuildException("Unknown data type "+qname); } - if (target != null) { wrapper = new RuntimeConfigurable2(element, qname); wrapper.setAttributes2(attrs); target.addDataType(wrapper); - } else { - PropertyHelper.getPropertyHelper(context.project).configure(element, attrs, context.project); - context.configureId(element, attrs); - } } catch (BuildException exc) { throw new SAXParseException(exc.getMessage(), context.locator, exc); } diff --git a/proposal/sandbox/embed/ant-sax2.jar b/proposal/sandbox/embed/ant-sax2.jar index c2334e58d..cabbafe24 100644 Binary files a/proposal/sandbox/embed/ant-sax2.jar and b/proposal/sandbox/embed/ant-sax2.jar differ