01: /*
02: * Hammurapi
03: * Automated Java code review system.
04: * Copyright (C) 2004 Hammurapi Group
05: *
06: * This program is free software; you can redistribute it and/or modify
07: * it under the terms of the GNU General Public License as published by
08: * the Free Software Foundation; either version 2 of the License, or
09: * (at your option) any later version.
10: *
11: * This program is distributed in the hope that it will be useful,
12: * but WITHOUT ANY WARRANTY; without even the implied warranty of
13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: * GNU General Public License for more details.
15: *
16: * You should have received a copy of the GNU General Public License
17: * along with this program; if not, write to the Free Software
18: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19: *
20: * URL: http://www.hammurapi.org
21: * e-Mail: support@hammurapi.biz
22: */
23: package org.hammurapi.inspectors;
24:
25: import org.hammurapi.InspectorBase;
26:
27: import com.pavelvlasov.jsel.Constructor;
28: import com.pavelvlasov.jsel.JselException;
29: import com.pavelvlasov.jsel.LanguageElement;
30: import com.pavelvlasov.jsel.Method;
31: import com.pavelvlasov.jsel.OperationInfo;
32: import com.pavelvlasov.jsel.expressions.MethodCall;
33: import com.pavelvlasov.review.SourceMarker;
34: import com.pavelvlasov.util.Visitor;
35:
36: /**
37: * ER-071
38: * Avoid calling an "abstract" method from a constructor in an "abstract" class
39: * @author Janos Czako
40: * @version $Revision: 1.3 $
41: */
42: public class AbstractMethodFromConstructorRule extends InspectorBase {
43:
44: /**
45: * The abstract modifier.
46: */
47: private static final String ABSTRACT = "abstract";
48:
49: /**
50: * Reviews the constructor definitions if they violate against
51: * the rule;
52: *
53: * @param element the constructor definition.
54: */
55: public void visit(Constructor element) {
56: element.accept(new Visitor() {
57: public boolean visit(Object target) {
58: if (target instanceof MethodCall) {
59: MethodCall mc = (MethodCall) target;
60: try {
61: OperationInfo oi = mc.getProvider();
62: if (oi == null) {
63: context.warn((SourceMarker) mc,
64: "Provider is null for "
65: + mc
66: + " at "
67: + ((LanguageElement) mc)
68: .getLocation());
69: } else if (oi.getOperation() instanceof Method) {
70: Method method = (Method) oi.getOperation();
71: if (method.getModifiers()
72: .contains(ABSTRACT)
73: && method.getEnclosingType() == ((LanguageElement) mc)
74: .getEnclosingType()) {
75: context
76: .reportViolation((SourceMarker) mc);
77: }
78: }
79: } catch (JselException e) {
80: context.warn((SourceMarker) mc, e);
81: }
82: }
83: return true;
84: }
85: });
86: }
87: }
|