blob: 64e8381d4b4bd14931ab79afbb9ee37eb29f654d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Oracle Corporation7
* 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:
* Cameron Bateman/Oracle - initial API and implementation
*
********************************************************************************/
package org.eclipse.jst.jsf.validation.internal.el.diagnostics;
import java.text.MessageFormat;
import org.eclipse.emf.common.util.BasicDiagnostic;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences;
import org.eclipse.osgi.util.NLS;
/**
* Factory for all operator diagnostics. Class should
* not be implemented, instantiated or sub-classed.
*
* @author cbateman
*
*/
public final class DiagnosticFactory
{
/**
* The id used in the source field of all Diagnostic's created by this factory
* to uniquely identify EL validation as their source type.
*/
public final static String SOURCE_ID = "org.eclipse.jst.jsf.validation.el.Diagnostics";//$NON-NLS-1$
/**
* Problem id
*/
public final static int BINARY_OP_BOTH_OPERANDS_NULL_ID = 0;
/**
* Problem id
*/
public final static int BINARY_OP_POSSIBLE_DIVISION_BY_ZERO_ID = 1;
/**
* Problem id
*/
public final static int BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID = 2;
/**
* Problem id
*/
public final static int BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID = 3;
/**
* Problem id
*/
public final static int BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID = 4;
/**
* Problem id
*/
public final static int BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID = 5;
/**
* Problem id
*/
public final static int BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS_ID = 6;
/**
* Problem id
*/
public final static int BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID = 7;
/**
* Problem id
*/
public final static int BINARY_OP_NO_AVAILABLE_TYPE_COERCION_ID = 8;
/**
* Problem id
*/
public final static int BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS_ID = 9;
/**
* Problem id
*/
public final static int UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID = 10;
/**
* Problem id
*/
public final static int UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE_ID = 11;
/**
* Problem id
*/
public final static int UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO_ID = 12;
/**
* Problem id
*/
public final static int UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID = 13;
/**
* Problem id
*/
public final static int UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID = 14;
/**
* Problem id
*/
public final static int TERNARY_OP_CHOICE_IS_ALWAYS_SAME_ID = 15;
/**
* Problem id
*/
public final static int TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID = 16;
/**
* Problem id
*/
public final static int UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED_ID = 17;
/**
* Problem id
*/
public final static int CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING_ID = 18;
/**
* Problem id
*/
public final static int MEMBER_NOT_FOUND_ID = 19;
/**
* Problem id
*/
public final static int VARIABLE_NOT_FOUND_ID = 20;
/**
* Problem id
*/
public final static int MISSING_CLOSING_EXPR_BRACKET_ID = 21;
/**
* Problem id
*/
public final static int GENERAL_SYNTAX_ERROR_ID = 22;
/**
* Problem id
*/
public final static int EMPTY_EL_EXPRESSION_ID = 23;
/**
*
*/
public final static int BINARY_OP_DOT_WITH_VALUEB_NULL_ID = 24;
/**
* Identifies a problem where we have x.y and x is a map. In this case
* the recommend syntax is x['y']
*/
public final static int BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY_ID = 25;
/**
* Indicates that a numeric array accessor is being used with a value
* which is either < 0 or may be greater than the assumed size of the array
*/
public final static int POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS_ID = 26;
/**
* Identifies the problem where an expr like bean.enumProp == 'blah'
* but 'blah' does not match any of the possible enum constants, meaning
* that the operation will always resolve to a constant value (in this case false)
*/
public final static int BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID = 27;
/**
* Identifies a problem where two enum variables are compared but the enums are
* not compatible. i.e. bean.enum1 < bean.enum2. Enum.compareTo() may throw
* an exception in this case (CCE).
*/
public final static int BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE_ID = 28;
/**
* Indicates a situation such as x.y where x is a bundle and
* 'x.y.z' exists, but x.y while partially valid, does not have a value
* associated.
*/
public final static int MEMBER_IS_INTERMEDIATE_ID = 29;
/**
* Count of ids
*/
public final static int NUM_IDS = 30;
/**
* @param operatorName
* @return a configured diagnostic
*/
public Diagnostic create_BINARY_OP_BOTH_OPERANDS_NULL(final String operatorName)
{
final String message = NLS.bind(
Messages.BINARY_OP_BOTH_OPERANDS_NULL, operatorName);
return create(BINARY_OP_BOTH_OPERANDS_NULL_ID, message);
}
private static Diagnostic DIAGNOSTIC_POSSIBLE_DIV_BY_ZERO;
/**
* @return a configured diagnostic
*/
public Diagnostic create_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO()
{
if (DIAGNOSTIC_POSSIBLE_DIV_BY_ZERO == null)
{
final String message = Messages.POSSIBLE_DIV_BY_ZERO;
DIAGNOSTIC_POSSIBLE_DIV_BY_ZERO =
create(BINARY_OP_POSSIBLE_DIVISION_BY_ZERO_ID, message);
}
return DIAGNOSTIC_POSSIBLE_DIV_BY_ZERO;
}
/**
* @param operatorName
* @return a configured diagnostic
*/
public Diagnostic create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(final String operatorName)
{
final String message =
NLS.bind(Messages.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION, operatorName);
return create(BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID, message);
}
/**
* @param operatorName
* @param value
* @return a configured diagnostic
*/
public Diagnostic create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME(final String operatorName, final String value)
{
final String message =
NLS.bind(Messages.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME,operatorName, value);
return create(BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID, message);
}
/**
* @param value
* @return a configured diagnostic
*/
public Diagnostic create_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME(final String value)
{
final String message =
NLS.bind(Messages.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME, value);
return create(BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID, message);
}
/**
* @param whichArgument
* @return a configured diagnostic
*/
public Diagnostic create_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN(final String whichArgument)
{
final String message =
NLS.bind(Messages.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN, whichArgument);
return create(BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID, message);
}
/**
* @param shortCircuitValue
* @param operatorName
* @return a configured diagnostic
*/
public Diagnostic create_BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS(boolean shortCircuitValue, String operatorName)
{
final String message =
NLS.bind(Messages.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS,
Boolean.valueOf(shortCircuitValue), operatorName);
return create(BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS_ID, message);
}
/**
* @param shortCircuitValue
* @param operatorName
* @return a configured diagnostic
*/
public Diagnostic create_BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME(final boolean shortCircuitValue, final String operatorName)
{
final String message =
NLS.bind(Messages.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME,
Boolean.valueOf(shortCircuitValue), operatorName);
return create(BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID, message);
}
private static Diagnostic DIAGNOSTIC_NO_AVAILABLE_TYPE_COERCION;
/**
* @return a configured diagnostic
*/
public Diagnostic create_BINARY_OP_NO_AVAILABLE_TYPE_COERCION()
{
if (DIAGNOSTIC_NO_AVAILABLE_TYPE_COERCION == null)
{
DIAGNOSTIC_NO_AVAILABLE_TYPE_COERCION =
create(BINARY_OP_NO_AVAILABLE_TYPE_COERCION_ID,
Messages.BINARY_OP_NO_AVAILABLE_TYPE_COERCION);
}
return DIAGNOSTIC_NO_AVAILABLE_TYPE_COERCION;
}
private static Diagnostic DIAGNOSTIC_COULD_NOT_COERCE_LITERALS;
/**
* @return a configured diagnostic
*/
public Diagnostic create_BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS()
{
if (DIAGNOSTIC_COULD_NOT_COERCE_LITERALS == null)
{
DIAGNOSTIC_COULD_NOT_COERCE_LITERALS =
create(BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS_ID,
Messages.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS);
}
return DIAGNOSTIC_COULD_NOT_COERCE_LITERALS;
}
/**
* @param operatorName
* @param value
* @return a configured diagnostic
*/
public Diagnostic create_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID(final String operatorName, final String value)
{
final String message =
NLS.bind(Messages.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME,
operatorName, value);
return create(UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID, message);
}
/**
* @return a configured diagnostic
*/
public Diagnostic create_UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE()
{
return create(UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE_ID,
Messages.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE);
}
/**
* @return a configured diagnostic
*/
public Diagnostic create_UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO()
{
return create(UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO_ID,
Messages.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO);
}
/**
* @param operatorName
* @return a configured diagnostic
*/
public Diagnostic create_UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(final String operatorName)
{
final String message =
NLS.bind(Messages.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION,
operatorName);
return create(UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID, message);
}
/**
* @param operatorName
* @return a configured diagnostic
*/
public Diagnostic create_UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED(final String operatorName)
{
final String message =
NLS.bind(Messages.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED,
operatorName);
return create(UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED_ID, message);
}
/**
* @return a configured diagnostic
*/
public Diagnostic create_UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN()
{
return create(UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID,
Messages.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN);
}
/**
* @param result
* @param whichSelected
* @return a configured diagnostic
*/
public Diagnostic create_TERNARY_OP_CHOICE_IS_ALWAYS_SAME(boolean result, String whichSelected)
{
final String message =
NLS.bind(Messages.TERNARY_OP_CHOICE_IS_ALWAYS_SAME,
Boolean.valueOf(result), whichSelected);
return create(TERNARY_OP_CHOICE_IS_ALWAYS_SAME_ID, message);
}
/**
* @return a configured diagnostic
*/
public Diagnostic create_TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN()
{
return create(TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID,
Messages.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID);
}
/**
* Method bindings cannot participate in expressions involving operators
* Per JSP 1.1 spec section 5.2.1
*
* @return a configured message
*/
public Diagnostic create_CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING()
{
return create(CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING_ID,
Messages.CANNOT_APPLY_OPERATORS_TO_MB);
}
/**
* @param curMemberSymbol
* @param owningMember
* @return a configured message
*/
public Diagnostic create_MEMBER_NOT_FOUND(String curMemberSymbol, String owningMember)
{
return create(MEMBER_NOT_FOUND_ID,
NLS.bind(Messages.VM_PROP_NAME_NOT_FOUND, curMemberSymbol, owningMember));
}
/**
* @param variableName
* @return a configured message
*/
public Diagnostic create_VARIABLE_NOT_FOUND(String variableName)
{
return create(VARIABLE_NOT_FOUND_ID
, NLS.bind(Messages.VM_ROOT_NAME_NOT_FOUND, variableName));
}
/**
* @return a configured message
*/
public Diagnostic create_MISSING_CLOSING_EXPR_BRACKET()
{
return create(MISSING_CLOSING_EXPR_BRACKET_ID
, Messages.MISSING_CLOSING_EXPR_BRACKET);
}
/**
* @return a configured message
*/
public Diagnostic create_GENERAL_SYNTAX_ERROR()
{
return create(GENERAL_SYNTAX_ERROR_ID, Messages.GENERAL_SYNTAX_ERROR);
}
/**
* @return a configured message
*/
public Diagnostic create_EMPTY_EL_EXPRESSION()
{
return create(EMPTY_EL_EXPRESSION_ID, Messages.EMPTY_EL_EXPRESSION);
}
/**
* @param operatorName
* @return a configured diagnostic
*/
public Diagnostic create_BINARY_OP_DOT_WITH_VALUEB_NULL(final String operatorName)
{
return create(BINARY_OP_DOT_WITH_VALUEB_NULL_ID
, Messages.bind(Messages.BINARY_OP_DOT_WITH_VALUEB_NULL, operatorName));
}
/**
* @param valAName
* @param valueBName
* @return a configured diagnostic
*/
public Diagnostic create_BINARY_OP_DOT_WITH_VALUEA_MAP_SHOULD_USE_ARRAY(final String valAName, final String valueBName)
{
final Object[] formatArgs = new Object[] {valAName, valueBName};
return create(BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY_ID,
MessageFormat.format(Messages.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY,formatArgs));
}
/**
* @param value
* @return an array index out of bounds diagnostic
*/
public Diagnostic create_POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS(final Integer value)
{
final Object[] formatArgs = new Object[] {value};
return create(POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS_ID
, MessageFormat.format(Messages.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS,formatArgs));
}
/**
* @param operatorName
* @param invariantResult
* @param enumName
* @param fieldName
* @return a diagnostic
*/
public Diagnostic create_BINARY_COMPARISON_WITH_ENUM_AND_CONST_ALWAYS_SAME(final String operatorName, final boolean invariantResult, final String enumName, final String fieldName)
{
return create(BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID
, MessageFormat.format(Messages.BINARY_COMPARISON_WITH_ENUM_AND_CONST_ALWAYS_SAME
, new Object[] {operatorName
, Boolean.valueOf(invariantResult), enumName, fieldName}));
}
/**
* @param operatorName
* @param invariantResult
* @param enumName1
* @param enumName2
* @return a diagnostic
*/
public Diagnostic create_BINARY_COMPARISON_WITH_TWO_ENUMS_ALWAYS_SAME(final String operatorName, final boolean invariantResult, final String enumName1, final String enumName2)
{
return create(BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID
, MessageFormat.format(Messages.BINARY_COMPARISON_WITH_TWO_ENUMS_ALWAYS_SAME
, new Object[] {operatorName
, Boolean.valueOf(invariantResult), enumName1, enumName2}));
}
/**
* @param operatorName
* @param invariantResult
* @param enumName
* @param nonEnum
* @return a diagnostic
*/
public Diagnostic create_BINARY_COMPARISON_WITH_ENUM_AND_UNCOERCABLE_NONCONST_ALWAYS_SAME(final String operatorName, final boolean invariantResult, final String enumName, final String nonEnum)
{
return create(BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID
, MessageFormat.format(Messages.BINARY_COMPARISON_WITH_ENUM_AND_UNCOERCABLE_NONCONST_ALWAYS_SAME
, new Object[] {operatorName
, Boolean.valueOf(invariantResult), enumName, nonEnum}));
}
/**
* @return a diagnostic
*/
public Diagnostic create_BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE()
{
return create(BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE_ID
, Messages.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE);
}
/**
* @param intermediateMemberName
* @return a diagnostic
*/
public Diagnostic create_MEMBER_IS_INTERMEDIATE(final String intermediateMemberName)
{
return create(MEMBER_IS_INTERMEDIATE_ID
, NLS.bind(Messages.MEMBER_IS_INTERMEDIATE
, intermediateMemberName));
}
private BasicDiagnostic create(int diagnosticId, String message)
{
final int severity = ELValidationPreferences.getDefaultSeverity(diagnosticId);
return new BasicDiagnostic(severity, SOURCE_ID
, diagnosticId
, message
, null);
}
}