001: /* ====================================================================
002: * The JRefactory License, Version 1.0
003: *
004: * Copyright (c) 2001 JRefactory. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * 3. The end-user documentation included with the redistribution,
019: * if any, must include the following acknowledgment:
020: * "This product includes software developed by the
021: * JRefactory (http://www.sourceforge.org/projects/jrefactory)."
022: * Alternately, this acknowledgment may appear in the software itself,
023: * if and wherever such third-party acknowledgments normally appear.
024: *
025: * 4. The names "JRefactory" must not be used to endorse or promote
026: * products derived from this software without prior written
027: * permission. For written permission, please contact seguin@acm.org.
028: *
029: * 5. Products derived from this software may not be called "JRefactory",
030: * nor may "JRefactory" appear in their name, without prior written
031: * permission of Chris Seguin.
032: *
033: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
034: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
035: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
036: * DISCLAIMED. IN NO EVENT SHALL THE CHRIS SEGUIN OR
037: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
038: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
039: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
040: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
041: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
042: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
043: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
044: * SUCH DAMAGE.
045: * ====================================================================
046: *
047: * This software consists of voluntary contributions made by many
048: * individuals on behalf of JRefactory. For more information on
049: * JRefactory, please see
050: * <http://www.sourceforge.org/projects/jrefactory>.
051: */
052: package org.acm.seguin.summary.query;
053:
054: import java.util.Iterator;
055: import net.sourceforge.jrefactory.ast.ModifierHolder;
056: import org.acm.seguin.summary.TypeSummary;
057: import org.acm.seguin.summary.TypeDeclSummary;
058: import org.acm.seguin.summary.MethodSummary;
059:
060: /**
061: * Finds a method associated with a particular type summary. A permission is
062: * also specified to insure that we find something interesting.
063: *
064: *@author Chris Seguin
065: *@created September 12, 2001
066: */
067: public class MethodQuery {
068: /**
069: * The method we are looking for can have any protection level
070: */
071: public final static int PRIVATE = 1;
072: /**
073: * The method we are looking for must have default protection level or
074: * higher
075: */
076: public final static int DEFAULT = 2;
077: /**
078: * The method we are looking for must have protected protection level or
079: * higher
080: */
081: public final static int PROTECTED = 3;
082: /**
083: * The method we are looking for must be public
084: */
085: public final static int PUBLIC = 4;
086:
087: /**
088: * Finds an associated method
089: *
090: *@param typeSummary the type
091: *@param name the name
092: *@return the method found or null if none
093: */
094: public static MethodSummary find(TypeSummary typeSummary,
095: String name) {
096: MethodSummary result = query(typeSummary, name, PRIVATE);
097: if (result == null) {
098: result = queryAncestors(typeSummary, name, PROTECTED);
099: }
100: return result;
101: }
102:
103: /**
104: * Finds the method associated with a type
105: *
106: *@param typeSummary the type to search
107: *@param name the name of the method
108: *@param protection the minimum protection level
109: *@return the method summary if one is found, null if none is
110: * found
111: */
112: public static MethodSummary query(TypeSummary typeSummary,
113: String name, int protection) {
114: Iterator iter = typeSummary.getMethods();
115: if (iter != null) {
116: while (iter.hasNext()) {
117: MethodSummary next = (MethodSummary) iter.next();
118: if (appropriate(next, name, protection)) {
119: return next;
120: }
121: }
122: }
123:
124: return null;
125: }
126:
127: /**
128: * Finds the method associated with a type in the ancestors of that type
129: *
130: *@param typeSummary the type to search
131: *@param name the name of the method
132: *@param protection the minimum protection level
133: *@return the method summary if one is found, null if none is
134: * found
135: */
136: public static MethodSummary queryAncestors(TypeSummary typeSummary,
137: String name, int protection) {
138: TypeDeclSummary next = typeSummary.getParentClass();
139: TypeSummary current = GetTypeSummary.query(next);
140:
141: while (current != null) {
142: MethodSummary attempt = query(current, name, protection);
143: if (attempt != null) {
144: return attempt;
145: }
146:
147: next = current.getParentClass();
148: current = GetTypeSummary.query(next);
149: }
150:
151: return null;
152: }
153:
154: /**
155: * Checks if the method we are considering is the correct type
156: *
157: *@param methodSummary the summary of the method
158: *@param name the name of the method
159: *@param protection the protection level of the method
160: *@return true if the method has the appropriate name and the
161: * appropriate protection level.
162: */
163: private static boolean appropriate(MethodSummary methodSummary,
164: String name, int protection) {
165: if (methodSummary.getName().equals(name)) {
166: //ModifierHolder mods = methodSummary.getModifiers();
167: if (protection == PRIVATE) {
168: return true;
169: } else if ((protection == DEFAULT)
170: && !methodSummary.isPrivate()) {
171: return true;
172: } else if ((protection == PROTECTED)
173: && (methodSummary.isPublic() || methodSummary
174: .isProtected())) {
175: return true;
176: } else if ((protection == PUBLIC)
177: && methodSummary.isPublic()) {
178: return true;
179: }
180: }
181:
182: return false;
183: }
184: }
|