SlideShare una empresa de Scribd logo
1 de 57
Descargar para leer sin conexión
DataFXThe best way to get real-world data
into your JavaFX application
The Mission
In this session, you'll learn how to develop
Enterprise Applications in JavaFX with
Real-World Services and Data.
We will show how the DataFX framework
facilitates the process of data retrieval and
rendering, and how it allows you to focus
on your application-specific logic.
About us
Hendrik Ebbers
@hendrikEbbers
www.guigarage.com.
.
Johan Vos
@johanvos
www.lodgon.com.
.
Overview
Overview
DataSources Websocket
Cells
Flow
Use DataFX
Use DataFX
JSF View
Browser Desktop Client
Business Layer
O
r
m
aybe
m
obile...
Server
Persistence
REST
Concurrency
Concurrency API
JavaFX is a single threaded toolkit
You should not block the platform thread
Rest calls may take some time...
...and could freeze the application
Do not do this at home!
DataFX Executor
Executor executor = new ObservableExecutor();
ListView<Service<?>> list = new ListView<>();
list.setCellFactory(new ServiceCellFactory());
list.itemsProperty().
bind(executor.currentServicesProperty());
implementation ofjava.util.concurrent.Executor
bind your services to the view
DataFX Executor
supports title, message and progress for
each service
supports Runnable, Callable, Service &
Task
cancel services on the gui
Let‘s wait
void ConcurrentUtils.runAndWait(Runnable runnable)
T ConcurrentUtils.runAndWait(Callable<T> callable)
like SwingUtilities.invokeAndWait(...)
we will collect all
concurrent helper
methods here
Lambda Support
JDK 8 has Lambda and the awesome
Stream API
Map and reduce your collections in
parallel
But how to turn into the JavaFX
application thread?
Lambda Support
StreamFX<T> streamFX = new StreamFX<>(myStream);
it is a wrapper
ObservableList<T> list = ...;
streamFX.publish(list);
streamFX.forEachOrdered(final
Consumer<ObjectProperty<? super T>> action)
this will happen in the
application thread
DataSources
DataSources
Obtain data from a variety of sources, in a
variety of formats and put the data in a
JavaFX Observable or ObservableList
Object.
Goal:
Variety of sources -> the DataReader abstracts this
Variety of formats -> the Converter abstracts this
*
*
1
11
*
11
*
1
DataSources
Data
Observable /
ObservableList
DataFX
DataProvider
DataReader
Converter
DataReader
interface DataReader<T> {
T get();
boolean next();
}
Easy to
implement!
RestSource
FileSource
JDCBSource We provide this implementations
- with builder API -
RestReader
RestSource restSource = new RestSource();
restSource.setHost(“myhost”);
RestSource.setConverter(...);
restSource.setPath("user/" + uid);
restSource.setConsumerKey(“mykey”);
restSource.setConsumerSecret(“mysecret”);
RestSourceBuilder.create().host(“myhost”)
.converter(...).path(“user”).path(uid)
.consumerKey(“myKey”).consumerSecret(“mysecret”)
.build()
-or-
Data conversion
DataReader<T> has to provide data as an
object of type T
Converter<U,T> consumes input as U,
and provides data as T
Converter
interface Converter<T,U> {
public void initialize(T input);
public U get();
public boolean next();
}
create your
custom one
JSONConverter<T> implements
Converter<InputStream, T>
RestSource reads an InputStream, and
will ask Converter to deliver instance(s) of T
DataProvider
DataProviders populate JavaFX
Observable and ObservableList instances
Data is added/changed on the JavaFX
Application Thread only
Retrieval is done in a background thread,
managable via an ExecutorPool
DataProvider
API distinction between
ObjectDataProvider and ListDataProvider
Builders are provided:
ObjectDataProviderBuilder
ListDataProviderBuilder
Usage
ObservableValue<T> dataProvider.getData();
Worker<T> dataProvider.retrieve().getValue();
DataProvider.setResultObjectProperty(o);
different patterns for
different developers
How to populate Observable o with the
retrieved value via DataProvider<T>
dataProvider?
or
or
DataProvider
DataProviders leverage the Observable
capabilities: content is added when it is
available
ListDataProvider will add entities to the
resulting ObservableList as long as input
can be read from the DataReader
DataProvider
Binding the ObservableList in a ListView
will cause the ListView to be populated
gradually
This can be leveraged in your application
logic, i.e. First retrieve the most recent or
important items
Writeback support
Starting in DataFX 2.0, it is possible to
make changes to retrieved data, and
send those changes back to the original
datasource
UI
Observable
external Data DataFX
Challenges
We don't want to write-back all changes
In many cases, write-back is more
complex than read, and not symmetrical
i.e. Authentication
needed, different
granularity
Writeback support
only one additional
class that handles
the writeback...
ObjectDataProvider.setWriteBackHandler(WriteBackHandler h);
ListDataDataProvider.setAddEntryHandler(WriteBackHandler h);
...and you only need
to implement one
method
Example
DataReader<Person> dr = new JdbcSource(....);
ListDataProvider<Person> lodp = new ListDataProvider(dr);
ObservableList<Person> myList = ...;
lodp.setResultObservableList(myList);
lodp.setWriteBackHandler(new WriteBackHandler<Person>() {...});
ok, this is the part
we already know
adding writeback support
Example
lodp.setWriteBackHandler(new WriteBackHandler<Person>() {
@Override
public WritableDataReader createDataSource(Person me) {
String statement = "UPDATE PERSON SET lastName='" +
me.getLastName() + "' WHERE firstName='" +
me.getFirstName() + "'";
JdbcSource<Person> dr = new JdbcSource(dbURL, statement,
null);
dr.setUpdateQuery(true);
return dr;
}
}); simple implementation of jdbc
writeback support
Writeback support
RestSource and JDBCSource already
implement WritableDataReader
Threading is dealt with by DataReader
implementations
Support of transient field by using
@WriteTransient
Controller API
JAVAFX API
In JavaFX you should use FXML to
define your views
You can define a controller for the view
Link from (FXML-) view to the controller
<HBox fx:controller="com.guigarage.MyController">
    <TextField fx:id="myTextfield"/>
    <Button fx:id="backButton" text="back"/>
</HBox>
Controller API
Some kind of inversion of control
Define the FXML in your controller class
Create a view by using the controller class
Supports more annotations for the view
livecycle
convention over configuration
Controller API
@FXMLController("Details.fxml")
public class DetailViewController {
  
        @FXML
        private TextField myTextfield;
  
        @FXML
        private Button backButton;
  
  
        @PostConstruct
        public void init() {
            myTextfield.setText("Hello!");
        }
}
define the
FXML file
default Java
annotation
Controller API
<?xml version="1.0" encoding="UTF-8"?>
  
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
  
<HBox spacing="10" alignment="bottom_right">
    <TextField fx:id="myTextfield"/>
    <Button fx:id="backButton" text="back"/>
</HBox>
use JavaFX Scene Builder!
no controller
class is set in
FXML
Controller API
Provides a factory for view creation
Inject all needed Nodes with @FXML
Supports @PostConstruct
View Context
Controller API support 2 contexts
ApplicationContext
View Context
Inject context by using Annotation
Register your model to the context
View Context
public class DetailViewController {
  
  @FXML
  private TextField myTextfield;
  
@FXMLViewContext
private ViewContext<DetailViewController> context;
  
  @PostConstruct
  public void init() {
DataModel model = context.getViewFlowContext().
getRegisteredObject(DataModel.class);
myTextfield.textProperty().
bindBidirectional(model.getSelected());
  }
}
injection
access
registered
objects
Conclusion
Create view with FXML
Define your model as pojo
Create a controller
bind all this by using annotations
Flow API
Flow API
Controller API is good for one view
How to link different view?
Flow API
open
View View
View
View
View
View
searc
h
details
open
diagram
setting
*
Master Detail
two views: master and detail
use FXML
switch from one view to the other one
delete data on user action
decoupling all this stuff!!
Master Detail
MasterView DetailsView
back
details
delete
Master Detail
MasterView DetailsView
back
details
FXML Controller FXML Controller
delete
Master Detail
FXMLFlowView masterView =
FXMLFlowView.create(MasterViewController.class);
FXMLFlowView detailView =
FXMLFlowView.create(DetailViewController.class);
create one FLowView for each view
use controller API internally
MasterView DetailsView
back
details
delete
Master Detail
detailView.withChangeViewAction("back",
masterView);
direct link between the views
action name
MasterView DetailsView
back
details
delete
Master Detail
masterView.withRunAction("delete",
DeleteAction.class);
define a custom action
action name
delete
MasterView DetailsView
back
details
delete
Master Detail
Use controller API for all views
Define a FlowView for each view
link with by adding an action
add custom actions to your flow
but how can I use them?
Master Detail
@FXMLController("Details.fxml")
public class DetailViewController {
@FXML
@FlowAction("back")
private Button backButton;
@PostConstruct
public void init() {
//...
}
@PreDestroy
public void destroy() {
//...
}
}
controller API
defined
in FXML
bind your flow
actions by annotation
listen to the
flow
Flow API
share your data model by using contexts
ViewFlowContext added
@FXMLViewFlowContext
private ViewFlowContext context;
You can inject contexts in your
action classes, too
@PostConstruct and @PreDestroy are
covered by the view livecycle
Flow API
By using the flow API you don‘t have
dependencies between the views
Reuse views and actions
Use annotations for configuration
more stuff
Websocket API
Cell API
FileSource
www.javafxdata.org
https://bitbucket.org/datafx/datafx
https://bitbucket.org/datafx/javafxcommunity
QA

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

JavaOne - The JavaFX Community and Ecosystem
JavaOne - The JavaFX Community and EcosystemJavaOne - The JavaFX Community and Ecosystem
JavaOne - The JavaFX Community and Ecosystem
 
Intoduction to Play Framework
Intoduction to Play FrameworkIntoduction to Play Framework
Intoduction to Play Framework
 
Jetpack, with new features in 2021 GDG Georgetown IO Extended
Jetpack, with new features in 2021 GDG Georgetown IO ExtendedJetpack, with new features in 2021 GDG Georgetown IO Extended
Jetpack, with new features in 2021 GDG Georgetown IO Extended
 
Spring 4 Web App
Spring 4 Web AppSpring 4 Web App
Spring 4 Web App
 
Seven Versions of One Web Application
Seven Versions of One Web ApplicationSeven Versions of One Web Application
Seven Versions of One Web Application
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOP
 
Jdbc Complete Notes by Java Training Center (Som Sir)
Jdbc Complete Notes by Java Training Center (Som Sir)Jdbc Complete Notes by Java Training Center (Som Sir)
Jdbc Complete Notes by Java Training Center (Som Sir)
 
Java EE 8 Web Frameworks: A Look at JSF vs MVC
Java EE 8 Web Frameworks: A Look at JSF vs MVCJava EE 8 Web Frameworks: A Look at JSF vs MVC
Java EE 8 Web Frameworks: A Look at JSF vs MVC
 
Lecture 3: Servlets - Session Management
Lecture 3:  Servlets - Session ManagementLecture 3:  Servlets - Session Management
Lecture 3: Servlets - Session Management
 
Java Enterprise Edition
Java Enterprise EditionJava Enterprise Edition
Java Enterprise Edition
 
Using the Tooling API to Generate Apex SOAP Web Service Clients
Using the Tooling API to Generate Apex SOAP Web Service ClientsUsing the Tooling API to Generate Apex SOAP Web Service Clients
Using the Tooling API to Generate Apex SOAP Web Service Clients
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Spring framework in depth
Spring framework in depthSpring framework in depth
Spring framework in depth
 
Java EE Introduction
Java EE IntroductionJava EE Introduction
Java EE Introduction
 
Next stop: Spring 4
Next stop: Spring 4Next stop: Spring 4
Next stop: Spring 4
 
Building an app with Google's new suites
Building an app with Google's new suitesBuilding an app with Google's new suites
Building an app with Google's new suites
 
Java EE 8 Recipes
Java EE 8 RecipesJava EE 8 Recipes
Java EE 8 Recipes
 
Struts N E W
Struts N E WStruts N E W
Struts N E W
 
Spring MVC framework
Spring MVC frameworkSpring MVC framework
Spring MVC framework
 

Similar a DataFX - JavaOne 2013

Integration of Backbone.js with Spring 3.1
Integration of Backbone.js with Spring 3.1Integration of Backbone.js with Spring 3.1
Integration of Backbone.js with Spring 3.1
Michał Orman
 
Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5
Tuna Tore
 
springmvc-150923124312-lva1-app6892
springmvc-150923124312-lva1-app6892springmvc-150923124312-lva1-app6892
springmvc-150923124312-lva1-app6892
Tuna Tore
 
Introduction to jsf2
Introduction to jsf2Introduction to jsf2
Introduction to jsf2
Rajiv Gupta
 

Similar a DataFX - JavaOne 2013 (20)

Effective JavaFX architecture with FxObjects
Effective JavaFX architecture with FxObjectsEffective JavaFX architecture with FxObjects
Effective JavaFX architecture with FxObjects
 
Jdbc
JdbcJdbc
Jdbc
 
Advance Java Practical file
Advance Java Practical fileAdvance Java Practical file
Advance Java Practical file
 
Integration of Backbone.js with Spring 3.1
Integration of Backbone.js with Spring 3.1Integration of Backbone.js with Spring 3.1
Integration of Backbone.js with Spring 3.1
 
JavaFX for Business Application Developers
JavaFX for Business Application DevelopersJavaFX for Business Application Developers
JavaFX for Business Application Developers
 
Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5
 
springmvc-150923124312-lva1-app6892
springmvc-150923124312-lva1-app6892springmvc-150923124312-lva1-app6892
springmvc-150923124312-lva1-app6892
 
Introduction to jsf2
Introduction to jsf2Introduction to jsf2
Introduction to jsf2
 
Servlets
ServletsServlets
Servlets
 
struts
strutsstruts
struts
 
JEE5 New Features
JEE5 New FeaturesJEE5 New Features
JEE5 New Features
 
EJB 3.0 Java Persistence with Oracle TopLink
EJB 3.0 Java Persistence with Oracle TopLinkEJB 3.0 Java Persistence with Oracle TopLink
EJB 3.0 Java Persistence with Oracle TopLink
 
Refreshing mule cache using oracle database change notification
Refreshing mule cache using oracle database change notificationRefreshing mule cache using oracle database change notification
Refreshing mule cache using oracle database change notification
 
Asp.net mvc
Asp.net mvcAsp.net mvc
Asp.net mvc
 
Liferay (DXP) 7 Tech Meetup for Developers
Liferay (DXP) 7 Tech Meetup for DevelopersLiferay (DXP) 7 Tech Meetup for Developers
Liferay (DXP) 7 Tech Meetup for Developers
 
Practical OData
Practical ODataPractical OData
Practical OData
 
Java J2EE Interview Question Part 2
Java J2EE Interview Question Part 2Java J2EE Interview Question Part 2
Java J2EE Interview Question Part 2
 
Java J2EE Interview Questions Part 2
Java J2EE Interview Questions Part 2Java J2EE Interview Questions Part 2
Java J2EE Interview Questions Part 2
 
vJUG - The JavaFX Ecosystem
vJUG - The JavaFX EcosystemvJUG - The JavaFX Ecosystem
vJUG - The JavaFX Ecosystem
 
Data access
Data accessData access
Data access
 

Más de Hendrik Ebbers

Vagrant Binding JayDay 2013
Vagrant Binding JayDay 2013Vagrant Binding JayDay 2013
Vagrant Binding JayDay 2013
Hendrik Ebbers
 
Vagrant-Binding JUG Dortmund
Vagrant-Binding JUG DortmundVagrant-Binding JUG Dortmund
Vagrant-Binding JUG Dortmund
Hendrik Ebbers
 
Lightweight and reproducible environments with vagrant and Puppet
Lightweight and reproducible environments with vagrant and PuppetLightweight and reproducible environments with vagrant and Puppet
Lightweight and reproducible environments with vagrant and Puppet
Hendrik Ebbers
 

Más de Hendrik Ebbers (20)

Java Desktop 2019
Java Desktop 2019Java Desktop 2019
Java Desktop 2019
 
Java APIs- The missing manual (concurrency)
Java APIs- The missing manual (concurrency)Java APIs- The missing manual (concurrency)
Java APIs- The missing manual (concurrency)
 
Beauty & the Beast - Java VS TypeScript
Beauty & the Beast - Java VS TypeScriptBeauty & the Beast - Java VS TypeScript
Beauty & the Beast - Java VS TypeScript
 
Java 11 OMG
Java 11 OMGJava 11 OMG
Java 11 OMG
 
Java APIs - the missing manual
Java APIs - the missing manualJava APIs - the missing manual
Java APIs - the missing manual
 
Multidevice Controls: A Different Approach to UX
Multidevice Controls: A Different Approach to UXMultidevice Controls: A Different Approach to UX
Multidevice Controls: A Different Approach to UX
 
Java WebStart Is Dead: What Should We Do Now?
Java WebStart Is Dead: What Should We Do Now?Java WebStart Is Dead: What Should We Do Now?
Java WebStart Is Dead: What Should We Do Now?
 
Java ap is you should know
Java ap is you should knowJava ap is you should know
Java ap is you should know
 
JavaFX JumpStart @JavaOne 2016
JavaFX JumpStart @JavaOne 2016JavaFX JumpStart @JavaOne 2016
JavaFX JumpStart @JavaOne 2016
 
BUILDING MODERN WEB UIS WITH WEB COMPONENTS @ Devoxx
BUILDING MODERN WEB UIS WITH WEB COMPONENTS @ DevoxxBUILDING MODERN WEB UIS WITH WEB COMPONENTS @ Devoxx
BUILDING MODERN WEB UIS WITH WEB COMPONENTS @ Devoxx
 
Web Components & Polymer 1.0 (Webinale Berlin)
Web Components & Polymer 1.0 (Webinale Berlin)Web Components & Polymer 1.0 (Webinale Berlin)
Web Components & Polymer 1.0 (Webinale Berlin)
 
Test Driven Development with JavaFX
Test Driven Development with JavaFXTest Driven Development with JavaFX
Test Driven Development with JavaFX
 
Feature driven development
Feature driven developmentFeature driven development
Feature driven development
 
Extreme Gui Makeover
Extreme Gui MakeoverExtreme Gui Makeover
Extreme Gui Makeover
 
JavaFX Enterprise
JavaFX EnterpriseJavaFX Enterprise
JavaFX Enterprise
 
Bonjour for Java
Bonjour for JavaBonjour for Java
Bonjour for Java
 
Vagrant Binding JayDay 2013
Vagrant Binding JayDay 2013Vagrant Binding JayDay 2013
Vagrant Binding JayDay 2013
 
Devoxx UK 2013: Sandboxing with the Vagrant-Binding API
Devoxx UK 2013: Sandboxing with the Vagrant-Binding APIDevoxx UK 2013: Sandboxing with the Vagrant-Binding API
Devoxx UK 2013: Sandboxing with the Vagrant-Binding API
 
Vagrant-Binding JUG Dortmund
Vagrant-Binding JUG DortmundVagrant-Binding JUG Dortmund
Vagrant-Binding JUG Dortmund
 
Lightweight and reproducible environments with vagrant and Puppet
Lightweight and reproducible environments with vagrant and PuppetLightweight and reproducible environments with vagrant and Puppet
Lightweight and reproducible environments with vagrant and Puppet
 

Último

Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Último (20)

Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 

DataFX - JavaOne 2013