001 /*
002 * Copyright 2003-2004 The Apache Software Foundation
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.apache.commons.convert1.util;
017
018 import java.util.ArrayList;
019 import java.util.Iterator;
020 import java.util.List;
021
022 /**
023 * An inheritence sequence. The target class is first,
024 * followed by its superclass and its interfaces. Then the
025 * lookup recurses through the superclass and interfaces
026 * with the same strategy.
027 * It is ensured that java.lang.Object is last in the sequence.
028 */
029 public class BasicInheritor implements Inheritor {
030
031 private Class clazz;
032
033 public BasicInheritor() {
034 }
035
036 public BasicInheritor(Class clazz) {
037 setTarget(clazz);
038 }
039
040 public void setTarget(Class clazz) {
041 this.clazz = clazz;
042 }
043
044 public Class getTarget() {
045 return clazz;
046 }
047
048 public Iterator iterator() {
049 List list = new ArrayList();
050
051 addToList(list, clazz);
052 addClassParents(list, clazz);
053
054 list.add( Object.class );
055
056 return list.iterator();
057 }
058
059 private void addClassParents(List list, Class clazz) {
060 if (clazz == null) {
061 return;
062 }
063
064 Class superclass = clazz.getSuperclass();
065 addToList(list, superclass);
066
067 Class[] interfaces = clazz.getInterfaces();
068 for (int i = 0; i < interfaces.length; i++) {
069 addToList(list, interfaces[i]);
070 }
071
072 for (int i = 0; i < interfaces.length; i++) {
073 addClassParents(list, interfaces[i]);
074 }
075
076 addClassParents(list, superclass);
077 }
078
079 private void addToList(List list, Class clazz) {
080 if( clazz == null ) {
081 return;
082 }
083
084 if( Object.class == clazz ) {
085 return;
086 }
087
088 if( list.contains( clazz ) ) {
089 return;
090 }
091
092 list.add(clazz);
093 }
094
095 }