JEXL
Jakarta - Commons
Java Expression Language
EL ispirato a Velocity e a EL di JSTL 1.1/JSP 2.0
(non è un implementazione compatibile EL JSTL)
Analogie con i Template Engine
✔
Expression ( ≅ Template)
✔
JexlContext ( ≅ Context)
Evaluation ( ≅ Merging)
✔ Output (in questo caso è un Object, non String)
✔
JEXL
Esempi base
// Create an expression object (Template)
String expStr = "foo.innerFoo.bar()";
Expression exp = ExpressionFactory.createExpressio(expStr);
// Retrieve data
Foo myFoo = new Foo();
// Create a context and add data
JexlContext jCtx = JexlHelper.createContext();
jCtx.getVars().put("foo", myFoo );
// Now evaluate the expression, getting the result
Object o = exp.evaluate(jCtx);
Esempio applicazione JEXL
Generatore file CSV
a) Configurazione formato file output: XML
Il Template è la stringa che descrive il singolo campo
b) L'applicazione client recupera una List di bean
(tramite una query o via Hibernate).
Ogni istanza di bean rappresenta una riga.
c) La List di bean viene passata al Generatore CSV
d) Il generatore CSV genera l'output:
una riga per volta, un campo per volta
e) Per ciascun campo: interpreta l'espressione con
JEXL
nel Context il bean della riga (+ helper)
Esemipio: generatore CSV
Configurazione
<csv-file name="export-elencoCandidati-ALL"
field-separator="," field-delimiter="&quot;"
... >
<field index="0" expression="this.cognome" label="cognome" />
...
<field index="2" expression="this.dataNascita.time" label="data-nascita" >
<format class="java.text.SimpleDateFormat" pattern="yyyy/MM/dd" />
</field>
...
<field index="18"
expression="helper.forceExcelString( this.recapiti.telAbitazione )"
label="tel-abitazione" />
...
<field index="24"
expressision="this.ultimoIter.getPrimoColloquio('APP').dataCont.time"
label="data-1o-colloquio-APP" >
<format class="java.text.SimpleDateFormat" pattern="yyyy/MM/dd" />
</field>
</csv-file>
✔
✔
Helper a disposizione nel Context (come Renderer)
Possibilità di usare implem. di java.text.Format
(Renderer)
Template
Esemipio: generatore CSV
Codice client e Helper
Client code
// Recupero la List di bean
List candidati =
candidatiService.findCandidatiByRegione(regione);
// Genero l'output verso un Writer
CSVgenerator.generate(candidati, “formato-A”, outWriter);
Helper class
public class Helper {
...
// Forza l'interpretazione di una cella come testo, in Excel
public String forceExcelString(String src) {
if (src == null)
return null;
else
return “'” + src;
}
Esempio: generatore CSV
Codice eval() del singolo campo
private String fieldToString(Object recordBean,CSVOutputFieldConfig outFieldCfg)
throws Exception {
String formattedValue;
Object value = null;
...
// Crea il JexlContext a seconda del tipo di recordBean
JexlContext ctx = ctx(recordBean);
// Inserisce l'Helper nel context
ctx.getVars().put("helper", new Helper());
// Crea l'Expression Jexl
Expression jexlExpression =
ExpressionFactory.createExpression(outFieldCfg.getField());
// Valuta l'espressione
value = jexlExpression.evaluate(ctx);
...
// Se è specificato un formatter, lo uso
if ( outFieldCfg.getFormatter() != null)
formattedValue = outFieldCfg.getFormatter().format(value);
// Altrimenti uso il toString()
else
formattedValue = value.toString();
return formattedValue;
}
Esemipio: generatore CSV
Output
"ADAMI","ENZO","1969/10/12","BRESCIA",...,”'02.123456”,...
"BIONDI","UGO","1974/05/22","BRESCIA",...,”'051.987654”,...
...
Scarica

SDA T.E. [JEXL]