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 */
017package 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 */
040public 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}