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    
020    /**
021     * <p>
022     * A specialized node implementation to be used in view configurations.
023     * </p>
024     * <p>
025     * Some configurations provide a logical view on the nodes of other
026     * configurations. These configurations construct their own hierarchy of nodes
027     * based on the node trees of their source configurations. This special node
028     * class can be used for this purpose. It allows child nodes and attributes to
029     * be added without changing their parent node. So a node can belong to a
030     * hierarchy of nodes of a source configuration, but be also contained in a view
031     * configuration.
032     * </p>
033     *
034     * @author <a
035     * href="http://commons.apache.org/configuration/team-list.html">Commons
036     * Configuration team</a>
037     * @version $Id: ViewNode.java 1206488 2011-11-26 16:42:41Z oheger $
038     * @since 1.3
039     */
040    public class ViewNode extends DefaultConfigurationNode
041    {
042        /**
043         * Adds an attribute to this view node. The new attribute's parent node will
044         * be saved.
045         *
046         * @param attr the attribute node to be added
047         */
048        @Override
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        @Override
072        public void addChild(ConfigurationNode child)
073        {
074            ConfigurationNode parent = null;
075    
076            if (child != null)
077            {
078                parent = child.getParentNode();
079                super.addChild(child);
080                child.setParentNode(parent);
081            }
082            else
083            {
084                throw new IllegalArgumentException("Child node must not be null!");
085            }
086        }
087    
088        /**
089         * Adds all attribute nodes of the given source node to this view node.
090         *
091         * @param source the source node
092         */
093        public void appendAttributes(ConfigurationNode source)
094        {
095            if (source != null)
096            {
097                for (ConfigurationNode attr : source.getAttributes())
098                {
099                    addAttribute(attr);
100                }
101            }
102        }
103    
104        /**
105         * Adds all child nodes of the given source node to this view node.
106         *
107         * @param source the source node
108         */
109        public void appendChildren(ConfigurationNode source)
110        {
111            if (source != null)
112            {
113                for (ConfigurationNode child : source.getChildren())
114                {
115                    addChild(child);
116                }
117            }
118        }
119    }