Successfully reported this slideshow.

TDC 2014 SP - E o DeltaSpike ?

6

Share

Upcoming SlideShare
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
Loading in …3
×
1 of 29
1 of 29

More Related Content

Related Books

Free with a 30 day trial from Scribd

See all

TDC 2014 SP - E o DeltaSpike ?

  1. 1. Globalcode – Open4education Software Livre: E o DeltaSpike ? Rafael Benevides
  2. 2. Globalcode – Open4education Quem sou eu? Nome: Rafael Benevides JBoss Software Engineer JBoss Developer Materials lead Apache DeltaSpike committer Twitter: @rafabene
  3. 3. Globalcode – Open4education CDI Extensions OCP (Open closed Principle)
  4. 4. 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
  5. 5. Globalcode – Open4education Apache DeltaSpike
  6. 6. Globalcode – Open4education Como tudo começou JBoss Seam 3 Apache MyFaces CODI CDI Source Comunidade Java EE
  7. 7. 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)
  8. 8. Globalcode – Open4education Então o DeltaSpike é um framework ?
  9. 9. Globalcode – Open4education Compatibilidade
  10. 10. Globalcode – Open4education Módulos “Extensões criadas pela comunidade são empacotadas como módulos” (Documentação DeltaSpike)
  11. 11. Globalcode – Open4education Módulos CORE Security JPA JSF Bean validation Servlet Partial Bean Data Test Control Scheduler
  12. 12. 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
  13. 13. 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(); } }
  14. 14. 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
  15. 15. 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")
  16. 16. 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(); } }
  17. 17. 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"));
  18. 18. 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 }
  19. 19. 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(); }
  20. 20. 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); }
  21. 21. 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 { } } }
  22. 22. 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)
  23. 23. 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); }
  24. 24. 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
  25. 25. 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
  26. 26. 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
  27. 27. 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!
  28. 28. Globalcode – Open4education Código Exemplo /rafabene https://github.com /demo_deltaspike
  29. 29. Globalcode – Open4education

Editor's Notes

  • 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.
  • 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.
  • 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
  • Conjunto de Portable Extensions CDI com diversas funcionalidades e extensões prontas para você dar uma acelerada no seu projeto.
  • Quem estava escrevendo Portable Extensions CDI?
  • 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
  • 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
  • Antes de falarmos das funcionalidades, é preciso saber...
    O DeltaSpike por ser baseado em CDI é fortemente tipado.
    Oq isto significa ?
  • 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
  • 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)
  • Permite passar configurações para a aplicação
    Multiplas configurações por ProjectStage
    Multiplos origens de configuração, inclusive um custom
  • Permite injectar InputStreams de maneira fácil
    Pode ser um arquivo texto, uma imagem, etc
  • 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
  • A segurança também é type-safe onde pode-se criar anotações que serão checadas por métodos específicos
  • O Data Module criar um proxy com implementações de alguns métodos básicos como save, saveAndFlush, remove, count, findBy(PK), etc
  • 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
  • Apesar do JSF estar caindo em desuso o type-safe view config é uma mão não roda
  • 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
  • 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
  • ×