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 }