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. | |||
* @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 { | |||
try { | |||
if (qualifiedName.equals("taskdef") | |||
@@ -126,8 +126,8 @@ public class AntConfigHandler extends ElementHandler { | |||
* @param attributes The attributes attached to the element. | |||
* @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 { | |||
// configs support two task collections as elements | |||
@@ -396,6 +396,45 @@ public class ComponentManager implements ComponentService { | |||
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 | |||
* | |||
@@ -416,7 +455,7 @@ public class ComponentManager implements ComponentService { | |||
* @exception AntException if there is a problem creating or | |||
* configuring the component | |||
*/ | |||
protected Object createComponent(BuildElement model) | |||
public Object createComponent(BuildElement model) | |||
throws AntException { | |||
String componentName = model.getType(); | |||
return createComponent(componentName, model); | |||
@@ -474,7 +513,6 @@ public class ComponentManager implements ComponentService { | |||
boolean isTask | |||
= libDefinition.getDefinitionType() == AntLibrary.TASKDEF; | |||
Object component = null; | |||
if (model != null) { | |||
location = model.getLocation(); | |||
@@ -678,15 +716,15 @@ public class ComponentManager implements ComponentService { | |||
* the attribute is to be added. | |||
* @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 { | |||
String nestedElementName = model.getType(); | |||
Class nestedType = setter.getType(nestedElementName); | |||
// is there a polymorph indicator - look in Ant aspects | |||
String typeName | |||
= model.getNamespaceAttributeValue(Namespace.ANT_META_URI, "type"); | |||
= model.getNamespaceAttributeValue(Namespace.XSI_URI, "type"); | |||
Object typeInstance = null; | |||
if (typeName != null) { | |||
@@ -706,9 +744,8 @@ public class ComponentManager implements ComponentService { | |||
} else { | |||
throw new ExecutionException("The type of the <" | |||
+ 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 | |||
@@ -732,8 +769,8 @@ public class ComponentManager implements ComponentService { | |||
* the nested element | |||
* @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 { | |||
String nestedElementName = model.getType(); | |||
try { | |||
@@ -819,11 +856,9 @@ public class ComponentManager implements ComponentService { | |||
container.addNestedTask(nestedTask); | |||
} else { | |||
if (setter.supportsNestedAdder(nestedElementName)) { | |||
addNestedElement(factory, setter, element, | |||
nestedElementModel); | |||
addNested(factory, setter, element, nestedElementModel); | |||
} else if (setter.supportsNestedCreator(nestedElementName)) { | |||
createNestedElement(factory, setter, element, | |||
nestedElementModel); | |||
createNested(factory, setter, element, nestedElementModel); | |||
} else { | |||
throw new ExecutionException("<" + model.getType() + ">" | |||
+ " does not support the \"" + nestedElementName | |||
@@ -145,8 +145,6 @@ public class CoreExecService implements ExecService { | |||
frame.executeTask(task, aspectValues); | |||
} | |||
/** | |||
* 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. | |||
* @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 { | |||
// 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. | |||
* @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 { | |||
if (qualifiedName.equals(INCLUDE_ELEMENT)) { | |||
@@ -130,8 +130,8 @@ public class TargetHandler extends ModelElementHandler { | |||
* @param attributes The attributes attached to the element. | |||
* @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 { | |||
// everything is a task | |||
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.antcore.xml.ParseContext; | |||
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. | |||
@@ -78,7 +79,11 @@ public class XMLProjectParser { | |||
throws XMLParseException { | |||
try { | |||
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(); | |||
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 | |||
* 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. | |||
* @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 { | |||
// everything is a task | |||
throw new SAXParseException("<" + elementName + "> does not support a <" | |||
+ qualifiedName + "> nested element", getLocator()); | |||
} | |||
@@ -320,7 +336,6 @@ public abstract class ElementHandler extends DefaultHandler { | |||
protected abstract void processElement(String elementName) | |||
throws SAXParseException; | |||
/** | |||
* Process all of the attributes of the element into maps, one for | |||
* aspects and one for other attributes | |||
@@ -335,13 +350,14 @@ public abstract class ElementHandler extends DefaultHandler { | |||
elementAttributes = new AttributeCollection(); | |||
int length = attributes.getLength(); | |||
for (int i = 0; i < length; ++i) { | |||
String localName = attributes.getLocalName(i); | |||
String qName = attributes.getQName(i); | |||
String uri = attributes.getURI(i); | |||
if (uri != null && uri.trim().length() == 0) { | |||
uri = null; | |||
} | |||
String localName = attributes.getLocalName(i); | |||
String qName = attributes.getQName(i); | |||
if (uri == null) { | |||
if (qName.indexOf(":") != -1) { | |||
// try to resolve through known namespaces | |||
@@ -95,6 +95,7 @@ public class ParseContext { | |||
ClassLoader thisLoader = this.getClass().getClassLoader(); | |||
thread.setContextClassLoader(thisLoader); | |||
parserFactory = SAXParserFactory.newInstance(); | |||
parserFactory.setNamespaceAware(true); | |||
} finally { | |||
thread.setContextClassLoader(currentContextLoader); | |||
} | |||
@@ -131,7 +132,7 @@ public class ParseContext { | |||
// create a parser for this source | |||
SAXParser saxParser = null; | |||
Thread thread = Thread.currentThread(); | |||
ClassLoader currentContextLoader = thread.getContextClassLoader(); | |||
try { | |||
@@ -141,7 +142,7 @@ public class ParseContext { | |||
} finally { | |||
thread.setContextClassLoader(currentContextLoader); | |||
} | |||
XMLReader xmlReader = saxParser.getXMLReader(); | |||
// create a root handler for this | |||
@@ -54,6 +54,7 @@ | |||
package org.apache.ant.common.service; | |||
import java.net.URL; | |||
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.AttributeCollection; | |||
@@ -187,6 +188,49 @@ public interface ComponentService { | |||
Object createComponent(String libraryId, String localName) | |||
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 | |||
* | |||
@@ -62,6 +62,7 @@ import org.apache.ant.antcore.config.AntConfigHandler; | |||
import org.apache.ant.antcore.xml.ParseContext; | |||
import org.apache.ant.antcore.xml.XMLParseException; | |||
import org.apache.ant.init.InitUtils; | |||
import org.apache.ant.common.constants.Namespace; | |||
/** | |||
* Frontend Utilities methods and constants. | |||
@@ -113,6 +114,11 @@ public class FrontendUtils { | |||
URL configFileURL = InitUtils.getFileURL(configFile); | |||
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(); | |||
context.parse(configFileURL, "antconfig", configHandler); | |||