    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    }