vgritsenko    2004/01/28 06:10:23

  Modified:    java/src/org/apache/xindice/util Configuration.java
  Log:
  * getChildNodes() can not return null (as per DOM javadoc)
  * Add setDirty() / isDirty()
  * Add getChildren(String name) method
  
  Revision  Changes    Path
  1.17      +80 -46    
xml-xindice/java/src/org/apache/xindice/util/Configuration.java
  
  Index: Configuration.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/util/Configuration.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- Configuration.java        24 Dec 2003 13:49:53 -0000      1.16
  +++ Configuration.java        28 Jan 2004 14:10:22 -0000      1.17
  @@ -87,11 +87,10 @@
   
       private static final Configuration[] EMPTY = new Configuration[0];
   
  -    // commented out 2002-07-16: not used
  -    //private static final Map Modified = Collections.synchronizedMap(new 
HashMap()); // Temporary HACK
  -
  -    private Element config = null;
  -    private boolean readOnly = true;
  +    private Element config;
  +    private boolean readOnly;
  +    private boolean isDirty;
  +    private Configuration root;
   
   
       public Configuration(Element config, boolean readOnly) {
  @@ -103,17 +102,47 @@
           this(config.getDocumentElement(), readOnly);
       }
   
  +    /**
  +     * Create read only configuration out of Element
  +     */
       public Configuration(Element config) {
           this(config, true);
       }
   
  +    /**
  +     * Create read only configuration out of Document
  +     */
       public Configuration(Document config) {
           this(config.getDocumentElement());
       }
   
  +    private Configuration(Configuration root, Element config, boolean 
readOnly) {
  +        this.root = root;
  +        this.config = config;
  +        this.readOnly = readOnly;
  +    }
  +
  +    private void setDirty() {
  +        if (root != null) {
  +            root.setDirty();
  +        } else {
  +            this.isDirty = true;
  +        }
  +    }
  +
  +    public boolean isDirty() {
  +        if (root != null) {
  +            return root.isDirty();
  +        } else {
  +            return isDirty;
  +        }
  +    }
  +
       /**
  -     * getElement returns the Element being managed by this
  -     * Configuration.
  +     * getElement returns the Element being managed by this Configuration.
  +     *
  +     * Returned Element should not be modified, use Configuration's methods
  +     * to modify managed Element.
        *
        * @return The Configuration Element
        * @throws ReadOnlyException If the Configuration is Read-only
  @@ -144,13 +173,6 @@
           return config.getAttributes().getLength() > 0;
       }
   
  -    /*
  -      // commented out 2002-07-16: not doing anything
  -      public void setDirty() {
  -      //Modified.put(config.getOwnerDocument(), Boolean.TRUE);
  -      }
  -    */
  -
       /**
        * getAttribute returns an attribute from the Configuration node.
        *
  @@ -638,18 +660,15 @@
        */
       public Configuration[] getChildren() {
           NodeList list = config.getChildNodes();
  -        if (list == null) {
  -            return EMPTY;
  -        }
  -
  -        List tmp = new ArrayList();
           int size = list.getLength();
  +
  +        List children = new ArrayList();
           for (int i = 0; i < size; i++) {
               if (list.item(i).getNodeType() == Node.ELEMENT_NODE) {
  -                tmp.add(new Configuration((Element) list.item(i), readOnly));
  +                children.add(new Configuration(this, (Element) list.item(i), 
readOnly));
               }
           }
  -        return (Configuration[]) tmp.toArray(EMPTY);
  +        return (Configuration[]) children.toArray(EMPTY);
       }
   
       /**
  @@ -660,15 +679,11 @@
        */
       public void processChildren(ConfigurationCallback callback) {
           NodeList list = config.getChildNodes();
  -        if (list == null) {
  -            return;
  -        }
  -
           int size = list.getLength();
           try {
               for (int i = 0; i < size; i++) {
                   if (list.item(i).getNodeType() == Node.ELEMENT_NODE) {
  -                    callback.process(new Configuration((Element) 
list.item(i), readOnly));
  +                    callback.process(new Configuration(this, (Element) 
list.item(i), readOnly));
                   }
               }
           } catch (Exception e) {
  @@ -687,9 +702,6 @@
        */
       public void processChildren(String name, ConfigurationCallback callback) 
{
           NodeList list = config.getChildNodes();
  -        if (list == null) {
  -            return;
  -        }
   
           Node[] nl = new Node[list.getLength()];
           for (int i = 0; i < nl.length; i++) {
  @@ -700,7 +712,7 @@
           try {
               for (int i = 0; i < size; i++) {
                   if (nl[i].getNodeType() == Node.ELEMENT_NODE && 
nl[i].getNodeName().equals(name)) {
  -                    callback.process(new Configuration((Element) nl[i], 
readOnly));
  +                    callback.process(new Configuration(this, (Element) 
nl[i], readOnly));
                   }
               }
           } catch (Exception e) {
  @@ -711,6 +723,27 @@
       }
   
       /**
  +     * getChildren returns all children Configuration nodes that matches the
  +     * specified name.
  +     *
  +     * @param name The Configuration node name
  +     * @return Children Configuration
  +     */
  +    public Configuration[] getChildren(String name) {
  +        NodeList list = config.getChildNodes();
  +        int size = list.getLength();
  +
  +        List children = new ArrayList();
  +        for (int i = 0; i < size; i++) {
  +            if (list.item(i).getNodeType() == Node.ELEMENT_NODE && 
list.item(i).getNodeName().equals(name)) {
  +                children.add(new Configuration(this, (Element) list.item(i), 
readOnly));
  +            }
  +        }
  +
  +        return (Configuration[])children.toArray(EMPTY);
  +    }
  +
  +    /**
        * getChild returns the first child Configuration node that matches the
        * specified name.
        *
  @@ -725,14 +758,11 @@
   
           for (int i = 0; i < size; i++) {
               if (list.item(i).getNodeType() == Node.ELEMENT_NODE && 
list.item(i).getNodeName().equals(name)) {
  -                return new Configuration((Element) list.item(i), readOnly);
  +                return new Configuration(this, (Element) list.item(i), 
readOnly);
               }
           }
  -        if (create) {
  -            return add(name);
  -        } else {
  -            return null;
  -        }
  +
  +        return create? add(name) : null;
       }
   
       /**
  @@ -771,10 +801,11 @@
           if (readOnly) {
               throw new ReadOnlyException();
           }
  +
           Element elem = config.getOwnerDocument().createElement(name);
           config.appendChild(elem);
  -        //setDirty();
  -        return new Configuration(elem, readOnly);
  +        setDirty();
  +        return new Configuration(this, elem, readOnly);
       }
   
       /**
  @@ -790,10 +821,11 @@
           if (readOnly) {
               throw new ReadOnlyException();
           }
  +
           Node imported = 
config.getOwnerDocument().importNode(newConfig.config, true);
           config.appendChild(imported);
           newConfig.config = (Element) imported;
  -        //setDirty();
  +        setDirty();
       }
   
       /**
  @@ -809,8 +841,7 @@
           if (config.getParentNode() != null) {
               config.getParentNode().removeChild(config);
           }
  -
  -        //setDirty();
  +        setDirty();
       }
   
       /**
  @@ -823,8 +854,9 @@
           if (readOnly) {
               throw new ReadOnlyException();
           }
  +
           config.removeAttribute(name);
  -        //setDirty();
  +        setDirty();
       }
   
       /**
  @@ -838,8 +870,9 @@
           if (readOnly) {
               throw new ReadOnlyException();
           }
  +
           config.setAttribute(name, value);
  -        //setDirty();
  +        setDirty();
       }
   
       /**
  @@ -940,6 +973,7 @@
           if (readOnly) {
               throw new ReadOnlyException();
           }
  +
           NodeList list = config.getChildNodes();
           if (list.getLength() == 1 && list.item(0).getNodeType() == 
Node.TEXT_NODE) {
               list.item(0).setNodeValue(value);
  @@ -947,7 +981,7 @@
               Text text = config.getOwnerDocument().createTextNode(value);
               config.appendChild(text);
           }
  -        //setDirty();
  +        setDirty();
       }
   
       /**
  
  
  

Reply via email to