blob: 7dc65c0e22894653aec8ca7a48d6be450d509fbd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2017 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.api.tools.internal.problems;
import java.text.ChoiceFormat;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.eclipse.core.resources.IMarker;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.pde.api.tools.internal.builder.BuilderMessages;
import org.eclipse.pde.api.tools.internal.provisional.IApiMarkerConstants;
import org.eclipse.pde.api.tools.internal.provisional.comparator.IDelta;
import org.eclipse.pde.api.tools.internal.provisional.descriptors.IElementDescriptor;
import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblem;
import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblemFilter;
import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblemTypes;
import org.eclipse.pde.api.tools.internal.util.Util;
import com.ibm.icu.text.MessageFormat;
/**
* Factory for creating {@link IApiProblem}s
*
* @since 1.0.0
*/
public class ApiProblemFactory {
public static final int TYPE_CONVERSION_ID = 76;
/**
* The current mapping of problem id to message
*/
private static Hashtable<Comparable<? extends Object>, String> fMessages = null;
/**
* Creates a new {@link IApiProblemFilter}
*
* @param componentid
* @param problem
* @param comment
* @return the new {@link IApiProblemFilter}
* @since 1.1
*/
public static IApiProblemFilter newProblemFilter(String componentid, IApiProblem problem, String comment) {
return new ApiProblemFilter(componentid, problem, comment);
}
/**
* Computes an {@link IApiProblem} hashcode from the given filter handle. If
* the handle is <code>null</code> this method returns <code>-1</code>.
*
* @param filterhandle the problem handle
* @return a new hashcode for the {@link IApiProblem} described in the
* filter or <code>-1</code>
* @see ApiProblem#hashCode()
* @see ApiProblemFilter#getHandle()
* @since 1.0.500
*/
public static int getProblemHashcode(String filterhandle) {
if (filterhandle != null) {
String[] args = filterhandle.split(ApiProblemFilter.HANDLE_DELIMITER);
int hashcode = 0;
try {
// the problem id
hashcode += Integer.parseInt(args[0]);
// the resource path
hashcode += args[1].hashCode();
// the type name, do not add to the hashcode if the type name is
// null
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=404173
if (args[2] != null && !args[2].equalsIgnoreCase("null")) { //$NON-NLS-1$
hashcode += args[2].hashCode();
}
// the message arguments
String[] margs = splitHandle(args[3], ApiProblemFilter.HANDLE_ARGUMENTS_DELIMITER);
hashcode += argumentsHashcode(margs);
} catch (Exception e) {
} finally {
}
return hashcode;
}
return -1;
}
/**
* Returns the deep hash code of the complete listing of message arguments
*
* @param arguments
* @return the hash code of the message arguments
*/
private static int argumentsHashcode(String[] arguments) {
if (arguments == null) {
return 0;
}
int hashcode = 0;
for (String argument : arguments) {
hashcode += argument.hashCode();
}
return hashcode;
}
private static String[] splitHandle(String messageArguments, String delimiter) {
List<String> matches = null;
char[] argumentsChars = messageArguments.toCharArray();
char[] delimiterChars = delimiter.toCharArray();
int delimiterLength = delimiterChars.length;
int start = 0;
int argumentsCharsLength = argumentsChars.length;
int balance = 0;
for (int i = 0; i < argumentsCharsLength;) {
char c = argumentsChars[i];
switch (c) {
case '(': {
balance++;
break;
}
case ')': {
balance--;
break;
}
default:
break;
}
if (c == delimiterChars[0] && balance == 0) {
// see if this is a matching delimiter start only if not within
// parenthesis (balance == 0)
if (i + delimiterLength < argumentsCharsLength) {
boolean match = true;
loop: for (int j = 1; j < delimiterLength; j++) {
if (argumentsChars[i + j] != delimiterChars[j]) {
match = false;
break loop;
}
}
if (match) {
// record the matching substring and proceed
if (matches == null) {
matches = new ArrayList<>();
}
matches.add(messageArguments.substring(start, i));
start = i + delimiterLength;
i += delimiterLength;
} else {
i++;
}
} else {
i++;
}
} else {
i++;
}
}
if (matches == null) {
return new String[] { messageArguments };
} else {
matches.add(messageArguments.substring(start, argumentsCharsLength));
}
return matches.toArray(new String[matches.size()]);
}
/**
* Creates a new {@link IApiProblem}
*
* @param resourcepath the path to the resource this problem was found in
* @param typeName the type name this problem was found in
* @param messageargs listing of arguments to pass in to the localized
* message. The arguments are passed into the string in the order
* they appear in the array.
* @param argumentids the ids of arguments passed into the problem
* @param arguments the arguments that correspond to the listing of ids
* @param linenumber the number of the line the problem occurred on
* @param charstart the start of a char selection range
* @param charend the end of a char selection range
* @param category the category of the problem. See {@link IApiProblem} for
* categories
* @param element the id of the backing element for this problem See
* {@link IElementDescriptor}, {@link IDelta} and
* {@link IJavaElement} for kinds
* @param kind the kind of the problem
* @param flags any additional flags for the kind
* @return a new {@link IApiProblem}
*/
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) {
return newApiProblem(resourcepath, typeName, messageargs, argumentids, arguments, linenumber, charstart, charend, createProblemId(category, element, kind, flags));
}
/**
* Creates a new {@link IApiProblem}
*
* @param resourcepath the path to the resource this problem was found in
* @param typeName the type name this problem was found in
* @param messageargs listing of arguments to pass in to the localized
* message. The arguments are passed into the string in the order
* they appear in the array.
* @param argumentids the ids of arguments passed into the problem
* @param arguments the arguments that correspond to the listing of ids
* @param linenumber the number of the line the problem occurred on
* @param charstart the start of a char selection range
* @param charend the end of a char selection range
* @param id the composite id of the problem
* @return a new {@link IApiProblem}
*/
public static IApiProblem newApiProblem(String resourcepath, String typeName, String[] messageargs, String[] argumentids, Object[] arguments, int linenumber, int charstart, int charend, int id) {
return new ApiProblem(resourcepath, typeName, messageargs, argumentids, arguments, linenumber, charstart, charend, id);
}
/**
* Creates a new API usage {@link IApiProblem}
*
* @param resourcepath the path to the resource this problem was found in
* @param typeName the type name this problem was found in
* @param messageargs listing of arguments to pass in to the localized
* message. The arguments are passed into the string in the order
* they appear in the array.
* @param argumentids the ids of arguments passed into the problem
* @param arguments the arguments that correspond to the listing of ids
* @param linenumber the number of the line the problem occurred on
* @param charstart the start of a char selection range
* @param charend the end of a char selection range
* @param element the element kind
* @param kind the kind
* @return a new {@link IApiProblem} for API usage
*/
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 id = createProblemId(IApiProblem.CATEGORY_USAGE, element, kind, IApiProblem.NO_FLAGS);
return newApiProblem(resourcepath, typeName, messageargs, argumentids, arguments, linenumber, charstart, charend, id);
}
/**
* Creates a new API usage {@link IApiProblem}
*
* @param resourcepath the path to the resource this problem was found in
* @param typeName the type name this problem was found in
* @param messageargs listing of arguments to pass in to the localized
* message. The arguments are passed into the string in the order
* they appear in the array.
* @param argumentids the ids of arguments passed into the problem
* @param arguments the arguments that correspond to the listing of ids
* @param linenumber the number of the line the problem occurred on
* @param charstart the start of a char selection range
* @param charend the end of a char selection range
* @param element the element kind
* @param kind the kind
* @param flags the flags
* @return a new {@link IApiProblem} for API usage
*/
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) {
int id = createProblemId(IApiProblem.CATEGORY_USAGE, element, kind, flags);
return newApiProblem(resourcepath, typeName, messageargs, argumentids, arguments, linenumber, charstart, charend, id);
}
/**
* Creates a new API baseline {@link IApiProblem}
*
* @param resourcepath the path to the resource this problem was found in
* The arguments are passed into the string in the order they
* appear in the array.
* @param argumentids the ids of arguments passed into the problem
* @param arguments the arguments that correspond to the listing of ids
* @param element the element kind
* @param kind the kind
* @return a new {@link IApiProblem} for API usage
*/
public static IApiProblem newApiBaselineProblem(String resourcepath, String[] argumentids, Object[] arguments, int element, int kind) {
int id = createProblemId(IApiProblem.CATEGORY_API_BASELINE, element, kind, IApiProblem.NO_FLAGS);
return newApiProblem(resourcepath, null, null, argumentids, arguments, -1, -1, -1, id);
}
/**
* Creates a new API component resolution {@link IApiProblem}
*
* @param resourcepath the path to the resource this problem was found in
* @param messageargs listing of arguments to pass in to the localized
* message. The arguments are passed into the string in the order
* they appear in the array.
* @param argumentids the ids of arguments passed into the problem
* @param arguments the arguments that correspond to the listing of ids
* @param element the element kind
* @param kind the kind
* @return a new {@link IApiProblem} for API usage
*/
public static IApiProblem newApiComponentResolutionProblem(String resourcepath, String[] messageargs, String[] argumentids, Object[] arguments, int element, int kind) {
int id = createProblemId(IApiProblem.CATEGORY_API_COMPONENT_RESOLUTION, element, kind, IApiProblem.NO_FLAGS);
return newApiProblem(resourcepath, null, messageargs, argumentids, arguments, -1, -1, -1, id);
}
/**
* Creates a new fatal {@link IApiProblem}
*
* @param resourcepath the path to the resource this problem was found in
* @param messageargs listing of arguments to pass in to the localized
* message. The arguments are passed into the string in the order
* they appear in the array.
* @param kind the kind
* @return a new {@link IApiProblem} for API usage
*/
public static IApiProblem newFatalProblem(String resourcepath, String[] messageargs, int kind) {
int id = createProblemId(IApiProblem.CATEGORY_FATAL_PROBLEM, IElementDescriptor.RESOURCE, kind, IApiProblem.NO_FLAGS);
return newApiProblem(resourcepath, null, messageargs, null, null, -1, -1, -1, id);
}
/**
* Creates a new since tag {@link IApiProblem}
*
* @param resourcepath the path to the resource this problem was found in
* @param typeName the type name this problem was found in
* @param messageargs listing of arguments to pass in to the localized
* message. The arguments are passed into the string in the order
* they appear in the array.
* @param argumentids the ids of arguments passed into the problem
* @param arguments the arguments that correspond to the listing of ids
* @param linenumber the number of the line the problem occurred on
* @param charstart the start of a char selection range
* @param charend the end of a char selection range
* @param element the element kind
* @param kind the kind
* @return a new {@link IApiProblem} for since tags
*/
public static IApiProblem newApiSinceTagProblem(String resourcepath, String typeName, String[] messageargs, String[] argumentids, Object[] arguments, int linenumber, int charstart, int charend, int element, int kind) {
int id = createProblemId(IApiProblem.CATEGORY_SINCETAGS, element, kind, IApiProblem.NO_FLAGS);
return newApiProblem(resourcepath, typeName, messageargs, argumentids, arguments, linenumber, charstart, charend, id);
}
/**
* Creates a new version number {@link IApiProblem}
*
* @param resourcepath the path to the resource this problem was found in
* @param typeName the type name this problem was found in
* @param messageargs listing of arguments to pass in to the localized
* message. The arguments are passed into the string in the order
* they appear in the array.
* @param argumentids the ids of arguments passed into the problem
* @param arguments the arguments that correspond to the listing of ids
* @param linenumber the number of the line the problem occurred on
* @param charstart the start of a char selection range
* @param charend the end of a char selection range
* @param element the element kind
* @param kind the kind
* @return a new {@link IApiProblem} for version numbers
*/
public static IApiProblem newApiVersionNumberProblem(String resourcepath, String typeName, String[] messageargs, String[] argumentids, Object[] arguments, int linenumber, int charstart, int charend, int element, int kind) {
int id = createProblemId(IApiProblem.CATEGORY_VERSION, element, kind, IApiProblem.NO_FLAGS);
return newApiProblem(resourcepath, typeName, messageargs, argumentids, arguments, linenumber, charstart, charend, id);
}
/**
* Creates a new API Use Scan breakage {@link IApiProblem}
*
* @param resourcePath path of the resource associated with the problem
* @param typeName the type name this problem was found in
* @param messageargs listing of arguments to pass in to the localized
* message. The arguments are passed into the string in the order
* they appear in the array.
* @param argumentids the ids of arguments passed into the problem
* @param arguments the arguments that correspond to the listing of ids
* @param linenumber the number of the line the problem occurred on
* @param charstart the start of a char selection range
* @param charend the end of a char selection range
* @param element the element kind
* @param kind the kind
* @param flags flags the reason for problem. <code>0</code> if the type
* could not be resolved. <code>1</code> if member could not be
* located in the type.
* @return a new {@link IApiProblem} for API Use Scan breakage
*/
public static IApiProblem newApiUseScanProblem(String resourcePath, String typeName, String[] messageargs, String[] argumentids, Object[] arguments, int linenumber, int charstart, int charend, int element, int kind, int flags) {
int id = createProblemId(IApiProblem.CATEGORY_API_USE_SCAN_PROBLEM, element, kind, flags);
return newApiProblem(resourcePath, typeName, messageargs, argumentids, arguments, linenumber, charstart, charend, id);
}
/**
* Returns the localized message for the given {@link IApiProblem}. Returns
* <code>null</code> if no localized message cannot be created.
*
* @param problemid the id of the problem to create a message for
* @param arguments the arguments to pass into the localized string. The
* arguments are passed in to the string in the order they appear
* in the array.
*
* @return a localized message for the given {@link IApiProblem} or
* <code>null</code>
*/
public static String getLocalizedMessage(IApiProblem problem) {
return getLocalizedMessage(problem.getMessageid(), problem.getMessageArguments());
}
/**
* Returns the localized message for the given problem id and message
* arguments. Returns a not found message if no localized message cannot be
* created.
*
* @param messageid
* @param messageargs
* @return a localized message for the given arguments or a 'not found'
* message
*/
public static String getLocalizedMessage(int messageid, String[] messageargs) {
if (fMessages == null) {
fMessages = loadMessageTemplates(Locale.getDefault());
}
String pattern = fMessages.get(Integer.valueOf(messageid));
if (pattern == null) {
return MessageFormat.format(BuilderMessages.ApiProblemFactory_problem_message_not_found, Integer.toString(messageid));
}
if (messageid == TYPE_CONVERSION_ID) {
MessageFormat messageFormat = new MessageFormat(pattern);
double[] typeElementTypes = {
IDelta.ANNOTATION_ELEMENT_TYPE, IDelta.CLASS_ELEMENT_TYPE,
IDelta.ENUM_ELEMENT_TYPE, IDelta.INTERFACE_ELEMENT_TYPE, };
String[] typeElementTypesStrings = {
fMessages.get(Util.getDeltaElementType(IDelta.ANNOTATION_ELEMENT_TYPE)),
fMessages.get(Util.getDeltaElementType(IDelta.CLASS_ELEMENT_TYPE)),
fMessages.get(Util.getDeltaElementType(IDelta.ENUM_ELEMENT_TYPE)),
fMessages.get(Util.getDeltaElementType(IDelta.INTERFACE_ELEMENT_TYPE)), };
ChoiceFormat choiceFormat = new ChoiceFormat(typeElementTypes, typeElementTypesStrings);
messageFormat.setFormatByArgumentIndex(1, choiceFormat);
messageFormat.setFormatByArgumentIndex(2, choiceFormat);
Object[] args = new Object[messageargs.length];
args[0] = messageargs[0];
args[1] = Integer.decode(messageargs[1]);
args[2] = Integer.decode(messageargs[2]);
return messageFormat.format(args);
}
return MessageFormat.format(pattern, (Object[]) messageargs);
}
/**
* This method initializes the MessageTemplates class variable according to
* the current Locale.
*
* @param loc Locale
* @return HashtableOfInt
*/
public static Hashtable<Comparable<? extends Object>, String> loadMessageTemplates(Locale loc) {
ResourceBundle bundle = null;
String bundleName = "org.eclipse.pde.api.tools.internal.problems.problemmessages"; //$NON-NLS-1$
try {
bundle = ResourceBundle.getBundle(bundleName, loc);
} catch (MissingResourceException e) {
System.out.println("Missing resource : " + bundleName.replace('.', '/') + ".properties for locale " + loc); //$NON-NLS-1$//$NON-NLS-2$
throw e;
}
Hashtable<Comparable<? extends Object>, String> templates = new Hashtable<>(700);
Enumeration<String> keys = bundle.getKeys();
while (keys.hasMoreElements()) {
String key = keys.nextElement();
try {
int messageID = Integer.parseInt(key);
templates.put(Integer.valueOf(messageID), bundle.getString(key));
} catch (NumberFormatException e) {
// key is not a number
templates.put(key, bundle.getString(key));
} catch (MissingResourceException e) {
// available ID
}
}
return templates;
}
/**
* Creates a problem id from the composite members of a problem id.
*
* @param category
* @param element
* @param kind
* @param flags
* @return a new problem id
*/
public static int createProblemId(int category, int element, int kind, int flags) {
return category | element << IApiProblem.OFFSET_ELEMENT | kind << IApiProblem.OFFSET_KINDS | flags << IApiProblem.OFFSET_FLAGS | getProblemMessageId(category, element, kind, flags);
}
/**
* Returns the {@link IApiProblem} id from the given marker or
* <code>-1</code> if the marker is <code>null</code> or the marker does not
* contain the {@link IApiMarkerConstants#MARKER_ATTR_PROBLEM_ID} attribute
*
* @param marker
* @return the {@link IApiProblem} id or <code>-1</code>
* @since 1.0.400
*/
public static int getProblemId(IMarker marker) {
if (marker != null) {
return marker.getAttribute(IApiMarkerConstants.MARKER_ATTR_PROBLEM_ID, -1);
}
return -1;
}
/**
* Returns the kind of the problem from the given problem id. The returned
* kind is not checked to see if it is correct or existing.
*
* @see IApiProblem#getKind()
* @see IDelta#getKind()
*
* @param problemid
* @return the kind from the given problem id
*/
public static int getProblemKind(int problemid) {
return (problemid & ApiProblem.KIND_MASK) >> IApiProblem.OFFSET_KINDS;
}
/**
* Returns the kind of element from the given problem id. The returned
* element kind is not checked to see if it is correct or existing.
*
* @see IElementDescriptor#getElementType()
* @see IDelta#getElementType()
*
* @param problemid
* @return the element kind from the given problem id
*/
public static int getProblemElementKind(int problemid) {
return (problemid & ApiProblem.ELEMENT_KIND_MASK) >> IApiProblem.OFFSET_ELEMENT;
}
/**
* Returns the flags from the given problem id. The returned flags are not
* checked to see if they are correct or existing.
*
* @see IDelta#getFlags()
*
* @param problemid
* @return the flags from the given problem id
*/
public static int getProblemFlags(int problemid) {
return (problemid & ApiProblem.FLAGS_MASK) >> IApiProblem.OFFSET_FLAGS;
}
/**
* Returns the category of the given problem id. The returned category is
* not checked to see if it is correct or existing.
*
* @see IApiProblem#getCategory()
*
* @param problemid
* @return the category of this problem id
*/
public static int getProblemCategory(int problemid) {
return (problemid & ApiProblem.CATEGORY_MASK);
}
/**
* Convenience method to get the message id from a problem id
*
* @param problemid
* @return the message id to use for the given problem id
*/
public static int getProblemMessageId(int problemid) {
return getProblemMessageId(getProblemCategory(problemid), getProblemElementKind(problemid), getProblemKind(problemid), getProblemFlags(problemid));
}
/**
* Returns the problem message id for the given problem parameters.
*
* @param category
* @param element
* @param kind
* @param flags
* @return the id of the message to use for the given problem parameters or
* <code>0</code>
*/
public static int getProblemMessageId(int category, int element, int kind, int flags) {
switch (category) {
case IApiProblem.CATEGORY_API_BASELINE: {
switch (kind) {
case IApiProblem.API_BASELINE_MISSING:
return 1;
default:
break;
}
break;
}
case IApiProblem.CATEGORY_SINCETAGS: {
switch (kind) {
case IApiProblem.SINCE_TAG_INVALID:
return 2;
case IApiProblem.SINCE_TAG_MALFORMED:
return 3;
case IApiProblem.SINCE_TAG_MISSING:
return 4;
default:
break;
}
break;
}
case IApiProblem.CATEGORY_VERSION: {
switch (kind) {
case IApiProblem.MAJOR_VERSION_CHANGE:
return 5;
case IApiProblem.MAJOR_VERSION_CHANGE_NO_BREAKAGE:
return 6;
case IApiProblem.MINOR_VERSION_CHANGE:
return 7;
case IApiProblem.MINOR_VERSION_CHANGE_NO_NEW_API:
return 56;
case IApiProblem.REEXPORTED_MAJOR_VERSION_CHANGE:
return 19;
case IApiProblem.REEXPORTED_MINOR_VERSION_CHANGE:
return 20;
case IApiProblem.MINOR_VERSION_CHANGE_EXECUTION_ENV_CHANGED:
return 43;
default:
break;
}
break;
}
case IApiProblem.CATEGORY_USAGE: {
switch (kind) {
case IApiProblem.ILLEGAL_IMPLEMENT: {
switch (flags) {
case IApiProblem.NO_FLAGS:
return 8;
case IApiProblem.INDIRECT_REFERENCE:
return 24;
case IApiProblem.LOCAL_TYPE:
return 18;
case IApiProblem.INDIRECT_LOCAL_REFERENCE:
return 37;
case IApiProblem.ANONYMOUS_TYPE:
return 27;
default:
break;
}
break;
}
case IApiProblem.ILLEGAL_EXTEND: {
switch (flags) {
case IApiProblem.NO_FLAGS:
return 9;
case IApiProblem.LOCAL_TYPE:
return 25;
case IApiProblem.ANONYMOUS_TYPE:
return 28;
default:
break;
}
break;
}
case IApiProblem.ILLEGAL_INSTANTIATE:
return 10;
case IApiProblem.ILLEGAL_OVERRIDE:
return 11;
case IApiProblem.ILLEGAL_REFERENCE: {
switch (flags) {
case IApiProblem.FIELD:
return 12;
case IApiProblem.CONSTRUCTOR_METHOD:
return 110;
case IApiProblem.METHOD:
return 111;
case IApiProblem.ANNOTATION:
return 42;
default:
break;
}
break;
}
case IApiProblem.API_LEAK: {
switch (flags) {
case IApiProblem.LEAK_EXTENDS:
return 13;
case IApiProblem.LEAK_BY_EXTENDING_NO_EXTEND_TYPE:
return 48;
case IApiProblem.LEAK_IMPLEMENTS:
return 14;
case IApiProblem.LEAK_FIELD:
return 15;
case IApiProblem.LEAK_RETURN_TYPE:
return 16;
case IApiProblem.LEAK_METHOD_PARAMETER:
return 17;
case IApiProblem.LEAK_CONSTRUCTOR_PARAMETER:
return 109;
default:
break;
}
break;
}
case IApiProblem.UNSUPPORTED_TAG_USE:
return 112;
case IApiProblem.DUPLICATE_TAG_USE:
return 22;
case IApiProblem.DUPLICATE_ANNOTATION_USE:
return 45;
case IApiProblem.UNSUPPORTED_ANNOTATION_USE:
return 46;
case IApiProblem.INVALID_REFERENCE_IN_SYSTEM_LIBRARIES:
switch (flags) {
case IApiProblem.METHOD:
return 33;
case IApiProblem.CONSTRUCTOR_METHOD:
return 34;
case IApiProblem.FIELD:
return 35;
default:
return 36;
}
case IApiProblem.UNUSED_PROBLEM_FILTERS:
return 30;
case IApiProblem.MISSING_EE_DESCRIPTIONS:
return 38;
default:
break;
}
break;
}
case IApiProblem.CATEGORY_COMPATIBILITY: {
switch (kind) {
case IDelta.ADDED: {
switch (element) {
case IDelta.CLASS_ELEMENT_TYPE: {
switch (flags) {
case IDelta.FIELD:
return 48;
case IDelta.METHOD:
return 41;
case IDelta.RESTRICTIONS:
return 72;
default:
break;
}
break;
}
case IDelta.ANNOTATION_ELEMENT_TYPE: {
switch (flags) {
case IDelta.FIELD:
return 39;
default:
break;
}
break;
}
case IDelta.INTERFACE_ELEMENT_TYPE: {
switch (flags) {
case IDelta.FIELD:
return 40;
case IDelta.METHOD:
return 44;
case IDelta.DEFAULT_METHOD:
return 47;
case IDelta.RESTRICTIONS:
return 72;
case IDelta.SUPER_INTERFACE_WITH_METHODS:
return 133;
default:
break;
}
break;
}
case IDelta.METHOD_ELEMENT_TYPE: {
switch (flags) {
case IDelta.RESTRICTIONS:
return 132;
default:
break;
}
break;
}
default:
break;
}
switch (flags) {
case IDelta.CLASS_BOUND:
return 21;
case IDelta.CONSTRUCTOR:
return 23;
case IDelta.INTERFACE_BOUND:
return 26;
case IDelta.METHOD_WITHOUT_DEFAULT_VALUE:
return 29;
case IDelta.TYPE_PARAMETER:
return 32;
case IDelta.TYPE_ARGUMENT:
return 106;
default:
break;
}
break;
}
case IDelta.CHANGED: {
switch (element) {
case IDelta.FIELD_ELEMENT_TYPE: {
switch (flags) {
case IDelta.TYPE:
return 81;
case IDelta.VALUE:
return 84;
case IDelta.DECREASE_ACCESS:
return 114;
case IDelta.NON_FINAL_TO_FINAL:
return 118;
case IDelta.STATIC_TO_NON_STATIC:
return 121;
case IDelta.NON_STATIC_TO_STATIC:
return 69;
default:
break;
}
break;
}
case IDelta.METHOD_ELEMENT_TYPE: {
switch (flags) {
case IDelta.DECREASE_ACCESS:
return 115;
case IDelta.NON_ABSTRACT_TO_ABSTRACT:
return 117;
case IDelta.NON_FINAL_TO_FINAL:
return 119;
case IDelta.NON_STATIC_TO_STATIC:
return 120;
case IDelta.STATIC_TO_NON_STATIC:
return 122;
default:
break;
}
break;
}
case IDelta.CONSTRUCTOR_ELEMENT_TYPE: {
switch (flags) {
case IDelta.DECREASE_ACCESS:
return 116;
default:
break;
}
break;
}
default:
break;
}
switch (flags) {
case IDelta.CLASS_BOUND:
return 52;
case IDelta.CONTRACTED_SUPERINTERFACES_SET:
return 54;
case IDelta.DECREASE_ACCESS:
return 55;
case IDelta.FINAL_TO_NON_FINAL_STATIC_CONSTANT:
return 61;
case IDelta.INTERFACE_BOUND:
return 64;
case IDelta.NON_ABSTRACT_TO_ABSTRACT:
return 66;
case IDelta.NON_FINAL_TO_FINAL:
return 67;
case IDelta.NON_STATIC_TO_STATIC:
return 123;
case IDelta.STATIC_TO_NON_STATIC:
return 73;
case IDelta.TYPE_CONVERSION:
return TYPE_CONVERSION_ID;
case IDelta.VARARGS_TO_ARRAY:
return 85;
case IDelta.TYPE_ARGUMENT:
return 124;
default:
break;
}
break;
}
case IDelta.REMOVED: {
switch (flags) {
case IDelta.ANNOTATION_DEFAULT_VALUE:
return 86;
case IDelta.API_COMPONENT:
return 87;
case IDelta.CLASS_BOUND:
return 89;
case IDelta.CONSTRUCTOR:
return 91;
case IDelta.ENUM_CONSTANT:
return 92;
case IDelta.FIELD:
return 94;
case IDelta.INTERFACE_BOUND:
return 96;
case IDelta.METHOD:
return 98;
case IDelta.METHOD_WITH_DEFAULT_VALUE:
return 100;
case IDelta.METHOD_WITHOUT_DEFAULT_VALUE:
return 101;
case IDelta.TYPE:
return 102;
case IDelta.TYPE_ARGUMENTS:
return 103;
case IDelta.TYPE_MEMBER:
return 104;
case IDelta.TYPE_PARAMETER:
return 105;
case IDelta.VALUE:
return 108;
case IDelta.API_TYPE:
return 113;
case IDelta.API_FIELD:
return 125;
case IDelta.API_METHOD:
return 126;
case IDelta.API_CONSTRUCTOR:
return 127;
case IDelta.API_ENUM_CONSTANT:
return 128;
case IDelta.API_METHOD_WITH_DEFAULT_VALUE:
return 129;
case IDelta.API_METHOD_WITHOUT_DEFAULT_VALUE:
return 130;
case IDelta.TYPE_ARGUMENT:
return 107;
case IDelta.SUPERCLASS:
return 131;
case IDelta.REEXPORTED_API_TYPE:
return 134;
case IDelta.REEXPORTED_TYPE:
return 135;
default:
break;
}
break;
}
default:
break;
}
break;
}
case IApiProblem.CATEGORY_API_COMPONENT_RESOLUTION: {
switch (kind) {
case IApiProblem.API_COMPONENT_RESOLUTION:
return 99;
default:
break;
}
break;
}
case IApiProblem.CATEGORY_FATAL_PROBLEM: {
switch (kind) {
case IApiProblem.FATAL_JDT_BUILDPATH_PROBLEM:
return 31;
default:
break;
}
break;
}
case IApiProblem.CATEGORY_API_USE_SCAN_PROBLEM: {
switch (kind) {
case IApiProblem.API_USE_SCAN_TYPE_PROBLEM:
return 136 + flags;
case IApiProblem.API_USE_SCAN_METHOD_PROBLEM:
return 138 + flags;
case IApiProblem.API_USE_SCAN_FIELD_PROBLEM:
return 140 + flags;
default:
break;
}
break;
}
default:
break;
}
return 0;
}
/**
* Returns the problem severity id for the given problem parameters.
*
* @param category
* @param element
* @param kind
* @param flags
* @return the id of the preference to use to lookup the user specified
* severity level for the given {@link IApiProblem}
*/
public static String getProblemSeverityId(IApiProblem problem) {
switch (problem.getCategory()) {
case IApiProblem.CATEGORY_FATAL_PROBLEM: {
switch (problem.getKind()) {
case IApiProblem.FATAL_JDT_BUILDPATH_PROBLEM:
return IApiProblemTypes.FATAL_PROBLEMS;
default:
break;
}
break;
}
case IApiProblem.CATEGORY_API_COMPONENT_RESOLUTION: {
switch (problem.getKind()) {
case IApiProblem.API_COMPONENT_RESOLUTION:
return IApiProblemTypes.REPORT_RESOLUTION_ERRORS_API_COMPONENT;
default:
break;
}
break;
}
case IApiProblem.CATEGORY_API_BASELINE: {
switch (problem.getKind()) {
case IApiProblem.API_BASELINE_MISSING:
return IApiProblemTypes.MISSING_DEFAULT_API_BASELINE;
default:
break;
}
break;
}
case IApiProblem.CATEGORY_SINCETAGS: {
switch (problem.getKind()) {
case IApiProblem.SINCE_TAG_INVALID:
return IApiProblemTypes.INVALID_SINCE_TAG_VERSION;
case IApiProblem.SINCE_TAG_MALFORMED:
return IApiProblemTypes.MALFORMED_SINCE_TAG;
case IApiProblem.SINCE_TAG_MISSING:
return IApiProblemTypes.MISSING_SINCE_TAG;
default:
break;
}
break;
}
case IApiProblem.CATEGORY_VERSION: {
switch (problem.getKind()) {
case IApiProblem.MINOR_VERSION_CHANGE_NO_NEW_API:
return IApiProblemTypes.INCOMPATIBLE_API_COMPONENT_VERSION_REPORT_MINOR_WITHOUT_API_CHANGE;
case IApiProblem.MAJOR_VERSION_CHANGE_NO_BREAKAGE:
return IApiProblemTypes.INCOMPATIBLE_API_COMPONENT_VERSION_REPORT_MAJOR_WITHOUT_BREAKING_CHANGE;
case IApiProblem.MINOR_VERSION_CHANGE_EXECUTION_ENV_CHANGED:
return IApiProblemTypes.CHANGED_EXECUTION_ENV;
default:
return IApiProblemTypes.INCOMPATIBLE_API_COMPONENT_VERSION;
}
}
case IApiProblem.CATEGORY_USAGE: {
switch (problem.getKind()) {
case IApiProblem.ILLEGAL_IMPLEMENT:
return IApiProblemTypes.ILLEGAL_IMPLEMENT;
case IApiProblem.ILLEGAL_EXTEND:
return IApiProblemTypes.ILLEGAL_EXTEND;
case IApiProblem.ILLEGAL_INSTANTIATE:
return IApiProblemTypes.ILLEGAL_INSTANTIATE;
case IApiProblem.ILLEGAL_OVERRIDE:
return IApiProblemTypes.ILLEGAL_OVERRIDE;
case IApiProblem.ILLEGAL_REFERENCE:
return IApiProblemTypes.ILLEGAL_REFERENCE;
case IApiProblem.API_LEAK: {
switch (problem.getFlags()) {
case IApiProblem.LEAK_EXTENDS:
case IApiProblem.LEAK_BY_EXTENDING_NO_EXTEND_TYPE:
return IApiProblemTypes.LEAK_EXTEND;
case IApiProblem.LEAK_FIELD:
return IApiProblemTypes.LEAK_FIELD_DECL;
case IApiProblem.LEAK_IMPLEMENTS:
return IApiProblemTypes.LEAK_IMPLEMENT;
case IApiProblem.LEAK_CONSTRUCTOR_PARAMETER:
case IApiProblem.LEAK_METHOD_PARAMETER:
return IApiProblemTypes.LEAK_METHOD_PARAM;
case IApiProblem.LEAK_RETURN_TYPE:
return IApiProblemTypes.LEAK_METHOD_RETURN_TYPE;
default:
break;
}
break;
}
case IApiProblem.UNSUPPORTED_TAG_USE:
return IApiProblemTypes.INVALID_JAVADOC_TAG;
case IApiProblem.DUPLICATE_TAG_USE:
return IApiProblemTypes.INVALID_JAVADOC_TAG;
case IApiProblem.DUPLICATE_ANNOTATION_USE:
return IApiProblemTypes.INVALID_ANNOTATION;
case IApiProblem.UNSUPPORTED_ANNOTATION_USE:
return IApiProblemTypes.INVALID_ANNOTATION;
case IApiProblem.INVALID_REFERENCE_IN_SYSTEM_LIBRARIES:
return IApiProblemTypes.INVALID_REFERENCE_IN_SYSTEM_LIBRARIES;
case IApiProblem.UNUSED_PROBLEM_FILTERS:
return IApiProblemTypes.UNUSED_PROBLEM_FILTERS;
case IApiProblem.MISSING_EE_DESCRIPTIONS:
return IApiProblemTypes.MISSING_EE_DESCRIPTIONS;
default:
break;
}
break;
}
case IApiProblem.CATEGORY_COMPATIBILITY: {
return Util.getDeltaPrefererenceKey(problem.getElementKind(), problem.getKind(), problem.getFlags());
}
case IApiProblem.CATEGORY_API_USE_SCAN_PROBLEM: {
switch (problem.getKind()) {
case IApiProblem.API_USE_SCAN_TYPE_PROBLEM:
return IApiProblemTypes.API_USE_SCAN_TYPE_SEVERITY;
case IApiProblem.API_USE_SCAN_METHOD_PROBLEM:
return IApiProblemTypes.API_USE_SCAN_METHOD_SEVERITY;
case IApiProblem.API_USE_SCAN_FIELD_PROBLEM:
return IApiProblemTypes.API_USE_SCAN_FIELD_SEVERITY;
default:
break;
}
break;
}
default:
break;
}
return null;
}
}