tdc 2014 sp - e o deltaspike ?
TRANSCRIPT
Globalcode – Open4education
Software Livre: E o DeltaSpike ?Rafael Benevides
Globalcode – Open4education
Quem sou eu?
Nome: Rafael BenevidesJBoss 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 MyFacesCODI
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 tipadaElimina a dependência de Strings
Fácil refatoração
Compilador pode detectar errosNenhuma 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 StageUnitTest,
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")@MessageBundlepublic interface Messages { public String usuarioAdicionado(String username); public String usuario(); @MessageTemplate("{password}") public String senha();}
<br /> #{msg.senha()}:
@Injectprivate Messages messages;
new FacesMessage(msg.usuarioAdicionado("Rafael"));
Globalcode – Open4education
Principais funcionalidades
Segurança
@Retention(value = RetentionPolicy.RUNTIME)@Target({ ElementType.TYPE, ElementType.METHOD })@Documented@SecurityBindingTypepublic @interface AdminOnly {
}
@ApplicationScopedpublic 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@Repositorypublic 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@Repositorypublic interface RepositorioUsuarios extends EntityRepository<Usuario, Long> {
// O próprio nome do método cria o SQL public Usuario findByUsernameAndPassword(String username, char[] password); }
@Repositorypublic 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 outcomepublic Class<Welcome> telaHome() { return Home.class;}
@Inject
ViewNavigationHandler vnh;
// type-safe outcomepublic 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 ModulePermite que “Validators” recebam injeção de objetos via CDI em ambiente java EE 6 / CDI 1.0
Partial BeanPermite a criação de implementações para suas interfaces ou classes abstratas
Globalcode – Open4education
Outras funcionalidades
Container ControlPermite fazer o boot de implementações CDI em ambiente Java SE, bem como controlar o ciclo de vida dos contextos
Test ControlFacilita 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
/rafabenehttps://github.com
/demo_deltaspike
Globalcode – Open4education