CDI Extensions and 
Apache DeltaSpike 
Jasoct 
AS Project Lead 
Rafael May 4, Benevides 
2011 
Senior Software Engineer 
benevides@redhat.com
Quem sou eu? 
• Nome: Rafael Benevides 
• JBoss Software Engineer 
• JBoss Developer Materials lead 
• Apache DeltaSpike committer 
• Twitter: @rafabene 
• e-Mail: benevides@redhat.com
CDI Extensions 
• OCP (Open closed Principle)
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
Como criar uma CDI 
Portable Extension ? 
• Baseado no java.util.ServiceLoader 
• Implementar javax.enterprise.inject.spi.Extension 
• Registrar a Extensão 
• Observar eventos do Container CDI 
• Durante o boot do container, modificar o 
comportamento do CDI
Eventos do Container CDI 
• BeforeBeanDiscovery 
• ProcessAnnotatedType and ProcessSyntheticAnnotatedType 
• AfterTypeDiscovery 
• ProcessInjectionTarget and ProcessProducer 
• ProcessInjectionPoint 
• ProcessBeanAttributes 
• ProcessBean, ProcessManagedBean, ProcessSessionBean, 
ProcessProducerMethod and ProcessProducerField 
• ProcessObserverMethod 
• AfterBeanDiscovery 
• AfterDeploymentValidation
Como registrar a extensão
Como a extensão é 
carregada? 
Opções ? 
O container CDI procura todas implementações da interface 
Extension ? 
A JRE procurar todas implemetações da interface Extension?
Opções ? 
Como a extensão é 
Magia ? 
carregada?
Opções ? 
Como a extensão é 
Magia ? 
ServiceLoader 
carregada?
E na vida real?
Portable Extensions 
“Você decide o que fazer com os Beans que o CDI lhe 
fornece”
Apache DeltaSpike 
http://deltaspike.apache.org
Como tudo começou 
JBoss Seam 3 Apache MyFaces 
CODI 
CDI Source Comunidade 
Java EE
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)
Então o DeltaSpike é 
um framework ?
Compatibilidade
Módulos 
• “Extensões criadas pela comunidade são 
empacotadas como módulos” 
(Documentação DeltaSpike)
Módulos 
CORE 
Security 
JPA 
JSF 
Bean validation 
Servlet 
Partial Bean 
Data 
Test Control 
Scheduler
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
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(); 
} 
}
Principais funcionalidades 
Type-safe Project Stage 
@Inject 
private ProjectStage projectStage; 
boolean isDevProjectStage = 
ProjectStage.Development.equals(this.projectStage); 
<h:panelGroup layout="block" 
rendered="#{applicationConfig.projectStage == 'Development'}" 
•UnitTest, 
•Development 
•SystemTest 
•IntegrationTest 
•Staging 
•Production 
Confgurável via DeltaSpike Confguration API 
-Dorg.apache.deltaspike.ProjectStage=Development
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: 
• Properties file values (apache-deltaspike.properties) (deltaspike_ordinal = 100, default filename 
is "META-INF/apache-deltaspike.properties") 
• JNDI values (deltaspike_ordinal = 200, the base name is "java:comp/env/deltaspike/") 
• Environment properties (deltaspike_ordinal = 300) 
• System properties (deltaspike_ordinal = 400)
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(); 
} 
}
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"));
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 
}
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(); 
}
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); 
}
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 { 
} 
} 
}
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.”
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); 
}
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
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
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
Conclusão 
• O DeltaSpike não é um full-stack framework 
• O DeltaSpike é um conjunto de Portable Extensions 
para facilitar o desenvolvimento Javaa utilizando CDI 
• O DeltaSpike é um conjunto de ferramentas!
Código Exemplo 
/rafabene 
https://github.com 
/demo_deltaspike
QQuueessttiioonnss?? 
bbeenneevviiddeess@@rreeddhhaatt..ccoomm

CDI Extensions e DeltaSpike

  • 1.
    CDI Extensions and Apache DeltaSpike Jasoct AS Project Lead Rafael May 4, Benevides 2011 Senior Software Engineer benevides@redhat.com
  • 2.
    Quem sou eu? • Nome: Rafael Benevides • JBoss Software Engineer • JBoss Developer Materials lead • Apache DeltaSpike committer • Twitter: @rafabene • e-Mail: benevides@redhat.com
  • 3.
    CDI Extensions •OCP (Open closed Principle)
  • 4.
    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
  • 5.
    Como criar umaCDI Portable Extension ? • Baseado no java.util.ServiceLoader • Implementar javax.enterprise.inject.spi.Extension • Registrar a Extensão • Observar eventos do Container CDI • Durante o boot do container, modificar o comportamento do CDI
  • 6.
    Eventos do ContainerCDI • BeforeBeanDiscovery • ProcessAnnotatedType and ProcessSyntheticAnnotatedType • AfterTypeDiscovery • ProcessInjectionTarget and ProcessProducer • ProcessInjectionPoint • ProcessBeanAttributes • ProcessBean, ProcessManagedBean, ProcessSessionBean, ProcessProducerMethod and ProcessProducerField • ProcessObserverMethod • AfterBeanDiscovery • AfterDeploymentValidation
  • 7.
  • 8.
    Como a extensãoé carregada? Opções ? O container CDI procura todas implementações da interface Extension ? A JRE procurar todas implemetações da interface Extension?
  • 9.
    Opções ? Comoa extensão é Magia ? carregada?
  • 10.
    Opções ? Comoa extensão é Magia ? ServiceLoader carregada?
  • 11.
    E na vidareal?
  • 12.
    Portable Extensions “Vocêdecide o que fazer com os Beans que o CDI lhe fornece”
  • 13.
  • 14.
    Como tudo começou JBoss Seam 3 Apache MyFaces CODI CDI Source Comunidade Java EE
  • 15.
    Qual o propósitodo 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)
  • 16.
    Então o DeltaSpikeé um framework ?
  • 17.
  • 18.
    Módulos • “Extensõescriadas pela comunidade são empacotadas como módulos” (Documentação DeltaSpike)
  • 19.
    Módulos CORE Security JPA JSF Bean validation Servlet Partial Bean Data Test Control Scheduler
  • 20.
    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
  • 21.
    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(); } }
  • 22.
    Principais funcionalidades Type-safeProject Stage @Inject private ProjectStage projectStage; boolean isDevProjectStage = ProjectStage.Development.equals(this.projectStage); <h:panelGroup layout="block" rendered="#{applicationConfig.projectStage == 'Development'}" •UnitTest, •Development •SystemTest •IntegrationTest •Staging •Production Confgurável via DeltaSpike Confguration API -Dorg.apache.deltaspike.ProjectStage=Development
  • 23.
    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: • Properties file values (apache-deltaspike.properties) (deltaspike_ordinal = 100, default filename is "META-INF/apache-deltaspike.properties") • JNDI values (deltaspike_ordinal = 200, the base name is "java:comp/env/deltaspike/") • Environment properties (deltaspike_ordinal = 300) • System properties (deltaspike_ordinal = 400)
  • 24.
    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(); } }
  • 25.
    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"));
  • 26.
    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 }
  • 27.
    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(); }
  • 28.
    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); }
  • 29.
    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 { } } }
  • 30.
    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.”
  • 31.
    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); }
  • 32.
    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
  • 33.
    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
  • 34.
    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
  • 35.
    Conclusão • ODeltaSpike não é um full-stack framework • O DeltaSpike é um conjunto de Portable Extensions para facilitar o desenvolvimento Javaa utilizando CDI • O DeltaSpike é um conjunto de ferramentas!
  • 36.
    Código Exemplo /rafabene https://github.com /demo_deltaspike
  • 37.