1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 package org.exolab.javasource;
44
45 import java.util.LinkedHashMap;
46 import java.util.Map;
47 import java.util.Vector;
48
49
50
51
52
53
54
55 public final class JConstructor extends JAnnotatedElementHelper {
56
57
58 private JModifiers _modifiers;
59
60
61 private Map<String, JParameter> _params = new LinkedHashMap<String, JParameter>();
62
63
64 private AbstractJClass _declaringClass;
65
66
67 private JSourceCode _sourceCode;
68
69
70 private Vector<JClass> _exceptions;
71
72
73
74
75
76
77 protected JConstructor(final AbstractJClass declaringClass) {
78 _declaringClass = declaringClass;
79 _modifiers = new JModifiers();
80 _sourceCode = new JSourceCode();
81 _exceptions = new Vector<JClass>(1);
82 }
83
84
85
86
87
88
89 public JClass[] getExceptions() {
90 JClass[] jclasses = new JClass[_exceptions.size()];
91 _exceptions.copyInto(jclasses);
92 return jclasses;
93 }
94
95
96
97
98
99
100 public void addException(final JClass exp) {
101 if (exp == null) { return; }
102
103
104 String expClassName = exp.getName();
105 for (int i = 0; i < _exceptions.size(); i++) {
106 JClass jClass = _exceptions.elementAt(i);
107 if (expClassName.equals(jClass.getName())) { return; }
108 }
109
110 _exceptions.addElement(exp);
111 }
112
113
114
115
116
117
118
119
120 public JParameter[] getParameters() {
121 return _params.values().toArray(new JParameter[_params.size()]);
122 }
123
124
125
126
127
128 public int getParameterCount() {
129 return _params.size();
130 }
131
132
133
134
135
136
137
138 public void addParameter(final JParameter parameter) {
139 if (parameter == null) { return; }
140
141
142 if (_params.get(parameter.getName()) != null) {
143 StringBuilder err = new StringBuilder(64);
144 err.append("A parameter already exists for the constructor, ");
145 err.append(this._declaringClass.getName());
146 err.append(", with the name: ");
147 err.append(parameter.getName());
148 throw new IllegalArgumentException(err.toString());
149 }
150
151 _params.put(parameter.getName(), parameter);
152
153
154
155 if (_declaringClass != null) {
156 JType jType = parameter.getType();
157 if (!jType.isPrimitive()) {
158 _declaringClass.addImport(jType.getName());
159 }
160 }
161 }
162
163
164
165
166
167
168 public AbstractJClass getDeclaringClass() {
169 return _declaringClass;
170 }
171
172
173
174
175
176
177 public JModifiers getModifiers() {
178 return _modifiers;
179 }
180
181
182
183
184
185
186 public void setModifiers(final JModifiers modifiers) {
187 _modifiers = modifiers.copy();
188 _modifiers.setFinal(false);
189 }
190
191
192
193
194
195
196 public JSourceCode getSourceCode() {
197 return _sourceCode;
198 }
199
200
201
202
203
204
205 public void setSourceCode(final String sourceCode) {
206 _sourceCode = new JSourceCode(sourceCode);
207 }
208
209
210
211
212
213
214 public void setSourceCode(final JSourceCode sourceCode) {
215 _sourceCode = sourceCode;
216 }
217
218
219
220
221
222
223 public void print(final JSourceWriter jsw) {
224
225 printAnnotations(jsw);
226
227 if (_modifiers.isPrivate()) {
228 jsw.write("private");
229 } else if (_modifiers.isProtected()) {
230 jsw.write("protected");
231 } else {
232 jsw.write("public");
233 }
234 jsw.write(' ');
235 jsw.write(_declaringClass.getLocalName());
236 jsw.write('(');
237
238
239 boolean parameterAnnotations = false;
240 for (JParameter jParameter : _params.values()) {
241 if (jParameter.hasAnnotations()) {
242 parameterAnnotations = true;
243 break;
244 }
245 }
246
247
248 if (parameterAnnotations) {
249 jsw.indent();
250 }
251 int parameterCount = 0;
252 for (JParameter jParameter : _params.values()) {
253 if (parameterCount > 0) {
254 jsw.write(", ");
255 }
256 if (parameterAnnotations) {
257 jsw.writeln();
258 }
259 jParameter.printAnnotations(jsw);
260 String typeAndName = jParameter.toString();
261 jsw.write(typeAndName);
262 parameterCount++;
263 }
264 if (parameterAnnotations) {
265 jsw.unindent();
266 }
267
268 jsw.write(")");
269 if (_exceptions.size() > 0) {
270 jsw.writeln();
271 jsw.write("throws ");
272 for (int i = 0; i < _exceptions.size(); i++) {
273 if (i > 0) { jsw.write(", "); }
274 JClass jClass = _exceptions.elementAt(i);
275 jsw.write(jClass.getName());
276 }
277 }
278 jsw.writeln(" {");
279
280 _sourceCode.print(jsw);
281
282 if (!jsw.isNewline()) { jsw.writeln(); }
283 jsw.writeln("}");
284 }
285
286
287
288
289 public String toString() {
290 StringBuilder sb = new StringBuilder(32);
291 sb.append(_declaringClass.getName());
292 sb.append('(');
293
294
295 for (int i = 0; i < _params.size(); i++) {
296 JParameter jp = _params.get(i);
297 if (i > 0) { sb.append(", "); }
298 sb.append(jp.getType().getName());
299 }
300 sb.append(')');
301 return sb.toString();
302 }
303
304 }