01: /**
02: * Spoon - http://spoon.gforge.inria.fr/
03: * Copyright (C) 2006 INRIA Futurs <renaud.pawlak@inria.fr>
04: *
05: * This software is governed by the CeCILL-C License under French law and
06: * abiding by the rules of distribution of free software. You can use,
07: * modify and/or redistribute the software under the terms of the
08: * CeCILL-C
09: * license as circulated by CEA, CNRS and INRIA at the following URL:
10: * http://www.cecill.info.
11: *
12: * This program is distributed in the hope that it will be useful, but
13: * WITHOUT ANY WARRANTY; without even the implied warranty of
14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C
15: * License for more details.
16: *
17: * The fact that you are presently reading this means that you have had
18: * knowledge of the CeCILL-C license and that you accept its terms.
19: */package spoon.aval.support.validator;
20:
21: import java.lang.annotation.Annotation;
22:
23: import spoon.aval.Validator;
24: import spoon.aval.annotation.structure.Inside;
25: import spoon.aval.processing.AValProcessor;
26: import spoon.aval.processing.ValidationPoint;
27: import spoon.processing.Severity;
28: import spoon.reflect.declaration.CtElement;
29:
30: /**
31: * Implementation for the {@link Inside} validation
32: *
33: * <p>
34: * This class implements the {@link Inside} validator. It checks that a parent
35: * CtElement of the current validation point is annotated with an annotation of
36: * the type specified in the Inside
37: *
38: * @Validator. If not, it checks the instance of the Inside
39: * @Validator to report an ERROR or a WARNING.
40: *
41: * @see Inside
42: * @see Severity
43: *
44: */
45: public class InsideValidator implements Validator<Inside> {
46:
47: /**
48: * Implementation of the Validator interface. Called by
49: * {@link AValProcessor}
50: */
51: public void check(ValidationPoint<Inside> vp) {
52: Class<? extends Annotation> parent = vp.getValAnnotation()
53: .value();
54:
55: CtElement pElement = vp.getProgramElement();
56: pElement = pElement.getParent();
57: while (pElement != null) {
58: if (pElement.getAnnotation(parent) != null) {
59: return;
60: }
61: pElement = pElement.getParent();
62: }
63:
64: String message = vp.getValAnnotation().message().replace(
65: "?val", parent.getSimpleName());
66: ValidationPoint.report(vp.getValAnnotation().severity(), vp
67: .getDslAnnotation(), message, vp.fixerFactory(vp
68: .getValAnnotation().fixers()));
69: }
70:
71: }
|