001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.configuration.tree;
018    
019    import java.util.Iterator;
020    
021    /**
022     * <p>
023     * A specialized node implementation to be used in view configurations.
024     * </p>
025     * <p>
026     * Some configurations provide a logical view on the nodes of other
027     * configurations. These configurations construct their own hierarchy of nodes
028     * based on the node trees of their source configurations. This special node
029     * class can be used for this purpose. It allows child nodes and attributes to
030     * be added without changing their parent node. So a node can belong to a
031     * hierarchy of nodes of a source configuration, but be also contained in a view
032     * configuration.
033     * </p>
034     *
035     * @author <a
036     * href="http://commons.apache.org/configuration/team-list.html">Commons
037     * Configuration team</a>
038     * @version $Id: ViewNode.java 561230 2007-07-31 04:17:09Z rahul $
039     * @since 1.3
040     */
041    public class ViewNode extends DefaultConfigurationNode
042    {
043        /**
044         * Adds an attribute to this view node. The new attribute's parent node will
045         * be saved.
046         *
047         * @param attr the attribute node to be added
048         */
049        public void addAttribute(ConfigurationNode attr)
050        {
051            ConfigurationNode parent = null;
052    
053            if (attr != null)
054            {
055                parent = attr.getParentNode();
056                super.addAttribute(attr);
057                attr.setParentNode(parent);
058            }
059            else
060            {
061                throw new IllegalArgumentException("Attribute node must not be null!");
062            }
063        }
064    
065        /**
066         * Adds a child node to this view node. The new child's parent node will be
067         * saved.
068         *
069         * @param child the child node to be added
070         */
071        public void addChild(ConfigurationNode child)
072        {
073            ConfigurationNode parent = null;
074    
075            if (child != null)
076            {
077                parent = child.getParentNode();
078                super.addChild(child);
079                child.setParentNode(parent);
080            }
081            else
082            {
083                throw new IllegalArgumentException("Child node must not be null!");
084            }
085        }
086    
087        /**
088         * Adds all attribute nodes of the given source node to this view node.
089         *
090         * @param source the source node
091         */
092        public void appendAttributes(ConfigurationNode source)
093        {
094            if (source != null)
095            {
096                for (Iterator it = source.getAttributes().iterator(); it.hasNext();)
097                {
098                    addAttribute((ConfigurationNode) it.next());
099                }
100            }
101        }
102    
103        /**
104         * Adds all child nodes of the given source node to this view node.
105         *
106         * @param source the source node
107         */
108        public void appendChildren(ConfigurationNode source)
109        {
110            if (source != null)
111            {
112                for (Iterator it = source.getChildren().iterator(); it.hasNext();)
113                {
114                    addChild((ConfigurationNode) it.next());
115                }
116            }
117        }
118    }