[jdom-interest] equality of Namespaces

Szegedi, Attila szegedi at scriptum.hu
Mon Jul 30 01:35:09 PDT 2001


To correct myself, Namespaces do actually use semantic comparison (they
compare equal if their URIs compare equal), however it's not the comparison
but the interning in the factory method that causes the behavior you
observed.

Attila.

> -----Original Message-----
> From: jdom-interest-admin at jdom.org
> [mailto:jdom-interest-admin at jdom.org]On Behalf Of Szegedi, Attila
> Sent: Monday, July 30, 2001 10:06 AM
> To: 'bob mcwhirter'; jdom-interest at jdom.org
> Subject: RE: [jdom-interest] equality of Namespaces
>
>
> Namespace doesn't use semantic comparison; rather Namespace
> objects are
> interned by the Namespace factory method Namespace.getNamespace(String
> prefix, String uri), so the two bar elements actually share a single
> Namespace object.
>
> Attila.
>
> > -----Original Message-----
> > From: jdom-interest-admin at jdom.org
> > [mailto:jdom-interest-admin at jdom.org]On Behalf Of bob mcwhirter
> > Sent: Saturday, July 28, 2001 2:42 PM
> > To: jdom-interest at jdom.org
> > Subject: [jdom-interest] equality of Namespaces
> >
> >
> >
> > Given a document:
> >
> > 	<foo>
> > 		<bar xmlns:bar="http://bar.org/"/>
> > 		<bar xmlns:bar="http://bar.org/"/>
> > 	</foo>
> >
> > And an XPath of
> >
> > 	//namespace::*
> >
> > I beleive I should select a NodeSet of two Namespace
> > nodes, both of which have the same prefix and URI
> > (but, different parents).
> >
> > Internally, maybe I'm using a HashSet to maintain
> > the NodeSet semantics of unordered/unique nodes.
> >
> > With the currently implementation of Namespace, the
> > equals() and hashCode() which are used by HashSet
> > (and the underlying HashMap) result in one of the
> > Namespace objects not being included, since it's
> > semantically a duplicate.
> >
> > Since JDOM uses identity comparison on pretty much
> > all other objects, why are we doing semantic comparison
> > with Namespaces?
> >
> > I'd argue that Namespace should follow Element and
> > other identity-based equality comparisons.
> >
> > Currently, they are compared as identical, due to the
> > fact we're losing information in their construction.
> > Once you lose the parentage information, they become
> > semantically equivelent.  If we were tracking parentages,
> > then even a semantic equivelent would disappear, since
> > equals() would appear more like:
> >
> >     public boolean equals(Object ob) {
> >         if (ob == null) {
> >             return false;
> >         }
> >
> >         if (ob instanceof Namespace) {
> >             Namespace ns = (Namespace)ob;
> >             // Compare URIs
> >             if (ns.getURI().equals(uri)
> >                 && ns.getPrefix().equals(prefix)
> >                 && ns.getParent().equals(parent)) {
> >                 return true;
> >             }
> >         }
> >         return false;
> >     }
> >
> >
> > This might not be a problem if we all lived in a
> > java 1.4 world, where IdentityHashMap exists, but,
> > we don't.
> >
> > Comments?
> >
> > 	-bob
> >
> > (fwiw, dom4j suffers from this too)
> >
> > _______________________________________________
> > To control your jdom-interest membership:
> > http://lists.denveronline.net/mailman/options/jdom-interest/yo
> uraddr at yourhost.com
>
> _______________________________________________
> To control your jdom-interest membership:
> http://lists.denveronline.net/mailman/options/jdom-interest/yo
uraddr at yourhost.com




More information about the jdom-interest mailing list