01: /*
02: * Author: Chris Seguin
03: *
04: * This software has been developed under the copyleft
05: * rules of the GNU General Public License. Please
06: * consult the GNU General Public License for more
07: * details about use and distribution of this software.
08: */
09: package org.acm.seguin.refactor.method;
10:
11: import java.util.Iterator;
12: import org.acm.seguin.awt.Question;
13: import org.acm.seguin.summary.TraversalVisitor;
14: import org.acm.seguin.summary.MethodSummary;
15: import org.acm.seguin.summary.FileSummary;
16: import org.acm.seguin.summary.TypeSummary;
17: import org.acm.seguin.summary.TypeDeclSummary;
18: import org.acm.seguin.summary.query.Ancestor;
19: import org.acm.seguin.summary.query.GetTypeSummary;
20:
21: /**
22: * Determines if there is a problem in performing this refactoring
23: * because of a near miss
24: *
25: *@author Chris Seguin
26: */
27: public class NearMissVisitor extends TraversalVisitor {
28: private MethodSummary target;
29: private TypeSummary ancestor;
30: private TypeSummary notHere;
31: private MethodSummary problem;
32:
33: /**
34: * Constructor for the NearMissVisitor object
35: *
36: *@param type the ancestor type
37: *@param init the method
38: *@param notThisOne a type to skip
39: */
40: public NearMissVisitor(TypeSummary type, MethodSummary init,
41: TypeSummary notThisOne) {
42: target = init;
43: ancestor = type;
44: notHere = notThisOne;
45: problem = null;
46: }
47:
48: /**
49: * Visits a type summary and updates it
50: *
51: *@param typeSummary Description of Parameter
52: *@param data Description of Parameter
53: *@return Description of the Returned Value
54: */
55: public Object visit(TypeSummary typeSummary, Object data) {
56: if ((typeSummary != notHere)
57: && Ancestor.query(typeSummary, ancestor)) {
58: Iterator iter = typeSummary.getMethods();
59: if (iter != null) {
60: while (iter.hasNext()) {
61: visit((MethodSummary) iter.next(), data);
62: }
63: }
64: }
65: return data;
66: }
67:
68: /**
69: * Visits the method summary and determines if it should be removed.
70: *
71: *@param methodSummary Description of Parameter
72: *@param data Description of Parameter
73: *@return Description of the Returned Value
74: */
75: public Object visit(MethodSummary methodSummary, Object data) {
76: if (methodSummary.isNearMiss(target)) {
77: problem = methodSummary;
78: }
79:
80: return data;
81: }
82:
83: /**
84: * Returns at least one near miss conflict
85: *
86: *@return the problem method
87: */
88: public MethodSummary getProblem() {
89: return problem;
90: }
91: }
|