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 * https://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.configuration2.tree; 018 019import java.util.List; 020import java.util.Set; 021 022/** 023 * <p> 024 * An abstract base class for decorators of a {@code NodeHandler}. 025 * </p> 026 * <p> 027 * This class implements all methods of the {@code NodeHandler} interface by delegating to another instance. This is 028 * convenient if specific functionality of a {@code NodeHandler} is to be adapted for a special use case. Concrete sub 029 * classes have to implement the {@code getDecoratedNodeHandler()} method to provide the underlying handler. 030 * </p> 031 * 032 * @param <T> the type of the nodes supported by this handler 033 * @since 2.0 034 */ 035public abstract class NodeHandlerDecorator<T> implements NodeHandler<T> { 036 037 /** 038 * Constructs a new instance. 039 */ 040 public NodeHandlerDecorator() { 041 // empty 042 } 043 044 @Override 045 public Set<String> getAttributes(final T node) { 046 return getDecoratedNodeHandler().getAttributes(node); 047 } 048 049 @Override 050 public Object getAttributeValue(final T node, final String name) { 051 return getDecoratedNodeHandler().getAttributeValue(node, name); 052 } 053 054 @Override 055 public T getChild(final T node, final int index) { 056 return getDecoratedNodeHandler().getChild(node, index); 057 } 058 059 @Override 060 public List<T> getChildren(final T node) { 061 return getDecoratedNodeHandler().getChildren(node); 062 } 063 064 @Override 065 public List<T> getChildren(final T node, final String name) { 066 return getDecoratedNodeHandler().getChildren(node, name); 067 } 068 069 @Override 070 public int getChildrenCount(final T node, final String name) { 071 return getDecoratedNodeHandler().getChildrenCount(node, name); 072 } 073 074 /** 075 * Gets the {@code NodeHandler} object that is decorated by this instance. All method calls are delegated to this 076 * object. 077 * 078 * @return the decorated {@code NodeHandler} 079 */ 080 protected abstract NodeHandler<T> getDecoratedNodeHandler(); 081 082 @Override 083 public <C> List<T> getMatchingChildren(final T node, final NodeMatcher<C> matcher, final C criterion) { 084 return getDecoratedNodeHandler().getMatchingChildren(node, matcher, criterion); 085 } 086 087 @Override 088 public <C> int getMatchingChildrenCount(final T node, final NodeMatcher<C> matcher, final C criterion) { 089 return getDecoratedNodeHandler().getMatchingChildrenCount(node, matcher, criterion); 090 } 091 092 @Override 093 public T getParent(final T node) { 094 return getDecoratedNodeHandler().getParent(node); 095 } 096 097 @Override 098 public T getRootNode() { 099 return getDecoratedNodeHandler().getRootNode(); 100 } 101 102 @Override 103 public Object getValue(final T node) { 104 return getDecoratedNodeHandler().getValue(node); 105 } 106 107 @Override 108 public boolean hasAttributes(final T node) { 109 return getDecoratedNodeHandler().hasAttributes(node); 110 } 111 112 @Override 113 public int indexOfChild(final T parent, final T child) { 114 return getDecoratedNodeHandler().indexOfChild(parent, child); 115 } 116 117 @Override 118 public boolean isDefined(final T node) { 119 return getDecoratedNodeHandler().isDefined(node); 120 } 121 122 @Override 123 public String nodeName(final T node) { 124 return getDecoratedNodeHandler().nodeName(node); 125 } 126}