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://jakarta.apache.org/commons/configuration/team-list.html">Commons
037: * Configuration team</a>
038: * @version $Id: ViewNode.java 439648 2006-09-02 20:42:10Z oheger $
039: * @since 1.3
040: */
041: public class ViewNode extends DefaultConfigurationNode {
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: public void addAttribute(ConfigurationNode attr) {
049: ConfigurationNode parent = null;
050:
051: if (attr != null) {
052: parent = attr.getParentNode();
053: super .addAttribute(attr);
054: attr.setParentNode(parent);
055: } else {
056: throw new IllegalArgumentException(
057: "Attribute node must not be null!");
058: }
059: }
060:
061: /**
062: * Adds a child node to this view node. The new child's parent node will be
063: * saved.
064: *
065: * @param child the child node to be added
066: */
067: public void addChild(ConfigurationNode child) {
068: ConfigurationNode parent = null;
069:
070: if (child != null) {
071: parent = child.getParentNode();
072: super .addChild(child);
073: child.setParentNode(parent);
074: } else {
075: throw new IllegalArgumentException(
076: "Child node must not be null!");
077: }
078: }
079:
080: /**
081: * Adds all attribute nodes of the given source node to this view node.
082: *
083: * @param source the source node
084: */
085: public void appendAttributes(ConfigurationNode source) {
086: if (source != null) {
087: for (Iterator it = source.getAttributes().iterator(); it
088: .hasNext();) {
089: addAttribute((ConfigurationNode) it.next());
090: }
091: }
092: }
093:
094: /**
095: * Adds all child nodes of the given source node to this view node.
096: *
097: * @param source the source node
098: */
099: public void appendChildren(ConfigurationNode source) {
100: if (source != null) {
101: for (Iterator it = source.getChildren().iterator(); it
102: .hasNext();) {
103: addChild((ConfigurationNode) it.next());
104: }
105: }
106: }
107: }
|