Clover coverage report - dom4j - 1.6.1
Coverage timestamp: ma mei 16 2005 14:23:01 GMT+01:00
file stats: LOC: 321   Methods: 28
NCLOC: 182   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
IndexedElement.java 0% 0% 0% 0%
coverage
 1    /*
 2    * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
 3    *
 4    * This software is open source.
 5    * See the bottom of this file for the licence.
 6    */
 7   
 8    package org.dom4j.util;
 9   
 10    import java.util.ArrayList;
 11    import java.util.HashMap;
 12    import java.util.Iterator;
 13    import java.util.List;
 14    import java.util.Map;
 15   
 16    import org.dom4j.Attribute;
 17    import org.dom4j.Element;
 18    import org.dom4j.Node;
 19    import org.dom4j.QName;
 20    import org.dom4j.tree.BackedList;
 21    import org.dom4j.tree.DefaultElement;
 22   
 23    /**
 24    * <p>
 25    * <code>IndexedElement</code> is an implementation of {@link Element}which
 26    * maintains an index of the attributes and elements it contains to optimise
 27    * lookups via name.
 28    * </p>
 29    *
 30    * @author <a href="mailto:james.strachan@metastuff.com">James Strachan </a>
 31    * @version $Revision: 1.10 $
 32    */
 33    public class IndexedElement extends DefaultElement {
 34    /** Lazily constructed index for elements */
 35    private Map elementIndex;
 36   
 37    /** Lazily constructed index for attributes */
 38    private Map attributeIndex;
 39   
 40  0 public IndexedElement(String name) {
 41  0 super(name);
 42    }
 43   
 44  0 public IndexedElement(QName qname) {
 45  0 super(qname);
 46    }
 47   
 48  0 public IndexedElement(QName qname, int attributeCount) {
 49  0 super(qname, attributeCount);
 50    }
 51   
 52  0 public Attribute attribute(String name) {
 53  0 return (Attribute) attributeIndex().get(name);
 54    }
 55   
 56  0 public Attribute attribute(QName qName) {
 57  0 return (Attribute) attributeIndex().get(qName);
 58    }
 59   
 60  0 public Element element(String name) {
 61  0 return asElement(elementIndex().get(name));
 62    }
 63   
 64  0 public Element element(QName qName) {
 65  0 return asElement(elementIndex().get(qName));
 66    }
 67   
 68  0 public List elements(String name) {
 69  0 return asElementList(elementIndex().get(name));
 70    }
 71   
 72  0 public List elements(QName qName) {
 73  0 return asElementList(elementIndex().get(qName));
 74    }
 75   
 76    // Implementation methods
 77    // -------------------------------------------------------------------------
 78  0 protected Element asElement(Object object) {
 79  0 if (object instanceof Element) {
 80  0 return (Element) object;
 81  0 } else if (object != null) {
 82  0 List list = (List) object;
 83   
 84  0 if (list.size() >= 1) {
 85  0 return (Element) list.get(0);
 86    }
 87    }
 88   
 89  0 return null;
 90    }
 91   
 92  0 protected List asElementList(Object object) {
 93  0 if (object instanceof Element) {
 94  0 return createSingleResultList(object);
 95  0 } else if (object != null) {
 96  0 List list = (List) object;
 97  0 BackedList answer = createResultList();
 98   
 99  0 for (int i = 0, size = list.size(); i < size; i++) {
 100  0 answer.addLocal(list.get(i));
 101    }
 102   
 103  0 return answer;
 104    }
 105   
 106  0 return createEmptyList();
 107    }
 108   
 109    /**
 110    * DOCUMENT ME!
 111    *
 112    * @param object
 113    * DOCUMENT ME!
 114    *
 115    * @return DOCUMENT ME!
 116    *
 117    * @deprecated WILL BE REMOVED IN dom4j-1.6 !!
 118    */
 119  0 protected Iterator asElementIterator(Object object) {
 120  0 return asElementList(object).iterator();
 121    }
 122   
 123    // #### could we override the add(Element) remove(Element methods?
 124  0 protected void addNode(Node node) {
 125  0 super.addNode(node);
 126   
 127  0 if ((elementIndex != null) && node instanceof Element) {
 128  0 addToElementIndex((Element) node);
 129  0 } else if ((attributeIndex != null) && node instanceof Attribute) {
 130  0 addToAttributeIndex((Attribute) node);
 131    }
 132    }
 133   
 134  0 protected boolean removeNode(Node node) {
 135  0 if (super.removeNode(node)) {
 136  0 if ((elementIndex != null) && node instanceof Element) {
 137  0 removeFromElementIndex((Element) node);
 138  0 } else if ((attributeIndex != null) && node instanceof Attribute) {
 139  0 removeFromAttributeIndex((Attribute) node);
 140    }
 141   
 142  0 return true;
 143    }
 144   
 145  0 return false;
 146    }
 147   
 148  0 protected Map attributeIndex() {
 149  0 if (attributeIndex == null) {
 150  0 attributeIndex = createAttributeIndex();
 151   
 152  0 for (Iterator iter = attributeIterator(); iter.hasNext();) {
 153  0 addToAttributeIndex((Attribute) iter.next());
 154    }
 155    }
 156   
 157  0 return attributeIndex;
 158    }
 159   
 160  0 protected Map elementIndex() {
 161  0 if (elementIndex == null) {
 162  0 elementIndex = createElementIndex();
 163   
 164  0 for (Iterator iter = elementIterator(); iter.hasNext();) {
 165  0 addToElementIndex((Element) iter.next());
 166    }
 167    }
 168   
 169  0 return elementIndex;
 170    }
 171   
 172    /**
 173    * A Factory Method to create the index for attributes
 174    *
 175    * @return DOCUMENT ME!
 176    */
 177  0 protected Map createAttributeIndex() {
 178  0 Map answer = createIndex();
 179   
 180  0 return answer;
 181    }
 182   
 183    /**
 184    * A Factory Method to create the index for elements
 185    *
 186    * @return DOCUMENT ME!
 187    */
 188  0 protected Map createElementIndex() {
 189  0 Map answer = createIndex();
 190   
 191  0 return answer;
 192    }
 193   
 194  0 protected void addToElementIndex(Element element) {
 195  0 QName qName = element.getQName();
 196  0 String name = qName.getName();
 197  0 addToElementIndex(qName, element);
 198  0 addToElementIndex(name, element);
 199    }
 200   
 201  0 protected void addToElementIndex(Object key, Element value) {
 202  0 Object oldValue = elementIndex.get(key);
 203   
 204  0 if (oldValue == null) {
 205  0 elementIndex.put(key, value);
 206    } else {
 207  0 if (oldValue instanceof List) {
 208  0 List list = (List) oldValue;
 209  0 list.add(value);
 210    } else {
 211  0 List list = createList();
 212  0 list.add(oldValue);
 213  0 list.add(value);
 214  0 elementIndex.put(key, list);
 215    }
 216    }
 217    }
 218   
 219  0 protected void removeFromElementIndex(Element element) {
 220  0 QName qName = element.getQName();
 221  0 String name = qName.getName();
 222  0 removeFromElementIndex(qName, element);
 223  0 removeFromElementIndex(name, element);
 224    }
 225   
 226  0 protected void removeFromElementIndex(Object key, Element value) {
 227  0 Object oldValue = elementIndex.get(key);
 228   
 229  0 if (oldValue instanceof List) {
 230  0 List list = (List) oldValue;
 231  0 list.remove(value);
 232    } else {
 233  0 elementIndex.remove(key);
 234    }
 235    }
 236   
 237  0 protected void addToAttributeIndex(Attribute attribute) {
 238  0 QName qName = attribute.getQName();
 239  0 String name = qName.getName();
 240  0 addToAttributeIndex(qName, attribute);
 241  0 addToAttributeIndex(name, attribute);
 242    }
 243   
 244  0 protected void addToAttributeIndex(Object key, Attribute value) {
 245  0 Object oldValue = attributeIndex.get(key);
 246   
 247  0 if (oldValue != null) {
 248  0 attributeIndex.put(key, value);
 249    }
 250    }
 251   
 252  0 protected void removeFromAttributeIndex(Attribute attribute) {
 253  0 QName qName = attribute.getQName();
 254  0 String name = qName.getName();
 255  0 removeFromAttributeIndex(qName, attribute);
 256  0 removeFromAttributeIndex(name, attribute);
 257    }
 258   
 259  0 protected void removeFromAttributeIndex(Object key, Attribute value) {
 260  0 Object oldValue = attributeIndex.get(key);
 261   
 262  0 if ((oldValue != null) && oldValue.equals(value)) {
 263  0 attributeIndex.remove(key);
 264    }
 265    }
 266   
 267    /**
 268    * Factory method to return a new map implementation for indices
 269    *
 270    * @return DOCUMENT ME!
 271    */
 272  0 protected Map createIndex() {
 273  0 return new HashMap();
 274    }
 275   
 276    /**
 277    * Factory method to return a list implementation for indices
 278    *
 279    * @return DOCUMENT ME!
 280    */
 281  0 protected List createList() {
 282  0 return new ArrayList();
 283    }
 284    }
 285   
 286    /*
 287    * Redistribution and use of this software and associated documentation
 288    * ("Software"), with or without modification, are permitted provided that the
 289    * following conditions are met:
 290    *
 291    * 1. Redistributions of source code must retain copyright statements and
 292    * notices. Redistributions must also contain a copy of this document.
 293    *
 294    * 2. Redistributions in binary form must reproduce the above copyright notice,
 295    * this list of conditions and the following disclaimer in the documentation
 296    * and/or other materials provided with the distribution.
 297    *
 298    * 3. The name "DOM4J" must not be used to endorse or promote products derived
 299    * from this Software without prior written permission of MetaStuff, Ltd. For
 300    * written permission, please contact dom4j-info@metastuff.com.
 301    *
 302    * 4. Products derived from this Software may not be called "DOM4J" nor may
 303    * "DOM4J" appear in their names without prior written permission of MetaStuff,
 304    * Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
 305    *
 306    * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
 307    *
 308    * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND
 309    * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 310    * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 311    * ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE
 312    * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 313    * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 314    * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 315    * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 316    * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 317    * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 318    * POSSIBILITY OF SUCH DAMAGE.
 319    *
 320    * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
 321    */