1 | /******************************************************************************* |
2 | * Copyright (c) 2008, 2009 IBM Corporation and others. |
3 | * All rights reserved. This program and the accompanying materials |
4 | * are made available under the terms of the Eclipse Public License v1.0 |
5 | * which accompanies this distribution, and is available at |
6 | * http://www.eclipse.org/legal/epl-v10.html |
7 | * |
8 | * Contributors: |
9 | * IBM Corporation - initial API and implementation |
10 | *******************************************************************************/ |
11 | package org.eclipse.pde.api.tools.internal.problems; |
12 | |
13 | import java.text.ChoiceFormat; |
14 | import java.util.Enumeration; |
15 | import java.util.Hashtable; |
16 | import java.util.Locale; |
17 | import java.util.MissingResourceException; |
18 | import java.util.ResourceBundle; |
19 | |
20 | import org.eclipse.pde.api.tools.internal.builder.BuilderMessages; |
21 | import org.eclipse.pde.api.tools.internal.provisional.comparator.IDelta; |
22 | import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblem; |
23 | import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblemTypes; |
24 | import org.eclipse.pde.api.tools.internal.util.Util; |
25 | |
26 | import com.ibm.icu.text.MessageFormat; |
27 | |
28 | /** |
29 | * Factory for creating {@link IApiProblem}s |
30 | * |
31 | * @since 1.0.0 |
32 | */ |
33 | public class ApiProblemFactory { |
34 | |
35 | public static final int TYPE_CONVERSION_ID = 76; |
36 | |
37 | /** |
38 | * The current mapping of problem id to message |
39 | */ |
40 | private static Hashtable fMessages = null; |
41 | |
42 | /** |
43 | * Creates a new {@link IApiProblem} |
44 | * @param resourcepath the path to the resource this problem was found in |
45 | * @param typeName the type name this problem was found in |
46 | * @param messageargs listing of arguments to pass in to the localized message. |
47 | * The arguments are passed into the string in the order they appear in the array. |
48 | * @param argumentids the ids of arguments passed into the problem |
49 | * @param arguments the arguments that correspond to the listing of ids |
50 | * @param linenumber the number of the line the problem occurred on |
51 | * @param charstart the start of a char selection range |
52 | * @param charend the end of a char selection range |
53 | * @param category the category of the problem. See {@link IApiProblem} for categories |
54 | * @param element the id of the backing element for this problem See {@link IElementDescriptor}, {@link IDelta} and {@link IJavaElement} for kinds |
55 | * @param kind the kind of the problem |
56 | * @param flags any additional flags for the kind |
57 | * @return a new {@link IApiProblem} |
58 | */ |
59 | public static IApiProblem newApiProblem(String resourcepath, String typeName, String[] messageargs, String[] argumentids, Object[] arguments, int linenumber, int charstart, int charend, int category, int element, int kind, int flags) { |
60 | return newApiProblem(resourcepath, typeName, messageargs, argumentids, arguments, linenumber, charstart, charend, createProblemId(category, element, kind, flags)); |
61 | } |
62 | |
63 | /** |
64 | * Creates a new {@link IApiProblem} |
65 | * @param resourcepath the path to the resource this problem was found in |
66 | * @param typeName the type name this problem was found in |
67 | * @param messageargs listing of arguments to pass in to the localized message. |
68 | * The arguments are passed into the string in the order they appear in the array. |
69 | * @param argumentids the ids of arguments passed into the problem |
70 | * @param arguments the arguments that correspond to the listing of ids |
71 | * @param linenumber the number of the line the problem occurred on |
72 | * @param charstart the start of a char selection range |
73 | * @param charend the end of a char selection range |
74 | * @param id the composite id of the problem |
75 | * @return a new {@link IApiProblem} |
76 | */ |
77 | public static IApiProblem newApiProblem(String resourcepath, String typeName, String[] messageargs, String[] argumentids, Object[] arguments, int linenumber, int charstart, int charend, int id) { |
78 | return new ApiProblem(resourcepath, typeName, messageargs, argumentids, arguments, linenumber, charstart, charend, id); |
79 | } |
80 | |
81 | /** |
82 | * Creates a new API usage {@link IApiProblem} |
83 | * @param resourcepath the path to the resource this problem was found in |
84 | * @param typeName the type name this problem was found in |
85 | * @param messageargs listing of arguments to pass in to the localized message. |
86 | * The arguments are passed into the string in the order they appear in the array. |
87 | * @param argumentids the ids of arguments passed into the problem |
88 | * @param arguments the arguments that correspond to the listing of ids |
89 | * @param linenumber the number of the line the problem occurred on |
90 | * @param charstart the start of a char selection range |
91 | * @param charend the end of a char selection range |
92 | * @param element the element kind |
93 | * @param kind the kind |
94 | * @return a new {@link IApiProblem} for API usage |
95 | */ |
96 | public static IApiProblem newApiUsageProblem(String resourcepath, String typeName, String[] messageargs, String[] argumentids, Object[] arguments, int linenumber, int charstart, int charend, int element, int kind) { |
97 | int id = createProblemId(IApiProblem.CATEGORY_USAGE, element, kind, IApiProblem.NO_FLAGS); |
98 | return newApiProblem(resourcepath, typeName, messageargs, argumentids, arguments, linenumber, charstart, charend, id); |
99 | } |
100 | |
101 | /** |
102 | * Creates a new API usage {@link IApiProblem} |
103 | * @param resourcepath the path to the resource this problem was found in |
104 | * @param typeName the type name this problem was found in |
105 | * @param messageargs listing of arguments to pass in to the localized message. |
106 | * The arguments are passed into the string in the order they appear in the array. |
107 | * @param argumentids the ids of arguments passed into the problem |
108 | * @param arguments the arguments that correspond to the listing of ids |
109 | * @param linenumber the number of the line the problem occurred on |
110 | * @param charstart the start of a char selection range |
111 | * @param charend the end of a char selection range |
112 | * @param element the element kind |
113 | * @param kind the kind |
114 | * @param flags the flags |
115 | * @return a new {@link IApiProblem} for API usage |
116 | */ |
117 | public static IApiProblem newApiUsageProblem(String resourcepath, String typeName, String[] messageargs, String[] argumentids, Object[] arguments, int linenumber, int charstart, int charend, int element, int kind, int flags) { |
118 | int id = createProblemId(IApiProblem.CATEGORY_USAGE, element, kind, flags); |
119 | return newApiProblem(resourcepath, typeName, messageargs, argumentids, arguments, linenumber, charstart, charend, id); |
120 | } |
121 | |
122 | /** |
123 | * Creates a new API baseline {@link IApiProblem} |
124 | * @param resourcepath the path to the resource this problem was found in |
125 | * The arguments are passed into the string in the order they appear in the array. |
126 | * @param argumentids the ids of arguments passed into the problem |
127 | * @param arguments the arguments that correspond to the listing of ids |
128 | * @param element the element kind |
129 | * @param kind the kind |
130 | * @return a new {@link IApiProblem} for API usage |
131 | */ |
132 | public static IApiProblem newApiBaselineProblem(String resourcepath, String[] argumentids, Object[] arguments, int element, int kind) { |
133 | int id = createProblemId(IApiProblem.CATEGORY_API_BASELINE, element, kind, IApiProblem.NO_FLAGS); |
134 | return newApiProblem(resourcepath, null, null, argumentids, arguments, -1, -1, -1, id); |
135 | } |
136 | /** |
137 | * Creates a new API component resolution {@link IApiProblem} |
138 | * @param resourcepath the path to the resource this problem was found in |
139 | * @param messageargs listing of arguments to pass in to the localized message. |
140 | * The arguments are passed into the string in the order they appear in the array. |
141 | * @param argumentids the ids of arguments passed into the problem |
142 | * @param arguments the arguments that correspond to the listing of ids |
143 | * @param element the element kind |
144 | * @param kind the kind |
145 | * @return a new {@link IApiProblem} for API usage |
146 | */ |
147 | public static IApiProblem newApiComponentResolutionProblem(String resourcepath, String[] messageargs, String[] argumentids, Object[] arguments, int element, int kind) { |
148 | int id = createProblemId(IApiProblem.CATEGORY_API_COMPONENT_RESOLUTION, element, kind, IApiProblem.NO_FLAGS); |
149 | return newApiProblem(resourcepath, null, messageargs, argumentids, arguments, -1, -1, -1, id); |
150 | } |
151 | /** |
152 | * Creates a new since tag {@link IApiProblem} |
153 | * @param resourcepath the path to the resource this problem was found in |
154 | * @param typeName the type name this problem was found in |
155 | * @param messageargs listing of arguments to pass in to the localized message. |
156 | * The arguments are passed into the string in the order they appear in the array. |
157 | * @param argumentids the ids of arguments passed into the problem |
158 | * @param arguments the arguments that correspond to the listing of ids |
159 | * @param linenumber the number of the line the problem occurred on |
160 | * @param charstart the start of a char selection range |
161 | * @param charend the end of a char selection range |
162 | * @param element the element kind |
163 | * @param kind the kind |
164 | * @return a new {@link IApiProblem} for since tags |
165 | */ |
166 | public static IApiProblem newApiSinceTagProblem(String resourcepath, String typeName, String[] messageargs, String[] argumentids, Object[] arguments, int linenumber, int charstart, int charend, int element, int kind) { |
167 | int id = createProblemId(IApiProblem.CATEGORY_SINCETAGS, element, kind, IApiProblem.NO_FLAGS); |
168 | return newApiProblem(resourcepath, typeName, messageargs, argumentids, arguments, linenumber, charstart, charend, id); |
169 | } |
170 | |
171 | /** |
172 | * Creates a new version number {@link IApiProblem} |
173 | * @param resourcepath the path to the resource this problem was found in |
174 | * @param typeName the type name this problem was found in |
175 | * @param messageargs listing of arguments to pass in to the localized message. |
176 | * The arguments are passed into the string in the order they appear in the array. |
177 | * @param argumentids the ids of arguments passed into the problem |
178 | * @param arguments the arguments that correspond to the listing of ids |
179 | * @param linenumber the number of the line the problem occurred on |
180 | * @param charstart the start of a char selection range |
181 | * @param charend the end of a char selection range |
182 | * @param element the element kind |
183 | * @param kind the kind |
184 | * @return a new {@link IApiProblem} for version numbers |
185 | */ |
186 | public static IApiProblem newApiVersionNumberProblem(String resourcepath, String typeName, String[] messageargs, String[] argumentids, Object[] arguments, int linenumber, int charstart, int charend, int element, int kind) { |
187 | int id = createProblemId(IApiProblem.CATEGORY_VERSION, element, kind, IApiProblem.NO_FLAGS); |
188 | return newApiProblem(resourcepath, typeName, messageargs, argumentids, arguments, linenumber, charstart, charend, id); |
189 | } |
190 | |
191 | /** |
192 | * Returns the localized message for the given {@link IApiProblem}. Returns |
193 | * <code>null</code> if no localized message cannot be created. |
194 | * @param problemid the id of the problem to create a message for |
195 | * @param arguments the arguments to pass into the localized string. The arguments are passed in to the string |
196 | * in the order they appear in the array. |
197 | * |
198 | * @return a localized message for the given {@link IApiProblem} or <code>null</code> |
199 | */ |
200 | public static String getLocalizedMessage(IApiProblem problem) { |
201 | return getLocalizedMessage(problem.getMessageid(), problem.getMessageArguments()); |
202 | } |
203 | |
204 | /** |
205 | * Returns the localized message for the given problem id and message arguments. Returns |
206 | * a not found message if no localized message cannot be created. |
207 | * @param messageid |
208 | * @param messageargs |
209 | * @return a localized message for the given arguments or a 'not found' message |
210 | */ |
211 | public static String getLocalizedMessage(int messageid, String[] messageargs){ |
212 | if(fMessages == null) { |
213 | fMessages = loadMessageTemplates(Locale.getDefault()); |
214 | } |
215 | String pattern = (String) fMessages.get(new Integer(messageid)); |
216 | if(pattern == null) { |
217 | return MessageFormat.format(BuilderMessages.ApiProblemFactory_problem_message_not_found, new String[] {Integer.toString(messageid)}); |
218 | } |
219 | if (messageid == TYPE_CONVERSION_ID) { |
220 | MessageFormat messageFormat = new MessageFormat(pattern); |
221 | double[] typeElementTypes = { |
222 | IDelta.ANNOTATION_ELEMENT_TYPE, |
223 | IDelta.CLASS_ELEMENT_TYPE, |
224 | IDelta.ENUM_ELEMENT_TYPE, |
225 | IDelta.INTERFACE_ELEMENT_TYPE, |
226 | }; |
227 | String [] typeElementTypesStrings = { |
228 | (String) fMessages.get(Util.getDeltaElementType(IDelta.ANNOTATION_ELEMENT_TYPE)), |
229 | (String) fMessages.get(Util.getDeltaElementType(IDelta.CLASS_ELEMENT_TYPE)), |
230 | (String) fMessages.get(Util.getDeltaElementType(IDelta.ENUM_ELEMENT_TYPE)), |
231 | (String) fMessages.get(Util.getDeltaElementType(IDelta.INTERFACE_ELEMENT_TYPE)), |
232 | }; |
233 | ChoiceFormat choiceFormat = new ChoiceFormat(typeElementTypes, typeElementTypesStrings); |
234 | messageFormat.setFormatByArgumentIndex(1, choiceFormat); |
235 | messageFormat.setFormatByArgumentIndex(2, choiceFormat); |
236 | Object[] args = new Object[messageargs.length]; |
237 | args[0] = messageargs[0]; |
238 | args[1] = Integer.decode(messageargs[1]); |
239 | args[2] = Integer.decode(messageargs[2]); |
240 | return messageFormat.format(args); |
241 | } |
242 | return MessageFormat.format(pattern, messageargs); |
243 | } |
244 | |
245 | /** |
246 | * This method initializes the MessageTemplates class variable according |
247 | * to the current Locale. |
248 | * @param loc Locale |
249 | * @return HashtableOfInt |
250 | */ |
251 | public static Hashtable loadMessageTemplates(Locale loc) { |
252 | ResourceBundle bundle = null; |
253 | String bundleName = "org.eclipse.pde.api.tools.internal.problems.problemmessages"; //$NON-NLS-1$ |
254 | try { |
255 | bundle = ResourceBundle.getBundle(bundleName, loc); |
256 | } catch(MissingResourceException e) { |
257 | System.out.println("Missing resource : " + bundleName.replace('.', '/') + ".properties for locale " + loc); //$NON-NLS-1$//$NON-NLS-2$ |
258 | throw e; |
259 | } |
260 | Hashtable templates = new Hashtable(700); |
261 | Enumeration keys = bundle.getKeys(); |
262 | while (keys.hasMoreElements()) { |
263 | String key = (String)keys.nextElement(); |
264 | try { |
265 | int messageID = Integer.parseInt(key); |
266 | templates.put(new Integer(messageID), bundle.getString(key)); |
267 | } catch(NumberFormatException e) { |
268 | // key is not a number |
269 | templates.put(key, bundle.getString(key)); |
270 | } catch (MissingResourceException e) { |
271 | // available ID |
272 | } |
273 | } |
274 | return templates; |
275 | } |
276 | |
277 | /** |
278 | * Creates a problem id from the composite members of a problem id. |
279 | * @param category |
280 | * @param element |
281 | * @param kind |
282 | * @param flags |
283 | * @return a new problem id |
284 | */ |
285 | public static int createProblemId(int category, int element, int kind, int flags) { |
286 | return category | element << IApiProblem.OFFSET_ELEMENT | |
287 | kind << IApiProblem.OFFSET_KINDS | |
288 | flags << IApiProblem.OFFSET_FLAGS | |
289 | getProblemMessageId(category, element, kind, flags); |
290 | } |
291 | |
292 | /** |
293 | * Returns the kind of the problem from the given problem id. The returned kind is not checked to see if it |
294 | * is correct or existing. |
295 | * |
296 | * @see IApiProblem#getKind() |
297 | * @see IDelta#getKind() |
298 | * |
299 | * @param problemid |
300 | * @return the kind from the given problem id |
301 | */ |
302 | public static int getProblemKind(int problemid) { |
303 | return (problemid & ApiProblem.KIND_MASK) >> IApiProblem.OFFSET_KINDS; |
304 | } |
305 | |
306 | /** |
307 | * Returns the kind of element from the given problem id. The returned element kind is not checked to see if it |
308 | * is correct or existing. |
309 | * |
310 | * @see IElementDescriptor#getElementType() |
311 | * @see IDelta#getElementType() |
312 | * |
313 | * @param problemid |
314 | * @return the element kind from the given problem id |
315 | */ |
316 | public static int getProblemElementKind(int problemid) { |
317 | return (problemid & ApiProblem.ELEMENT_KIND_MASK) >> IApiProblem.OFFSET_ELEMENT; |
318 | } |
319 | |
320 | /** |
321 | * Returns the flags from the given problem id. The returned flags are not checked to see if they |
322 | * are correct or existing. |
323 | * |
324 | * @see IDelta#getFlags() |
325 | * |
326 | * @param problemid |
327 | * @return the flags from the given problem id |
328 | */ |
329 | public static int getProblemFlags(int problemid) { |
330 | return (problemid & ApiProblem.FLAGS_MASK) >> IApiProblem.OFFSET_FLAGS; |
331 | } |
332 | |
333 | /** |
334 | * Returns the category of the given problem id. The returned category is not checked to see if it |
335 | * is correct or existing. |
336 | * |
337 | * @see IApiProblem#getCategory() |
338 | * |
339 | * @param problemid |
340 | * @return the category of this problem id |
341 | */ |
342 | public static int getProblemCategory(int problemid) { |
343 | return (problemid & ApiProblem.CATEGORY_MASK); |
344 | } |
345 | |
346 | /** |
347 | * Convenience method to get the message id from a problem id |
348 | * @param problemid |
349 | * @return the message id to use for the given problem id |
350 | */ |
351 | public static int getProblemMessageId(int problemid) { |
352 | return getProblemMessageId(getProblemCategory(problemid), getProblemElementKind(problemid), getProblemKind(problemid), getProblemFlags(problemid)); |
353 | } |
354 | |
355 | /** |
356 | * Returns the problem message id for the given problem parameters. |
357 | * @param category |
358 | * @param element |
359 | * @param kind |
360 | * @param flags |
361 | * @return the id of the message to use for the given problem parameters or <code>0</code> |
362 | */ |
363 | public static int getProblemMessageId(int category, int element, int kind, int flags) { |
364 | switch(category) { |
365 | case IApiProblem.CATEGORY_API_BASELINE: { |
366 | switch(kind) { |
367 | case IApiProblem.API_BASELINE_MISSING: return 1; |
368 | } |
369 | break; |
370 | } |
371 | case IApiProblem.CATEGORY_SINCETAGS: { |
372 | switch(kind) { |
373 | case IApiProblem.SINCE_TAG_INVALID: return 2; |
374 | case IApiProblem.SINCE_TAG_MALFORMED: return 3; |
375 | case IApiProblem.SINCE_TAG_MISSING: return 4; |
376 | } |
377 | break; |
378 | } |
379 | case IApiProblem.CATEGORY_VERSION: { |
380 | switch(kind) { |
381 | case IApiProblem.MAJOR_VERSION_CHANGE: return 5; |
382 | case IApiProblem.MAJOR_VERSION_CHANGE_NO_BREAKAGE: return 6; |
383 | case IApiProblem.MINOR_VERSION_CHANGE: return 7; |
384 | case IApiProblem.MINOR_VERSION_CHANGE_NO_NEW_API: return 56; |
385 | case IApiProblem.REEXPORTED_MAJOR_VERSION_CHANGE : return 19; |
386 | case IApiProblem.REEXPORTED_MINOR_VERSION_CHANGE : return 20; |
387 | } |
388 | break; |
389 | } |
390 | case IApiProblem.CATEGORY_USAGE: { |
391 | switch(kind) { |
392 | case IApiProblem.ILLEGAL_IMPLEMENT: { |
393 | switch(flags) { |
394 | case IApiProblem.NO_FLAGS: return 8; |
395 | case IApiProblem.INDIRECT_REFERENCE: return 24; |
396 | } |
397 | break; |
398 | } |
399 | case IApiProblem.ILLEGAL_EXTEND: { |
400 | switch(flags) { |
401 | case IApiProblem.NO_FLAGS: return 9; |
402 | case IApiProblem.LOCAL_TYPE : return 25; |
403 | case IApiProblem.ANONYMOUS_TYPE: return 28; |
404 | } |
405 | break; |
406 | } |
407 | case IApiProblem.ILLEGAL_INSTANTIATE: return 10; |
408 | case IApiProblem.ILLEGAL_OVERRIDE: return 11; |
409 | case IApiProblem.ILLEGAL_REFERENCE: { |
410 | switch(flags) { |
411 | case IApiProblem.FIELD: return 12; |
412 | case IApiProblem.CONSTRUCTOR_METHOD: return 110; |
413 | case IApiProblem.METHOD: return 111; |
414 | } |
415 | break; |
416 | } |
417 | case IApiProblem.API_LEAK: { |
418 | switch(flags) { |
419 | case IApiProblem.LEAK_EXTENDS: return 13; |
420 | case IApiProblem.LEAK_IMPLEMENTS: return 14; |
421 | case IApiProblem.LEAK_FIELD: return 15; |
422 | case IApiProblem.LEAK_RETURN_TYPE: return 16; |
423 | case IApiProblem.LEAK_METHOD_PARAMETER: return 17; |
424 | case IApiProblem.LEAK_CONSTRUCTOR_PARAMETER: return 109; |
425 | } |
426 | break; |
427 | } |
428 | case IApiProblem.UNSUPPORTED_TAG_USE: return 112; |
429 | case IApiProblem.DUPLICATE_TAG_USE: return 22; |
430 | case IApiProblem.INVALID_REFERENCE_IN_SYSTEM_LIBRARIES : |
431 | switch(flags) { |
432 | case IApiProblem.METHOD : return 33; |
433 | case IApiProblem.CONSTRUCTOR_METHOD : return 34; |
434 | case IApiProblem.FIELD : return 35; |
435 | default: return 36; |
436 | } |
437 | case IApiProblem.UNUSED_PROBLEM_FILTERS: return 30; |
438 | } |
439 | break; |
440 | } |
441 | case IApiProblem.CATEGORY_COMPATIBILITY: { |
442 | switch(kind) { |
443 | case IDelta.ADDED: { |
444 | switch(element) { |
445 | case IDelta.CLASS_ELEMENT_TYPE: { |
446 | switch(flags) { |
447 | case IDelta.METHOD: return 41; |
448 | case IDelta.RESTRICTIONS: return 72; |
449 | } |
450 | break; |
451 | } |
452 | case IDelta.ANNOTATION_ELEMENT_TYPE: { |
453 | switch(flags) { |
454 | case IDelta.FIELD: return 39; |
455 | } |
456 | break; |
457 | } |
458 | case IDelta.INTERFACE_ELEMENT_TYPE: { |
459 | switch(flags) { |
460 | case IDelta.FIELD: return 40; |
461 | case IDelta.METHOD: return 44; |
462 | case IDelta.RESTRICTIONS: return 72; |
463 | case IDelta.SUPER_INTERFACE_WITH_METHODS : return 133; |
464 | } |
465 | break; |
466 | } |
467 | case IDelta.METHOD_ELEMENT_TYPE : { |
468 | switch(flags) { |
469 | case IDelta.RESTRICTIONS: return 132; |
470 | } |
471 | } |
472 | } |
473 | switch(flags) { |
474 | case IDelta.CLASS_BOUND: return 21; |
475 | case IDelta.CONSTRUCTOR: return 23; |
476 | case IDelta.INTERFACE_BOUND: return 26; |
477 | case IDelta.METHOD_WITHOUT_DEFAULT_VALUE: return 29; |
478 | case IDelta.TYPE_PARAMETER: return 32; |
479 | case IDelta.TYPE_ARGUMENT: return 106; |
480 | } |
481 | break; |
482 | } |
483 | case IDelta.CHANGED: { |
484 | switch(element) { |
485 | case IDelta.FIELD_ELEMENT_TYPE: { |
486 | switch(flags) { |
487 | case IDelta.TYPE: return 81; |
488 | case IDelta.VALUE: return 84; |
489 | case IDelta.DECREASE_ACCESS: return 114; |
490 | case IDelta.NON_FINAL_TO_FINAL: return 118; |
491 | case IDelta.STATIC_TO_NON_STATIC: return 121; |
492 | case IDelta.NON_STATIC_TO_STATIC: return 69; |
493 | } |
494 | break; |
495 | } |
496 | case IDelta.METHOD_ELEMENT_TYPE : { |
497 | switch(flags) { |
498 | case IDelta.DECREASE_ACCESS : return 115; |
499 | case IDelta.NON_ABSTRACT_TO_ABSTRACT : return 117; |
500 | case IDelta.NON_FINAL_TO_FINAL: return 119; |
501 | case IDelta.NON_STATIC_TO_STATIC: return 120; |
502 | case IDelta.STATIC_TO_NON_STATIC: return 122; |
503 | } |
504 | break; |
505 | } |
506 | case IDelta.CONSTRUCTOR_ELEMENT_TYPE : { |
507 | switch(flags) { |
508 | case IDelta.DECREASE_ACCESS : return 116; |
509 | } |
510 | } |
511 | } |
512 | switch(flags) { |
513 | case IDelta.CLASS_BOUND: return 52; |
514 | case IDelta.CONTRACTED_SUPERINTERFACES_SET: return 54; |
515 | case IDelta.DECREASE_ACCESS: return 55; |
516 | case IDelta.FINAL_TO_NON_FINAL_STATIC_CONSTANT: return 61; |
517 | case IDelta.INTERFACE_BOUND: return 64; |
518 | case IDelta.NON_ABSTRACT_TO_ABSTRACT: return 66; |
519 | case IDelta.NON_FINAL_TO_FINAL: return 67; |
520 | case IDelta.NON_STATIC_TO_STATIC: return 123; |
521 | case IDelta.STATIC_TO_NON_STATIC: return 73; |
522 | case IDelta.TYPE_CONVERSION: return TYPE_CONVERSION_ID; |
523 | case IDelta.VARARGS_TO_ARRAY: return 85; |
524 | case IDelta.TYPE_ARGUMENT: return 124; |
525 | } |
526 | break; |
527 | } |
528 | case IDelta.REMOVED: { |
529 | switch(flags) { |
530 | case IDelta.ANNOTATION_DEFAULT_VALUE: return 86; |
531 | case IDelta.API_COMPONENT: return 87; |
532 | case IDelta.CLASS_BOUND: return 89; |
533 | case IDelta.CONSTRUCTOR: return 91; |
534 | case IDelta.ENUM_CONSTANT: return 92; |
535 | case IDelta.FIELD: return 94; |
536 | case IDelta.INTERFACE_BOUND: return 96; |
537 | case IDelta.METHOD: return 98; |
538 | case IDelta.METHOD_WITH_DEFAULT_VALUE: return 100; |
539 | case IDelta.METHOD_WITHOUT_DEFAULT_VALUE: return 101; |
540 | case IDelta.TYPE: return 102; |
541 | case IDelta.TYPE_ARGUMENTS: return 103; |
542 | case IDelta.TYPE_MEMBER: return 104; |
543 | case IDelta.TYPE_PARAMETER: return 105; |
544 | case IDelta.VALUE : return 108; |
545 | case IDelta.API_TYPE: return 113; |
546 | case IDelta.API_FIELD: return 125; |
547 | case IDelta.API_METHOD: return 126; |
548 | case IDelta.API_CONSTRUCTOR: return 127; |
549 | case IDelta.API_ENUM_CONSTANT: return 128; |
550 | case IDelta.API_METHOD_WITH_DEFAULT_VALUE : return 129; |
551 | case IDelta.API_METHOD_WITHOUT_DEFAULT_VALUE: return 130; |
552 | case IDelta.TYPE_ARGUMENT: return 107; |
553 | case IDelta.SUPERCLASS: return 131; |
554 | case IDelta.REEXPORTED_API_TYPE: return 134; |
555 | case IDelta.REEXPORTED_TYPE: return 135; |
556 | } |
557 | } |
558 | } |
559 | break; |
560 | } |
561 | case IApiProblem.CATEGORY_API_COMPONENT_RESOLUTION: { |
562 | switch(kind) { |
563 | case IApiProblem.API_COMPONENT_RESOLUTION: { |
564 | return 99; |
565 | } |
566 | } |
567 | } |
568 | } |
569 | return 0; |
570 | } |
571 | |
572 | /** |
573 | * Returns the problem severity id for the given problem parameters. |
574 | * @param category |
575 | * @param element |
576 | * @param kind |
577 | * @param flags |
578 | * @return the id of the preference to use to lookup the user specified severity level for the given {@link IApiProblem} |
579 | */ |
580 | public static String getProblemSeverityId(IApiProblem problem) { |
581 | switch(problem.getCategory()) { |
582 | case IApiProblem.CATEGORY_API_COMPONENT_RESOLUTION : { |
583 | switch(problem.getKind()) { |
584 | case IApiProblem.API_COMPONENT_RESOLUTION: return IApiProblemTypes.REPORT_RESOLUTION_ERRORS_API_COMPONENT; |
585 | } |
586 | break; |
587 | } |
588 | case IApiProblem.CATEGORY_API_BASELINE: { |
589 | switch(problem.getKind()) { |
590 | case IApiProblem.API_BASELINE_MISSING: return IApiProblemTypes.MISSING_DEFAULT_API_BASELINE; |
591 | } |
592 | break; |
593 | } |
594 | case IApiProblem.CATEGORY_SINCETAGS: { |
595 | switch(problem.getKind()) { |
596 | case IApiProblem.SINCE_TAG_INVALID: return IApiProblemTypes.INVALID_SINCE_TAG_VERSION; |
597 | case IApiProblem.SINCE_TAG_MALFORMED: return IApiProblemTypes.MALFORMED_SINCE_TAG; |
598 | case IApiProblem.SINCE_TAG_MISSING: return IApiProblemTypes.MISSING_SINCE_TAG; |
599 | } |
600 | break; |
601 | } |
602 | case IApiProblem.CATEGORY_VERSION: { |
603 | return IApiProblemTypes.INCOMPATIBLE_API_COMPONENT_VERSION; |
604 | } |
605 | case IApiProblem.CATEGORY_USAGE: { |
606 | switch(problem.getKind()) { |
607 | case IApiProblem.ILLEGAL_IMPLEMENT: return IApiProblemTypes.ILLEGAL_IMPLEMENT; |
608 | case IApiProblem.ILLEGAL_EXTEND: return IApiProblemTypes.ILLEGAL_EXTEND; |
609 | case IApiProblem.ILLEGAL_INSTANTIATE: return IApiProblemTypes.ILLEGAL_INSTANTIATE; |
610 | case IApiProblem.ILLEGAL_OVERRIDE: return IApiProblemTypes.ILLEGAL_OVERRIDE; |
611 | case IApiProblem.ILLEGAL_REFERENCE: return IApiProblemTypes.ILLEGAL_REFERENCE; |
612 | case IApiProblem.API_LEAK: { |
613 | switch(problem.getFlags()) { |
614 | case IApiProblem.LEAK_EXTENDS : return IApiProblemTypes.LEAK_EXTEND; |
615 | case IApiProblem.LEAK_FIELD : return IApiProblemTypes.LEAK_FIELD_DECL; |
616 | case IApiProblem.LEAK_IMPLEMENTS : return IApiProblemTypes.LEAK_IMPLEMENT; |
617 | case IApiProblem.LEAK_CONSTRUCTOR_PARAMETER: |
618 | case IApiProblem.LEAK_METHOD_PARAMETER : return IApiProblemTypes.LEAK_METHOD_PARAM; |
619 | case IApiProblem.LEAK_RETURN_TYPE : return IApiProblemTypes.LEAK_METHOD_RETURN_TYPE; |
620 | } |
621 | break; |
622 | } |
623 | case IApiProblem.UNSUPPORTED_TAG_USE: return IApiProblemTypes.INVALID_JAVADOC_TAG; |
624 | case IApiProblem.DUPLICATE_TAG_USE: return IApiProblemTypes.INVALID_JAVADOC_TAG; |
625 | case IApiProblem.INVALID_REFERENCE_IN_SYSTEM_LIBRARIES: return IApiProblemTypes.INVALID_REFERENCE_IN_SYSTEM_LIBRARIES; |
626 | case IApiProblem.UNUSED_PROBLEM_FILTERS: return IApiProblemTypes.UNUSED_PROBLEM_FILTERS; |
627 | } |
628 | break; |
629 | } |
630 | case IApiProblem.CATEGORY_COMPATIBILITY: { |
631 | return Util.getDeltaPrefererenceKey(problem.getElementKind(), problem.getKind(), problem.getFlags()); |
632 | } |
633 | } |
634 | return null; |
635 | } |
636 | |
637 | /** |
638 | * Returns the problem kind from the given preference key. |
639 | * |
640 | * @see IApiProblemTypes for a listing of all preference keys |
641 | * @param prefkey |
642 | * @return the corresponding kind for the given preference key, or 0 if the pref key is unknown |
643 | */ |
644 | public static int getProblemKindFromPref(String prefkey) { |
645 | if(IApiProblemTypes.ILLEGAL_EXTEND.equals(prefkey)) { |
646 | return IApiProblem.ILLEGAL_EXTEND; |
647 | } |
648 | if(IApiProblemTypes.ILLEGAL_IMPLEMENT.equals(prefkey)) { |
649 | return IApiProblem.ILLEGAL_IMPLEMENT; |
650 | } |
651 | if(IApiProblemTypes.ILLEGAL_INSTANTIATE.equals(prefkey)) { |
652 | return IApiProblem.ILLEGAL_INSTANTIATE; |
653 | } |
654 | if(IApiProblemTypes.ILLEGAL_REFERENCE.equals(prefkey)) { |
655 | return IApiProblem.ILLEGAL_REFERENCE; |
656 | } |
657 | if(IApiProblemTypes.ILLEGAL_OVERRIDE.equals(prefkey)) { |
658 | return IApiProblem.ILLEGAL_OVERRIDE; |
659 | } |
660 | if(IApiProblemTypes.INVALID_REFERENCE_IN_SYSTEM_LIBRARIES.equals(prefkey)) { |
661 | return IApiProblem.INVALID_REFERENCE_IN_SYSTEM_LIBRARIES; |
662 | } |
663 | if(IApiProblemTypes.UNUSED_PROBLEM_FILTERS.equals(prefkey)) { |
664 | return IApiProblem.UNUSED_PROBLEM_FILTERS; |
665 | } |
666 | if(IApiProblemTypes.MISSING_SINCE_TAG.equals(prefkey)) { |
667 | return IApiProblem.SINCE_TAG_MISSING; |
668 | } |
669 | if(IApiProblemTypes.MALFORMED_SINCE_TAG.equals(prefkey)) { |
670 | return IApiProblem.SINCE_TAG_MALFORMED; |
671 | } |
672 | if(IApiProblemTypes.INVALID_SINCE_TAG_VERSION.equals(prefkey)) { |
673 | return IApiProblem.SINCE_TAG_INVALID; |
674 | } |
675 | if(IApiProblemTypes.REPORT_RESOLUTION_ERRORS_API_COMPONENT.equals(prefkey)) { |
676 | return IApiProblem.API_COMPONENT_RESOLUTION; |
677 | } |
678 | if(prefkey != null) { |
679 | if(prefkey.indexOf("ADDED") > -1) { //$NON-NLS-1$ |
680 | return IDelta.ADDED; |
681 | } |
682 | if(prefkey.indexOf("CHANGED") > -1) { //$NON-NLS-1$ |
683 | return IDelta.CHANGED; |
684 | } |
685 | if(prefkey.indexOf("REMOVED") > -1) { //$NON-NLS-1$ |
686 | return IDelta.REMOVED; |
687 | } |
688 | } |
689 | return 0; |
690 | } |
691 | } |