SlideShare a Scribd company logo
1 of 36
Download to read offline
APACHE DELTASPIKE
THE CDITOOLBOX
@antoine_sd
ANTOINE SABOT-DURAND
• Senior Software Engineer @Red Hat
• Java & OSS :
• CDI co-spec lead
• CDI community development
• Apache Deltaspike committer
• @antoine_sd
AGENDA
• What is Apache Deltaspike?
• Deltaspike Core
• Deltaspike Modules
• Conclusion
WHAT IS APACHE DELTASPIKE
CDI & DELTASPIKE
• CDI is a specification. It doesn’t provide business features
• but it includes a powerful hook to add these business features
• The “portable extensions” feature is this hook
• Thanks to it, CDI can be easily enhanced with new high level features
APACHE DELTASPIKE IS…
• A collection of ready to use extensions to help you in your projects
• A toolbox to help you develop new CDI portable extensions
• A great way to learn how to develop your own extension by
browsing the source code
• The most obvious entry point to CDI eco-system
WHERE DOES IT COMES FROM?
Font: Avenir Light
Font-size: 64pt
Letter-spacing: 410
RGB: 51,181 229
HEX: #35b4e3
C=66.45 M=8.61 Y=1.97 K=0
Miscellaneous CDI Initiatives
TESTED WITH
• CDI 1.0, 1.1, 1.2
• JBoss Weld 1.1.3 to 2.2.8
• OpenWebBeans 1.1.1 to 1.2.7
• JBoss AS 7.x,WildFly 8.x
• JBoss EAP 6.x
• TomEE 1.0.x - 1.7.x
• GlassFish 3.x, 4.x
• Weblogic 12c
A BIT OF HISTORY
Dec 2011 Feb 2012 May 2013 June 2014
ProjectLaunch
rel.0.1
rel.0.4(outofincubator)
rel.1.0
Dec 2014
rel.1.2.1
WHAT’S INCLUDED?
Apache Deltaspike is organized in the following modules
Container control provides a portable way to boot CDI container
Core Module core features and helpers. Used by all other modules below
Partial Bean Module develop generic handler to choose code dynamically at runtime
Scheduler Module add job scheduling with Quartz or any other scheduler
Security Module add security checking. Integration of 3rd party security framework
BeanValidation Module CDI integration for BeanValidation 1.0
JPA Module Enhance JPA integration for CDI 1.0. Mostly useless in Java EE 7
Data Module Implements repository pattern removing JPA boilerplate code
Servlet Module Enhance Servlet integration for CDI 1.0. Mostly useless in Java EE 7
JSF Module Enhance JSF by adding CDI scopes, typesafe view config, etc…
Test control provide a test solution for CDI based on Junit
MODULES AND DEPENDENCIES
Partial Bean Core
Bean
Validation
JPAData
Security
JSF
Scheduler Servlet
Test CTRL
Containers
CTRL
ADDING DELTASPIKETOYOUR POM.XML
<dependency>

<groupId>org.apache.deltaspike.core</groupId>

<artifactId>deltaspike-core-api</artifactId>

<version>1.2.1</version>

<scope>compile</scope>

</dependency>



<dependency>

<groupId>org.apache.deltaspike.core</groupId>

<artifactId>deltaspike-core-impl</artifactId>

<version>1.2.1</version>

<scope>runtime</scope>

</dependency>
DELTASPIKE CORE
CONFIGURATION 1/2
• DeltaSpike provides a powerful configuration API / SPI
• It doesn’t depend on CDI, thus it can be used in portable extension
• The entry point is the ConfigResolver class
• ConfigSource SPI allows to add new configuration source
• Each config has a priority (ordinal).This highest is picked first
CONFIGURATION 2/2
Out of the Box Config Sources
ConfigSource Priority Notes
System properties 400
Environment properties 300
JNDI values 200 java:comp/env/deltaspike
Properties files value 100 META-INF/apache-deltaspike.properties
CONFIGURATION USAGE
//ConfigResolver can be used directly without CDI dependency (useful in extensions)

String dbUserName = ConfigResolver.getPropertyValue("databaseconfig.username");
…
//Config can also be used in CDI mode and typeSafe config

@Inject

@ConfigProperty(name = "endpoint.poll.interval")

private Integer p; // DS provides conversion for String, Integer, Long, Boolean, Float
…
//But you can provide your own ConfigProperty producer to perform custom conversion

@ApplicationScoped

public class MyConfigPropertyProducer extends BaseConfigPropertyProducer {

@Produces @ConfigProperty(name = "ignored")

public MyType produceStringConfiguration(InjectionPoint injectionPoint) {
String strValue = getStringPropertyValue(injectionPoint);
…
}

}
PROJECT STAGES
• Allows to use implementations depending on current environment
• You can defined your owned stage or used the provided ones
• Pre-defined project stages:
• UnitTest, Development, SystemTest, IntegrationTest, Staging, Production
• Project Stage is configured thru DS configuration mechanism
PROJECT STAGE EXAMPLE
//Setting project stage with environment property
-Dorg.apache.deltaspike.ProjectStage=Development
…
//Using project stage

@Inject

private ProjectStage projectStage;

boolean isDevProjectStage = ProjectStage.Development.equals(this.projectStage);
BEAN EXCLUSION WITH @EXCLUDE
@Exclude //like CDI 1.1+ @Vetoed but limited to a class
@Exclude(ifProjectStage=Production.class) //based on project stage


@Exclude(exceptIfProjectStage=UnitTest.class) //based on project stage


@Exclude(onExpression="myProperty==myValue") //based on config value


@Exclude(onExpression="[cust exp]", interpretedBy=CustomExpInterpreter.class) //custom
EXCEPTION HANDLERS
• Based on CDI event
• ExceptionToCatchEvent class sends the exception to DS
• @ExceptionHandler marks a class as handlers container
• @Handles and ExceptionEvent<T> handle an exception
EXCEPTION HANDLER EXAMPLE
public class InventoryActions {

@PersistenceContext

private EntityManager em;

@Inject

private Event<ExceptionToCatchEvent> catchEvent;



public Integer queryForItem(Item i) {

try {

Query q = em.createQuery("SELECT i from Item i where i.id = :id");

q.setParameter("id", item.getId());

return q.getSingleResult();

} catch (PersistenceException e) {

catchEvent.fire(new ExceptionToCatchEvent(e));

}

}

}
…
@ExceptionHandler

public class MyHandler {

void handleTheException(@Handles ExceptionEvent<Throwable> exEvent) {

// Do anything with the exception

exEvent.handleAndContinue();

}

}
INJECTABLE RESOURCE
@Inject

@InjectableResource(location = "/version.txt")

private InputStream is; //Can be customised for alternate sources



public String getVersion() throws IOException {

try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) {

return br.readLine();

}

}
INTERNATIONALISATION (I18N)
package org.apache.deltaspike.example



@MessageBundle // Can only be applied on an interface

public interface SimpleMessage
// Will map the org/apache/deltaspike/example/SimpleMessage bundle

{

@MessageTemplate(“{my_message}”) // Will map my_message key in bundle

String welcomeToDeltaSpike();
// For value with parameter i.e welcome_to = Welcome to %s 

@MessageTemplate("{welcome_to}")

String welcomeTo(String name);


}
CDI METADATA BUILDERS
• Creating CDI SPI metadata for you extension can be cumbersome
• Deltaspike provides builder to ease the work and reduce code verbosity
• Major builder are
• AnnotatedTypeBuilder
• BeanBuilder
• WrapperBeanBuilder
BUILDING META DATA EXAMPLES
void addTimedBinding(@Observes BeforeBeanDiscovery bbd) {

AnnotationLiteral<Nonbinding> nonbindingLiteral = new AnnotationLiteral<Nonbinding>(){};

AnnotatedTypeBuilder<Timed> atb = new AnnotatedTypeBuilder<Timed>()

.readFromType(Timed.class)

.addToMethod(Timed.class.getMethod("name"), nonbindingLiteral)

.addToMethod(Timed.class.getMethod(“absolute"),nonbindingLiteral);

bbd.addInterceptorBinding(atb.create());

}
…
public void registerGenericBeans(@Observes AfterBeanDiscovery abd) {

BeanBuilder<User> ubb = new BeanBuilder<User>(beanManager)

.readFromType(User.class)

.passivationCapable(true)

.addTypes(otherTypes);

if (weAreOnWeb)

ubb.scope(SessionScoped.class);

else

ubb.scope(ApplicationScoped.class);


abd.addBean(ubb.create());

}
DELTASPIKE MODULES
CONTAINER CONTROL
public class MainApp {

public static void main(String[] args) {



CdiContainer cdiContainer = CdiContainerLoader.getCdiContainer();

cdiContainer.boot();



// Starting the application-context enables use of @ApplicationScoped beans

ContextControl contextControl = cdiContainer.getContextControl();

contextControl.startContext(ApplicationScoped.class);



// You can use CDI here



cdiContainer.shutdown();

}

}
TEST CONTROL EXAMPLES
@RunWith(CdiTestRunner.class)

public class MyCdiTest {

@Inject

private MyBean bean;

}

…

@RunWith(CdiTestSuiteRunner.class)

@Suite.SuiteClasses({ TestX.class, TestY.class})

public class SuiteLevelContainerControl{}

…

@RunWith(CdiTestRunner.class)

@TestControl(projectStage = CustomTestStage.class)

public class TestStageControl {

@Test

@TestControl(projectStage = ProjectStage.Development.class)

public void checkDevEnv(){}

}
SECURITY
@Retention(value = RetentionPolicy.RUNTIME)

@Target({ ElementType.TYPE, ElementType.METHOD })

@Documented

@SecurityBindingType

public @interface AdminOnly {}
…
@ApplicationScoped

public class ApplicationAuthorizer {

@Secures

@AdminOnly // Binding security to permission verifier

public boolean verifyPermission(InvocationContext invocationContext,

BeanManager manager, @Logged User user) throws Exception {

return user.getRole().equalsIgnoreCase("Admin");

}

}
…
@AdminOnly

public void startAdministrativeTask() {

// Only admins can start admin tasks

}
SCHEDULER
@Scheduled(cronExpression = "0 0/10 * * * ?")

public class CdiAwareQuartzJob implements org.quartz.Job

{

@Inject

private MyService service;



@Override

public void execute(JobExecutionContext context) throws JobExecutionException

{

//...

}

}
DATA MODULE
DATA MODULE
• Data module is an implementation of the repository pattern
• At the moment it only support RDBMS thru JPA
• But it could be extended to support other data services
• It uses the “partial bean” module to dynamically create
implementation at runtime
-Eric Evans (in Domain Driven Design)
« A Repository represents all objects of a certain
type as a conceptual set. It acts like a collection,
except with more elaborate querying capability.»
REPOSITORY PATTERN DEFINITION
SIMPLE EXAMPLE
@Repository //Repo definition to put an interface

public interface UserRepository extends EntityRepository<User, Long> {



// method signature creates the JPQL with the partial bean mechanism

public User findByUsernameAndPassword(String username, char[] password);



}

…

@Repository

public interface PostRepostiory extends EntityRepository<Post, Long> {





@Query("SELECT p FROM Post AS p WHERE p.author in (?1)")

public List<Post> findByFollowing(List<User> following);



}
JPA FUNCTIONS SUPPORTED
• count();
• findAll();
• findBy(PK);
• flush();
• refresh();
• remove();
• save();
• saveAndFlush();
CONCLUSION
• More info & doc on http://deltaspike.apache.org
• Follow @Deltaspiketeam onTwitter
• Visit examples: https://deltaspike.apache.org/external.html
• & http://jboss.org/developer-materials/#!keyword=Deltaspike
• Questions ?

More Related Content

What's hot

AWS CodeDeploy, AWS CodePipeline, and AWS CodeCommit: Transforming Software D...
AWS CodeDeploy, AWS CodePipeline, and AWS CodeCommit: Transforming Software D...AWS CodeDeploy, AWS CodePipeline, and AWS CodeCommit: Transforming Software D...
AWS CodeDeploy, AWS CodePipeline, and AWS CodeCommit: Transforming Software D...
Amazon Web Services
 

What's hot (20)

놀면 뭐하니? 같이 개인 방송 서비스 만들어보자! - 김승준 현륜식 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
놀면 뭐하니? 같이 개인 방송 서비스 만들어보자! - 김승준 현륜식 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021놀면 뭐하니? 같이 개인 방송 서비스 만들어보자! - 김승준 현륜식 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
놀면 뭐하니? 같이 개인 방송 서비스 만들어보자! - 김승준 현륜식 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
 
Docker compose
Docker composeDocker compose
Docker compose
 
AWS Elastic Beanstalk Tutorial | AWS Certification | AWS Tutorial | Edureka
AWS Elastic Beanstalk Tutorial | AWS Certification | AWS Tutorial | EdurekaAWS Elastic Beanstalk Tutorial | AWS Certification | AWS Tutorial | Edureka
AWS Elastic Beanstalk Tutorial | AWS Certification | AWS Tutorial | Edureka
 
AWS CodeDeploy, AWS CodePipeline, and AWS CodeCommit: Transforming Software D...
AWS CodeDeploy, AWS CodePipeline, and AWS CodeCommit: Transforming Software D...AWS CodeDeploy, AWS CodePipeline, and AWS CodeCommit: Transforming Software D...
AWS CodeDeploy, AWS CodePipeline, and AWS CodeCommit: Transforming Software D...
 
Introduction to React Native - Nader Dabit
Introduction to React Native - Nader DabitIntroduction to React Native - Nader Dabit
Introduction to React Native - Nader Dabit
 
Laravel Presentation
Laravel PresentationLaravel Presentation
Laravel Presentation
 
Improving Infrastructure Governance on AWS - AWS June 2016 Webinar Series
Improving Infrastructure Governance on AWS - AWS June 2016 Webinar SeriesImproving Infrastructure Governance on AWS - AWS June 2016 Webinar Series
Improving Infrastructure Governance on AWS - AWS June 2016 Webinar Series
 
Automating with Ansible
Automating with AnsibleAutomating with Ansible
Automating with Ansible
 
Selecting the Best VPC Network Architecture (CPN208) | AWS re:Invent 2013
Selecting the Best VPC Network Architecture (CPN208) | AWS re:Invent 2013Selecting the Best VPC Network Architecture (CPN208) | AWS re:Invent 2013
Selecting the Best VPC Network Architecture (CPN208) | AWS re:Invent 2013
 
Ansible - Hands on Training
Ansible - Hands on TrainingAnsible - Hands on Training
Ansible - Hands on Training
 
Ansible
AnsibleAnsible
Ansible
 
Deep dive into Vue.js
Deep dive into Vue.jsDeep dive into Vue.js
Deep dive into Vue.js
 
Sling Models Overview
Sling Models OverviewSling Models Overview
Sling Models Overview
 
Gardener: Managed Kubernetes on Your Terms
Gardener: Managed Kubernetes on Your TermsGardener: Managed Kubernetes on Your Terms
Gardener: Managed Kubernetes on Your Terms
 
Ansible
AnsibleAnsible
Ansible
 
Testing of React JS app
Testing of React JS appTesting of React JS app
Testing of React JS app
 
Getting Started With Continuous Delivery on AWS - AWS April 2016 Webinar Series
Getting Started With Continuous Delivery on AWS - AWS April 2016 Webinar SeriesGetting Started With Continuous Delivery on AWS - AWS April 2016 Webinar Series
Getting Started With Continuous Delivery on AWS - AWS April 2016 Webinar Series
 
AEM Rich Text Editor (RTE) Deep Dive
AEM Rich Text Editor (RTE) Deep DiveAEM Rich Text Editor (RTE) Deep Dive
AEM Rich Text Editor (RTE) Deep Dive
 
Parsing XML & JSON in Apex
Parsing XML & JSON in ApexParsing XML & JSON in Apex
Parsing XML & JSON in Apex
 
Introduction to The Flow Factory Design Pattern
Introduction to The Flow Factory Design PatternIntroduction to The Flow Factory Design Pattern
Introduction to The Flow Factory Design Pattern
 

Viewers also liked

Apache DeltaSpike
Apache DeltaSpikeApache DeltaSpike
Apache DeltaSpike
os890
 
Flexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpikeFlexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpike
os890
 

Viewers also liked (6)

JSF2 c/ PrimeFaces, RichFaces e ICEfaces
JSF2 c/ PrimeFaces, RichFaces e ICEfacesJSF2 c/ PrimeFaces, RichFaces e ICEfaces
JSF2 c/ PrimeFaces, RichFaces e ICEfaces
 
Make JSF more type-safe with CDI and MyFaces CODI
Make JSF more type-safe with CDI and MyFaces CODIMake JSF more type-safe with CDI and MyFaces CODI
Make JSF more type-safe with CDI and MyFaces CODI
 
MyFaces CODI and JBoss Seam3 become Apache DeltaSpike
MyFaces CODI and JBoss Seam3 become Apache DeltaSpikeMyFaces CODI and JBoss Seam3 become Apache DeltaSpike
MyFaces CODI and JBoss Seam3 become Apache DeltaSpike
 
Apache DeltaSpike
Apache DeltaSpikeApache DeltaSpike
Apache DeltaSpike
 
Apache DeltaSpike the CDI toolbox
Apache DeltaSpike the CDI toolboxApache DeltaSpike the CDI toolbox
Apache DeltaSpike the CDI toolbox
 
Flexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpikeFlexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpike
 

Similar to Apache DeltaSpike: The CDI Toolbox

Staging Drupal 8 31 09 1 3
Staging Drupal 8 31 09 1 3Staging Drupal 8 31 09 1 3
Staging Drupal 8 31 09 1 3
Drupalcon Paris
 
Jenkins advance topic
Jenkins advance topicJenkins advance topic
Jenkins advance topic
Kalkey
 

Similar to Apache DeltaSpike: The CDI Toolbox (20)

BMO - Intelligent Projects with Maven
BMO - Intelligent Projects with MavenBMO - Intelligent Projects with Maven
BMO - Intelligent Projects with Maven
 
Intelligent Projects with Maven - DevFest Istanbul
Intelligent Projects with Maven - DevFest IstanbulIntelligent Projects with Maven - DevFest Istanbul
Intelligent Projects with Maven - DevFest Istanbul
 
An introduction to maven gradle and sbt
An introduction to maven gradle and sbtAn introduction to maven gradle and sbt
An introduction to maven gradle and sbt
 
SSDT unleashed
SSDT unleashedSSDT unleashed
SSDT unleashed
 
Gradle plugin, take control of the build
Gradle plugin, take control of the buildGradle plugin, take control of the build
Gradle plugin, take control of the build
 
Database continuous integration, unit test and functional test
Database continuous integration, unit test and functional testDatabase continuous integration, unit test and functional test
Database continuous integration, unit test and functional test
 
A (very) opinionated guide to MSBuild and Project Files
A (very) opinionated guide to MSBuild and Project FilesA (very) opinionated guide to MSBuild and Project Files
A (very) opinionated guide to MSBuild and Project Files
 
Staging Drupal 8 31 09 1 3
Staging Drupal 8 31 09 1 3Staging Drupal 8 31 09 1 3
Staging Drupal 8 31 09 1 3
 
Dao example
Dao exampleDao example
Dao example
 
Useful practices of creation automatic tests by using cucumber jvm
Useful practices of creation automatic tests by using cucumber jvmUseful practices of creation automatic tests by using cucumber jvm
Useful practices of creation automatic tests by using cucumber jvm
 
How to help your editor love your vue component library
How to help your editor love your vue component libraryHow to help your editor love your vue component library
How to help your editor love your vue component library
 
Gradle - From minutes to seconds: minimizing build times
Gradle - From minutes to seconds: minimizing build timesGradle - From minutes to seconds: minimizing build times
Gradle - From minutes to seconds: minimizing build times
 
Liquibase – a time machine for your data
Liquibase – a time machine for your dataLiquibase – a time machine for your data
Liquibase – a time machine for your data
 
2/3 : CDI advanced - Antoine Sabot-Durand
2/3 : CDI advanced - Antoine Sabot-Durand2/3 : CDI advanced - Antoine Sabot-Durand
2/3 : CDI advanced - Antoine Sabot-Durand
 
How (and why) to roll your own Docker SaaS
How (and why) to roll your own Docker SaaSHow (and why) to roll your own Docker SaaS
How (and why) to roll your own Docker SaaS
 
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
 
Gradle,the new build system for android
Gradle,the new build system for androidGradle,the new build system for android
Gradle,the new build system for android
 
Jenkins advance topic
Jenkins advance topicJenkins advance topic
Jenkins advance topic
 
Untangling - fall2017 - week 9
Untangling - fall2017 - week 9Untangling - fall2017 - week 9
Untangling - fall2017 - week 9
 
Maven
MavenMaven
Maven
 

More from Virtual JBoss User Group

More from Virtual JBoss User Group (11)

An Enterprise Developer's Joerney to the IoT
An Enterprise Developer's Joerney to the IoTAn Enterprise Developer's Joerney to the IoT
An Enterprise Developer's Joerney to the IoT
 
Messaging for IoT
Messaging for IoTMessaging for IoT
Messaging for IoT
 
Apache Lucene for Java EE Developers
Apache Lucene for Java EE DevelopersApache Lucene for Java EE Developers
Apache Lucene for Java EE Developers
 
What's New in WildFly 9?
What's New in WildFly 9?What's New in WildFly 9?
What's New in WildFly 9?
 
Narayana 5: The premier open source transaction manager
Narayana 5: The premier open source transaction manager Narayana 5: The premier open source transaction manager
Narayana 5: The premier open source transaction manager
 
Hacking on WildFly 9
Hacking on WildFly 9Hacking on WildFly 9
Hacking on WildFly 9
 
Implementing your own Google App Engine
Implementing your own Google App Engine Implementing your own Google App Engine
Implementing your own Google App Engine
 
Ceylon From Here to Infinity: The Big Picture and What's Coming
Ceylon From Here to Infinity: The Big Picture and What's Coming Ceylon From Here to Infinity: The Big Picture and What's Coming
Ceylon From Here to Infinity: The Big Picture and What's Coming
 
Going Further with CDI 1.2
Going Further with CDI 1.2Going Further with CDI 1.2
Going Further with CDI 1.2
 
Introduction to CDI
Introduction to CDIIntroduction to CDI
Introduction to CDI
 
Testing the Enterprise layers, with Arquillian
Testing the Enterprise layers, with ArquillianTesting the Enterprise layers, with Arquillian
Testing the Enterprise layers, with Arquillian
 

Recently uploaded

%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
masabamasaba
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
masabamasaba
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 

Recently uploaded (20)

WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
WSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaS
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
tonesoftg
tonesoftgtonesoftg
tonesoftg
 
WSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security Program
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 

Apache DeltaSpike: The CDI Toolbox

  • 2. ANTOINE SABOT-DURAND • Senior Software Engineer @Red Hat • Java & OSS : • CDI co-spec lead • CDI community development • Apache Deltaspike committer • @antoine_sd
  • 3. AGENDA • What is Apache Deltaspike? • Deltaspike Core • Deltaspike Modules • Conclusion
  • 4. WHAT IS APACHE DELTASPIKE
  • 5. CDI & DELTASPIKE • CDI is a specification. It doesn’t provide business features • but it includes a powerful hook to add these business features • The “portable extensions” feature is this hook • Thanks to it, CDI can be easily enhanced with new high level features
  • 6. APACHE DELTASPIKE IS… • A collection of ready to use extensions to help you in your projects • A toolbox to help you develop new CDI portable extensions • A great way to learn how to develop your own extension by browsing the source code • The most obvious entry point to CDI eco-system
  • 7. WHERE DOES IT COMES FROM? Font: Avenir Light Font-size: 64pt Letter-spacing: 410 RGB: 51,181 229 HEX: #35b4e3 C=66.45 M=8.61 Y=1.97 K=0 Miscellaneous CDI Initiatives
  • 8. TESTED WITH • CDI 1.0, 1.1, 1.2 • JBoss Weld 1.1.3 to 2.2.8 • OpenWebBeans 1.1.1 to 1.2.7 • JBoss AS 7.x,WildFly 8.x • JBoss EAP 6.x • TomEE 1.0.x - 1.7.x • GlassFish 3.x, 4.x • Weblogic 12c
  • 9. A BIT OF HISTORY Dec 2011 Feb 2012 May 2013 June 2014 ProjectLaunch rel.0.1 rel.0.4(outofincubator) rel.1.0 Dec 2014 rel.1.2.1
  • 10. WHAT’S INCLUDED? Apache Deltaspike is organized in the following modules Container control provides a portable way to boot CDI container Core Module core features and helpers. Used by all other modules below Partial Bean Module develop generic handler to choose code dynamically at runtime Scheduler Module add job scheduling with Quartz or any other scheduler Security Module add security checking. Integration of 3rd party security framework BeanValidation Module CDI integration for BeanValidation 1.0 JPA Module Enhance JPA integration for CDI 1.0. Mostly useless in Java EE 7 Data Module Implements repository pattern removing JPA boilerplate code Servlet Module Enhance Servlet integration for CDI 1.0. Mostly useless in Java EE 7 JSF Module Enhance JSF by adding CDI scopes, typesafe view config, etc… Test control provide a test solution for CDI based on Junit
  • 11. MODULES AND DEPENDENCIES Partial Bean Core Bean Validation JPAData Security JSF Scheduler Servlet Test CTRL Containers CTRL
  • 14. CONFIGURATION 1/2 • DeltaSpike provides a powerful configuration API / SPI • It doesn’t depend on CDI, thus it can be used in portable extension • The entry point is the ConfigResolver class • ConfigSource SPI allows to add new configuration source • Each config has a priority (ordinal).This highest is picked first
  • 15. CONFIGURATION 2/2 Out of the Box Config Sources ConfigSource Priority Notes System properties 400 Environment properties 300 JNDI values 200 java:comp/env/deltaspike Properties files value 100 META-INF/apache-deltaspike.properties
  • 16. CONFIGURATION USAGE //ConfigResolver can be used directly without CDI dependency (useful in extensions)
 String dbUserName = ConfigResolver.getPropertyValue("databaseconfig.username"); … //Config can also be used in CDI mode and typeSafe config
 @Inject
 @ConfigProperty(name = "endpoint.poll.interval")
 private Integer p; // DS provides conversion for String, Integer, Long, Boolean, Float … //But you can provide your own ConfigProperty producer to perform custom conversion
 @ApplicationScoped
 public class MyConfigPropertyProducer extends BaseConfigPropertyProducer {
 @Produces @ConfigProperty(name = "ignored")
 public MyType produceStringConfiguration(InjectionPoint injectionPoint) { String strValue = getStringPropertyValue(injectionPoint); … }
 }
  • 17. PROJECT STAGES • Allows to use implementations depending on current environment • You can defined your owned stage or used the provided ones • Pre-defined project stages: • UnitTest, Development, SystemTest, IntegrationTest, Staging, Production • Project Stage is configured thru DS configuration mechanism
  • 18. PROJECT STAGE EXAMPLE //Setting project stage with environment property -Dorg.apache.deltaspike.ProjectStage=Development … //Using project stage
 @Inject
 private ProjectStage projectStage;
 boolean isDevProjectStage = ProjectStage.Development.equals(this.projectStage);
  • 19. BEAN EXCLUSION WITH @EXCLUDE @Exclude //like CDI 1.1+ @Vetoed but limited to a class @Exclude(ifProjectStage=Production.class) //based on project stage 
 @Exclude(exceptIfProjectStage=UnitTest.class) //based on project stage 
 @Exclude(onExpression="myProperty==myValue") //based on config value 
 @Exclude(onExpression="[cust exp]", interpretedBy=CustomExpInterpreter.class) //custom
  • 20. EXCEPTION HANDLERS • Based on CDI event • ExceptionToCatchEvent class sends the exception to DS • @ExceptionHandler marks a class as handlers container • @Handles and ExceptionEvent<T> handle an exception
  • 21. EXCEPTION HANDLER EXAMPLE public class InventoryActions {
 @PersistenceContext
 private EntityManager em;
 @Inject
 private Event<ExceptionToCatchEvent> catchEvent;
 
 public Integer queryForItem(Item i) {
 try {
 Query q = em.createQuery("SELECT i from Item i where i.id = :id");
 q.setParameter("id", item.getId());
 return q.getSingleResult();
 } catch (PersistenceException e) {
 catchEvent.fire(new ExceptionToCatchEvent(e));
 }
 }
 } … @ExceptionHandler
 public class MyHandler {
 void handleTheException(@Handles ExceptionEvent<Throwable> exEvent) {
 // Do anything with the exception
 exEvent.handleAndContinue();
 }
 }
  • 22. INJECTABLE RESOURCE @Inject
 @InjectableResource(location = "/version.txt")
 private InputStream is; //Can be customised for alternate sources
 
 public String getVersion() throws IOException {
 try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
 return br.readLine();
 }
 }
  • 23. INTERNATIONALISATION (I18N) package org.apache.deltaspike.example
 
 @MessageBundle // Can only be applied on an interface
 public interface SimpleMessage // Will map the org/apache/deltaspike/example/SimpleMessage bundle
 {
 @MessageTemplate(“{my_message}”) // Will map my_message key in bundle
 String welcomeToDeltaSpike(); // For value with parameter i.e welcome_to = Welcome to %s 
 @MessageTemplate("{welcome_to}")
 String welcomeTo(String name); 
 }
  • 24. CDI METADATA BUILDERS • Creating CDI SPI metadata for you extension can be cumbersome • Deltaspike provides builder to ease the work and reduce code verbosity • Major builder are • AnnotatedTypeBuilder • BeanBuilder • WrapperBeanBuilder
  • 25. BUILDING META DATA EXAMPLES void addTimedBinding(@Observes BeforeBeanDiscovery bbd) {
 AnnotationLiteral<Nonbinding> nonbindingLiteral = new AnnotationLiteral<Nonbinding>(){};
 AnnotatedTypeBuilder<Timed> atb = new AnnotatedTypeBuilder<Timed>()
 .readFromType(Timed.class)
 .addToMethod(Timed.class.getMethod("name"), nonbindingLiteral)
 .addToMethod(Timed.class.getMethod(“absolute"),nonbindingLiteral);
 bbd.addInterceptorBinding(atb.create());
 } … public void registerGenericBeans(@Observes AfterBeanDiscovery abd) {
 BeanBuilder<User> ubb = new BeanBuilder<User>(beanManager)
 .readFromType(User.class)
 .passivationCapable(true)
 .addTypes(otherTypes);
 if (weAreOnWeb)
 ubb.scope(SessionScoped.class);
 else
 ubb.scope(ApplicationScoped.class); 
 abd.addBean(ubb.create());
 }
  • 27. CONTAINER CONTROL public class MainApp {
 public static void main(String[] args) {
 
 CdiContainer cdiContainer = CdiContainerLoader.getCdiContainer();
 cdiContainer.boot();
 
 // Starting the application-context enables use of @ApplicationScoped beans
 ContextControl contextControl = cdiContainer.getContextControl();
 contextControl.startContext(ApplicationScoped.class);
 
 // You can use CDI here
 
 cdiContainer.shutdown();
 }
 }
  • 28. TEST CONTROL EXAMPLES @RunWith(CdiTestRunner.class)
 public class MyCdiTest {
 @Inject
 private MyBean bean;
 }
 …
 @RunWith(CdiTestSuiteRunner.class)
 @Suite.SuiteClasses({ TestX.class, TestY.class})
 public class SuiteLevelContainerControl{}
 …
 @RunWith(CdiTestRunner.class)
 @TestControl(projectStage = CustomTestStage.class)
 public class TestStageControl {
 @Test
 @TestControl(projectStage = ProjectStage.Development.class)
 public void checkDevEnv(){}
 }
  • 29. SECURITY @Retention(value = RetentionPolicy.RUNTIME)
 @Target({ ElementType.TYPE, ElementType.METHOD })
 @Documented
 @SecurityBindingType
 public @interface AdminOnly {} … @ApplicationScoped
 public class ApplicationAuthorizer {
 @Secures
 @AdminOnly // Binding security to permission verifier
 public boolean verifyPermission(InvocationContext invocationContext,
 BeanManager manager, @Logged User user) throws Exception {
 return user.getRole().equalsIgnoreCase("Admin");
 }
 } … @AdminOnly
 public void startAdministrativeTask() {
 // Only admins can start admin tasks
 }
  • 30. SCHEDULER @Scheduled(cronExpression = "0 0/10 * * * ?")
 public class CdiAwareQuartzJob implements org.quartz.Job
 {
 @Inject
 private MyService service;
 
 @Override
 public void execute(JobExecutionContext context) throws JobExecutionException
 {
 //...
 }
 }
  • 32. DATA MODULE • Data module is an implementation of the repository pattern • At the moment it only support RDBMS thru JPA • But it could be extended to support other data services • It uses the “partial bean” module to dynamically create implementation at runtime
  • 33. -Eric Evans (in Domain Driven Design) « A Repository represents all objects of a certain type as a conceptual set. It acts like a collection, except with more elaborate querying capability.» REPOSITORY PATTERN DEFINITION
  • 34. SIMPLE EXAMPLE @Repository //Repo definition to put an interface
 public interface UserRepository extends EntityRepository<User, Long> {
 
 // method signature creates the JPQL with the partial bean mechanism
 public User findByUsernameAndPassword(String username, char[] password);
 
 }
 …
 @Repository
 public interface PostRepostiory extends EntityRepository<Post, Long> {
 
 
 @Query("SELECT p FROM Post AS p WHERE p.author in (?1)")
 public List<Post> findByFollowing(List<User> following);
 
 }
  • 35. JPA FUNCTIONS SUPPORTED • count(); • findAll(); • findBy(PK); • flush(); • refresh(); • remove(); • save(); • saveAndFlush();
  • 36. CONCLUSION • More info & doc on http://deltaspike.apache.org • Follow @Deltaspiketeam onTwitter • Visit examples: https://deltaspike.apache.org/external.html • & http://jboss.org/developer-materials/#!keyword=Deltaspike • Questions ?