    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    }