Xerces, need to turn on support git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272895 13f79535-47bb-0310-9956-ffa450edef68master
@@ -129,8 +129,8 @@ public class AntLibHandler extends ElementHandler { | |||||
* @param attributes The attributes attached to the element. | * @param attributes The attributes attached to the element. | ||||
* @throws SAXParseException if there is a parsing problem. | * @throws SAXParseException if there is a parsing problem. | ||||
*/ | */ | ||||
public void startElement(String uri, String localName, String qualifiedName, | |||||
Attributes attributes) | |||||
protected void addNestedElement(String uri, String localName, | |||||
String qualifiedName, Attributes attributes) | |||||
throws SAXParseException { | throws SAXParseException { | ||||
try { | try { | ||||
if (qualifiedName.equals("taskdef") | if (qualifiedName.equals("taskdef") | ||||
@@ -126,8 +126,8 @@ public class AntConfigHandler extends ElementHandler { | |||||
* @param attributes The attributes attached to the element. | * @param attributes The attributes attached to the element. | ||||
* @throws SAXParseException if there is a parsing problem. | * @throws SAXParseException if there is a parsing problem. | ||||
*/ | */ | ||||
public void startElement(String uri, String localName, String qualifiedName, | |||||
Attributes attributes) | |||||
protected void addNestedElement(String uri, String localName, | |||||
String qualifiedName, Attributes attributes) | |||||
throws SAXParseException { | throws SAXParseException { | ||||
// configs support two task collections as elements | // configs support two task collections as elements | ||||
@@ -396,6 +396,45 @@ public class ComponentManager implements ComponentService { | |||||
return libFactory; | return libFactory; | ||||
} | } | ||||
/** | |||||
* Set an attribute on an object. | |||||
* | |||||
* This method is useful for manipulating components without assuming | |||||
* anything about the component's type. The context classloader should be | |||||
* set to the component's loaded when calling this method. | |||||
* | |||||
* @param component the component on which to set the attribute | |||||
* @param attributeName the attribute name | |||||
* @param attributeValue the required value | |||||
* | |||||
* @exception AntException if the attribute cannot be set. | |||||
*/ | |||||
public void setAttribute(Object component, String attributeName, | |||||
String attributeValue) throws AntException { | |||||
Setter setter = getSetter(component.getClass()); | |||||
setter.setAttribute(component, attributeName, | |||||
frame.replacePropertyRefs(attributeValue)); | |||||
} | |||||
/** | |||||
* Add a nested element to a component. | |||||
* | |||||
* This method is useful for manipulating components without assuming | |||||
* anything about the component's type. The context classloader should be | |||||
* set to the component's loaded when calling this method. | |||||
* | |||||
* @param component the component to which the nested element will be added. | |||||
* @param nestedElementName the name of the nested element. | |||||
* @param nestedElement the actual object to be added. | |||||
* | |||||
* @exception AntException if the nested element cannot be added. | |||||
*/ | |||||
public void addNestedElement(Object component, String nestedElementName, | |||||
Object nestedElement) throws AntException { | |||||
Setter setter = getSetter(component.getClass()); | |||||
setter.addElement(component, nestedElementName, nestedElement); | |||||
} | |||||
/** | /** | ||||
* Get an imported definition from the component manager | * Get an imported definition from the component manager | ||||
* | * | ||||
@@ -416,7 +455,7 @@ public class ComponentManager implements ComponentService { | |||||
* @exception AntException if there is a problem creating or | * @exception AntException if there is a problem creating or | ||||
* configuring the component | * configuring the component | ||||
*/ | */ | ||||
protected Object createComponent(BuildElement model) | |||||
public Object createComponent(BuildElement model) | |||||
throws AntException { | throws AntException { | ||||
String componentName = model.getType(); | String componentName = model.getType(); | ||||
return createComponent(componentName, model); | return createComponent(componentName, model); | ||||
@@ -474,7 +513,6 @@ public class ComponentManager implements ComponentService { | |||||
boolean isTask | boolean isTask | ||||
= libDefinition.getDefinitionType() == AntLibrary.TASKDEF; | = libDefinition.getDefinitionType() == AntLibrary.TASKDEF; | ||||
Object component = null; | Object component = null; | ||||
if (model != null) { | if (model != null) { | ||||
location = model.getLocation(); | location = model.getLocation(); | ||||
@@ -678,15 +716,15 @@ public class ComponentManager implements ComponentService { | |||||
* the attribute is to be added. | * the attribute is to be added. | ||||
* @exception AntException if the nested element cannot be created | * @exception AntException if the nested element cannot be created | ||||
*/ | */ | ||||
private void addNestedElement(AntLibFactory factory, Setter setter, | |||||
Object element, BuildElement model) | |||||
private void addNested(AntLibFactory factory, Setter setter, | |||||
Object element, BuildElement model) | |||||
throws AntException { | throws AntException { | ||||
String nestedElementName = model.getType(); | String nestedElementName = model.getType(); | ||||
Class nestedType = setter.getType(nestedElementName); | Class nestedType = setter.getType(nestedElementName); | ||||
// is there a polymorph indicator - look in Ant aspects | // is there a polymorph indicator - look in Ant aspects | ||||
String typeName | String typeName | ||||
= model.getNamespaceAttributeValue(Namespace.ANT_META_URI, "type"); | |||||
= model.getNamespaceAttributeValue(Namespace.XSI_URI, "type"); | |||||
Object typeInstance = null; | Object typeInstance = null; | ||||
if (typeName != null) { | if (typeName != null) { | ||||
@@ -706,9 +744,8 @@ public class ComponentManager implements ComponentService { | |||||
} else { | } else { | ||||
throw new ExecutionException("The type of the <" | throw new ExecutionException("The type of the <" | ||||
+ nestedElementName + "> nested element is not known. " | + nestedElementName + "> nested element is not known. " | ||||
+ "Please specify by the type using the \"ant:type\" " | |||||
+ "attribute or provide a reference to an instance with " | |||||
+ "the \"ant:id\" attribute"); | |||||
+ "Please specify by the type using the \"xsi:type\" " | |||||
+ "attribute or provide a reference to another instance"); | |||||
} | } | ||||
// is the typeInstance compatible with the type expected | // is the typeInstance compatible with the type expected | ||||
@@ -732,8 +769,8 @@ public class ComponentManager implements ComponentService { | |||||
* the nested element | * the nested element | ||||
* @exception AntException if the nested element cannot be created. | * @exception AntException if the nested element cannot be created. | ||||
*/ | */ | ||||
private void createNestedElement(AntLibFactory factory, Setter setter, | |||||
Object element, BuildElement model) | |||||
private void createNested(AntLibFactory factory, Setter setter, | |||||
Object element, BuildElement model) | |||||
throws AntException { | throws AntException { | ||||
String nestedElementName = model.getType(); | String nestedElementName = model.getType(); | ||||
try { | try { | ||||
@@ -819,11 +856,9 @@ public class ComponentManager implements ComponentService { | |||||
container.addNestedTask(nestedTask); | container.addNestedTask(nestedTask); | ||||
} else { | } else { | ||||
if (setter.supportsNestedAdder(nestedElementName)) { | if (setter.supportsNestedAdder(nestedElementName)) { | ||||
addNestedElement(factory, setter, element, | |||||
nestedElementModel); | |||||
addNested(factory, setter, element, nestedElementModel); | |||||
} else if (setter.supportsNestedCreator(nestedElementName)) { | } else if (setter.supportsNestedCreator(nestedElementName)) { | ||||
createNestedElement(factory, setter, element, | |||||
nestedElementModel); | |||||
createNested(factory, setter, element, nestedElementModel); | |||||
} else { | } else { | ||||
throw new ExecutionException("<" + model.getType() + ">" | throw new ExecutionException("<" + model.getType() + ">" | ||||
+ " does not support the \"" + nestedElementName | + " does not support the \"" + nestedElementName | ||||
@@ -145,8 +145,6 @@ public class CoreExecService implements ExecService { | |||||
frame.executeTask(task, aspectValues); | frame.executeTask(task, aspectValues); | ||||
} | } | ||||
/** | /** | ||||
* Get the base directory for this execution of this frame | * Get the base directory for this execution of this frame | ||||
* | * | ||||
@@ -107,8 +107,8 @@ public class BuildElementHandler extends ModelElementHandler { | |||||
* @param attributes The attributes attached to the element. | * @param attributes The attributes attached to the element. | ||||
* @throws SAXParseException if there is a parsing problem. | * @throws SAXParseException if there is a parsing problem. | ||||
*/ | */ | ||||
public void startElement(String uri, String localName, String qualifiedName, | |||||
Attributes attributes) | |||||
protected void addNestedElement(String uri, String localName, | |||||
String qualifiedName, Attributes attributes) | |||||
throws SAXParseException { | throws SAXParseException { | ||||
// everything within a task element is also a task element | // everything within a task element is also a task element | ||||
@@ -154,8 +154,8 @@ public class ProjectHandler extends ModelElementHandler { | |||||
* @param attributes The attributes attached to the element. | * @param attributes The attributes attached to the element. | ||||
* @throws SAXParseException if there is a parsing problem. | * @throws SAXParseException if there is a parsing problem. | ||||
*/ | */ | ||||
public void startElement(String uri, String localName, String qualifiedName, | |||||
Attributes attributes) | |||||
protected void addNestedElement(String uri, String localName, | |||||
String qualifiedName, Attributes attributes) | |||||
throws SAXParseException { | throws SAXParseException { | ||||
if (qualifiedName.equals(INCLUDE_ELEMENT)) { | if (qualifiedName.equals(INCLUDE_ELEMENT)) { | ||||
@@ -130,8 +130,8 @@ public class TargetHandler extends ModelElementHandler { | |||||
* @param attributes The attributes attached to the element. | * @param attributes The attributes attached to the element. | ||||
* @throws SAXParseException if there is a parsing problem. | * @throws SAXParseException if there is a parsing problem. | ||||
*/ | */ | ||||
public void startElement(String uri, String localName, String qualifiedName, | |||||
Attributes attributes) | |||||
protected void addNestedElement(String uri, String localName, | |||||
String qualifiedName, Attributes attributes) | |||||
throws SAXParseException { | throws SAXParseException { | ||||
// everything is a task | // everything is a task | ||||
BuildElementHandler taskHandler = new BuildElementHandler(); | BuildElementHandler taskHandler = new BuildElementHandler(); | ||||
@@ -58,6 +58,7 @@ import org.apache.ant.common.util.Location; | |||||
import org.apache.ant.common.model.Project; | import org.apache.ant.common.model.Project; | ||||
import org.apache.ant.antcore.xml.ParseContext; | import org.apache.ant.antcore.xml.ParseContext; | ||||
import org.apache.ant.antcore.xml.XMLParseException; | import org.apache.ant.antcore.xml.XMLParseException; | ||||
import org.apache.ant.common.constants.Namespace; | |||||
/** | /** | ||||
* Parses an Ant project model from an XML source using a SAX Parser. | * Parses an Ant project model from an XML source using a SAX Parser. | ||||
@@ -78,7 +79,11 @@ public class XMLProjectParser { | |||||
throws XMLParseException { | throws XMLParseException { | ||||
try { | try { | ||||
ParseContext context = new ParseContext(); | ParseContext context = new ParseContext(); | ||||
context.declareNamespace("ant", "http://jakarta.apache.org/ant"); | |||||
context.declareNamespace(Namespace.ANT_META_PREFIX, | |||||
Namespace.ANT_META_URI); | |||||
context.declareNamespace(Namespace.XSI_PREFIX, | |||||
Namespace.XSI_URI); | |||||
ProjectHandler projectHandler = new ProjectHandler(); | ProjectHandler projectHandler = new ProjectHandler(); | ||||
context.parse(buildSource, "project", projectHandler); | context.parse(buildSource, "project", projectHandler); | ||||
@@ -215,6 +215,22 @@ public abstract class ElementHandler extends DefaultHandler { | |||||
} | } | ||||
/** | |||||
* Process an element. This resolves any namespaces against | |||||
* prefixes declared in the ParseContext. | |||||
* | |||||
* @param uri The Namespace URI. | |||||
* @param localName The local name (without prefix). | |||||
* @param qualifiedName The qualified name (with prefix) | |||||
* @param attributes The attributes attached to the element. | |||||
* @throws SAXParseException if there is a problem parsng the subelement | |||||
*/ | |||||
final public void startElement(String uri, String localName, | |||||
String qualifiedName, Attributes attributes) | |||||
throws SAXParseException { | |||||
addNestedElement(uri, localName, qualifiedName, attributes); | |||||
} | |||||
/** | /** | ||||
* By default an element handler does not support nested elements. This | * By default an element handler does not support nested elements. This | ||||
* method will always throw an exception. Subclasses should override | * method will always throw an exception. Subclasses should override | ||||
@@ -226,10 +242,10 @@ public abstract class ElementHandler extends DefaultHandler { | |||||
* @param attributes The attributes attached to the element. | * @param attributes The attributes attached to the element. | ||||
* @throws SAXParseException if there is a problem parsng the subelement | * @throws SAXParseException if there is a problem parsng the subelement | ||||
*/ | */ | ||||
public void startElement(String uri, String localName, String qualifiedName, | |||||
Attributes attributes) | |||||
protected void addNestedElement(String uri, String localName, | |||||
String qualifiedName, | |||||
Attributes attributes) | |||||
throws SAXParseException { | throws SAXParseException { | ||||
// everything is a task | |||||
throw new SAXParseException("<" + elementName + "> does not support a <" | throw new SAXParseException("<" + elementName + "> does not support a <" | ||||
+ qualifiedName + "> nested element", getLocator()); | + qualifiedName + "> nested element", getLocator()); | ||||
} | } | ||||
@@ -320,7 +336,6 @@ public abstract class ElementHandler extends DefaultHandler { | |||||
protected abstract void processElement(String elementName) | protected abstract void processElement(String elementName) | ||||
throws SAXParseException; | throws SAXParseException; | ||||
/** | /** | ||||
* Process all of the attributes of the element into maps, one for | * Process all of the attributes of the element into maps, one for | ||||
* aspects and one for other attributes | * aspects and one for other attributes | ||||
@@ -335,13 +350,14 @@ public abstract class ElementHandler extends DefaultHandler { | |||||
elementAttributes = new AttributeCollection(); | elementAttributes = new AttributeCollection(); | ||||
int length = attributes.getLength(); | int length = attributes.getLength(); | ||||
for (int i = 0; i < length; ++i) { | for (int i = 0; i < length; ++i) { | ||||
String localName = attributes.getLocalName(i); | |||||
String qName = attributes.getQName(i); | |||||
String uri = attributes.getURI(i); | String uri = attributes.getURI(i); | ||||
if (uri != null && uri.trim().length() == 0) { | if (uri != null && uri.trim().length() == 0) { | ||||
uri = null; | uri = null; | ||||
} | } | ||||
String localName = attributes.getLocalName(i); | |||||
String qName = attributes.getQName(i); | |||||
if (uri == null) { | if (uri == null) { | ||||
if (qName.indexOf(":") != -1) { | if (qName.indexOf(":") != -1) { | ||||
// try to resolve through known namespaces | // try to resolve through known namespaces | ||||
@@ -95,6 +95,7 @@ public class ParseContext { | |||||
ClassLoader thisLoader = this.getClass().getClassLoader(); | ClassLoader thisLoader = this.getClass().getClassLoader(); | ||||
thread.setContextClassLoader(thisLoader); | thread.setContextClassLoader(thisLoader); | ||||
parserFactory = SAXParserFactory.newInstance(); | parserFactory = SAXParserFactory.newInstance(); | ||||
parserFactory.setNamespaceAware(true); | |||||
} finally { | } finally { | ||||
thread.setContextClassLoader(currentContextLoader); | thread.setContextClassLoader(currentContextLoader); | ||||
} | } | ||||
@@ -131,7 +132,7 @@ public class ParseContext { | |||||
// create a parser for this source | // create a parser for this source | ||||
SAXParser saxParser = null; | SAXParser saxParser = null; | ||||
Thread thread = Thread.currentThread(); | Thread thread = Thread.currentThread(); | ||||
ClassLoader currentContextLoader = thread.getContextClassLoader(); | ClassLoader currentContextLoader = thread.getContextClassLoader(); | ||||
try { | try { | ||||
@@ -141,7 +142,7 @@ public class ParseContext { | |||||
} finally { | } finally { | ||||
thread.setContextClassLoader(currentContextLoader); | thread.setContextClassLoader(currentContextLoader); | ||||
} | } | ||||
XMLReader xmlReader = saxParser.getXMLReader(); | XMLReader xmlReader = saxParser.getXMLReader(); | ||||
// create a root handler for this | // create a root handler for this | ||||
@@ -54,6 +54,7 @@ | |||||
package org.apache.ant.common.service; | package org.apache.ant.common.service; | ||||
import java.net.URL; | import java.net.URL; | ||||
import org.apache.ant.common.antlib.AntLibFactory; | import org.apache.ant.common.antlib.AntLibFactory; | ||||
import org.apache.ant.common.model.BuildElement; | |||||
import org.apache.ant.common.util.AntException; | import org.apache.ant.common.util.AntException; | ||||
import org.apache.ant.common.util.AttributeCollection; | import org.apache.ant.common.util.AttributeCollection; | ||||
@@ -187,6 +188,49 @@ public interface ComponentService { | |||||
Object createComponent(String libraryId, String localName) | Object createComponent(String libraryId, String localName) | ||||
throws AntException; | throws AntException; | ||||
/** | |||||
* Create a component from a build model. The returned object will be | |||||
* configured according to the model. | |||||
* | |||||
* @param model the build element to use to create and configure the | |||||
* component | |||||
* @return the created component. | |||||
* @exception AntException if the component cannot be created | |||||
*/ | |||||
Object createComponent(BuildElement model) throws AntException; | |||||
/** | |||||
* Set an attribute on an object. | |||||
* | |||||
* This method is useful for manipulating components without assuming | |||||
* anything about the component's type. The context classloader should be | |||||
* set to the component's loaded when calling this method. | |||||
* | |||||
* @param component the component on which to set the attribute | |||||
* @param attributeName the attribute name | |||||
* @param attributeValue the required value | |||||
* | |||||
* @exception AntException if the attribute cannot be set. | |||||
*/ | |||||
void setAttribute(Object component, String attributeName, | |||||
String attributeValue) throws AntException; | |||||
/** | |||||
* Add a nested element to a component. | |||||
* | |||||
* This method is useful for manipulating components without assuming | |||||
* anything about the component's type. The context classloader should be | |||||
* set to the component's loaded when calling this method. | |||||
* | |||||
* @param component the component to which the nested element will be added. | |||||
* @param nestedElementName the name of the nested element. | |||||
* @param nestedElement the actual object to be added. | |||||
* | |||||
* @exception AntException if the nested element cannot be added. | |||||
*/ | |||||
void addNestedElement(Object component, String nestedElementName, | |||||
Object nestedElement) throws AntException; | |||||
/** | /** | ||||
* configure an object with attribtes from the given map | * configure an object with attribtes from the given map | ||||
* | * | ||||
@@ -62,6 +62,7 @@ import org.apache.ant.antcore.config.AntConfigHandler; | |||||
import org.apache.ant.antcore.xml.ParseContext; | import org.apache.ant.antcore.xml.ParseContext; | ||||
import org.apache.ant.antcore.xml.XMLParseException; | import org.apache.ant.antcore.xml.XMLParseException; | ||||
import org.apache.ant.init.InitUtils; | import org.apache.ant.init.InitUtils; | ||||
import org.apache.ant.common.constants.Namespace; | |||||
/** | /** | ||||
* Frontend Utilities methods and constants. | * Frontend Utilities methods and constants. | ||||
@@ -113,6 +114,11 @@ public class FrontendUtils { | |||||
URL configFileURL = InitUtils.getFileURL(configFile); | URL configFileURL = InitUtils.getFileURL(configFile); | ||||
ParseContext context = new ParseContext(); | ParseContext context = new ParseContext(); | ||||
context.declareNamespace(Namespace.ANT_META_PREFIX, | |||||
Namespace.ANT_META_URI); | |||||
context.declareNamespace(Namespace.XSI_PREFIX, | |||||
Namespace.XSI_URI); | |||||
AntConfigHandler configHandler = new AntConfigHandler(); | AntConfigHandler configHandler = new AntConfigHandler(); | ||||
context.parse(configFileURL, "antconfig", configHandler); | context.parse(configFileURL, "antconfig", configHandler); | ||||