001    /*
002     * Copyright 1999-2004 Sun Microsystems, Inc.  All Rights Reserved.
003     * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004     *
005     * This code is free software; you can redistribute it and/or modify it
006     * under the terms of the GNU General Public License version 2 only, as
007     * published by the Free Software Foundation.  Sun designates this
008     * particular file as subject to the "Classpath" exception as provided
009     * by Sun in the LICENSE file that accompanied this code.
010     *
011     * This code is distributed in the hope that it will be useful, but WITHOUT
012     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013     * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
014     * version 2 for more details (a copy is included in the LICENSE file that
015     * accompanied this code).
016     *
017     * You should have received a copy of the GNU General Public License version
018     * 2 along with this work; if not, write to the Free Software Foundation,
019     * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020     *
021     * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022     * CA 95054 USA or visit www.sun.com if you need additional information or
023     * have any questions.
024     */
025    
026    package com.sun.tools.doclets.internal.toolkit.util;
027    
028    import com.sun.javadoc.*;
029    
030    /**
031     * This class is useful for searching a method which has documentation
032     * comment and documentation tags. The method is searched in all the
033     * superclasses and interfaces(subsequently super-interfaces also)
034     * recursively.
035     *
036     * This code is not part of an API.
037     * It is implementation that is subject to change.
038     * Do not use it as an API.
039     */
040    public abstract class MethodFinder {
041    
042        abstract boolean isCorrectMethod(MethodDoc method);
043    
044        public MethodDoc search(ClassDoc cd, MethodDoc method) {
045            MethodDoc meth = searchInterfaces(cd, method);
046            if (meth != null) {
047                return meth;
048            }
049            ClassDoc icd = cd.superclass();
050            if (icd != null) {
051                meth = Util.findMethod(icd, method);
052                if (meth != null) {
053                if (isCorrectMethod(meth)) {
054                        return meth;
055                    }
056                }
057                return search(icd, method);
058            }
059            return null;
060        }
061    
062        public MethodDoc searchInterfaces(ClassDoc cd, MethodDoc method) {
063            MethodDoc[] implementedMethods = (new ImplementedMethods(method, null)).build();
064            for (int i = 0; i < implementedMethods.length; i++) {
065                if (isCorrectMethod(implementedMethods[i])) {
066                    return implementedMethods[i];
067                }
068            }
069            return null;
070        }
071    }