# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

elSupport.coerce.nonAbstract=Unable to coerce a LambdaExpression to the functional interface [{0}] because the method [{1}] is not abstract

# General Errors
error.cannotSetVariables=Cannot set variables on factory
error.convert=Cannot convert [{0}] of type [{1}] to [{2}]
error.compare=Cannot compare [{0}] to [{1}]
error.compare.null=Unable to compare null with non-null object
error.function=Problems calling function [{0}]
error.invalidMethodExpression=Not a valid method expression [{0}]
error.noFunctionMapperTarget=FunctionMapper target cannot be null
error.noVariableMapperTarget=VariableMapper target cannot be null
error.nullLocalName=Local name cannot be null
error.nullMethod=Method cannot be null
error.unreachable.base=Target Unreachable, identifier [{0}] resolved to null
error.unreachable.property=Target Unreachable, [{0}] returned null
error.resolver.unhandled=ELResolver did not handle type: [{0}] with property of [{1}]
error.resolver.unhandled.null=ELResolver cannot handle a null base Object with identifier [{0}]
error.invoke.wrongParams=The method [{0}] was called with [{1}] parameter(s) when it expected [{2}]
error.invoke.tooFewParams=The method [{0}] was called with [{1}] parameter(s) when it expected at least [{2}]

# ValueExpressionLiteral
error.value.literal.write=ValueExpression is a literal and not writable: [{0}]

# ExpressionFactoryImpl
error.null=Expression cannot be null
error.mixed=Expression cannot contain both ''#{...}'' and ''${...}'' : [{0}]
error.method=Not a valid MethodExpression : [{0}]
error.method.nullParms=Parameter types cannot be null
error.value.expectedType=Expected type cannot be null

# ExpressionBuilder
error.parseFail=Failed to parse the expression [{0}]

# ValueSetVisitor
error.syntax.set=Illegal Syntax for Set Operation

# ReflectionUtil
error.method.notfound=Method not found: {0}.{1}({2})
error.method.ambiguous=Unable to find unambiguous method: {0}.{1}({2})

# ValidatingVisitor
error.fnMapper.null=Expression uses functions, but no FunctionMapper was provided
error.fnMapper.method=Function [{0}] not found
error.fnMapper.paramcount=Function [{0}] specifies [{1}] params, but [{2}] were declared

# ExpressionImpl
error.context.null=ELContext was null

# Parser
error.function.tooManyMethodParameterSets=There are multiple sets of parameters specified for function [{0}]
error.identifier.noMethod=Identity [{0}] was null and was unable to invoke
error.identifier.notjava=The identifier [{0}] is not a valid Java identifier as required by section 1.19 of the EL specification (Identifier ::= Java language identifier). This check can be disabled by setting the system property org.apache.el.parser.SKIP_IDENTIFIER_CHECK to true.
error.identifier.notMethodExpression=Identity [{0}] does not reference a method expression instance, returned type [{1}]
error.lambda.tooManyMethodParameterSets=There are more sets of method parameters specified than there are nested lambda expressions
error.lambda.wrongNestedState=Nested state may only be set once

# Stream
stream.compare.notComparable=Stream elements must implement Comparable
stream.optional.empty=It is illegal to call get() on an empty optional
stream.optional.paramNotLambda=The parameter for the method [{0}] should be a lambda expression
