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
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
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
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!
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&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