ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Antoine Lévy-Lambert <anto...@antbuild.com>
Subject Re: DynamicConfigurator namespace problem
Date Wed, 17 Dec 2003 15:40:40 GMT
Thanks Peter,

cheers,

Antoine

Peter Reilly wrote:

> I think we can leave macrodef the way it is now for
> the future.
>
> I will make minor changes to the default namespace to
> allow a future NS dynamic configurator to work correct.
>
> I will also make changes to the 1.6 new public methods of
> Introspection helper to allow a future NS dynamic configurator
> to work.
>
> Peter
> Antoine Levy-Lambert wrote:
>
>> Hi Peter,
>>
>> How serious is the problem ?
>>
>> Will we be able to fix the problem in a minor release without 
>> breaking the
>> backward compatibility ?
>>
>> Cheers,
>> Antoine
>> ----- Original Message -----
>> From: "Peter Reilly" <peter.reilly@corvil.com>
>> To: "Ant Developers List" <dev@ant.apache.org>
>> Sent: Tuesday, December 16, 2003 9:04 PM
>> Subject: Re: DynamicConfigurator namespace problem
>>
>>
>>  
>>
>>> Stefan Bodewig wrote:
>>>
>>>   
>>>
>>>> On Fri, 12 Dec 2003, Christopher Lenz <cmlenz@gmx.de> wrote:
>>>>
>>>>
>>>>
>>>>     
>>>>
>>>>> public class DynamicConfiguratorNS {
>>>>>
>>>>>
>>>>>       
>>>>
>>>> looks fine to me.
>>>>
>>>>
>>>>
>>>>     
>>>>
>>>>> I don't think this interface should extend DynamicConfigurator.
>>>>>
>>>>>
>>>>>       
>>>>
>>>> Same here.
>>>>
>>>> I'd also like Ant to pass element and attribute names in as they are,
>>>> i.e. without changing their case in any way.
>>>>
>>>>
>>>>     
>>>
>>> I have code for this, however I am uneasy about placing it
>>> it ANT for 1.6, without a new beta release.
>>>
>>> The interface is:
>>>
>>> public interface DynamicConfiguratorNS {
>>>    void setDynamicAttribute(String uri, String qualifiedName,
>>>                             String value)
>>>            throws BuildException;
>>>    Object createDynamicElement(
>>>        String uri, String localName) throws BuildException;
>>> }
>>>
>>>
>>> The prefix is not set. - It is possible to get it for the element
>>> but not (without more major changes) for the attributes.
>>>
>>> One issue with the patch is that if the namespace of
>>> the attribute is the same as the element, the namespace URI
>>> is replaced with a "".
>>>
>>> For an example:
>>>
>>> public class DTest2 extends Task implements DynamicConfiguratorNS {
>>>    public Object createDynamicElement(
>>>        String uri,
>>>        String localName) {
>>>        System.out.println("Element  {" + uri  +", " + localName + "}");
>>>        return new DTest2();
>>>    }
>>>    public void setDynamicAttribute(
>>>        String uri,
>>>        String localName,
>>>        String value) {
>>>        System.out.println("Attribute {" + uri  +", " + localName + 
>>> "}");
>>>    }
>>> }
>>>
>>>    <dtest x="b" ant:b="b"  xmlns:ant="antlib:org.apache.tools.ant"/>
>>> will print:
>>> Attribute {, x}
>>> Attribute {antlib:org.apache.tools.ant, b}
>>>
>>> and
>>>    <dtest x="b" ant:b="b"  xmlns:ant="antlib:org.apache.tools.ant"
>>>           xmlns="antlib:org.apache.tools.ant"/>
>>> will print
>>> Attribute {, x}
>>> Attribute {, b}
>>>
>>> Another Namespace issue is the handling of the ant core uri by the
>>> code. Currently the code sets this to "" at an early stage.
>>> It however should be retained in the system (ie. whether
>>> the namespace URI of an element  is "" or 
>>> "antlib:org.apache.tools.ant").
>>>
>>>
>>> For ant 1.6 (and beyond) we can make macrodef namespace  independent,
>>> without
>>> this patch.
>>>
>>> So for example:
>>>
>>>    <macrodef name="example">
>>>      <element name="element"/>
>>>      <sequential>
>>>        <element/>
>>>      </sequential>
>>>    </macrodef>
>>>
>>> In a antlib  referred to by a namespace prefix x, the following
>>> would work:
>>>
>>> <x:example>
>>>   <x:element>
>>>      <echo>Hello world</echo>
>>>   </x:element>
>>> </x:example>
>>>
>>>
>>> And the following would work:
>>>
>>> <x:example>
>>>   <element>
>>>      <echo>Hello world</echo>
>>>   </element>
>>> </x:example>
>>>
>>> Peter
>>>
>>>   
>>
>>
>>
>> ---------------------------------------------------------------------------- 
>>
>> ----
>>
>>
>>  
>>
>>> Index: src/main/org/apache/tools/ant/IntrospectionHelper.java
>>> ===================================================================
>>> RCS file:
>>>   
>>
>> /home/cvs/ant/src/main/org/apache/tools/ant/IntrospectionHelper.java,v
>>  
>>
>>> retrieving revision 1.69
>>> diff -u -r1.69 IntrospectionHelper.java
>>> --- src/main/org/apache/tools/ant/IntrospectionHelper.java 11 Dec 2003
>>>   
>>
>> 17:21:05 -0000 1.69
>>  
>>
>>> +++ src/main/org/apache/tools/ant/IntrospectionHelper.java 16 Dec 2003
>>>   
>>
>> 19:27:25 -0000
>>  
>>
>>> @@ -517,13 +517,24 @@
>>>     public void setAttribute(Project p, Object element, String
>>>   
>>
>> attributeName,
>>  
>>
>>>                              String value) throws BuildException {
>>>         AttributeSetter as
>>> -            = (AttributeSetter) attributeSetters.get(attributeName);
>>> +            = (AttributeSetter) attributeSetters.get(
>>> +                attributeName.toLowerCase(Locale.US));
>>>         if (as == null) {
>>> -            if (element instanceof DynamicConfigurator) {
>>> +            if (element instanceof DynamicConfiguratorNS) {
>>> +                DynamicConfiguratorNS dc = (DynamicConfiguratorNS)
>>>   
>>
>> element;
>>  
>>
>>> +                dc.setDynamicAttribute(
>>> +
>>>   
>>
>> ProjectHelper.extractUriFromComponentName(attributeName),
>>  
>>
>>> +
>>>   
>>
>> ProjectHelper.extractNameFromComponentName(attributeName),
>>  
>>
>>> +                    value);
>>> +                return;
>>> +            } else if (element instanceof DynamicConfigurator) {
>>>                 DynamicConfigurator dc = (DynamicConfigurator) element;
>>> -                dc.setDynamicAttribute(attributeName, value);
>>> +
>>>   
>>
>> dc.setDynamicAttribute(attributeName.toLowerCase(Locale.US), value);
>>  
>>
>>>                 return;
>>>             } else {
>>> +                if (attributeName.indexOf(':') != -1) {
>>> +                    return; // Ignore attribute from unknown uri's
>>> +                }
>>>                 String msg = getElementName(p, element)
>>>                     + " doesn't support the \"" + attributeName
>>>                     + "\" attribute.";
>>> @@ -543,6 +554,7 @@
>>>             throw new BuildException(t);
>>>         }
>>>     }
>>> +
>>>
>>>     /**
>>>      * Adds PCDATA to an element, using the element's
>>> @@ -611,6 +623,9 @@
>>>         if (nc == null) {
>>>             nc = createAddTypeCreator(project, parent, elementName);
>>>         }
>>> +        if (nc == null && parent instanceof DynamicConfiguratorNS) {
>>> +            throw new BuildException("SHOULD NOT BE HERE");
>>> +        }
>>>         if (nc == null && parent instanceof DynamicConfigurator) {
>>>             DynamicConfigurator dc = (DynamicConfigurator) parent;
>>>             final Object nestedElement =
>>>   
>>
>> dc.createDynamicElement(elementName);
>>  
>>
>>> @@ -644,7 +659,7 @@
>>>
>>>     private NestedCreator getNestedCreator(
>>>         Project project, String parentUri, Object parent,
>>> -        String elementName) throws BuildException {
>>> +        String elementName, UnknownElement child) throws 
>>> BuildException {
>>>
>>>         String uri =
>>>   
>>
>> ProjectHelper.extractUriFromComponentName(elementName);
>>  
>>
>>>         String name =
>>>   
>>
>> ProjectHelper.extractNameFromComponentName(elementName);
>>  
>>
>>> @@ -657,6 +672,33 @@
>>>         if (nc == null) {
>>>             nc = createAddTypeCreator(project, parent, elementName);
>>>         }
>>> +        if (nc == null && parent instanceof DynamicConfiguratorNS) {
>>> +            DynamicConfiguratorNS dc = (DynamicConfiguratorNS) parent;
>>> +            final Object nestedElement =
>>> +                dc.createDynamicElement(
>>> +                    child.getNamespace(), child.getTag());
>>> +            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) {
>>>             DynamicConfigurator dc = (DynamicConfigurator) parent;
>>>             final Object nestedElement =
>>> @@ -747,9 +789,10 @@
>>>      */
>>>
>>>     public Creator getElementCreator(
>>> -        Project project, String parentUri, Object parent, String
>>>   
>>
>> elementName) {
>>  
>>
>>> +        Project project, String parentUri, Object parent, String
>>>   
>>
>> elementName,
>>  
>>
>>> +        UnknownElement child) {
>>>         NestedCreator nc = getNestedCreator(
>>> -            project, parentUri, parent, elementName);
>>> +            project, parentUri, parent, elementName, child);
>>>         return new Creator(project, parent, nc);
>>>     }
>>>
>>> @@ -764,6 +807,7 @@
>>>     public boolean supportsNestedElement(String elementName) {
>>>         return
>>>   
>>
>> nestedCreators.containsKey(elementName.toLowerCase(Locale.US))
>>  
>>
>>>             || DynamicConfigurator.class.isAssignableFrom(bean)
>>> +            || DynamicConfiguratorNS.class.isAssignableFrom(bean)
>>>             || addTypeMethods.size() != 0;
>>>     }
>>>
>>> @@ -784,6 +828,7 @@
>>>             nestedCreators.containsKey(name.toLowerCase(Locale.US))
>>>             && (uri.equals(parentUri))) // || uri.equals("")))
>>>             || DynamicConfigurator.class.isAssignableFrom(bean)
>>> +            || DynamicConfiguratorNS.class.isAssignableFrom(bean)
>>>             || addTypeMethods.size() != 0;
>>>     }
>>>
>>> Index: src/main/org/apache/tools/ant/RuntimeConfigurable.java
>>> ===================================================================
>>> RCS file:
>>>   
>>
>> /home/cvs/ant/src/main/org/apache/tools/ant/RuntimeConfigurable.java,v
>>  
>>
>>> retrieving revision 1.46
>>> diff -u -r1.46 RuntimeConfigurable.java
>>> --- src/main/org/apache/tools/ant/RuntimeConfigurable.java 6 Nov 2003
>>>   
>>
>> 09:04:08 -0000 1.46
>>  
>>
>>> +++ src/main/org/apache/tools/ant/RuntimeConfigurable.java 16 Dec 2003
>>>   
>>
>> 19:27:25 -0000
>>  
>>
>>> @@ -206,7 +206,8 @@
>>>      * @param value the attribute's value.
>>>      */
>>>     public void setAttribute(String name, String value) {
>>> -        if (name.equalsIgnoreCase(ANT_TYPE)) {
>>> +        if (name.equalsIgnoreCase(ANT_TYPE) || name.equalsIgnoreCase(
>>> +                ProjectHelper.ANT_CORE_URI + ":" + ANT_TYPE)) {
>>>             this.polyType = value;
>>>         } else {
>>>             if (attributeNames == null) {
>>> @@ -391,7 +392,6 @@
>>>         Object target = (wrappedObject instanceof TypeAdapter)
>>>             ? ((TypeAdapter) wrappedObject).getProxy() : wrappedObject;
>>>
>>> -        //PropertyHelper ph=PropertyHelper.getPropertyHelper(p);
>>>         IntrospectionHelper ih =
>>>             IntrospectionHelper.getHelper(p, target.getClass());
>>>
>>> @@ -403,8 +403,7 @@
>>>                 // reflect these into the target
>>>                 value = p.replaceProperties(value);
>>>                 try {
>>> -                    ih.setAttribute(p, target,
>>> -                                    name.toLowerCase(Locale.US), 
>>> value);
>>> +                    ih.setAttribute(p, target, name, value);
>>>                 } catch (BuildException be) {
>>>                     // id attribute must be set externally
>>>                     if (!name.equals("id")) {
>>> Index: src/main/org/apache/tools/ant/UnknownElement.java
>>> ===================================================================
>>> RCS file:
>>>   
>>
>> /home/cvs/ant/src/main/org/apache/tools/ant/UnknownElement.java,v
>>  
>>
>>> retrieving revision 1.70
>>> diff -u -r1.70 UnknownElement.java
>>> --- src/main/org/apache/tools/ant/UnknownElement.java 24 Nov 2003
>>>   
>>
>> 09:15:41 -0000 1.70
>>  
>>
>>> +++ src/main/org/apache/tools/ant/UnknownElement.java 16 Dec 2003
>>>   
>>
>> 19:27:25 -0000
>>  
>>
>>> @@ -564,7 +564,8 @@
>>>             child.getNamespace(), child.getTag());
>>>         if (ih.supportsNestedElement(parentUri, childName)) {
>>>             IntrospectionHelper.Creator creator =
>>> -                ih.getElementCreator(getProject(), parentUri, parent,
>>>   
>>
>> childName);
>>  
>>
>>> +                ih.getElementCreator(
>>> +                    getProject(), parentUri, parent, childName, 
>>> child);
>>>             creator.setPolyType(childWrapper.getPolyType());
>>>             Object realChild = creator.create();
>>>             if (realChild instanceof PreSetDef.PreSetDefinition) {
>>> Index: src/main/org/apache/tools/ant/helper/ProjectHelper2.java
>>> ===================================================================
>>> RCS file:
>>>   
>>
>> /home/cvs/ant/src/main/org/apache/tools/ant/helper/ProjectHelper2.java,v
>>  
>>
>>> retrieving revision 1.37
>>> diff -u -r1.37 ProjectHelper2.java
>>> --- src/main/org/apache/tools/ant/helper/ProjectHelper2.java 18 Nov 
>>> 2003
>>>   
>>
>> 17:06:58 -0000 1.37
>>  
>>
>>> +++ src/main/org/apache/tools/ant/helper/ProjectHelper2.java 16 Dec 
>>> 2003
>>>   
>>
>> 19:27:25 -0000
>>  
>>
>>> @@ -484,9 +484,6 @@
>>>          */
>>>         public void startElement(String uri, String tag, String qname,
>>>   
>>
>> Attributes attrs)
>>  
>>
>>>             throws SAXParseException {
>>> -            if (uri.equals(ANT_CORE_URI)) {
>>> -                uri = "";
>>> -            }
>>>             AntHandler next
>>>                 = currentHandler.onStartChild(uri, tag, qname, attrs,
>>>   
>>
>> context);
>>  
>>
>>>             antHandlers.push(currentHandler);
>>> @@ -519,9 +516,6 @@
>>>          *
>>>          */
>>>         public void endElement(String uri, String name, String qName)
>>>   
>>
>> throws SAXException {
>>  
>>
>>> -            if (uri.equals(ANT_CORE_URI)) {
>>> -                uri = "";
>>> -            }
>>>             currentHandler.onEndElement(uri, name, context);
>>>             AntHandler prev = (AntHandler) antHandlers.pop();
>>>             currentHandler = prev;
>>> @@ -585,7 +579,8 @@
>>>                                        Attributes attrs,
>>>                                        AntXMLContext context)
>>>             throws SAXParseException {
>>> -            if (name.equals("project") && uri.equals("")) {
>>> +            if (name.equals("project")
>>> +                && (uri.equals("") || uri.equals(ANT_CORE_URI))) {
>>>                 return ProjectHelper2.projectHandler;
>>>             } else {
>>> //                 if (context.importlevel > 0) {
>>> @@ -756,7 +751,8 @@
>>>                                        Attributes attrs,
>>>                                        AntXMLContext context)
>>>             throws SAXParseException {
>>> -            if (name.equals("target") && uri.equals("")) {
>>> +            if (name.equals("target")
>>> +                && (uri.equals("") || uri.equals(ANT_CORE_URI))) {
>>>                 return ProjectHelper2.targetHandler;
>>>             } else {
>>>                 return ProjectHelper2.elementHandler;
>>> @@ -979,19 +975,20 @@
>>>                 = new RuntimeConfigurable(task, task.getTaskName());
>>>
>>>             for (int i = 0; i < attrs.getLength(); i++) {
>>> +                String name = attrs.getLocalName(i);
>>>                 String attrUri = attrs.getURI(i);
>>>                 if (attrUri != null
>>>                     && !attrUri.equals("")
>>>                     && !attrUri.equals(uri)) {
>>> -                    continue; // Ignore attributes from unknown uris
>>> +                    name = attrUri + ":" + name;
>>>                 }
>>> -                String name = attrs.getLocalName(i);
>>>                 String value = attrs.getValue(i);
>>>                 // PR: Hack for ant-type value
>>>                 //  an ant-type is a component name which can
>>>                 // be namespaced, need to extract the name
>>>                 // and convert from qualified name to uri/name
>>> -                if (name.equals("ant-type")) {
>>> +                if (name.equals("ant-type")
>>> +                    || name.equals(ANT_CORE_URI + ":ant-type")) {
>>>                     int index = value.indexOf(":");
>>>                     if (index != -1) {
>>>                         String prefix = value.substring(0, index);
>>>
>>>
>>>   
>>
>>
>>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Mime
View raw message