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.FieldSummary;
059:
060: /**
061: * Finds a field 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 FieldQuery {
068: /**
069: * The field we are looking for can have any protection level
070: */
071: public final static int PRIVATE = 1;
072: /**
073: * The field we are looking for must have default protection level or
074: * higher
075: */
076: public final static int DEFAULT = 2;
077: /**
078: * The field we are looking for must have protected protection level or
079: * higher
080: */
081: public final static int PROTECTED = 3;
082: /**
083: * The field we are looking for must be public
084: */
085: public final static int PUBLIC = 4;
086:
087: /**
088: * Finds an associated field
089: *
090: *@param typeSummary the type
091: *@param name the name
092: *@return the field found or null if none
093: */
094: public static FieldSummary find(TypeSummary typeSummary, String name) {
095: FieldSummary result = query(typeSummary, name, PRIVATE);
096: if (result == null) {
097: result = queryAncestors(typeSummary, name, PROTECTED);
098: }
099: return result;
100: }
101:
102: /**
103: * Finds the field associated with a type
104: *
105: *@param typeSummary the type to search
106: *@param name the name of the field
107: *@param protection the minimum protection level
108: *@return the field summary if one is found, null if none is
109: * found
110: */
111: public static FieldSummary query(TypeSummary typeSummary,
112: String name, int protection) {
113: Iterator iter = typeSummary.getFields();
114: if (iter != null) {
115: while (iter.hasNext()) {
116: FieldSummary next = (FieldSummary) iter.next();
117: if (appropriate(next, name, protection)) {
118: return next;
119: }
120: }
121: }
122:
123: return null;
124: }
125:
126: /**
127: * Finds the field associated with a type in the ancestors of that type
128: *
129: *@param typeSummary the type to search
130: *@param name the name of the field
131: *@param protection the minimum protection level
132: *@return the field summary if one is found, null if none is
133: * found
134: */
135: public static FieldSummary queryAncestors(TypeSummary typeSummary,
136: String name, int protection) {
137: TypeDeclSummary next = typeSummary.getParentClass();
138: TypeSummary current = GetTypeSummary.query(next);
139:
140: while (current != null) {
141: FieldSummary attempt = query(current, name, protection);
142: if (attempt != null) {
143: return attempt;
144: }
145:
146: next = current.getParentClass();
147: current = GetTypeSummary.query(next);
148: }
149:
150: return null;
151: }
152:
153: /**
154: * Checks if the field we are considering is the correct type
155: *
156: *@param fieldSummary the summary of the field
157: *@param name the name of the field
158: *@param protection the protection level of the field
159: *@return true if the field has the appropriate name and the
160: * appropriate protection level.
161: */
162: private static boolean appropriate(FieldSummary fieldSummary,
163: String name, int protection) {
164: if (fieldSummary.getName().equals(name)) {
165: //ModifierHolder mods = fieldSummary.getModifiers();
166: if (protection == PRIVATE) {
167: return true;
168: } else if ((protection == DEFAULT)
169: && !fieldSummary.isPrivate()) {
170: return true;
171: } else if ((protection == PROTECTED)
172: && (fieldSummary.isPublic() || fieldSummary
173: .isProtected())) {
174: return true;
175: } else if ((protection == PUBLIC)
176: && fieldSummary.isPublic()) {
177: return true;
178: }
179: }
180:
181: return false;
182: }
183: }
|