SlideShare a Scribd company logo
1 of 53
Download to read offline
Apache	DeltaSpike	-	the
CDI	toolbox
Antoine	Sabot-Durand	·	Rafael	Benevides
Rafael	Benevides
	DeltaSpike	P.M.C	member
	Red	Hat,	Inc.
	@rafabene
	rafabene.com
	github.com/rafabene
Antoine	Sabot-Durand
	CDI	spec	lead
	Red	Hat,	Inc.
	@antoine_sd
	next-presso.com
	github.com/antoinesd
Should	I	stay	or	should	I	go?
	A	talk	about	CDI	eco-system
	Don’t	need	to	be	a	CDI	guru
	But	you	need	to	know	CDI
@Inject @Produces
Event<T> @Observes
@Qualifier InjectionPoint
Should	I	stay	or	should	I	go	?
 If	you	know	the	most	of	these	you	can	stay
Agenda
	What	is	DeltaSpike	?
	Core	Module
	Other	DeltaSpike	Modules
	Question	&	Answers
 Slides	available	at	rafabene.github.io/deltaspike-cdi-toolbox/
What	is	DeltaSpike	?
Where	does	it	come	from	?
A	bit	of	history
	Dec	2011:	project	launch
	Feb	2012:	version	0.1
	May	2013:	version	0.4	(out	of	incubator)
	June	2014:	version	1.0
	August	2015:	version	1.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
CDI	Portable	extensions

One	of	the	most	powerful	feature	of	the
CDI	specification
 Not	really	popularized,	partly	due	to:
1.	 Their	high	level	of	abstraction
2.	 The	good	knowledge	on	Basic	CDI	and	SPI
3.	 Lack	of	information	(CDI	is	often	reduced	to	a	basic	DI	solution)
Extensions,	what	for?
 To	integrate	3rd	party	libraries,	frameworks	or	legacy	components
 To	change	existing	configuration	or	behavior
 To	extend	CDI	and	Java	EE
 Thanks	to	them,	Java	EE	can	evolve	between	major	releases
Extensions,	how?

Observing	SPI	events	at	boot	time	related	to
the	bean	manager	lifecycle
 Checking	what	meta-data	are	being	created
 Modifying	these	meta-data	or	creating	new
ones
More	concretely

Service	provider	of	the	service
javax.enterprise.inject.spi.Extension 	declared	in
META-INF/services
 Just	put	the	fully	qualified	name	of	your	extension	class	in	this	file
import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.Extension;
public class CdiExtension implements Extension {
void beforeBeanDiscovery(@Observes BeforeBeanDiscovery bbd) {
}
//...
void afterDeploymentValidation(@Observes AfterDeploymentValidation adv) {
}
}
Internal Step Happen Once Loop on Elements
Bean	manager	lifecycle
Deployment
Start
Before
Bean
Discovery
Scan
Archive
Process
Annotated
Type
After
Type
Discovery
Bean
Eligibility
Check
Process
Injection
Point
Process
Injection
Target
Process
Bean
Attributes
Process
Bean
Process
Producer
Process
Observer
Method
After
Bean
Discovery
After
Deployment
Validation
Application
Running
Before
Shutdown
Undeploy
Application
Example:	Ignoring	JPA	entities
 The	following	extension	prevents	CDI	to	manage	entities
 This	is	a	commonly	admitted	good	practice
public class VetoEntity implements Extension {
void vetoEntity(@Observes @WithAnnotations(Entity.class)
ProcessAnnotatedType<?> pat) {
pat.veto();
}
}
	Extensions	are	launched	during
bootstrap	and	are	based	on	CDI	events
	Once	the	application	is	bootstrapped,
the	Bean	Manager	is	in	read-only	mode	(no
runtime	bean	registration)
	You	only	have	to	@Observes 	built-in	CDI
events	to	create	your	extensions
Remember
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
DeltaSpike	is	tested	with
	CDI	1.0,	1.1,	1.2	and	2.0
	JBoss	Weld	and	Apache	OpenWebBeans
	JBoss	AS	7.x,	WildFly	8.x	-	10.x
	JBoss	EAP	6.x	-	7.x
	Apache	TomEE	1.0.x	-	1.7.x
	Oracle	GlassFish	3.x,	4.x
	Oracle	Weblogic	12c
	IBM	Websphere	8.x
Deltaspike	is	for	all	CDI	developers
 While	this	talk	is	focused	on	classical	project	developers…​
 …​advanced	developers	may	find	interesting	helpers	in	Deltaspike
 For	instance	metadata	builder	are	useful	for	portable	extension
developers
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());

}
More	on	DeltaSpike
 Apache	DeltaSpike	received	Duke’s	choice	award	2014
 This	talk	shows	only	a	small	part	of	the	framework
 More	info	on:	deltaspike.apache.org/
Modules	and	dependencies
Core	Module
Core	-	Exception	Handler
public class InventoryActions {
@PersistenceContext private EntityManager em;
@Inject private Event<ExceptionToCatchEvent> catchEvent;
public Integer queryForItem(Item item) {
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));
}
}
}
The	Event	of	generic	type	ExceptionToCatchEvent	is	injected	into	your	class	for	use	later	within	a	try/catch
block.
The	event	is	fired	with	a	new	instance	of	ExceptionToCatchEvent	constructed	with	the	exception	to	be
handled.
1
2
1
2
Core	-	Exception	Handler
 Exceptions	are	handled	asynchronously.
@ExceptionHandler
public class MyHandlers {
void printExceptions(@Handles ExceptionEvent<Throwable> evt) {
System.out.println("Something bad happened:" +
evt.getException().getMessage());
evt.handleAndContinue();
}
}
Exception	handler	methods	are	registered	on	beans	annotated	with	@ExceptionHandler
The	@Handles	annotation	on	the	first	parameter	designates	this	method	as	an	exception	handler.
This	handler	does	not	modify	the	invocation	of	subsequent	handlers,	as	designated	by	invoking
handleAndContinue().
1
2
3
1
2
3
Core	-	Type-safe	ProjectStage
 The	current	ProjectStage	can	be	injected.
@Inject
private ProjectStage projectStage;
//...
boolean isDevelopment = ProjectStage.Development.equals(this.projectStage);
 You	can	also	use	the	ProjectStage	at	XHTML	files.
<h:panelGroup layout="block"rendered="#{applicationConfig.projectStage == 'Development'}" >
<!-- HTML Snippet is shown only in Development stage -->
</h:panelGroup>
Core	-	Type-safe	ProjectStage
 DeltaSpike	comes	with	the	following	pre-defined	ProjectStages:
1.	 UnitTest
2.	 Development
3.	 SystemTest
4.	 IntegrationTest
5.	 Staging
6.	 Production
 But	you	can	create	your	own	custom	ProjectStages.
Core	-	Project	Stage	Configuration
 It	can	be	set	using	DeltaSpike	Configuration	Mechanism
-D org.apache.deltaspike.ProjectStage=Development
	How	to	provide	these	Key/Values	to	DeltaSpike?
1.	 System	properties
2.	 Environment	properties
3.	 JNDI	values	-	the	base	name	is	"java:comp/env/deltaspike/"
4.	 Properties	file	values	-	default	filename	is	"META-INF/apache-
deltaspike.properties"
Core	-	DeltaSpike	Configuration	Mechanism
Configuration	API
String userName = ConfigResolver.getPropertyValue("user.name");
String dbUserName = ConfigResolver.getProjectStageAwarePropertyValue("db.username");
Integer dbPort = ConfigResolver
.resolve("db.port")
.as(Integer.class)
.withProjectStage(true)
.withDefault(3306)
.getValue();
Date deadline = ConfigResolver.resolve("project.deadline")
.as(Date.class, new CustomDateConverter()).getValue());
Properties	(Key	/	Value)
user.name = "Rafael"
db.username.Production = "Antoine"
db.username.Development = "Benevides"
db.port = 1234
project.deadline = 2017-04-01
1
2
3
4
1
2
2
3
4
Core	-	DeltaSpike	Configuration	Mechanism
Injection	of	configured	values	into	beans	using	@ConfigProperty
@ApplicationScoped
public class SomeRandomService
{
@Inject
@ConfigProperty(name = "endpoint.poll.interval")
private Integer pollInterval;
@Inject
@ConfigProperty(name = "endpoint.poll.servername")
private String pollUrl;
...
}
Core	-	Messages	and	i18n
 Type-safe	messages	-	Bean	creation
@Named("msg")
@MessageBundle
public interface MyMessages {
public String welcome();
public String welcomeTo(String username);
@MessageTemplate("{custom_message}")
public String message();
}
in	the	message	bundle:	welcometo=Welcome	to	%s
in	the	message	bundle:	custom_message=DeltaSpike	is	awesome!
1
2
1
2
Core	-	Messages	and	i18n
 Now	the	messages	bean	is	ready	to	be	used	in	Java	Classes
@Inject
private MyMessages messages;
//
new FacesMessage(messages.welcomeTo("Rafael"));
log.info(messages.message());
 …​or	even	inside	JSP/JSF	because	it	uses	a	@Named	annotation.
<h1>#{msg.welcome}</h1>

It	uses	the	“partial	bean”	module	to	dynamically	create
implementation	at	runtime.
Core	-	@Exclude
 It’s	like	@Vetoed	from	CDI	1.1	but	better!
Excluding	a	Bean	in	any	Case
@Exclude
public class NoBean{ }
Excluding	a	Bean	in	Case	of	ProjectStageDevelopment
@Exclude(ifProjectStage = ProjectStage.Development.class)
public class MyBean{ }
Excluding	a	Bean	if	the	ProjectStage	is	different	from	Development
@Exclude(exceptIfProjectStage = ProjectStage.Development.class)
public class MyDevBean{ }
Excluding	a	Bean	based	on	an	Expression	which	Evaluates	to	True
@Exclude(onExpression = "db==prodDB")
public class DevDbBean { }
Core	-	Injecting	Resources

DeltaSpike	has	simple	APIs	for	performing	basic	resource	loading	and
property	file	reading.
@Inject
@InjectableResource("myfile.properties")
private InputStream is;
public String getVersion() throws IOException {
try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
return br.readLine();
}
}
 The	InjectableResourceProvider	interface	can	be	implemented	to
allow	reading	from	alternate	sources	if	needed.
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.
“ "A	Repository	represents
all	objects	of	a	certain	type	as
a	conceptual	set.
It	acts	like	a	collection,	except	with	more	elaborate
querying	capability."
Domain	Driven	Design
—	Eric	Evans
Repository	pattern
Data	Module	-	Creating	a	Repository
@Repository
public interface UserRepository extends EntityRepository<User, Long> {
/* DeltaSpike creates a proxy which implements:
Long count();
List<E> findAll();
E findBy(PK);
void flush();
void refresh();
void remove(E);
E save(E);
E saveAndFlush(E);
...and many others */
}

It	uses	the	“partial	bean”	module	to	dynamically	create
implementation	at	runtime.
Data	Module	-	Making	queries
@Repository
public interface UserRepository extends EntityRepository<User, Long> {
public User findByUsernameAndPassword(String username, char[] password);
@Query("SELECT u FROM User AS u WHERE u.role in (?1)")
public List<Role> findByRoles(List<Role> roles);
}
The	name	of	the	method	automatically	creates	the	query.	Example:
"SELECT	u	FROM	User	u	WHERE	u.username	=	?1	AND	u.password	=	?2	"
The	query	is	defined	inside	the	@Query	annotation.
1
2
1
2
Data	Module	-	Pagination
@Repository
public interface UserRepository extends EntityRepository<User, Long> {
@Query("select p from Person p where p.age between ?1 and ?2")
QueryResult<Person> findAllByAge(int minAge, int maxAge);
}
QueryResult<Person> paged = personRepository.findByAge(age)
// Query API style
paged.maxResults(10).firstResult(50).getResultList();
// or paging style
paged.withPageSize(10).toPage(5).getResultList();
int totalPages = paged.countPages();
Security	Module
Security	Module	-	Simple	interceptor-style	authorization
 Type-safe	authorization
@Retention(value = RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@SecurityBindingType
public @interface AdminOnly {
}
@ApplicationScoped
public class SecuredBean {
@AdminOnly
public void doSomething() {
//...
}
}
Security	Module	-	Simple	interceptor-style	authorization
 An	interceptor-style	class	is	used	to	define	the	access
@ApplicationScoped
public class ApplicationAuthorizer {
@Secures
@AdminOnly
public boolean verifyPermission(InvocationContext invocationContext,
BeanManager manager, @Loggged User user) throws Exception {
return user.getRole().equalsIgnoreCase("Admin");
}
}
JSF	Module
JSF	Module	-	JSF	Messages
@MessageBundle
public interface Messages {
@MessageTemplate("Welcome to DeltaSpike")
String welcomeToDeltaSpike();
}
@Model
public class MyJSFBean {
@Inject
private JsfMessage<Messages> messages;
//...
messages.addInfo().welcomeToDeltaSpike();
}
JSF	Module	-	@WindowScoped
 "The	window-scope	is	like	a	session	per	window"
@WindowScoped
public class PreferencesBean implements Serializable {
//...
}

"There	isn’t	a	lot	of	use-cases	which	need	shared	data	between
windows"
JSF	Module	-	Double-Submit	Prevention

"To	avoid	that	the	same	content	of	a	form	gets	submitted	and
therefore	processed	multiple	times"
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ds="http://deltaspike.apache.org/jsf">
<h:head>
<!-- head content -->
</h:head>
<h:body>
<h:form>
<!-- form content -->
<ds:preventDoubleSubmit/>
</h:form>
</h:body>
</html>
Scheduler	Module
Scheduler	Module
 Provides	integration	with	Quartz.
// Job will execute each minute
@Scheduled(cronExpression = "0 0/1 * * * ?", onStartup = false)
public class CdiAwareQuartzJob implements org.quartz.Job {
// And it can receive CDI injections
@Inject
private AdminServices service;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
service.executeAdministrativeTask();
}
}
@Inject
private Scheduler<Job> jobScheduler;
//...
jobScheduler.registerNewJob(CdiAwareQuartzJob.class);
Other	Modules
Other	Modules
Want	to	go	farther	on	CDI?
	TUT2376:	Advanced	CDI	in	live	coding
	Tuesday	27th	at	8:30
	Cyril	Magnin	II	/	III
	Antonin	Stefanutti	&	Antoine	SD
Questions	???
deltaspike.apache.org/

More Related Content

What's hot

Agile - Iteration 0 CodeMash 2010
Agile - Iteration 0 CodeMash 2010Agile - Iteration 0 CodeMash 2010
Agile - Iteration 0 CodeMash 2010
kensipe
 

What's hot (20)

CDI In Real Life
CDI In Real LifeCDI In Real Life
CDI In Real Life
 
New York Kubernetes: CI/CD Patterns for Kubernetes
New York Kubernetes: CI/CD Patterns for KubernetesNew York Kubernetes: CI/CD Patterns for Kubernetes
New York Kubernetes: CI/CD Patterns for Kubernetes
 
Modules in Java? Finally! (OpenJDK 9 Jigsaw, JSR376)
Modules in Java? Finally! (OpenJDK 9 Jigsaw, JSR376)Modules in Java? Finally! (OpenJDK 9 Jigsaw, JSR376)
Modules in Java? Finally! (OpenJDK 9 Jigsaw, JSR376)
 
Let your tests drive your code
Let your tests drive your codeLet your tests drive your code
Let your tests drive your code
 
Scala on androids
Scala on androidsScala on androids
Scala on androids
 
Continuous deployment 2.0
Continuous deployment 2.0Continuous deployment 2.0
Continuous deployment 2.0
 
OSGi, Eclipse and API Tooling
OSGi, Eclipse and API ToolingOSGi, Eclipse and API Tooling
OSGi, Eclipse and API Tooling
 
AOTB2014: Agile Testing on the Java Platform
AOTB2014: Agile Testing on the Java PlatformAOTB2014: Agile Testing on the Java Platform
AOTB2014: Agile Testing on the Java Platform
 
App server4rpg - English
App server4rpg - EnglishApp server4rpg - English
App server4rpg - English
 
Ard gate - English
Ard gate - EnglishArd gate - English
Ard gate - English
 
Reverse engineering and instrumentation of android apps
Reverse engineering and instrumentation of android appsReverse engineering and instrumentation of android apps
Reverse engineering and instrumentation of android apps
 
Git Tutorial | Git Basics - Branching, Merging, Rebasing | Learn Git | DevOps...
Git Tutorial | Git Basics - Branching, Merging, Rebasing | Learn Git | DevOps...Git Tutorial | Git Basics - Branching, Merging, Rebasing | Learn Git | DevOps...
Git Tutorial | Git Basics - Branching, Merging, Rebasing | Learn Git | DevOps...
 
Lean and Kanban Principles for Software Developers
Lean and Kanban Principles for Software DevelopersLean and Kanban Principles for Software Developers
Lean and Kanban Principles for Software Developers
 
Test Engineering on Mobage
Test Engineering on MobageTest Engineering on Mobage
Test Engineering on Mobage
 
Steelcon 2015 Reverse-Engineering Obfuscated Android Applications
Steelcon 2015 Reverse-Engineering Obfuscated Android ApplicationsSteelcon 2015 Reverse-Engineering Obfuscated Android Applications
Steelcon 2015 Reverse-Engineering Obfuscated Android Applications
 
Android talks #08 dagger2
Android talks #08   dagger2Android talks #08   dagger2
Android talks #08 dagger2
 
不只自動化而且更敏捷的Android開發工具 gradle
不只自動化而且更敏捷的Android開發工具 gradle不只自動化而且更敏捷的Android開發工具 gradle
不只自動化而且更敏捷的Android開發工具 gradle
 
Agile - Iteration 0 CodeMash 2010
Agile - Iteration 0 CodeMash 2010Agile - Iteration 0 CodeMash 2010
Agile - Iteration 0 CodeMash 2010
 
Common primitives in Docker environments
Common primitives in Docker environmentsCommon primitives in Docker environments
Common primitives in Docker environments
 
JavaEE & GlassFish UG - Digital JavaEE 7 New & Noteworthy by P.Pilgrim
JavaEE & GlassFish UG - Digital JavaEE 7 New & Noteworthy by P.PilgrimJavaEE & GlassFish UG - Digital JavaEE 7 New & Noteworthy by P.Pilgrim
JavaEE & GlassFish UG - Digital JavaEE 7 New & Noteworthy by P.Pilgrim
 

Viewers also liked

Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014
Antoine Sabot-Durand
 

Viewers also liked (13)

Invoke dynamite in Java EE with invoke dynamic
Invoke dynamite in Java EE with invoke dynamicInvoke dynamite in Java EE with invoke dynamic
Invoke dynamite in Java EE with invoke dynamic
 
Fais ce que tu veux avec Java EE - Devoxx France 2014
Fais ce que tu veux avec Java EE - Devoxx France 2014Fais ce que tu veux avec Java EE - Devoxx France 2014
Fais ce que tu veux avec Java EE - Devoxx France 2014
 
Going further with CDI 1.2
Going further with CDI 1.2Going further with CDI 1.2
Going further with CDI 1.2
 
Apache DeltaSpike the CDI toolbox
Apache DeltaSpike the CDI toolboxApache DeltaSpike the CDI toolbox
Apache DeltaSpike the CDI toolbox
 
Mute Java EE DNA with CDI
Mute Java EE DNA with CDI Mute Java EE DNA with CDI
Mute Java EE DNA with CDI
 
Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014
 
Java EE, un ami qui vous veut du bien
Java EE, un ami qui vous veut du bienJava EE, un ami qui vous veut du bien
Java EE, un ami qui vous veut du bien
 
The Magnificent java EE 7 in Wildfly-O-Rama
The Magnificent java EE 7 in Wildfly-O-RamaThe Magnificent java EE 7 in Wildfly-O-Rama
The Magnificent java EE 7 in Wildfly-O-Rama
 
Devoxx Java Social and Agorava
Devoxx Java Social and AgoravaDevoxx Java Social and Agorava
Devoxx Java Social and Agorava
 
Architecting Large Enterprise Projects @DevConf.CZ
Architecting Large Enterprise Projects @DevConf.CZArchitecting Large Enterprise Projects @DevConf.CZ
Architecting Large Enterprise Projects @DevConf.CZ
 
Kids computer-programming
Kids computer-programmingKids computer-programming
Kids computer-programming
 
Java 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelizationJava 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelization
 
CDI mis en pratique avec Seam Social et Weld OSGI
CDI mis en pratique avec Seam Social et Weld OSGICDI mis en pratique avec Seam Social et Weld OSGI
CDI mis en pratique avec Seam Social et Weld OSGI
 

Similar to Apache Deltaspike the CDI Toolbox (Java One 2015)

IBM Cloud Bordeaux Meetup - 20190325 - Software Factory
IBM Cloud Bordeaux Meetup - 20190325 - Software FactoryIBM Cloud Bordeaux Meetup - 20190325 - Software Factory
IBM Cloud Bordeaux Meetup - 20190325 - Software Factory
IBM France Lab
 
Github for Serious Business Professional
Github for Serious Business ProfessionalGithub for Serious Business Professional
Github for Serious Business Professional
zwheller
 
Zend_Tool: Rapid Application Development with Zend Framework
Zend_Tool: Rapid Application Development with Zend FrameworkZend_Tool: Rapid Application Development with Zend Framework
Zend_Tool: Rapid Application Development with Zend Framework
Ralph Schindler
 

Similar to Apache Deltaspike the CDI Toolbox (Java One 2015) (20)

Beyond QA
Beyond QABeyond QA
Beyond QA
 
State of the Union by Dan Bode Puppet Labs
State of the Union by Dan Bode Puppet LabsState of the Union by Dan Bode Puppet Labs
State of the Union by Dan Bode Puppet Labs
 
Dev Ops for systems of record - Talk at Agile Australia 2015
Dev Ops for systems of record - Talk at Agile Australia 2015Dev Ops for systems of record - Talk at Agile Australia 2015
Dev Ops for systems of record - Talk at Agile Australia 2015
 
Dist::Zilla - A very brief introduction
Dist::Zilla - A very brief introductionDist::Zilla - A very brief introduction
Dist::Zilla - A very brief introduction
 
IBM Cloud Bordeaux Meetup - 20190325 - Software Factory
IBM Cloud Bordeaux Meetup - 20190325 - Software FactoryIBM Cloud Bordeaux Meetup - 20190325 - Software Factory
IBM Cloud Bordeaux Meetup - 20190325 - Software Factory
 
apidays LIVE London 2021 - Rethink API Troubleshooting to Deliver Value by Sa...
apidays LIVE London 2021 - Rethink API Troubleshooting to Deliver Value by Sa...apidays LIVE London 2021 - Rethink API Troubleshooting to Deliver Value by Sa...
apidays LIVE London 2021 - Rethink API Troubleshooting to Deliver Value by Sa...
 
Devops is (not ) a buzzword
Devops is (not ) a buzzwordDevops is (not ) a buzzword
Devops is (not ) a buzzword
 
Agile android
Agile androidAgile android
Agile android
 
Continuous Integration for Spark Apps by Sean McIntyre
Continuous Integration for Spark Apps by Sean McIntyreContinuous Integration for Spark Apps by Sean McIntyre
Continuous Integration for Spark Apps by Sean McIntyre
 
OpenAPI at Scale
OpenAPI at ScaleOpenAPI at Scale
OpenAPI at Scale
 
Github for Serious Business Professional
Github for Serious Business ProfessionalGithub for Serious Business Professional
Github for Serious Business Professional
 
Git workflows á la-carte, Presenation at jdays2013 www.jdays.se by Nicola Pao...
Git workflows á la-carte, Presenation at jdays2013 www.jdays.se by Nicola Pao...Git workflows á la-carte, Presenation at jdays2013 www.jdays.se by Nicola Pao...
Git workflows á la-carte, Presenation at jdays2013 www.jdays.se by Nicola Pao...
 
Open event (show&tell april 2016)
Open event (show&tell april 2016)Open event (show&tell april 2016)
Open event (show&tell april 2016)
 
PuppetConf 2014 Killer R10K Workflow With Notes
PuppetConf 2014 Killer R10K Workflow With NotesPuppetConf 2014 Killer R10K Workflow With Notes
PuppetConf 2014 Killer R10K Workflow With Notes
 
Git workflows (Basics)
Git workflows (Basics)Git workflows (Basics)
Git workflows (Basics)
 
OSDC 2019 | Feature Branching considered Evil by Thierry de Pauw
OSDC 2019 | Feature Branching considered Evil by Thierry de PauwOSDC 2019 | Feature Branching considered Evil by Thierry de Pauw
OSDC 2019 | Feature Branching considered Evil by Thierry de Pauw
 
Drupal Café October 2014: DrupalCon Amsterdam
Drupal Café October 2014: DrupalCon AmsterdamDrupal Café October 2014: DrupalCon Amsterdam
Drupal Café October 2014: DrupalCon Amsterdam
 
Zend_Tool: Rapid Application Development with Zend Framework
Zend_Tool: Rapid Application Development with Zend FrameworkZend_Tool: Rapid Application Development with Zend Framework
Zend_Tool: Rapid Application Development with Zend Framework
 
PL/SQL All the Things in Oracle SQL Developer
PL/SQL All the Things in Oracle SQL DeveloperPL/SQL All the Things in Oracle SQL Developer
PL/SQL All the Things in Oracle SQL Developer
 
Meetups - The Oracle Ace Way
Meetups - The Oracle Ace WayMeetups - The Oracle Ace Way
Meetups - The Oracle Ace Way
 

Recently uploaded

Recently uploaded (20)

WSO2CON 2024 - Architecting AI in the Enterprise: APIs and Applications
WSO2CON 2024 - Architecting AI in the Enterprise: APIs and ApplicationsWSO2CON 2024 - Architecting AI in the Enterprise: APIs and Applications
WSO2CON 2024 - Architecting AI in the Enterprise: APIs and Applications
 
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
 
WSO2CON 2024 - OSU & WSO2: A Decade Journey in Integration & Innovation
WSO2CON 2024 - OSU & WSO2: A Decade Journey in Integration & InnovationWSO2CON 2024 - OSU & WSO2: A Decade Journey in Integration & Innovation
WSO2CON 2024 - OSU & WSO2: A Decade Journey in Integration & Innovation
 
WSO2CON2024 - Why Should You Consider Ballerina for Your Next Integration
WSO2CON2024 - Why Should You Consider Ballerina for Your Next IntegrationWSO2CON2024 - Why Should You Consider Ballerina for Your Next Integration
WSO2CON2024 - Why Should You Consider Ballerina for Your Next Integration
 
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
 
%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
 
WSO2Con2024 - Organization Management: The Revolution in B2B CIAM
WSO2Con2024 - Organization Management: The Revolution in B2B CIAMWSO2Con2024 - Organization Management: The Revolution in B2B CIAM
WSO2Con2024 - Organization Management: The Revolution in B2B CIAM
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
Evolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI EraEvolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI Era
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
WSO2CON 2024 - Unlocking the Identity: Embracing CIAM 2.0 for a Competitive A...
WSO2CON 2024 - Unlocking the Identity: Embracing CIAM 2.0 for a Competitive A...WSO2CON 2024 - Unlocking the Identity: Embracing CIAM 2.0 for a Competitive A...
WSO2CON 2024 - Unlocking the Identity: Embracing CIAM 2.0 for a Competitive A...
 
WSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AIWSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AI
 
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?
 
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public AdministrationWSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
 
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
 
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...
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
 
WSO2CON 2024 - Software Engineering for Digital Businesses
WSO2CON 2024 - Software Engineering for Digital BusinessesWSO2CON 2024 - Software Engineering for Digital Businesses
WSO2CON 2024 - Software Engineering for Digital Businesses
 

Apache Deltaspike the CDI Toolbox (Java One 2015)