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=""" ... > <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”,... ...