Ir para o conteúdo principal
Administrator Guide
Última atualização: 2023-06-23
Conceito: noções básicas sobre MVEL

Conceito: noções básicas sobre MVEL

Sintaxe

MVEL é uma linguagem de expressão para aplicativos baseados em Java. Sua sintaxe é semelhante à do Java, porém com alguns acréscimos que tornam o MVEL mais eficiente na correspondência do conteúdo.
Observação:
  • O MVEL usa namespaces e classes do Java, mas não pode declará-los.
  • Ao contrário do Java, o MVEL tem tipagem dinâmica, com tipagem opcional.
  • As expressões MVEL podem ser instruções únicas ou scripts com várias linhas. Para scripts com várias linhas, use um ponto e vírgula para separar cada instrução.
  • A Mvel opera com base no início do último valor a ser emitido. Ele tem suporte para
    return
    palavra-chave , mas geralmente não a requer.
  • A Mvel oferece suporte a regras de precedência de operador e usa colchetes para controlar a ordem de execução.
  • Você pode colocar literais de cadeia de caracteres do MVEL entre aspas simples ou duplas.
  • O ponto e vírgula é um caractere reservado no MVEL. Você não pode usá-la em expressões. Uso
    (char) 59
    Em vez disso, Exemplo:
    props['string']='a;b'
    gera um erro. Esse código não:
    props['string']= (char) 59 props['string_new']='a'props['string']'b'
As expressões Mvel podem incluir:
  • Expressões boolianas
  • Invocações de método
  • Expressões de propriedade
  • Atribuições de variáveis
Um exemplo de expressão de propriedade Mvel simples:
context.errorMessage
Ele extrai a propriedade
errorMessage
da variável ou do objeto de contexto
context
.
O Mvel tem suporte para todos os operadores comuns de comparação, matemáticos e lógicos do Java. Esta tabela resume outros operadores de destaque do MVEL:
Operador
Descrição
Exemplo
new
Instancia um objeto.
new String("foo")
with
Executa várias operações em uma única instância de objeto.
with (value) { name = 'Foo', age = 50, sex = Sex.MALE }
assert
Declara que um valor é verdadeiro ou falha com um AssertionError.
assert foo != null
contains
Determina se o valor à esquerda contém o valor à direita.
var contains "Foo"
is
ou
instance of
Determina se o valor à esquerda é um membro da classe à direita.
var instanceof String
strsim
Compara cadeias de caracteres e retorna a similaridade deles expressa como um percentual.
"foobol" strsim "foobar"
soundslike
Executa uma comparação workex entre duas cadeias de caracteres.
"foobar" soundslike "fubar"
&
Executa uma operação AND em nível de bit.
foo & 5
|
Executa uma operação OR de bit a bit.
foo | 5
^
Executa uma operação XOR bit a bit.
foo ^ 5
+
Operador sobrecarregado para concatenar duas cadeias de caracteres.
"foo" + "bar"
#
Concatena dois literais como cadeias de caracteres.
8 # 9
in
Inspeciona objetos dentro de uma coleção.
(foo in list)
=
Atribui um valor a uma variável.
var = "foobar"

Teste de valor

Em Java, o operador
==
verifica se as referências apontam para o mesmo objeto. No entanto, em Mvel, o operador de comparação
==
verifica se os valores são iguais. A expressão Mvel
foo == 'bar'
é equivalente ao do Java
foo.equals("bar")
.
Um exemplo de expressão booliana Mvel:
user.name == 'John Smith'
Retorna
true
se o
name
propriedade da variável ou do objeto de contexto
user
é John Smith.
O Mvel emprega coerção de tipo. Se você compara dois valores de tipos diferentes, o MVEL tenta converter o valor à direita no tipo à esquerda. Se isso não é possível, ele tenta converter o valor à esquerda no tipo à direita. Exemplo:
"123" == 123;
Essa expressão retorna
true
porque o Mvel converte o valor à direita em uma cadeia de caracteres antes de executar a comparação.

Listas, mapas e matrizes

Coloque as listas em MVEL entre colchetes. Separe os itens com vírgulas. Exemplo:
["Paris", "London", "Berlin"]
Coloque os mapas Mvel entre colchetes. Separe chaves e valores com dois pontos. Exemplo:
["Foo" : "Bar", "Bar" : "Foo"]
Coloque as matrizes Mvel entre colchetes. Separe os itens com vírgulas. Exemplo:
{"Bill", "Bob", "Ben"}

Navegação em Propriedades

O MVEL oferece uma sintaxe única e unificada para acessar propriedades, campos estáticos, listas, mapas e matrizes.
Em Java, você pode acessar uma propriedade de um objeto usando esta instrução:
context.getException().getCause()
No Mvel, você pode acessar a mesma propriedade usando esta expressão:
context.exception.cause
Acesse listas e matrizes da mesma maneira. Exemplo:
parts[2]
Você acessa mapas da mesma forma que as matrizes, mas pode passar qualquer objeto como o valor de índice. Exemplo:
props["foobar"]
Se um mapa usa uma cadeia de caracteres como chave, você pode tratar o próprio mapa como um objeto virtual. Exemplo:
props.foobar
A Mvel trata cadeias de caracteres como matrizes para fins de indexação.
Este exemplo retorna
B
:
foo = "Berlin"; foo[0];

Atribuição

Você pode atribuir variáveis em uma expressão MVEL para uso na expressão ou para a extração durante o tempo de execução.
Como o MVEL é uma linguagem de tipagem dinâmica, você não precisa especificar um tipo quando declara uma nova variável. No entanto, pode fazer isso.
Estes dois exemplos são válidos no Mvel:
str = "Some string"; String str = "Some string";
Ao atribuir um valor a uma variável digitada, o Mvel tenta executar a conversão de tipo automática. Exemplo:
String num = 1;
Você pode converter o valor de uma variável dinamicamente em outro tipo. Exemplo:
String num = 1;

Seção: digitação e coação

O MVEL usa tipagem dinâmica, com tipagem estática opcional. Objetos Java nativos são tipados estaticamente. Para interagir com eles, às vezes o MVEL deve executar coerção de tipos, o que pode ter implicações no desempenho.
O MVEL converte automaticamente o tipo em um que pareça ser melhor para o valor atual. Isso significa que você deve ter cuidado ao trabalhar com números. Podem surgir erros na aritmética de ponto flutuante porque o Mvel é lançado automaticamente a partir da precisão infinita
java.math.BigDecimal
a
java.lang.Double
e
java.lang.Long
. Isso pode causar problemas quando o tipo do valor armazenado não é o esperado. Em geral, você deve evitar executar em MVEL operações aritméticas com valores financeiros usando números decimais.
A coerção de tipos do MVEL significa que você pode chamar métodos Java sem ajustar as entradas. O interpretador ou compilador analisa os tipos que você está passando para o método e determina qual conversão é necessária.
No caso de um conflito de tipo de matriz, o MVEL tenta converter a matriz inteira no tipo de entrada necessário.
O MVEL executa todas as conversões necessárias em uma variável tipada estaticamente, desde que seja possível converter o valor atribuído. Caso contrário, ocorre uma exceção.