Expression Language 3.0

24
Expression Language 3.0 Trilha - JavaEE

Transcript of Expression Language 3.0

Page 1: Expression Language 3.0

Expression Language 3.0

Trilha - JavaEE

Page 2: Expression Language 3.0

Everton Emilio TavaresDeveloper

Page 3: Expression Language 3.0

Expression Language 3.0

• Permite processar expressões em tempo de execução;• Histórico

• Primeiramente incluído no JSTL 1;• Movido para o JSP 2;• JSF 1.0 criou uma variante para atender suas necessidades;• Unificado com o JSF 1.2 no JSP 2.1;• Especificação independente – JSR 341;

• Usado no JSF, JSP, CDI, Bean Validation, entre outros...

Page 4: Expression Language 3.0

Implementações

<dependency>    <groupId>org.apache.tomcat.embed</groupId>    <artifactId>tomcat-embed-el</artifactId>    <version>8.0.32</version></dependency>

...

<dependency> <groupId>org.jboss.spec.javax.el</groupId> <artifactId>jboss-el-api_3.0_spec</artifactId> <version>1.0.6.Final</version></dependency>

...

<dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.0</version></dependency>

Page 5: Expression Language 3.0

Novidades

• Construtores de Collections;• Novos operadores (+=, = e ;)• Expressões Lambda;• Operações em Collections;• Standalone API;

Page 6: Expression Language 3.0

Collections

• List:• [“Renault”, “Ford”, “Ford”, “Fiat”]

• Set:• {“Renault”, “Ford”, ‘Fiat’}

• Map:• {“marca” : “Ford”, “modelo” : “Fiesta”}

Page 7: Expression Language 3.0

Novos Operadores

• Concatenação ( +=)• “Olá “ += pessoa.nome

• Atribuição (=)• nome_completo = pessoa.nome += “ “ += pessoa.sobrenome;

• Fim de expressão (;)• nome = pessoa.nome; “Olá “+= nome

Page 8: Expression Language 3.0

Lambda

• Pode ser usadas diretamente…• ((x, y) -> x + y)(2, 4) // 6

• Ou atribuir a variáveis• soma = (x,y) -> x + y; soma(5,10); // 15• fact = n -> n == 0 ? 1 : n*fact(n-1); fact(5) // 120

Page 9: Expression Language 3.0

Streams

• Mesma sintaxe do Java 8• nomes = pessoas.stream() .map(p -> p.name)

.sorted() .toList()

• maiores_de_idade = pessoas.stream().filter(p -> p.age > 18)

.toArray()• pais = criancas.stream()

.map(c -> c.pai) .distinct() .toList()

Page 10: Expression Language 3.0

Standalone API

Object result;ELProcessor processor = new ELProcessor();processor.setValue("nome", "Everton");result = processor.eval("'Olá ' += nome"); // "Olá Everton"result = processor.eval("1"); // 1result = processor.getValue("1", String.class); // "1"

Page 11: Expression Language 3.0

Bean Converterhttps://github.com/ezidio/bean-converter

Page 12: Expression Language 3.0

Spring Social - Tweeter• Total de 22

propriedades;

Page 13: Expression Language 3.0

Mapeamento

@ConvertFrom(Tweet.class)public class SimpleTweet {

@PropertyMapping("origin.id") private String code;

@PropertyMapping("origin.user.name += ' (@' += origin.user.screenName += ')'") private String user;

@PropertyMapping("origin.text") private String text;

@PropertyMapping("origin.entities.urls.stream().findFirst().orElse(null).url") private String url;

@PropertyMapping("origin.entities.hashTags.stream().map(h -> h.text).toList()") private List<String> tags;

//...}

Page 14: Expression Language 3.0

Bean Converter

@Testpublic void should_convert_tweet() throws Exception {

Tweet tweet = TestUtils.loadObject("/tweet.json", Tweet.class);

SimpleTweet result = new BeanConverter().convert(tweet, SimpleTweet.class);

assertEquals(tweet.getText(), result.getText()); assertEquals(Lists.newArrayList("Ruby", "TheDevConf"), result.getTags()); assertEquals("https://t.co/L2PKu17aD6", result.getUrl()); assertEquals("TDC2016 (@TheDevConf)", result.getUser());

}

Page 15: Expression Language 3.0

Configurando o ELProcessor

SearchResults searchResult = twitter.searchOperations().search("#TheDevConf");

ELProcessor proc = new ELProcessor();

// Configuração do ELProcessor

List<SimpleTweet> result = new BeanConverter(proc).convertList( searchResult.getTweets(), SimpleTweet.class);

Page 16: Expression Language 3.0

Type Converter

ELProcessor processor = new ELProcessor();processor.getELManager().addELResolver(new URLConverter());

...

@PropertyMapping("origin.user.url")private URL userURL;

Page 17: Expression Language 3.0

Type Converter

public class URLConverter extends TypeConverter {

@Override public Object convertToType(ELContext elContext, Object o, Class<?> aClass) {

try { if (URL.class.equals(aClass) && String.class.isInstance(o)) { elContext.setPropertyResolved(true); return new URL(String.class.cast(o)); } } catch (MalformedURLException e) { throw new IllegalArgumentException("URL inválida: “+o, e); } return null; }}

Page 18: Expression Language 3.0

Importar Classes

ELProcessor processor = new ELProcessor();processor.getELManager().importClass("com.google.common.base.MoreObjects");

...

@PropertyMapping("MoreObjects.firstNonNull(origin.retweetedStatus, 'UNDEFINED')")

private String retweetedStatus;

Page 19: Expression Language 3.0

Importar Package

ELProcessor processor = new ELProcessor();processor.getELManager().importPackage("com.google.common.base");

...

@PropertyMapping("Ascii.truncate(origin.text, 50, '...')")private String text;

@PropertyMapping("MoreObjects.firstNonNull(origin.retweetedStatus, 'UNDEFINED')")private String retweetedStatus;

Page 20: Expression Language 3.0

Definição de funções

ELProcessor p= new ELProcessor();p.defineFunction(“guava", “trunc", Ascii.class.getName(), “truncate");p.defineFunction(“guava", “nvl", MoreObjects.class.getName(), “firstNonNull");

...

@PropertyMapping(“guava:trunc(origin.text, 50, '...')")private String text;

@PropertyMapping(“guava:nvl(origin.retweetedStatus, 'UNDEFINED')")private String retweetedStatus;

Page 21: Expression Language 3.0

BeanNameResolver

@ConvertFrom(TwitterProfile.class)public class MyUserProfile {

@PropertyMapping("origin.name") private String name;

@PropertyMapping("twitterService.getLastTweets(origin.screenName)") private List<Tweet> lastTweets;

//...}

Page 22: Expression Language 3.0

BeanNameResolver

@Componentpublic class SpringBeanNameResolver extends BeanNameResolver {

@Autowired private ApplicationContext applicationContext;

@Override public boolean isNameResolved(String beanName) { return applicationContext.getBean(beanName) != null; }

@Override public Object getBean(String beanName) { return applicationContext.getBean(beanName); }}

Page 23: Expression Language 3.0

BeanNameResolver

@AutowiredSpringBeanNameResolver springBeanNameResolver;

// ...

ELProcessor processor = new ELProcessor();processor.getELManager().addBeanNameResolver(springBeanNameResolver);