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 }