Initial code for dynamicConfiguratorNS. Change from patch the qualified name is given and not the prefix. PR: 28426 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@276473 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -486,13 +486,30 @@ public final class IntrospectionHelper implements BuildListener { | |||||
| public void setAttribute(Project p, Object element, String attributeName, | public void setAttribute(Project p, Object element, String attributeName, | ||||
| String value) throws BuildException { | String value) throws BuildException { | ||||
| AttributeSetter as | AttributeSetter as | ||||
| = (AttributeSetter) attributeSetters.get(attributeName); | |||||
| = (AttributeSetter) attributeSetters.get( | |||||
| attributeName.toLowerCase(Locale.US)); | |||||
| if (as == null) { | if (as == null) { | ||||
| if (element instanceof DynamicConfigurator) { | |||||
| if (element instanceof DynamicConfiguratorNS) { | |||||
| DynamicConfiguratorNS dc = (DynamicConfiguratorNS) element; | |||||
| String uriPlusPrefix = | |||||
| ProjectHelper.extractUriFromComponentName(attributeName); | |||||
| String uri = | |||||
| ProjectHelper.extractUriFromComponentName(uriPlusPrefix); | |||||
| String localName = | |||||
| ProjectHelper.extractNameFromComponentName(attributeName); | |||||
| String qName = ("".equals(uri) | |||||
| ? localName : (uri + ":" + localName)); | |||||
| dc.setDynamicAttribute(uri, localName, qName, value); | |||||
| return; | |||||
| } else if (element instanceof DynamicConfigurator) { | |||||
| DynamicConfigurator dc = (DynamicConfigurator) element; | DynamicConfigurator dc = (DynamicConfigurator) element; | ||||
| dc.setDynamicAttribute(attributeName, value); | |||||
| dc.setDynamicAttribute(attributeName.toLowerCase(Locale.US), value); | |||||
| return; | return; | ||||
| } else { | } else { | ||||
| if (attributeName.indexOf(':') != -1) { | |||||
| return; // Ignore attribute from unknown uri's | |||||
| } | |||||
| String msg = getElementName(p, element) | String msg = getElementName(p, element) | ||||
| + " doesn't support the \"" + attributeName | + " doesn't support the \"" + attributeName | ||||
| + "\" attribute."; | + "\" attribute."; | ||||
| @@ -512,6 +529,7 @@ public final class IntrospectionHelper implements BuildListener { | |||||
| throw new BuildException(t); | throw new BuildException(t); | ||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * Adds PCDATA to an element, using the element's | * Adds PCDATA to an element, using the element's | ||||
| @@ -574,7 +592,7 @@ public final class IntrospectionHelper implements BuildListener { | |||||
| private NestedCreator getNestedCreator( | private NestedCreator getNestedCreator( | ||||
| Project project, String parentUri, Object parent, | Project project, String parentUri, Object parent, | ||||
| String elementName) throws BuildException { | |||||
| String elementName, UnknownElement child) throws BuildException { | |||||
| String uri = ProjectHelper.extractUriFromComponentName(elementName); | String uri = ProjectHelper.extractUriFromComponentName(elementName); | ||||
| String name = ProjectHelper.extractNameFromComponentName(elementName); | String name = ProjectHelper.extractNameFromComponentName(elementName); | ||||
| @@ -593,6 +611,35 @@ public final class IntrospectionHelper implements BuildListener { | |||||
| if (nc == null) { | if (nc == null) { | ||||
| nc = createAddTypeCreator(project, parent, elementName); | nc = createAddTypeCreator(project, parent, elementName); | ||||
| } | } | ||||
| if (nc == null && parent instanceof DynamicConfiguratorNS) { | |||||
| DynamicConfiguratorNS dc = (DynamicConfiguratorNS) parent; | |||||
| String qName = (child == null ? name : child.getQName()); | |||||
| final Object nestedElement = | |||||
| dc.createDynamicElement( | |||||
| (child == null ? "" : child.getNamespace()), | |||||
| name, qName); | |||||
| if (nestedElement != null) { | |||||
| nc = new NestedCreator() { | |||||
| public boolean isPolyMorphic() { | |||||
| return false; | |||||
| } | |||||
| public Class getElementClass() { | |||||
| return null; | |||||
| } | |||||
| public Object getRealObject() { | |||||
| return null; | |||||
| } | |||||
| public Object create( | |||||
| Project project, Object parent, Object ignore) { | |||||
| return nestedElement; | |||||
| } | |||||
| public void store(Object parent, Object child) { | |||||
| } | |||||
| }; | |||||
| } | |||||
| } | |||||
| if (nc == null && parent instanceof DynamicConfigurator) { | if (nc == null && parent instanceof DynamicConfigurator) { | ||||
| DynamicConfigurator dc = (DynamicConfigurator) parent; | DynamicConfigurator dc = (DynamicConfigurator) parent; | ||||
| final Object nestedElement = | final Object nestedElement = | ||||
| @@ -649,7 +696,7 @@ public final class IntrospectionHelper implements BuildListener { | |||||
| */ | */ | ||||
| public Object createElement(Project project, Object parent, | public Object createElement(Project project, Object parent, | ||||
| String elementName) throws BuildException { | String elementName) throws BuildException { | ||||
| NestedCreator nc = getNestedCreator(project, "", parent, elementName); | |||||
| NestedCreator nc = getNestedCreator(project, "", parent, elementName, null); | |||||
| try { | try { | ||||
| Object nestedElement = nc.create(project, parent, null); | Object nestedElement = nc.create(project, parent, null); | ||||
| if (project != null) { | if (project != null) { | ||||
| @@ -688,7 +735,7 @@ public final class IntrospectionHelper implements BuildListener { | |||||
| Project project, String parentUri, Object parent, String elementName, | Project project, String parentUri, Object parent, String elementName, | ||||
| UnknownElement ue) { | UnknownElement ue) { | ||||
| NestedCreator nc = getNestedCreator( | NestedCreator nc = getNestedCreator( | ||||
| project, parentUri, parent, elementName); | |||||
| project, parentUri, parent, elementName, ue); | |||||
| return new Creator(project, parent, nc); | return new Creator(project, parent, nc); | ||||
| } | } | ||||
| @@ -703,6 +750,7 @@ public final class IntrospectionHelper implements BuildListener { | |||||
| public boolean supportsNestedElement(String elementName) { | public boolean supportsNestedElement(String elementName) { | ||||
| return nestedCreators.containsKey(elementName.toLowerCase(Locale.US)) | return nestedCreators.containsKey(elementName.toLowerCase(Locale.US)) | ||||
| || DynamicConfigurator.class.isAssignableFrom(bean) | || DynamicConfigurator.class.isAssignableFrom(bean) | ||||
| || DynamicConfiguratorNS.class.isAssignableFrom(bean) | |||||
| || addTypeMethods.size() != 0; | || addTypeMethods.size() != 0; | ||||
| } | } | ||||
| @@ -729,6 +777,7 @@ public final class IntrospectionHelper implements BuildListener { | |||||
| nestedCreators.containsKey(name.toLowerCase(Locale.US)) | nestedCreators.containsKey(name.toLowerCase(Locale.US)) | ||||
| && (uri.equals(parentUri))) // || uri.equals(""))) | && (uri.equals(parentUri))) // || uri.equals(""))) | ||||
| || DynamicConfigurator.class.isAssignableFrom(bean) | || DynamicConfigurator.class.isAssignableFrom(bean) | ||||
| || DynamicConfiguratorNS.class.isAssignableFrom(bean) | |||||
| || addTypeMethods.size() != 0; | || addTypeMethods.size() != 0; | ||||
| } | } | ||||
| @@ -56,6 +56,9 @@ public class ProjectHelper { | |||||
| /** The URI for defined types/tasks - the format is antlib:<package> */ | /** The URI for defined types/tasks - the format is antlib:<package> */ | ||||
| public static final String ANTLIB_URI = "antlib:"; | public static final String ANTLIB_URI = "antlib:"; | ||||
| /** Polymorphic attribute */ | |||||
| public static final String ANT_TYPE = "ant-type"; | |||||
| /** | /** | ||||
| * Name of JVM system property which provides the name of the | * Name of JVM system property which provides the name of the | ||||
| * ProjectHelper class to use. | * ProjectHelper class to use. | ||||
| @@ -40,9 +40,6 @@ import org.xml.sax.helpers.AttributeListImpl; | |||||
| */ | */ | ||||
| public class RuntimeConfigurable implements Serializable { | public class RuntimeConfigurable implements Serializable { | ||||
| /** Polymorphic attribute (May be XML NS attribute later) */ | |||||
| private static final String ANT_TYPE = "ant-type"; | |||||
| /** Name of the element to configure. */ | /** Name of the element to configure. */ | ||||
| private String elementTag = null; | private String elementTag = null; | ||||
| @@ -168,7 +165,7 @@ public class RuntimeConfigurable implements Serializable { | |||||
| * @param value the attribute's value. | * @param value the attribute's value. | ||||
| */ | */ | ||||
| public void setAttribute(String name, String value) { | public void setAttribute(String name, String value) { | ||||
| if (name.equalsIgnoreCase(ANT_TYPE)) { | |||||
| if (name.equalsIgnoreCase(ProjectHelper.ANT_TYPE)) { | |||||
| this.polyType = value; | this.polyType = value; | ||||
| } else { | } else { | ||||
| if (attributeNames == null) { | if (attributeNames == null) { | ||||
| @@ -353,7 +350,6 @@ public class RuntimeConfigurable implements Serializable { | |||||
| Object target = (wrappedObject instanceof TypeAdapter) | Object target = (wrappedObject instanceof TypeAdapter) | ||||
| ? ((TypeAdapter) wrappedObject).getProxy() : wrappedObject; | ? ((TypeAdapter) wrappedObject).getProxy() : wrappedObject; | ||||
| //PropertyHelper ph=PropertyHelper.getPropertyHelper(p); | |||||
| IntrospectionHelper ih = | IntrospectionHelper ih = | ||||
| IntrospectionHelper.getHelper(p, target.getClass()); | IntrospectionHelper.getHelper(p, target.getClass()); | ||||
| @@ -365,8 +361,7 @@ public class RuntimeConfigurable implements Serializable { | |||||
| // reflect these into the target | // reflect these into the target | ||||
| value = p.replaceProperties(value); | value = p.replaceProperties(value); | ||||
| try { | try { | ||||
| ih.setAttribute(p, target, | |||||
| name.toLowerCase(Locale.US), value); | |||||
| ih.setAttribute(p, target, name, value); | |||||
| } catch (BuildException be) { | } catch (BuildException be) { | ||||
| // id attribute must be set externally | // id attribute must be set externally | ||||
| if (!name.equals("id")) { | if (!name.equals("id")) { | ||||
| @@ -942,19 +942,22 @@ public class ProjectHelper2 extends ProjectHelper { | |||||
| = new RuntimeConfigurable(task, task.getTaskName()); | = new RuntimeConfigurable(task, task.getTaskName()); | ||||
| for (int i = 0; i < attrs.getLength(); i++) { | for (int i = 0; i < attrs.getLength(); i++) { | ||||
| String name = attrs.getLocalName(i); | |||||
| String attrUri = attrs.getURI(i); | String attrUri = attrs.getURI(i); | ||||
| if (attrUri != null | if (attrUri != null | ||||
| && !attrUri.equals("") | && !attrUri.equals("") | ||||
| && !attrUri.equals(uri)) { | && !attrUri.equals(uri)) { | ||||
| continue; // Ignore attributes from unknown uris | |||||
| name = attrUri + ":" + attrs.getQName(i); | |||||
| } | } | ||||
| String name = attrs.getLocalName(i); | |||||
| String value = attrs.getValue(i); | String value = attrs.getValue(i); | ||||
| // PR: Hack for ant-type value | // PR: Hack for ant-type value | ||||
| // an ant-type is a component name which can | // an ant-type is a component name which can | ||||
| // be namespaced, need to extract the name | // be namespaced, need to extract the name | ||||
| // and convert from qualified name to uri/name | // and convert from qualified name to uri/name | ||||
| if (name.equals("ant-type")) { | |||||
| if (ANT_TYPE.equals(name) | |||||
| || (ANT_CORE_URI.equals(attrUri) | |||||
| && ANT_TYPE.equals(attrs.getLocalName(i)))) { | |||||
| name = ANT_TYPE; | |||||
| int index = value.indexOf(":"); | int index = value.indexOf(":"); | ||||
| if (index != -1) { | if (index != -1) { | ||||
| String prefix = value.substring(0, index); | String prefix = value.substring(0, index); | ||||
| @@ -24,7 +24,7 @@ import org.w3c.dom.Node; | |||||
| import org.w3c.dom.Text; | import org.w3c.dom.Text; | ||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.tools.ant.DynamicConfigurator; | |||||
| import org.apache.tools.ant.DynamicConfiguratorNS; | |||||
| import org.apache.tools.ant.ProjectHelper; | import org.apache.tools.ant.ProjectHelper; | ||||
| /** | /** | ||||
| @@ -38,7 +38,7 @@ import org.apache.tools.ant.ProjectHelper; | |||||
| * | * | ||||
| * @since Ant 1.7 | * @since Ant 1.7 | ||||
| */ | */ | ||||
| public class XMLFragment implements DynamicConfigurator { | |||||
| public class XMLFragment implements DynamicConfiguratorNS { | |||||
| private Document doc; | private Document doc; | ||||
| private DocumentFragment fragment; | private DocumentFragment fragment; | ||||
| @@ -66,7 +66,7 @@ public class XMLFragment implements DynamicConfigurator { | |||||
| /** | /** | ||||
| * No attributes for the wrapping element. | * No attributes for the wrapping element. | ||||
| */ | */ | ||||
| public void setDynamicAttribute(String name, String value) | |||||
| public void setDynamicAttribute(String uri, String name, String qName, String value) | |||||
| throws BuildException { | throws BuildException { | ||||
| throw new BuildException("Attribute " + name + " is not supported."); | throw new BuildException("Attribute " + name + " is not supported."); | ||||
| } | } | ||||
| @@ -74,10 +74,8 @@ public class XMLFragment implements DynamicConfigurator { | |||||
| /** | /** | ||||
| * Creates a nested element. | * Creates a nested element. | ||||
| */ | */ | ||||
| public Object createDynamicElement(String name) { | |||||
| Element e = doc | |||||
| .createElementNS(ProjectHelper.extractUriFromComponentName(name), | |||||
| ProjectHelper.extractNameFromComponentName(name)); | |||||
| public Object createDynamicElement(String uri, String name, String qName) { | |||||
| Element e = doc.createElementNS(uri, qName); | |||||
| fragment.appendChild(e); | fragment.appendChild(e); | ||||
| return new Child(e); | return new Child(e); | ||||
| } | } | ||||
| @@ -89,7 +87,7 @@ public class XMLFragment implements DynamicConfigurator { | |||||
| } | } | ||||
| } | } | ||||
| public class Child implements DynamicConfigurator { | |||||
| public class Child implements DynamicConfiguratorNS { | |||||
| private Element e; | private Element e; | ||||
| Child(Element e) { | Child(Element e) { | ||||
| @@ -106,19 +104,25 @@ public class XMLFragment implements DynamicConfigurator { | |||||
| /** | /** | ||||
| * Sets the attribute | * Sets the attribute | ||||
| */ | */ | ||||
| public void setDynamicAttribute(String name, String value) { | |||||
| e.setAttribute(name, value); | |||||
| public void setDynamicAttribute( | |||||
| String uri, String name, String qName, String value) { | |||||
| if (uri.equals("")) { | |||||
| e.setAttribute(name, value); | |||||
| } else { | |||||
| e.setAttributeNS(uri, qName, value); | |||||
| } | |||||
| } | } | ||||
| /** | /** | ||||
| * Creates a nested element. | * Creates a nested element. | ||||
| */ | */ | ||||
| public Object createDynamicElement(String name) { | |||||
| Element e2 = doc | |||||
| .createElementNS(ProjectHelper | |||||
| .extractUriFromComponentName(name), | |||||
| ProjectHelper | |||||
| .extractNameFromComponentName(name)); | |||||
| public Object createDynamicElement(String uri, String name, String qName) { | |||||
| Element e2 = null; | |||||
| if (uri.equals("")) { | |||||
| e2 = doc.createElement(name); | |||||
| } else { | |||||
| e2 = doc.createElementNS(uri, qName); | |||||
| } | |||||
| e.appendChild(e2); | e.appendChild(e2); | ||||
| return new Child(e2); | return new Child(e2); | ||||
| } | } | ||||