[jdom-interest] Element.clone() - code questions
Victor Toni
victor.toni at ebuconnect.de
Fri Nov 26 16:22:08 PST 2004
I was browsing the code to see what happens if Element.clone() gets called.
The clone method has this snippets:
-----------
...
// Cloning additional namespaces
if (additionalNamespaces != null) {
int additionalSize = additionalNamespaces.size();
element.additionalNamespaces = new ArrayList(additionalSize);
for (int i = 0; i < additionalSize; i++) {
Object additional = additionalNamespaces.get(i);
element.additionalNamespaces.add(additional);
}
}
...
// cloning content
...
// Handle additional namespaces
if (additionalNamespaces != null) {
// Avoid additionalNamespaces.clone() because List isn't Cloneable
element.additionalNamespaces = new ArrayList();
element.additionalNamespaces.addAll(additionalNamespaces);
}
-----------
Maybe I'm missing something but shouldn't this code be executed only once?
I changed the clone method to the code below and it still works (or
seems to :)
------------------------
public Object clone() {
// Ken Rune Helland <kenh at csc.no> is our local clone() guru
final Element element = (Element) super.clone();
// name and namespace are references to immutable objects
// so super.clone() handles them ok
// Reference to parent is copied by super.clone()
// (Object.clone()) so we have to remove it
// Actually, super is a Content, which has already detached in the
// clone().
// element.parent = null;
// Reference to content list and attribute lists are copyed by
// super.clone() so we set it new lists if the original had lists
element.content = new ContentList(element);
element.attributes = new AttributeList(element);
// Cloning attributes
if ( attributes != null ) {
for( int i = 0; i < attributes.size(); i++ ) {
final Attribute attribute = (Attribute) attributes.get(i);
element.attributes.add(attribute.clone());
}
}
// Cloning additional namespaces
if ( additionalNamespaces != null ) {
element.additionalNamespaces = new
ArrayList(additionalNamespaces);
}
// Cloning content
if ( content != null ) {
for( int i = 0; i < content.size(); i++ ) {
final Content c = (Content) content.get(i);
element.content.add(c.clone());
}
}
return element;
}
------------------------
Kindest regards,
Victor
More information about the jdom-interest
mailing list