Usar a Unified Expression Language (JSP/EL) com Swing. É possível?

É possível usar a Unified Expression Language com Swing? Se é, como?

Gostaríamos que nosso usuário fosse capaz de fazer um mapa com valores como:
${test.name}

Onde test seria um objeto presente em runtime. Nós então resolveríamos a expressão, sempre que ele precisasse dela.

A idéia seria que ele fosse capaz de criar um “dicionário” associando uma chave, a expressões como essa. Então, ao requisitar a chave, a aplicação avaliaria a expressão com variáveis presentes em runtime, e retornaria o valor resolvido.

Já vi um negócio assim em algum lugar, mas já faz bastante tempo. Se não me engano o negócio é ter os JARs corretos no classpath e invocar um monte de comandos manualmente (os que normalmente o container faria automaticamente).

Estou cogitando a idéia de usar um GroovyShell para isso.

Já que a GString suporta a EL, e os Bindings são um meio fácil de dizer com que classes ele deve trabalhar.

É, vamos fazer com o Groovy mesmo.

Um exemplo:

        Binding binding = new Binding();
        GroovyShell gs = new GroovyShell(binding);

        binding.setVariable("Nome", gs.evaluate("\"Vinicius\""));
        binding.setVariable("Sobrenome", gs.evaluate("\"Godoy\""));
        
        binding.setVariable("NomeCompleto", gs.evaluate("\"${Nome} ${Sobrenome}\""));
        binding.setVariable("NickGUJ", gs.evaluate("\"${Nome[0..3]}${Sobrenome}\""));        
        binding.setVariable("NomeCompletoInvertido", gs.evaluate("\"${NomeCompleto.reverse()}\""));
        
        System.out.println(gs.getVariable("NomeCompleto"));
        System.out.println(gs.getVariable("NickGUJ"));
        System.out.println(gs.getVariable("NomeCompletoInvertido"));

A saída disso aí é:
Vinicius Godoy
ViniGodoy
yodoG suiciniV

Agora basta trabalhar nos detalhes.

Realmente eu não conhecia o GroovyShell.
To devendo a mim mesmo estudar mais sobre Groovy.

Mas, você já deu uma olhada no velocity?

Uma boa alternativa.

Não, ainda não vi o velocity, vou dar uma pesquisada.
Aí está o exemplo ali de cima “retrabalhado”. É mais ou menos isso que queríamos:

[code]
public static Map<String, String> evaluate(LinkedHashMap<String, String> ruleSet) {
Binding binding = new Binding();
GroovyShell gs = new GroovyShell(binding);

Map<String, String> result = new LinkedHashMap<String, String>();
for (Map.Entry<String, String> entry : ruleSet.entrySet()) {
gs.setVariable(entry.getKey(), gs.evaluate(""" + entry.getValue() + “”"));
result.put(entry.getKey(), gs.getVariable(entry.getKey()).toString());
}
return result;
}

public static void main(String[] args) {
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
map.put(“Nome”, “Vinicius”);
map.put(“Sobrenome”, “Godoy”);
map.put(“NomeCompleto”, “${Nome} ${Sobrenome}”);
map.put(“NickGUJ”, “${Nome[0…3]}${Sobrenome}”);
map.put(“NomeCompletoInvertido”, “${NomeCompleto.reverse()}”);

Map<String, String> result = evaluate(map);
for (Map.Entry<String, String> entry : result.entrySet())
System.out.println(entry.getKey() + ": " + entry.getValue());
}[/code]
A saída é:
Nome: Vinicius
Sobrenome: Godoy
NomeCompleto: Vinicius Godoy
NickGUJ: ViniGodoy
NomeCompletoInvertido: yodoG suiciniV

O Groovy é realmente muito bom, superou muito as nossas expectativas.

O velocity também é muito legal e também bem poderoso.

Dê uma olhada no exemplo simples aqui do guj.
http://www.guj.com.br/java.tutorial.artigo.18.1.guj

Estou lendo o Getting Started dele nesse exato momento. :wink:

Nossa… é muito próximo do que eu queria também.

Mas no nosso caso, não creio que terá vantagem. Nossos usuário já usam groovy. E nossa aplicação já tem o .jar do groovy embarcado. De qualquer forma, foi bom conhecer! :slight_smile:

Vou estudar mais à respeito num futuro próximo.