É 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.
nbluis
Janeiro 4, 2008, 5:23pm
#5
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.
nbluis
Janeiro 4, 2008, 5:36pm
#7
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.
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!
Vou estudar mais à respeito num futuro próximo.