[jdom-interest] NullPointerException in Element.setAttribute(final String name, final String value, final Namespace ns)

Rolf Lear jdom at tuis.net
Fri Apr 6 16:38:35 PDT 2012


Hi Gisella

Yes, I can see now where the change is. It happened between JDOM 1.0 and 
1.1, back in 2006 ... 
https://github.com/hunterhacker/jdom/commit/b48373d95cd91986f83ac5345566258d80e88027#L0R1139

In fact, this issue has been reported before: 
http://markmail.org/message/atybnwqqvlxk7ut4 and there was never any 
follow-up...

So, I can see the problem, and it still exists in JDOM 2.x.

But, I can't see an easy fix.

I am of the opinion that null input values deserve a 
NullPointerException unless documented that nulls are allowed... but I 
also recognize that compatibility is important, and JDOM has some 
consistency in it when treating null Namespace values
as Namespace.NO_NAMESPACE.

So, I am going to think about it for a moment.... but, I would not 
expect a fix in the short term for JDOM 1.x. Even in the best 
circumstances it would take a month or so to get a 1.1.4 out...

For JDOM 2.x, it is also very late in the game.... too late, in fact.

In order to fix it properly I would have to decide on a strategy for 
dealing with null Namespace input. A quick 'poll' of the JDOM 2.x code 
suggests:


Change null to NO_NAMESPACE:
----------------------------
Element Constructor.
Element.setNamespace(Namespace)


Treats null as 'wildcard':
--------------------------
Element.getChild(String,Namespace)
Element.getChildren(String,Namespace)
Element.getChildText*(String,Namespace)
Element.removeChild(String,Namespace)
Element.removeChildren(String,Namespace)


Just ignores it.
----------------
Element.removeNamespaceDeclaration(Namespace)


Throws NPE:
-----------
Element.addNamespaceDeclaration(Namespace)
Element.getAttribute(String,Namespace)
Element.getAttributeValue(String,Namespace);
Element.getAttributeValue(String,Namespace, String);
Element.removeAttribute(String,Namespace);
Element.setAttribute(String,String,Namespace)


I think, having looked at the 'poll' results, when it comes to 
Attributes, the NPE is the 'right' thing.

Given that getAttribute(String,Namespace) throws NPE (and 
removeAttribute), and they have 'always' thrown NPE, I think it is 
logical that setAttribute(String,String,Namespace) throws NPE too.

Bottom line is that I am not convinced that it is a bug in 1.1.3. 
Perhaps it was a bug in 1.0 to allow the null.

So, this all comes around to the 'push-back' option. How difficult is it 
for you to do the null-check yourself before you call setAttribute()?

That is the obvious workaround, and it is the 'right thing'....

Rolf




On 06/04/2012 5:53 PM, gisella.saavedra at navis.com wrote:
> the stack trace belongs to JDOM 1.1.3
>
> -----Original Message-----
> From: Saavedra Gisella
> Sent: Friday, April 06, 2012 2:49 PM
> To: 'Rolf Lear'
> Cc: jdom-interest at jdom.org
> Subject: RE: [jdom-interest] NullPointerException in Element.setAttribute(final String name, final String value, final Namespace ns)
>
> Rolf,
>
> I believe you might be looking at the wrong method:
>
> This is JDOM 1.0  (ns is passed as null)
>
>     public Element setAttribute(String name, String value, Namespace ns) {
>          return setAttribute(new Attribute(name, value, ns));
>      }
>
> Inside this code, the constructor new Attribute(name, value, ns) calls:
>
> public Attribute(String name, String value, Namespace namespace) {
>          setName(name);
>          setValue(value);
>          setNamespace(namespace);
>      }
>
> Here setNamespace(namespace) calls:
> public Attribute setNamespace(Namespace namespace) {
>          if (namespace == null) {
>              namespace = Namespace.NO_NAMESPACE;
>          }
>
>          // Verify the attribute isn't trying to be in a default namespace
>          // Attributes can't be in a default namespace
>          if (namespace != Namespace.NO_NAMESPACE&&
>              namespace.getPrefix().equals("")) {
>              throw new IllegalNameException("", "attribute namespace",
>                  "An attribute namespace without a prefix can only be the " +
>                  "NO_NAMESPACE namespace");
>          }
>          this.namespace = namespace;
>          return this;
>      }
>
> where namespace being null is set to NO_NAMESPACE.
>
>
>
>
> Stack trace (JODM 1.1.3):
>
> java.lang.NullPointerException
>      at org.jdom.AttributeList.indexOf(AttributeList.java:378)
>      at org.jdom.AttributeList.get(AttributeList.java:366)
>      at org.jdom.Element.getAttribute(Element.java:1004)
>      at org.jdom.Element.setAttribute(Element.java:1178)
>      at com.navis.argo.business.snx.AbstractXmlExporter.setAttribute(AbstractXmlExporter.java:40)
>
>
> --------------
>
>
> -----Original Message-----
> From: Rolf Lear [mailto:jdom at tuis.net]
> Sent: Friday, April 06, 2012 2:40 PM
> To: Saavedra Gisella
> Cc: jdom-interest at jdom.org
> Subject: Re: [jdom-interest] NullPointerException in Element.setAttribute(final String name, final String value, final Namespace ns)
>
> Hi Gisella.
>
> I have looked through the JDOM 1.0 code. JDOM 1.0 was released in
> September 2004. Here's the code as it was at the time:
>
> Here's the getAttribute method:
> https://github.com/hunterhacker/jdom/blob/jdom-1.0/core/src/java/org/jdom/Element.java#L980
>
> Here's the attributes.get(String,Namespace) method:
> https://github.com/hunterhacker/jdom/blob/jdom-1.0/core/src/java/org/jdom/AttributeList.java#L365
>
> And that calls the indexOf(String,Namespace) method:
> https://github.com/hunterhacker/jdom/blob/jdom-1.0/core/src/java/org/jdom/AttributeList.java#L377
>
> Which calls namespace.getURI().
>
> The way I see it is that JDOM 1.0 would always throw a
> NullPointerException if you gave it a null Namespace.
>
> I don't think it would have ever worked in JDOM 1.0...
>
> Did you have your own custom build of JDOM 1.0?
>
> Rolf
>
> On 06/04/2012 5:08 PM, Rolf Lear wrote:
>> Hi Gisella.
>>
>> Is it possible to send us a stack trace, at least the parts including
>> the org.jdom.* code.
>>
>> Thanks
>>
>> Rolf
>>
>>
>> On 06/04/2012 1:43 PM, gisella.saavedra at navis.com wrote:
>>> I just upgraded from jdom 1.0 to jdom 1.1.3
>>>
>>> and I was setting an attribute where the namespace was NULL.
>>>
>>> The old code was different, it was NOT calling get(...), so it was setting
>>> the namespace to namespace.NO_NAMESPACE when the namespace was NULL,
>>>
>>> before calling this get(...)
>>>
>>> but the new code, when it calls getAttribute(name, ns) (first line of
>>> method described)
>>>
>>> is getting a null pointer on the namespace.
>>>
>>> Probably the namespace needs to be set to NO_NAMESPACE before calling
>>> get(..) when it is NULL.
>>>
>>> *Gisella Saavedra**
>>> *Framework Team
>>> _gsaavedra at navis.com<mailto:gsaavedra at navis.com>_
>>>
>>>
>>>
>>> http://www.navis.com/images/spacer.gif
>>>
>>> 1000 Broadway, Suite 150, Oakland, CA 94607 | T+1 510 267 5123 T Main+1
>>> 510 267 5000 F+1 510 267 5100 | _http://www.navis.com
>>> <http://www.navis.com/>_
>>>
>>>
>>>
>>> _______________________________________________
>>> To control your jdom-interest membership:
>>> http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.com
>>
>> _______________________________________________
>> To control your jdom-interest membership:
>> http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.com
>>
>



More information about the jdom-interest mailing list