Globalcode – Open4education
Software Livre: E o DeltaSpike ?
Rafael Benevides
Globalcode – Open4education
Quem sou eu?
Nome: Rafael Benevides
JBoss Software Engineer
JBoss Developer Materials lead
Apache DeltaSpike committer
Twitter: @rafabene
Globalcode – Open4education
CDI Extensions
OCP (Open closed Principle)
Globalcode – Open4education
OCP in CDI =
Portable Extensions
Baseado em SPI (Service Provider Interface)
Permite:
✔
Registrar novos “Beans”
✔
Registrar novos “Scopes” (custom scopes)
✔
Satisfazer @Inject “tion” points
✔
Modificar os metadados dos Beans
Globalcode – Open4education
Apache DeltaSpike
Globalcode – Open4education
Como tudo começou
JBoss Seam 3 Apache MyFaces
CODI
CDI Source
Comunidade
Java EE
Globalcode – Open4education
Qual o propósito do
projeto DeltaSpike ?
“Suportar o desenvolvimento de Portable Extensions
CDI que promovam funcionalidades úteis para
aplicações Java que não são fornecidas pela
especificação CDI.”
(Documentação DeltaSpike)
Globalcode – Open4education
Então o DeltaSpike é
um framework ?
Globalcode – Open4education
Compatibilidade
Globalcode – Open4education
Módulos
“Extensões criadas pela comunidade são
empacotadas como módulos”
(Documentação DeltaSpike)
Globalcode – Open4education
Módulos
CORE
Security
JPA
JSF
Bean validation
Servlet
Partial Bean
Data
Test Control
Scheduler
Globalcode – Open4education
Strong typing
Injeção de dependência tipada
Elimina a dependência de Strings
Fácil refatoração
Compilador pode detectar erros
Nenhuma ferramenta especial é
necessária
Elimina cast (ok, esconde casts)
Resolução de erros detectado durante deploy
Strong typing == Strong tooling
Globalcode – Open4education
Principais funcionalidades
Exception Handler
try {
// Invoca um serviço que lança exception
} catch (NoResultException e) {
// O tratamento de exception é delegado para os @ExceptionHandlers
catchEvent.fire(new ExceptionToCatchEvent(e));
}
Handlers
@ExceptionHandler
public class MyHandler {
void fazAlgoComException(@Handles ExceptionEvent<Throwable> evt) {
// Faz Algo com a Exception
evt.handledAndContinue();
}
}
Globalcode – Open4education
Principais funcionalidades
Type-safe Project Stage
UnitTest,
Development
SystemTest
IntegrationTest
Staging
Production
Configurável via DeltaSpike Configuration API
@Inject
private ProjectStage projectStage;
boolean isDevProjectStage = ProjectStage
.Development.equals(this.projectStage);
<h:panelGroup layout="block"
rendered="#{applicationConfig.projectStage == 'Development'}"
-Dorg.apache.deltaspike.ProjectStage=Development
Globalcode – Open4education
Principais Funcionalidades
DeltaSpike Configuration API
public String getFilaJMS() {
return ConfigResolver.getProjectStageAwarePropertyValue("jms.queue");
}
jms.queue.Production=queue/queueProduction
jms.queue.Development=queue/queueDevelopment
Múltiplos ConfigSources:
System properties (deltaspike_ordinal = 400)
Environment properties (deltaspike_ordinal = 300)
JNDI values (deltaspike_ordinal = 200, the base name is "java:comp/env/deltaspike/")
Properties file values (apache-deltaspike.properties) (deltaspike_ordinal = 100,
default filename is "META-INF/apache-deltaspike.properties")
Globalcode – Open4education
Principais funcionalidades
Injetable Resource
@Inject
@InjectableResource(location = "/version.txt")
private InputStream is;
public String getVersion() throws IOException {
try (BufferedReader br =
new BufferedReader(new InputStreamReader(is))) {
return br.readLine();
}
}
Globalcode – Open4education
Principais funcionalidades
I18n Messages
@Named("msg")
@MessageBundle
public interface Messages {
public String usuarioAdicionado(String username);
public String usuario();
@MessageTemplate("{password}")
public String senha();
}
<br /> #{msg.senha()}:
@Inject
private Messages messages;
new FacesMessage(msg.usuarioAdicionado("Rafael"));
Globalcode – Open4education
Principais funcionalidades
Segurança
@Retention(value = RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@SecurityBindingType
public @interface AdminOnly {
}
@ApplicationScoped
public class ApplicationAuthorizer
{
@Secures
@AdminOnly
public boolean verificaPermissao(InvocationContext invocationContext,
BeanManager manager, @Logado Usuario usuario) throws Exception {
return usuario.getRole().equalsIgnoreCase("Admin");
}
}
@AdminOnly
public void iniciarTarefaAdministrativa() {
// Inicia uma tarefa
}
Globalcode – Open4education
Principais Funcionalidades
Data Module – Repository Pattern
@Repository
public interface RepositorioUsuarios extends EntityRepository<Usuario, Long> {
// O DeltaSpike cria um proxy com implementações para
●
count();
●
findAll();
●
findBy(PK);
●
flush();
●
refresh();
●
remove();
●
save();
●
saveAndFlush();
}
Globalcode – Open4education
Principais Funcionalidades
Data Module – Repository Pattern
@Repository
public interface RepositorioUsuarios extends EntityRepository<Usuario, Long> {
// O próprio nome do método cria o SQL
public Usuario findByUsernameAndPassword(String username, char[]
password);
}
@Repository
public interface RepositorioPostagens extends EntityRepository<Postagem,
Long> {
@Query("SELECT p FROM Postagem AS p WHERE p.autor in (?1)")
public List<Postagem> findBySeguidos(List<Usuario> usuariosSeguidos);
}
Globalcode – Open4education
Principais funcionalidades
Type-safe view-config for JSF
// type-safe outcome
public Class<Welcome> telaHome() {
return Home.class;
}
@Inject
ViewNavigationHandler vnh;
// type-safe outcome
public Class<CriarUsuario> tela2() {
vnh.navigateTo(CriarUsuario.class);
}
@Secured(CustomAccessDecisionVoter.class)
public interface SecuredPages {}
@View(navigation = REDIRECT)
public interface Pages extends ViewConfig
{
class Index implements Pages {
}
interface Admin extends Pages, SecuredPages
{
class Index implements Admin {
}
@View(navigation = FORWARD)
class Home implements Admin {
}
}
}
Globalcode – Open4education
Principais funcionalidades
@WindowScoped
“É como se fosse uma sessão por aba/janela...
Não existem muitos casos de uso que precisam
compartilhar dados entre as abas.”
(Documentação DeltaSpike)
Globalcode – Open4education
Principais funcionalidades
Agendador de Jobs integrado com o Quartz
//Job de exemplo agendado para rodar a cada 1 minuto
@Scheduled(cronExpression = "0 0/1 * * * ?", onStartup = false)
public class CdiAwareQuartzJob implements org.quartz.Job {
// O Job permite injeção CDI
@Inject
private AdminServices service;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
service.executarRotinasAdministrativas();
}
} @Inject
private Scheduler<Job> jobScheduler;
public void iniciarTarefaAdministrativa() {
jobScheduler.registerNewJob(CdiAwareQuartzJob.class);
}
Globalcode – Open4education
Outras funcionalidades
Servlet Module – Injectable Servlet objects/
Servlet Events Propagation
@Inject @DeltaSpike (qualifier para compatibilidade com CDI 1.1)
private HttpServletRequest request;
private HttpServletResponse response;
private HttpSession session;
private Principal principal;
@Observes @Initialized HttpServletRequest
@Observes @Destroyed HttpServletRequest
@Observes @Initialized HttpSession
Globalcode – Open4education
Outras funcionalidades
Bean Validation Module
Permite que “Validators” recebam injeção de objetos via
CDI em ambiente java EE 6 / CDI 1.0
Partial Bean
Permite a criação de implementações para suas
interfaces ou classes abstratas
Globalcode – Open4education
Outras funcionalidades
Container Control
Permite fazer o boot de implementações CDI em
ambiente Java SE, bem como controlar o ciclo de vida
dos contextos
Test Control
Facilita a criação de testes CDI
Inicia e finalizar o container CDI / Inicia Contextos
Controla o ProjectStage
Globalcode – Open4education
Conclusão
O DeltaSpike não é um full-stack framework
O DeltaSpike é um conjunto de Portable Extensions para
facilitar o desenvolvimento Java utilizando CDI
O DeltaSpike é um conjunto de ferramentas!
Globalcode – Open4education
Código Exemplo
/rafabene
https://github.com
/demo_deltaspike
Globalcode – Open4education

TDC 2014 SP - E o DeltaSpike ?

  • 1.
    Globalcode – Open4education SoftwareLivre: E o DeltaSpike ? Rafael Benevides
  • 2.
    Globalcode – Open4education Quemsou eu? Nome: Rafael Benevides JBoss Software Engineer JBoss Developer Materials lead Apache DeltaSpike committer Twitter: @rafabene
  • 3.
    Globalcode – Open4education CDIExtensions OCP (Open closed Principle)
  • 4.
    Globalcode – Open4education OCPin CDI = Portable Extensions Baseado em SPI (Service Provider Interface) Permite: ✔ Registrar novos “Beans” ✔ Registrar novos “Scopes” (custom scopes) ✔ Satisfazer @Inject “tion” points ✔ Modificar os metadados dos Beans
  • 5.
  • 6.
    Globalcode – Open4education Comotudo começou JBoss Seam 3 Apache MyFaces CODI CDI Source Comunidade Java EE
  • 7.
    Globalcode – Open4education Qualo propósito do projeto DeltaSpike ? “Suportar o desenvolvimento de Portable Extensions CDI que promovam funcionalidades úteis para aplicações Java que não são fornecidas pela especificação CDI.” (Documentação DeltaSpike)
  • 8.
    Globalcode – Open4education Entãoo DeltaSpike é um framework ?
  • 9.
  • 10.
    Globalcode – Open4education Módulos “Extensõescriadas pela comunidade são empacotadas como módulos” (Documentação DeltaSpike)
  • 11.
    Globalcode – Open4education Módulos CORE Security JPA JSF Beanvalidation Servlet Partial Bean Data Test Control Scheduler
  • 12.
    Globalcode – Open4education Strongtyping Injeção de dependência tipada Elimina a dependência de Strings Fácil refatoração Compilador pode detectar erros Nenhuma ferramenta especial é necessária Elimina cast (ok, esconde casts) Resolução de erros detectado durante deploy Strong typing == Strong tooling
  • 13.
    Globalcode – Open4education Principaisfuncionalidades Exception Handler try { // Invoca um serviço que lança exception } catch (NoResultException e) { // O tratamento de exception é delegado para os @ExceptionHandlers catchEvent.fire(new ExceptionToCatchEvent(e)); } Handlers @ExceptionHandler public class MyHandler { void fazAlgoComException(@Handles ExceptionEvent<Throwable> evt) { // Faz Algo com a Exception evt.handledAndContinue(); } }
  • 14.
    Globalcode – Open4education Principaisfuncionalidades Type-safe Project Stage UnitTest, Development SystemTest IntegrationTest Staging Production Configurável via DeltaSpike Configuration API @Inject private ProjectStage projectStage; boolean isDevProjectStage = ProjectStage .Development.equals(this.projectStage); <h:panelGroup layout="block" rendered="#{applicationConfig.projectStage == 'Development'}" -Dorg.apache.deltaspike.ProjectStage=Development
  • 15.
    Globalcode – Open4education PrincipaisFuncionalidades DeltaSpike Configuration API public String getFilaJMS() { return ConfigResolver.getProjectStageAwarePropertyValue("jms.queue"); } jms.queue.Production=queue/queueProduction jms.queue.Development=queue/queueDevelopment Múltiplos ConfigSources: System properties (deltaspike_ordinal = 400) Environment properties (deltaspike_ordinal = 300) JNDI values (deltaspike_ordinal = 200, the base name is "java:comp/env/deltaspike/") Properties file values (apache-deltaspike.properties) (deltaspike_ordinal = 100, default filename is "META-INF/apache-deltaspike.properties")
  • 16.
    Globalcode – Open4education Principaisfuncionalidades Injetable Resource @Inject @InjectableResource(location = "/version.txt") private InputStream is; public String getVersion() throws IOException { try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) { return br.readLine(); } }
  • 17.
    Globalcode – Open4education Principaisfuncionalidades I18n Messages @Named("msg") @MessageBundle public interface Messages { public String usuarioAdicionado(String username); public String usuario(); @MessageTemplate("{password}") public String senha(); } <br /> #{msg.senha()}: @Inject private Messages messages; new FacesMessage(msg.usuarioAdicionado("Rafael"));
  • 18.
    Globalcode – Open4education Principaisfuncionalidades Segurança @Retention(value = RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE, ElementType.METHOD }) @Documented @SecurityBindingType public @interface AdminOnly { } @ApplicationScoped public class ApplicationAuthorizer { @Secures @AdminOnly public boolean verificaPermissao(InvocationContext invocationContext, BeanManager manager, @Logado Usuario usuario) throws Exception { return usuario.getRole().equalsIgnoreCase("Admin"); } } @AdminOnly public void iniciarTarefaAdministrativa() { // Inicia uma tarefa }
  • 19.
    Globalcode – Open4education PrincipaisFuncionalidades Data Module – Repository Pattern @Repository public interface RepositorioUsuarios extends EntityRepository<Usuario, Long> { // O DeltaSpike cria um proxy com implementações para ● count(); ● findAll(); ● findBy(PK); ● flush(); ● refresh(); ● remove(); ● save(); ● saveAndFlush(); }
  • 20.
    Globalcode – Open4education PrincipaisFuncionalidades Data Module – Repository Pattern @Repository public interface RepositorioUsuarios extends EntityRepository<Usuario, Long> { // O próprio nome do método cria o SQL public Usuario findByUsernameAndPassword(String username, char[] password); } @Repository public interface RepositorioPostagens extends EntityRepository<Postagem, Long> { @Query("SELECT p FROM Postagem AS p WHERE p.autor in (?1)") public List<Postagem> findBySeguidos(List<Usuario> usuariosSeguidos); }
  • 21.
    Globalcode – Open4education Principaisfuncionalidades Type-safe view-config for JSF // type-safe outcome public Class<Welcome> telaHome() { return Home.class; } @Inject ViewNavigationHandler vnh; // type-safe outcome public Class<CriarUsuario> tela2() { vnh.navigateTo(CriarUsuario.class); } @Secured(CustomAccessDecisionVoter.class) public interface SecuredPages {} @View(navigation = REDIRECT) public interface Pages extends ViewConfig { class Index implements Pages { } interface Admin extends Pages, SecuredPages { class Index implements Admin { } @View(navigation = FORWARD) class Home implements Admin { } } }
  • 22.
    Globalcode – Open4education Principaisfuncionalidades @WindowScoped “É como se fosse uma sessão por aba/janela... Não existem muitos casos de uso que precisam compartilhar dados entre as abas.” (Documentação DeltaSpike)
  • 23.
    Globalcode – Open4education Principaisfuncionalidades Agendador de Jobs integrado com o Quartz //Job de exemplo agendado para rodar a cada 1 minuto @Scheduled(cronExpression = "0 0/1 * * * ?", onStartup = false) public class CdiAwareQuartzJob implements org.quartz.Job { // O Job permite injeção CDI @Inject private AdminServices service; @Override public void execute(JobExecutionContext context) throws JobExecutionException { service.executarRotinasAdministrativas(); } } @Inject private Scheduler<Job> jobScheduler; public void iniciarTarefaAdministrativa() { jobScheduler.registerNewJob(CdiAwareQuartzJob.class); }
  • 24.
    Globalcode – Open4education Outrasfuncionalidades Servlet Module – Injectable Servlet objects/ Servlet Events Propagation @Inject @DeltaSpike (qualifier para compatibilidade com CDI 1.1) private HttpServletRequest request; private HttpServletResponse response; private HttpSession session; private Principal principal; @Observes @Initialized HttpServletRequest @Observes @Destroyed HttpServletRequest @Observes @Initialized HttpSession
  • 25.
    Globalcode – Open4education Outrasfuncionalidades Bean Validation Module Permite que “Validators” recebam injeção de objetos via CDI em ambiente java EE 6 / CDI 1.0 Partial Bean Permite a criação de implementações para suas interfaces ou classes abstratas
  • 26.
    Globalcode – Open4education Outrasfuncionalidades Container Control Permite fazer o boot de implementações CDI em ambiente Java SE, bem como controlar o ciclo de vida dos contextos Test Control Facilita a criação de testes CDI Inicia e finalizar o container CDI / Inicia Contextos Controla o ProjectStage
  • 27.
    Globalcode – Open4education Conclusão ODeltaSpike não é um full-stack framework O DeltaSpike é um conjunto de Portable Extensions para facilitar o desenvolvimento Java utilizando CDI O DeltaSpike é um conjunto de ferramentas!
  • 28.
    Globalcode – Open4education CódigoExemplo /rafabene https://github.com /demo_deltaspike
  • 29.

Notas do Editor

  • #3 according to OCP software should be open for extension and closed for modification Você não precisa abrir o peito de uma pessoa para colocar um casaco.
  • #4 according to OCP software should be open for extension and closed for modification Você não precisa abrir o peito de uma pessoa para colocar um casaco.
  • #5 CDI possibilita a extensão de suas funcionalidades – Hack Java EE :) A especificação fornece um SPI (que é uma Service Provider Interface), onde o o Provedor de serviços implementa uma interface para estender o CDI Esta funcionalidade é oficialmante chamada de CDI Portable Extensions É portable pois todos os servers devem suportar sua implantação Nada mais, nada menos que um JAR
  • #6 Conjunto de Portable Extensions CDI com diversas funcionalidades e extensões prontas para você dar uma acelerada no seu projeto.
  • #7 Quem estava escrevendo Portable Extensions CDI?
  • #9 O DeltaSpike NÃO é um full stack frameworkj como o Seam, Spring, Play, etc Não há nada de errado hoje em dia nos chamados Full Stack Frameworks (englobam funcionalides para View, Persistência, Segurança) A confusão veio por causa do Seam 3
  • #10 Mesmo com a garantia de portabilidade na especidicac&amp;apos;ão CDI para Portalble estensions, A integração contínua do DeltaSpike é testada nas implmentações Glassfish, 3 e 4, Weld 1, 2, TomEE, OpenWebBeans
  • #13 Antes de falarmos das funcionalidades, é preciso saber... O DeltaSpike por ser baseado em CDI é fortemente tipado. Oq isto significa ?
  • #14 Ou pelo menos as funcionalidades que mais me atraem Posso ter os mais variados Handlers: Logar a Exception: - enviar para uma console administrativa, - enviar para uma fila para ser tratada, - Tratar exceptions específicas de maneira diferenciada, etc
  • #15 Permite configurar o estágio do projeto. Algum dos estágio pré-definidos, você pode criar um stage custom (caso sua empresa tenha algo fora do normal)
  • #16 Permite passar configurações para a aplicação Multiplas configurações por ProjectStage Multiplos origens de configuração, inclusive um custom
  • #17 Permite injectar InputStreams de maneira fácil Pode ser um arquivo texto, uma imagem, etc
  • #18 Permite que o código fique mais expressivo, além de facilitar e muito lidar com grandes sistemas que requeiram internacionalização Vantagem1: Evita Strings no código / facilita refactoring Vantagem2: Evitar cadastrar chaves duplicadas
  • #19 A segurança também é type-safe onde pode-se criar anotações que serão checadas por métodos específicos
  • #20 O Data Module criar um proxy com implementações de alguns métodos básicos como save, saveAndFlush, remove, count, findBy(PK), etc
  • #21 Além disso, é possível criar queries customizadas usando o nome do método ou então declarar a query com a anotação @Query
  • #22 Apesar do JSF estar caindo em desuso o type-safe view config é uma mão não roda
  • #24 Permite a injeção de beans CDI em Jobs Quartz, Permite a injeção de um Schedduler para manipular os Jobs Permite o agendamento do Jobs através da anotação @Scheduled
  • #25 Permite em ambiente CDI 1.0 a injeção de objetos do ambiente Servlet. É possível utilizar o qualifier @Deltaspike para seu código ter compatibilidade com o CDI 1.1 onde esta funcionlidade faz parte da especificação Também é possível registrar listerners CDI para os eventos gerados pelo Servlet