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}