blob: 571d0fc56a08cff64fc4b74433ebd3306f3f8e0a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2017 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.api.tools.internal.comparator;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.eclipse.jdt.core.Flags;
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.api.tools.internal.provisional.RestrictionModifiers;
import org.eclipse.pde.api.tools.internal.provisional.comparator.IDelta;
import com.ibm.icu.text.MessageFormat;
/**
* Class that manages the messages for compatible deltas.
*/
public class Messages extends NLS {
/**
* The current mapping of problem id to message
*/
private static Hashtable<Integer, String> fMessages = null;
public static String problem_message_not_found;
static {
// initialize resource bundle
NLS.initializeMessages("org.eclipse.pde.api.tools.internal.comparator.messages", Messages.class); //$NON-NLS-1$
}
private Messages() {
}
/**
* This method initializes the MessageTemplates class variable according to
* the current Locale.
*
* @param loc Locale
* @return HashtableOfInt
*/
public static Hashtable<Integer, String> loadMessageTemplates(Locale loc) {
ResourceBundle bundle = null;
String bundleName = "org.eclipse.pde.api.tools.internal.comparator.compatible_delta_messages"; //$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<Integer, 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 ill-formed
} catch (MissingResourceException e) {
// available ID
}
}
return templates;
}
public static String getCompatibleLocalizedMessage(Delta delta) {
if (fMessages == null) {
fMessages = loadMessageTemplates(Locale.getDefault());
}
Integer key = Integer.valueOf(getKey(delta));
String message = fMessages.get(key);
if (message == null) {
return MessageFormat.format(Messages.problem_message_not_found, String.valueOf(key));
}
String[] arguments = delta.getArguments();
if (arguments.length != 0) {
return MessageFormat.format(message, (Object[]) arguments);
}
return message;
}
private static int getKey(IDelta delta) {
switch (delta.getElementType()) {
case IDelta.ANNOTATION_ELEMENT_TYPE:
switch (delta.getKind()) {
case IDelta.ADDED:
switch (delta.getFlags()) {
case IDelta.METHOD_WITH_DEFAULT_VALUE:
return 1;
case IDelta.DEPRECATION:
return 110;
default:
break;
}
break;
case IDelta.CHANGED:
switch (delta.getFlags()) {
case IDelta.DECREASE_ACCESS:
return 101;
default:
break;
}
break;
case IDelta.REMOVED:
switch (delta.getFlags()) {
case IDelta.DEPRECATION:
return 111;
default:
break;
}
break;
default:
break;
}
break;
case IDelta.API_COMPONENT_ELEMENT_TYPE:
switch (delta.getKind()) {
case IDelta.ADDED:
switch (delta.getFlags()) {
case IDelta.EXECUTION_ENVIRONMENT:
return 2;
case IDelta.TYPE:
return 3;
case IDelta.REEXPORTED_TYPE:
return 109;
default:
break;
}
break;
case IDelta.CHANGED:
switch (delta.getFlags()) {
case IDelta.TYPE_VISIBILITY:
return 4;
case IDelta.MAJOR_VERSION:
return 95;
case IDelta.MINOR_VERSION:
return 96;
default:
break;
}
break;
case IDelta.REMOVED:
if (delta.getFlags() == IDelta.EXECUTION_ENVIRONMENT) {
return 5;
}
break;
default:
break;
}
break;
case IDelta.API_BASELINE_ELEMENT_TYPE:
switch (delta.getKind()) {
case IDelta.ADDED:
if (delta.getFlags() == IDelta.API_COMPONENT) {
return 6;
}
break;
default:
break;
}
break;
case IDelta.CLASS_ELEMENT_TYPE:
switch (delta.getKind()) {
case IDelta.ADDED:
switch (delta.getFlags()) {
case IDelta.DEPRECATION:
return 110;
case IDelta.CLINIT:
return 7;
case IDelta.CONSTRUCTOR:
return 8;
case IDelta.FIELD:
if (Flags.isProtected(delta.getNewModifiers())) {
return 9;
}
if (Flags.isStatic(delta.getNewModifiers())) {
return 10;
}
if (Flags.isPublic(delta.getNewModifiers())) {
return 11;
}
return 80;
case IDelta.METHOD:
if (!Flags.isAbstract(delta.getNewModifiers())) {
return 12;
}
return 13;
case IDelta.OVERRIDEN_METHOD:
return 14;
case IDelta.SUPERCLASS:
return 15;
case IDelta.TYPE_MEMBER:
return 16;
case IDelta.TYPE_PARAMETERS:
return 17;
case IDelta.METHOD_MOVED_DOWN:
return 97;
case IDelta.RESTRICTIONS:
return 108;
default:
break;
}
break;
case IDelta.CHANGED:
switch (delta.getFlags()) {
case IDelta.ABSTRACT_TO_NON_ABSTRACT:
return 19;
case IDelta.EXPANDED_SUPERINTERFACES_SET:
return 21;
case IDelta.FINAL_TO_NON_FINAL:
return 22;
case IDelta.INCREASE_ACCESS:
return 23;
case IDelta.NON_FINAL_TO_FINAL:
return 94;
case IDelta.DECREASE_ACCESS:
return 101;
case IDelta.NON_ABSTRACT_TO_ABSTRACT:
return 105;
default:
break;
}
break;
case IDelta.REMOVED:
switch (delta.getFlags()) {
case IDelta.DEPRECATION:
return 111;
case IDelta.CLINIT:
return 25;
case IDelta.CONSTRUCTOR:
case IDelta.API_CONSTRUCTOR:
return 26;
case IDelta.FIELD_MOVED_UP:
return 27;
case IDelta.FIELD:
case IDelta.API_FIELD:
if (Flags.isProtected(delta.getOldModifiers())) {
return 28;
}
return 29;
case IDelta.METHOD_MOVED_UP:
return 30;
case IDelta.METHOD:
case IDelta.API_METHOD:
if (Flags.isProtected(delta.getOldModifiers())) {
return 31;
}
return 32;
case IDelta.TYPE_MEMBER:
if (Flags.isProtected(delta.getOldModifiers())) {
return 33;
}
return 34;
default:
break;
}
break;
default:
break;
}
break;
case IDelta.ENUM_ELEMENT_TYPE:
switch (delta.getKind()) {
case IDelta.ADDED:
switch (delta.getFlags()) {
case IDelta.CONSTRUCTOR:
return 35;
case IDelta.ENUM_CONSTANT:
return 36;
case IDelta.FIELD:
return 59;
case IDelta.METHOD:
return 37;
case IDelta.DEPRECATION:
return 110;
default:
break;
}
break;
case IDelta.REMOVED:
switch (delta.getFlags()) {
case IDelta.CONSTRUCTOR:
case IDelta.API_CONSTRUCTOR:
return 38;
case IDelta.DEPRECATION:
return 111;
default:
break;
}
break;
case IDelta.CHANGED:
switch (delta.getFlags()) {
case IDelta.DECREASE_ACCESS:
return 101;
default:
break;
}
break;
default:
break;
}
break;
case IDelta.FIELD_ELEMENT_TYPE:
switch (delta.getKind()) {
case IDelta.ADDED:
switch (delta.getFlags()) {
case IDelta.TYPE_ARGUMENTS:
return 18;
case IDelta.VALUE:
return 40;
case IDelta.DEPRECATION:
return 110;
default:
break;
}
break;
case IDelta.CHANGED:
switch (delta.getFlags()) {
case IDelta.FINAL_TO_NON_FINAL_NON_STATIC:
return 41;
case IDelta.FINAL_TO_NON_FINAL_STATIC_CONSTANT:
if (Flags.isProtected(delta.getNewModifiers())) {
return 42;
}
return 43;
case IDelta.FINAL_TO_NON_FINAL_STATIC_NON_CONSTANT:
return 44;
case IDelta.INCREASE_ACCESS:
return 45;
case IDelta.NON_FINAL_TO_FINAL:
return 46;
case IDelta.NON_TRANSIENT_TO_TRANSIENT:
return 47;
case IDelta.TRANSIENT_TO_NON_TRANSIENT:
return 48;
case IDelta.VALUE:
if (Flags.isProtected(delta.getNewModifiers())) {
return 50;
}
return 51;
case IDelta.TYPE:
return 78;
case IDelta.NON_VOLATILE_TO_VOLATILE:
return 92;
case IDelta.VOLATILE_TO_NON_VOLATILE:
return 93;
case IDelta.DECREASE_ACCESS:
return 98;
case IDelta.NON_STATIC_TO_STATIC:
return 103;
case IDelta.STATIC_TO_NON_STATIC:
return 104;
default:
break;
}
break;
case IDelta.REMOVED:
switch (delta.getFlags()) {
case IDelta.VALUE:
if (Flags.isProtected(delta.getNewModifiers())) {
return 52;
}
return 53;
case IDelta.DEPRECATION:
return 111;
default:
break;
}
break;
default:
break;
}
break;
case IDelta.TYPE_PARAMETER_ELEMENT_TYPE:
if (delta.getKind() == IDelta.CHANGED && delta.getFlags() == IDelta.TYPE_PARAMETER_NAME) {
return 24;
}
break;
case IDelta.INTERFACE_ELEMENT_TYPE:
switch (delta.getKind()) {
case IDelta.ADDED:
switch (delta.getFlags()) {
case IDelta.DEPRECATION:
return 110;
case IDelta.FIELD:
return 54;
case IDelta.METHOD:
return 55;
case IDelta.TYPE_MEMBER:
return 56;
case IDelta.OVERRIDEN_METHOD:
return 57;
case IDelta.TYPE_PARAMETERS:
return 58;
case IDelta.METHOD_MOVED_DOWN:
return 97;
case IDelta.SUPER_INTERFACE_WITH_METHODS:
return 107;
default:
break;
}
break;
case IDelta.CHANGED:
switch (delta.getFlags()) {
case IDelta.EXPANDED_SUPERINTERFACES_SET:
return 79;
case IDelta.DECREASE_ACCESS:
return 101;
default:
break;
}
break;
case IDelta.REMOVED:
switch (delta.getFlags()) {
case IDelta.FIELD_MOVED_UP:
return 60;
case IDelta.METHOD_MOVED_UP:
return 61;
case IDelta.DEPRECATION:
return 111;
default:
break;
}
break;
default:
break;
}
break;
case IDelta.METHOD_ELEMENT_TYPE:
switch (delta.getKind()) {
case IDelta.ADDED:
switch (delta.getFlags()) {
case IDelta.DEPRECATION:
return 110;
case IDelta.ANNOTATION_DEFAULT_VALUE:
return 62;
case IDelta.CHECKED_EXCEPTION:
return 63;
case IDelta.TYPE_PARAMETERS:
return 64;
case IDelta.UNCHECKED_EXCEPTION:
return 65;
case IDelta.TYPE_ARGUMENTS:
return 18;
case IDelta.RESTRICTIONS:
return 106;
default:
break;
}
break;
case IDelta.CHANGED:
switch (delta.getFlags()) {
case IDelta.ABSTRACT_TO_NON_ABSTRACT:
return 66;
case IDelta.ANNOTATION_DEFAULT_VALUE:
return 67;
case IDelta.ARRAY_TO_VARARGS:
return 68;
case IDelta.FINAL_TO_NON_FINAL:
return 69;
case IDelta.INCREASE_ACCESS:
return 70;
case IDelta.NATIVE_TO_NON_NATIVE:
return 71;
case IDelta.NON_NATIVE_TO_NATIVE:
return 72;
case IDelta.NON_SYNCHRONIZED_TO_SYNCHRONIZED:
return 73;
case IDelta.SYNCHRONIZED_TO_NON_SYNCHRONIZED:
return 74;
case IDelta.NON_FINAL_TO_FINAL:
if (RestrictionModifiers.isExtendRestriction(delta.getCurrentRestrictions())) {
return 81;
}
if (RestrictionModifiers.isOverrideRestriction(delta.getCurrentRestrictions())) {
return 82;
}
return 83;
case IDelta.NON_STATIC_TO_STATIC:
return 84;
case IDelta.DECREASE_ACCESS:
return 99;
case IDelta.STATIC_TO_NON_STATIC:
return 102;
default:
break;
}
break;
case IDelta.REMOVED:
switch (delta.getFlags()) {
case IDelta.CHECKED_EXCEPTION:
return 76;
case IDelta.UNCHECKED_EXCEPTION:
return 77;
case IDelta.DEPRECATION:
return 111;
default:
break;
}
break;
default:
break;
}
break;
case IDelta.CONSTRUCTOR_ELEMENT_TYPE:
switch (delta.getKind()) {
case IDelta.ADDED:
switch (delta.getFlags()) {
case IDelta.DEPRECATION:
return 110;
case IDelta.CHECKED_EXCEPTION:
return 85;
case IDelta.TYPE_PARAMETERS:
return 64;
case IDelta.UNCHECKED_EXCEPTION:
return 86;
case IDelta.TYPE_ARGUMENTS:
return 18;
default:
break;
}
break;
case IDelta.CHANGED:
switch (delta.getFlags()) {
case IDelta.ARRAY_TO_VARARGS:
return 87;
case IDelta.INCREASE_ACCESS:
return 89;
case IDelta.DECREASE_ACCESS:
return 100;
default:
break;
}
break;
case IDelta.REMOVED:
switch (delta.getFlags()) {
case IDelta.CHECKED_EXCEPTION:
return 90;
case IDelta.UNCHECKED_EXCEPTION:
return 91;
case IDelta.DEPRECATION:
return 111;
default:
break;
}
break;
default:
break;
}
break;
default:
break;
}
return 0;
}
}