1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.exolab.javasource;
17
18 import java.util.HashMap;
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 public final class Java5HacksHelper {
36
37
38
39
40 private Java5HacksHelper() { }
41
42 private static class MethodSpec {
43 private String _methodName;
44 private int _paramCount;
45 private String _param1ClassName;
46 private String _param2ClassName;
47
48 public MethodSpec(final String methodName, final int paramCount,
49 final String param1ClassName, final String param2ClassName) {
50 _methodName = methodName;
51 _paramCount = paramCount;
52 _param1ClassName = param1ClassName;
53 _param2ClassName = param2ClassName;
54 }
55
56 public String getMethodName() {
57 return _methodName;
58 }
59
60 public int getParamCount() {
61 return _paramCount;
62 }
63
64 public String getParam1ClassName() {
65 return _param1ClassName;
66 }
67
68 public String getParam2ClassName() {
69 return _param2ClassName;
70 }
71 }
72
73 private static final HashMap<String, MethodSpec> DEFINED_SPECS =
74 new HashMap<String, MethodSpec>();
75
76 private static void createMethodSpec(final String methodName, final int paramCount,
77 final String param1ClassName, final String param2ClassName) {
78 MethodSpec temp = new MethodSpec(methodName, paramCount, param1ClassName, param2ClassName);
79
80 DEFINED_SPECS.put(methodName, temp);
81 }
82
83 static {
84 createMethodSpec("getAccessMode", 0, "", "");
85
86
87 createMethodSpec("getNameSpacePrefix", 0, "", "");
88 createMethodSpec("getNameSpaceURI", 0, "", "");
89 createMethodSpec("getValidator", 0, "", "");
90 createMethodSpec("getXMLName", 0, "", "");
91 createMethodSpec("getXTransients", 0, "", "");
92 createMethodSpec("newInstance", 1, "java.lang.Object", "");
93 createMethodSpec("setValue", 1, "java.lang.Object", "");
94 createMethodSpec("equals", 1, "java.lang.Object", "");
95 createMethodSpec("getValue", 1, "java.lang.Object", "");
96 createMethodSpec("marshal", 1, "java.io.Writer", "");
97 createMethodSpec("newInstance", 1, "java.lang.Object", "");
98 createMethodSpec("setValue", 2, "java.lang.Object", "java.lang.Object");
99 createMethodSpec("setXTransients", 1, "org.openmrm.core.data.castor.XTransients", "");
100 };
101
102
103 private static final JAnnotationType OVERRIDE_ANNOTATION = new JAnnotationType("Override");
104
105
106
107
108
109
110
111 public static void addOverrideAnnotations(final JMethodSignature jms) {
112 String name = jms.getName();
113 boolean addOverrideAnnotation = false;
114
115
116 JAnnotation override = jms.getAnnotation(OVERRIDE_ANNOTATION);
117 if (override != null) {
118 return;
119 }
120
121
122 MethodSpec methodSpec = DEFINED_SPECS.get(name);
123 if (methodSpec == null) {
124 return;
125 }
126
127
128 int paramCount = jms.getParameters().length;
129 if (paramCount != methodSpec.getParamCount()) {
130 return;
131 }
132
133
134 switch (paramCount) {
135 case 0:
136 addOverrideAnnotation = true;
137 break;
138 case 1:
139 String incomingClassName1 = jms.getParameter(0).getType().getName();
140 if (incomingClassName1.equalsIgnoreCase(methodSpec.getParam1ClassName())) {
141 addOverrideAnnotation = true;
142 }
143 break;
144 case 2:
145 String className1 = jms.getParameter(0).getType().getName();
146 String className2 = jms.getParameter(1).getType().getName();
147 if (className1.equalsIgnoreCase(methodSpec.getParam1ClassName())
148 && className2.equalsIgnoreCase(methodSpec.getParam2ClassName())) {
149 addOverrideAnnotation = true;
150 }
151 break;
152 default:
153
154 break;
155 }
156
157
158 if (addOverrideAnnotation) {
159 jms.addAnnotation(new JAnnotation(new JAnnotationType("Override")));
160 }
161 }
162
163 }