SlideShare a Scribd company logo
SeedStack tour
Adrien LAUER
Outline
Overview of the full stack
Java framework
Business framework
Web framework
Frontend/backend integration
Tooling
OVERVIEW OF THE FULL STACK
What is SeedStack?
A full-stack development solution
– Java backend
– Web frontend
A scalable architecture for enterprise software
An extensible ecosystem of add-ons
General architecture
Java framework Web framework
Add-on
1
Business framework
Add-on
4
Add-on
2
Add-on
3
Add-on
5
Add-on
6
Add-on
7
 REST APIs
Application backend
 REST APIs
Application frontend
Modularity
Modularity at every level of the stack
– Clear separation of APIs from impl.
– One module per concern
– Powerful extension mechanisms (plugins,
fragments, API/SPI)
Automatic integration of modules
– Auto-discovery
– Every module just works without effort
Distribution
Global packaging of all modules
Archetypes for quick project creation
Each organization can roll its own custom distribution
16.4 16.7 16.11
Add-ons
Persistence: JDBC, JPA, MongoDB, Redis, Neo4J, Solr,
ElasticSearch
Communication: JMS, Web-Services, JavaMail, MQTT
Bridges: W20 bridge, Spring bridge
Features: dynamic i18n, batch monitoring,
import/export, audit, validation, cache, scheduling
UI themes: simple, business, material
JAVA FRAMEWORK
Core
Java framework modules
Kernel
Lifecycle LoggingConfiguration Diagnostic
Commands Bindings
Web CLI Testing
Transactions Security REST
Metrics
Services
Kernel + plugin architecture
A concern per plugin
Each plugin is responsible for:
1. Submitting classpath scan requests to the kernel
2. Providing initialization, startup and shutdown code
3. Building a Guice module
The kernel orchestrates all plugins:
– Resolve dependencies between plugins
– Invoke init, startup and shutdown code
Sample plugin
public class MyPlugin extends AbstractPlugin {
private final Set<Class<?>> annotatedClasses = new HashSet<>();
@Override
public String name() {
return "my-plugin";
}
@Override
public Collection<ClasspathScanRequest> classpathScanRequests() {
return classpathScanRequestBuilder().annotationType(Service.class).build();
}
@Override
public InitState init(InitContext initContext) {
annotatedClasses.addAll(
initContext.scannedClassesByAnnotationClass().get(Service.class)
);
return InitState.INITIALIZED;
}
@Override
public Object nativeUnitModule() {
return (Module) binder -> annotatedClasses.forEach(binder::bind);
}
}



Dependency injection
Each plugin provides a Guice module
– Define injection bindings
– Is dynamically created by the plugin
All modules are aggregated and used to produce
a global injector
Only javax.inject API is used in application code
Modular configuration
Configuration files go in META-INF/configuration
– They are scanned upon startup
– They are merged into one unique configuration
Configuration values can be accessed from
anywhere in the application
Feature-rich: profiles, macros, environment
variables, system properties, override, converters,
…
Sample configuration
[org.seedstack]
jdbc.datasources = main-datasource
jpa.units = my-unit
[org.seedstack.seed]
core.application-id = my-app
core.application-name = My application
server.port<heroku> = ${env:PORT}
[org.seedstack.jdbc.datasource.main-datasource]
driver = org.hsqldb.jdbcDriver
url = jdbc:hsqldb:mem:store
[org.seedstack.jpa.unit.my-unit]
datasource = main-datasource
property.hibernate.dialect = org.hibernate.dialect.HSQLDialect
property.hibernate.hbm2ddl.auto = update
[org.seedstack.samples.myapp.domain.*]
jpa-unit = my-unit
Exceptions and diagnostic
Readable, content-rich technical exceptions:
– Templatable message and fix advice
– Concise list of causes
– Online reference if relevant
When an unexpected exception occurs:
– Extensive diagnostic info is collected
– A JSON diagnostic report is dumped to the filesystem if possible
Custom diagnostic collectors and reporters can be plugged in
Great support tool
Sample exception trace
org.seedstack.seed.SeedException: (CORE) Unexpected exception
Causes
------
1. java.lang.RuntimeException: (JPA) No persisted classes in unit
2. (JPA) No classes were found belonging to JPA unit "my-unit".
Fix
---
Verify that the classes are correctly scanned and they are configured to belong to the
JPA unit "my-unit".
Online information
------------------
http://seedstack.org/addons/jpa#configuration
Stacktrace
----------
...
Security
Based on Apache Shiro
Modular permission-based security model
Built-in and pluggable security realms:
– Static configuration
– LDAP
– X509 certificate
Fine-grained data obfuscation
REST
JAX-RS 2.0 through Jersey 2
Hypermedia capable:
– JSON-HOME for discovering entry resources
– Registry of rels
– Builder of HAL representations and links
Swagger generator via add-on
More…
Fully injectable Servlet and Filters
WebSockets
Command-line parsing
Transactions
Metrics collection and reporting
Applicative SSH shell
Benefits
Lays ground for software componentization at
the enterprise scale:
– Provides and promotes modularity
– Enables quick integration of components without
effort
Solves common technical challenges once for
the whole organization
BUSINESS FRAMEWORK
Building blocks
Levels of abstraction
Annotations
Interfaces
Base classes
Low framework coupling
Low dev speed
High framework coupling
High dev speed
Entities
public class Customer extends BaseEntity<String> {
private String email;
private Address address;
public Customer (String email) {
this.email = email;
}
@Override
public String getEntityId() {
return this.email;
}
// … more
}
Value Objects
public class Address extends BaseValueObject {
private final String street;
private final String city;
private final ZipCode zipCode;
public Address(String street, String city, ZipCode zipCode) {
this.street = street;
this.city = city;
this.zipCode = zipCode;
}
// … more
}
Aggregates
public class Order extends BaseAggregateRoot<OrderId> {
private OrderId orderId;
private Date checkoutDate;
private double totalPrice;
public Order(OrderId orderId) {
this.orderId = orderId;
}
@Override
public OrderId getEntityId() {
return this.orderId ;
}
// … more
}
Services
Define an interface:
@Service
public interface CheckoutService {
public Invoice checkout(Order order);
}
And one or more implementation(s):
@Named(“creditCard")
public class CreditCardCheckoutService implements CheckoutService {
@Override
public Invoice checkout(Order order) {
...
}
}
Qualifies implementation if there are multiple ones
Repositories
Basic repositories without effort:
@Inject @Jpa
private Repository<Customer, String> customerRepository;
Can be extended with custom methods:
public interface CustomerRepository extends GenericRepository<Customer, String> {
List<Customer> findByName(String firstName, String lastName);
}
@Jpa
public class CustomerJpaRepository extends BaseJpaRepository<Customer, String>
implements CustomerRepository {
@Override
public List<Customer> findByName (String firstName, String lastName) {
...
}
}
Also available with other technologies
Qualifies implementation if there are multiple ones
Factories
Constructor-based factories without effort:
@Inject
private Factory<Customer> customerFactory;
Can be extended with custom methods:
public interface CustomerFactory extends GenericFactory<Customer> {
Customer createCustomer(String email, String firstName, String lastName);
}
public class CustomerFactoryImpl extends BaseFactory<Customer>
implements CustomerFactory {
@Override
public Customer createCustomer(String email, String firstName, String lastName) {
...
}
}
Can be plugged in with identity generators (provided or custom)
More…
Domain policies
Domain events
DTO/Aggregate assembling
Finders and pagination
Benefits
Proven approach to produce quality and
maintainable software
Promotes software industry best-practices
Homogenize business code accross projects
Design for reuse
WEB FRAMEWORK
Loader + fragment architecture
Allows composability of Web frontends
Each fragment contains:
– A manifest describing its contents
– Static assets like modules, stylesheets, templates, …
The W20 loader aggregates all fragments and
orchestrate the initialization of the Single-Page
Application
Loading sequence
Sample fragment
{
"id": "my-fragment",
"name": "My awesome fragment",
"modules": {
"module1": "{my-fragment}/modules/module1"
},
"...": {
…
},
"...": {
…
}
}
Identity
1. Modules are loaded by the W20 loader first
2. Then each loaded module can process
fragment sections to further initialize the
application


Paths can be relative to the fragment manifest
Additional abitrary section

Sample configuration
{
"/path/to/my-fragment.w20.json": {
"modules": {
"module1": {
…
}
},
"vars": {
"var1": "value1"
}
}
}
Fragment manifest URL
Module configuration object
Define values of fragment manifest’s variables
Features
AngularJS integration
Culture and internationalization
Integration with backend security
Navigation and menu management
Hypermedia
Pluggable CSS frameworks
Theming
Simple theme
Material theme
Business theme
Benefits
Provides a component architecture for Web
frontends
Provides useful services for Web enterprise
applications (security, i18n, navigation …)
Provides theming support
Solves common technical challenges once for the
whole organization
FRONTEND/BACKEND BRIDGE
Features
Seamless Java/Web integration:
– Auto-detects W20 fragments in classpath
– Implements REST API required by frontend
– Dynamically generates the W20 configuration and the
masterpage
Can be extended through an SPI
Enables activation of a front/back feature simply by
adding a dependency
TOOLING
SeedStack tools
Maven plugin:
– Generate: generate projects from scratch
– Run: run a project from command-line
– Package: creates a runnable unique JAR
Yeoman generator for pure-frontend modules
Grunt plugin for bundling and minification
PROJECT
Open-Source
Business-friendly license: MPL 2.0
100% open-source:
– Core frameworks
– 25+ official add-ons
– Tools
– Documentation (CC BY-SA)
Can be extended with proprietary add-ons without
restriction
Community
http://seedstack.org
https://github.com/seedstack
@seedstack
http://stackoverflow.com/questions/tagged/seedstack
#seedstack on freenode

More Related Content

What's hot

Case Study: University of California, Berkeley and San Francisco
Case Study: University of California, Berkeley and San FranciscoCase Study: University of California, Berkeley and San Francisco
Case Study: University of California, Berkeley and San Francisco
ForgeRock
 
Essential Kit for Oracle JET Programming
Essential Kit for Oracle JET ProgrammingEssential Kit for Oracle JET Programming
Essential Kit for Oracle JET Programming
andrejusb
 
Introduction To Code Igniter
Introduction To Code IgniterIntroduction To Code Igniter
Introduction To Code Igniter
Amzad Hossain
 
High Performance Cloud Native APIs Using Apache Geode
High Performance Cloud Native APIs Using Apache Geode High Performance Cloud Native APIs Using Apache Geode
High Performance Cloud Native APIs Using Apache Geode
VMware Tanzu
 
Gradle 2.2, 2.3 news #jggug
Gradle 2.2, 2.3 news #jggugGradle 2.2, 2.3 news #jggug
Gradle 2.2, 2.3 news #jggug
kyon mm
 
JSF 2.3: Integration with Front-End Frameworks
JSF 2.3: Integration with Front-End FrameworksJSF 2.3: Integration with Front-End Frameworks
JSF 2.3: Integration with Front-End Frameworks
Ian Hlavats
 
Introduction to Spring Framework
Introduction to Spring FrameworkIntroduction to Spring Framework
Introduction to Spring Framework
Dineesha Suraweera
 
Struts Interview Questions
Struts Interview QuestionsStruts Interview Questions
Struts Interview Questions
jbashask
 
Web Application Frameworks - Lecture 05 - Web Information Systems (4011474FNR)
Web Application Frameworks - Lecture 05 - Web Information Systems (4011474FNR)Web Application Frameworks - Lecture 05 - Web Information Systems (4011474FNR)
Web Application Frameworks - Lecture 05 - Web Information Systems (4011474FNR)
Beat Signer
 
Spring Mvc
Spring MvcSpring Mvc
Spring Mvc
ifnu bima
 
PHP Frameworks & Introduction to CodeIgniter
PHP Frameworks & Introduction to CodeIgniterPHP Frameworks & Introduction to CodeIgniter
PHP Frameworks & Introduction to CodeIgniter
Jamshid Hashimi
 
WSO2 Gadget Server
WSO2 Gadget ServerWSO2 Gadget Server
WSO2 Gadget Server
WSO2
 
Top 10 web application development frameworks 2016
Top 10 web application development frameworks 2016Top 10 web application development frameworks 2016
Top 10 web application development frameworks 2016
iMOBDEV Technologies Pvt. Ltd.
 
Integrating SAP the Java EE Way - JBoss One Day talk 2012
Integrating SAP the Java EE Way - JBoss One Day talk 2012Integrating SAP the Java EE Way - JBoss One Day talk 2012
Integrating SAP the Java EE Way - JBoss One Day talk 2012
hwilming
 
Introducing Sitecore Habitat - SUGCON EU 2016
Introducing Sitecore Habitat - SUGCON EU 2016Introducing Sitecore Habitat - SUGCON EU 2016
Introducing Sitecore Habitat - SUGCON EU 2016
Ruud van Falier
 
JavaCro'14 - Consuming Java EE Backends in Desktop, Web, and Mobile Frontends...
JavaCro'14 - Consuming Java EE Backends in Desktop, Web, and Mobile Frontends...JavaCro'14 - Consuming Java EE Backends in Desktop, Web, and Mobile Frontends...
JavaCro'14 - Consuming Java EE Backends in Desktop, Web, and Mobile Frontends...
HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association
 
Oracle JET overview
Oracle JET overviewOracle JET overview
Oracle JET overview
Steven Davelaar
 
Best Practices for JSF, Gameduell 2013
Best Practices for JSF, Gameduell 2013Best Practices for JSF, Gameduell 2013
Best Practices for JSF, Gameduell 2013
Edward Burns
 
Spring Mvc,Java, Spring
Spring Mvc,Java, SpringSpring Mvc,Java, Spring
Spring Mvc,Java, Spring
ifnu bima
 
Liferay Configuration and Customization
Liferay Configuration and CustomizationLiferay Configuration and Customization
Liferay Configuration and Customization
Thành Nguyễn
 

What's hot (20)

Case Study: University of California, Berkeley and San Francisco
Case Study: University of California, Berkeley and San FranciscoCase Study: University of California, Berkeley and San Francisco
Case Study: University of California, Berkeley and San Francisco
 
Essential Kit for Oracle JET Programming
Essential Kit for Oracle JET ProgrammingEssential Kit for Oracle JET Programming
Essential Kit for Oracle JET Programming
 
Introduction To Code Igniter
Introduction To Code IgniterIntroduction To Code Igniter
Introduction To Code Igniter
 
High Performance Cloud Native APIs Using Apache Geode
High Performance Cloud Native APIs Using Apache Geode High Performance Cloud Native APIs Using Apache Geode
High Performance Cloud Native APIs Using Apache Geode
 
Gradle 2.2, 2.3 news #jggug
Gradle 2.2, 2.3 news #jggugGradle 2.2, 2.3 news #jggug
Gradle 2.2, 2.3 news #jggug
 
JSF 2.3: Integration with Front-End Frameworks
JSF 2.3: Integration with Front-End FrameworksJSF 2.3: Integration with Front-End Frameworks
JSF 2.3: Integration with Front-End Frameworks
 
Introduction to Spring Framework
Introduction to Spring FrameworkIntroduction to Spring Framework
Introduction to Spring Framework
 
Struts Interview Questions
Struts Interview QuestionsStruts Interview Questions
Struts Interview Questions
 
Web Application Frameworks - Lecture 05 - Web Information Systems (4011474FNR)
Web Application Frameworks - Lecture 05 - Web Information Systems (4011474FNR)Web Application Frameworks - Lecture 05 - Web Information Systems (4011474FNR)
Web Application Frameworks - Lecture 05 - Web Information Systems (4011474FNR)
 
Spring Mvc
Spring MvcSpring Mvc
Spring Mvc
 
PHP Frameworks & Introduction to CodeIgniter
PHP Frameworks & Introduction to CodeIgniterPHP Frameworks & Introduction to CodeIgniter
PHP Frameworks & Introduction to CodeIgniter
 
WSO2 Gadget Server
WSO2 Gadget ServerWSO2 Gadget Server
WSO2 Gadget Server
 
Top 10 web application development frameworks 2016
Top 10 web application development frameworks 2016Top 10 web application development frameworks 2016
Top 10 web application development frameworks 2016
 
Integrating SAP the Java EE Way - JBoss One Day talk 2012
Integrating SAP the Java EE Way - JBoss One Day talk 2012Integrating SAP the Java EE Way - JBoss One Day talk 2012
Integrating SAP the Java EE Way - JBoss One Day talk 2012
 
Introducing Sitecore Habitat - SUGCON EU 2016
Introducing Sitecore Habitat - SUGCON EU 2016Introducing Sitecore Habitat - SUGCON EU 2016
Introducing Sitecore Habitat - SUGCON EU 2016
 
JavaCro'14 - Consuming Java EE Backends in Desktop, Web, and Mobile Frontends...
JavaCro'14 - Consuming Java EE Backends in Desktop, Web, and Mobile Frontends...JavaCro'14 - Consuming Java EE Backends in Desktop, Web, and Mobile Frontends...
JavaCro'14 - Consuming Java EE Backends in Desktop, Web, and Mobile Frontends...
 
Oracle JET overview
Oracle JET overviewOracle JET overview
Oracle JET overview
 
Best Practices for JSF, Gameduell 2013
Best Practices for JSF, Gameduell 2013Best Practices for JSF, Gameduell 2013
Best Practices for JSF, Gameduell 2013
 
Spring Mvc,Java, Spring
Spring Mvc,Java, SpringSpring Mvc,Java, Spring
Spring Mvc,Java, Spring
 
Liferay Configuration and Customization
Liferay Configuration and CustomizationLiferay Configuration and Customization
Liferay Configuration and Customization
 

Similar to SeedStack feature tour

Foundations of Zend Framework
Foundations of Zend FrameworkFoundations of Zend Framework
Foundations of Zend Framework
Adam Culp
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
Fabio Franzini
 
C# .NET Developer Portfolio
C# .NET Developer PortfolioC# .NET Developer Portfolio
C# .NET Developer Portfolio
cummings49
 
What's Next Replay - SpringSource
What's Next Replay - SpringSourceWhat's Next Replay - SpringSource
What's Next Replay - SpringSource
ZenikaOuest
 
React Native for multi-platform mobile applications
React Native for multi-platform mobile applicationsReact Native for multi-platform mobile applications
React Native for multi-platform mobile applications
Matteo Manchi
 
Learning ASP.NET 5 and MVC 6
Learning ASP.NET 5 and MVC 6Learning ASP.NET 5 and MVC 6
Learning ASP.NET 5 and MVC 6
Ido Flatow
 
Meteor Meet-up San Diego December 2014
Meteor Meet-up San Diego December 2014Meteor Meet-up San Diego December 2014
Meteor Meet-up San Diego December 2014
Lou Sacco
 
Folio3 - An Introduction to PHP Yii
Folio3 - An Introduction to PHP YiiFolio3 - An Introduction to PHP Yii
Folio3 - An Introduction to PHP Yii
Folio3 Software
 
Deprecated: Foundations of Zend Framework 2
Deprecated: Foundations of Zend Framework 2Deprecated: Foundations of Zend Framework 2
Deprecated: Foundations of Zend Framework 2
Adam Culp
 
"Micro-frontends: Scalable and Modular Frontend in Parimatch Tech", Kyrylo Ai...
"Micro-frontends: Scalable and Modular Frontend in Parimatch Tech", Kyrylo Ai..."Micro-frontends: Scalable and Modular Frontend in Parimatch Tech", Kyrylo Ai...
"Micro-frontends: Scalable and Modular Frontend in Parimatch Tech", Kyrylo Ai...
Fwdays
 
Extend Eclipse p2 framework capabilities: Add your custom installation steps
Extend Eclipse p2 framework capabilities: Add your custom installation stepsExtend Eclipse p2 framework capabilities: Add your custom installation steps
Extend Eclipse p2 framework capabilities: Add your custom installation steps
Dragos_Mihailescu
 
Divide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.jsDivide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.js
Sebastian Springer
 
Power your move to the cloud 20180611
Power your move to the cloud 20180611Power your move to the cloud 20180611
Power your move to the cloud 20180611
Pieter de Bruin
 
Spring
SpringSpring
Headless Drupal en pratique
Headless Drupal en pratiqueHeadless Drupal en pratique
Headless Drupal en pratique
Simon Morvan
 
Developing your first application using FIWARE
Developing your first application using FIWAREDeveloping your first application using FIWARE
Developing your first application using FIWARE
FIWARE
 
Developing your first application using FI-WARE
Developing your first application using FI-WAREDeveloping your first application using FI-WARE
Developing your first application using FI-WARE
Fermin Galan
 
Plugin-based software design with Ruby and RubyGems
Plugin-based software design with Ruby and RubyGemsPlugin-based software design with Ruby and RubyGems
Plugin-based software design with Ruby and RubyGems
Sadayuki Furuhashi
 
Building Reactive Microservices with Vert.x
Building Reactive Microservices with Vert.xBuilding Reactive Microservices with Vert.x
Building Reactive Microservices with Vert.x
Claudio Eduardo de Oliveira
 
TDC2017 | São Paulo - Trilha Java EE How we figured out we had a SRE team at ...
TDC2017 | São Paulo - Trilha Java EE How we figured out we had a SRE team at ...TDC2017 | São Paulo - Trilha Java EE How we figured out we had a SRE team at ...
TDC2017 | São Paulo - Trilha Java EE How we figured out we had a SRE team at ...
tdc-globalcode
 

Similar to SeedStack feature tour (20)

Foundations of Zend Framework
Foundations of Zend FrameworkFoundations of Zend Framework
Foundations of Zend Framework
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 
C# .NET Developer Portfolio
C# .NET Developer PortfolioC# .NET Developer Portfolio
C# .NET Developer Portfolio
 
What's Next Replay - SpringSource
What's Next Replay - SpringSourceWhat's Next Replay - SpringSource
What's Next Replay - SpringSource
 
React Native for multi-platform mobile applications
React Native for multi-platform mobile applicationsReact Native for multi-platform mobile applications
React Native for multi-platform mobile applications
 
Learning ASP.NET 5 and MVC 6
Learning ASP.NET 5 and MVC 6Learning ASP.NET 5 and MVC 6
Learning ASP.NET 5 and MVC 6
 
Meteor Meet-up San Diego December 2014
Meteor Meet-up San Diego December 2014Meteor Meet-up San Diego December 2014
Meteor Meet-up San Diego December 2014
 
Folio3 - An Introduction to PHP Yii
Folio3 - An Introduction to PHP YiiFolio3 - An Introduction to PHP Yii
Folio3 - An Introduction to PHP Yii
 
Deprecated: Foundations of Zend Framework 2
Deprecated: Foundations of Zend Framework 2Deprecated: Foundations of Zend Framework 2
Deprecated: Foundations of Zend Framework 2
 
"Micro-frontends: Scalable and Modular Frontend in Parimatch Tech", Kyrylo Ai...
"Micro-frontends: Scalable and Modular Frontend in Parimatch Tech", Kyrylo Ai..."Micro-frontends: Scalable and Modular Frontend in Parimatch Tech", Kyrylo Ai...
"Micro-frontends: Scalable and Modular Frontend in Parimatch Tech", Kyrylo Ai...
 
Extend Eclipse p2 framework capabilities: Add your custom installation steps
Extend Eclipse p2 framework capabilities: Add your custom installation stepsExtend Eclipse p2 framework capabilities: Add your custom installation steps
Extend Eclipse p2 framework capabilities: Add your custom installation steps
 
Divide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.jsDivide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.js
 
Power your move to the cloud 20180611
Power your move to the cloud 20180611Power your move to the cloud 20180611
Power your move to the cloud 20180611
 
Spring
SpringSpring
Spring
 
Headless Drupal en pratique
Headless Drupal en pratiqueHeadless Drupal en pratique
Headless Drupal en pratique
 
Developing your first application using FIWARE
Developing your first application using FIWAREDeveloping your first application using FIWARE
Developing your first application using FIWARE
 
Developing your first application using FI-WARE
Developing your first application using FI-WAREDeveloping your first application using FI-WARE
Developing your first application using FI-WARE
 
Plugin-based software design with Ruby and RubyGems
Plugin-based software design with Ruby and RubyGemsPlugin-based software design with Ruby and RubyGems
Plugin-based software design with Ruby and RubyGems
 
Building Reactive Microservices with Vert.x
Building Reactive Microservices with Vert.xBuilding Reactive Microservices with Vert.x
Building Reactive Microservices with Vert.x
 
TDC2017 | São Paulo - Trilha Java EE How we figured out we had a SRE team at ...
TDC2017 | São Paulo - Trilha Java EE How we figured out we had a SRE team at ...TDC2017 | São Paulo - Trilha Java EE How we figured out we had a SRE team at ...
TDC2017 | São Paulo - Trilha Java EE How we figured out we had a SRE team at ...
 

Recently uploaded

Measures in SQL (SIGMOD 2024, Santiago, Chile)
Measures in SQL (SIGMOD 2024, Santiago, Chile)Measures in SQL (SIGMOD 2024, Santiago, Chile)
Measures in SQL (SIGMOD 2024, Santiago, Chile)
Julian Hyde
 
DDS-Security 1.2 - What's New? Stronger security for long-running systems
DDS-Security 1.2 - What's New? Stronger security for long-running systemsDDS-Security 1.2 - What's New? Stronger security for long-running systems
DDS-Security 1.2 - What's New? Stronger security for long-running systems
Gerardo Pardo-Castellote
 
GreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-JurisicGreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-Jurisic
Green Software Development
 
SMS API Integration in Saudi Arabia| Best SMS API Service
SMS API Integration in Saudi Arabia| Best SMS API ServiceSMS API Integration in Saudi Arabia| Best SMS API Service
SMS API Integration in Saudi Arabia| Best SMS API Service
Yara Milbes
 
Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
Octavian Nadolu
 
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit ParisNeo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptxLORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
lorraineandreiamcidl
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
TheSMSPoint
 
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Crescat
 
socradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdfsocradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdf
SOCRadar
 
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s EcosystemUI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
Peter Muessig
 
E-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet DynamicsE-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet Dynamics
Hornet Dynamics
 
What is Augmented Reality Image Tracking
What is Augmented Reality Image TrackingWhat is Augmented Reality Image Tracking
What is Augmented Reality Image Tracking
pavan998932
 
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling ExtensionsUI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
Peter Muessig
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Neo4j
 
Energy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina JonuziEnergy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina Jonuzi
Green Software Development
 
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppAI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
Google
 
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdfVitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
Safe Software
 
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, FactsALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
Green Software Development
 

Recently uploaded (20)

Measures in SQL (SIGMOD 2024, Santiago, Chile)
Measures in SQL (SIGMOD 2024, Santiago, Chile)Measures in SQL (SIGMOD 2024, Santiago, Chile)
Measures in SQL (SIGMOD 2024, Santiago, Chile)
 
DDS-Security 1.2 - What's New? Stronger security for long-running systems
DDS-Security 1.2 - What's New? Stronger security for long-running systemsDDS-Security 1.2 - What's New? Stronger security for long-running systems
DDS-Security 1.2 - What's New? Stronger security for long-running systems
 
GreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-JurisicGreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-Jurisic
 
SMS API Integration in Saudi Arabia| Best SMS API Service
SMS API Integration in Saudi Arabia| Best SMS API ServiceSMS API Integration in Saudi Arabia| Best SMS API Service
SMS API Integration in Saudi Arabia| Best SMS API Service
 
Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
 
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit ParisNeo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptxLORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
 
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
 
socradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdfsocradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdf
 
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s EcosystemUI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
 
E-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet DynamicsE-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet Dynamics
 
What is Augmented Reality Image Tracking
What is Augmented Reality Image TrackingWhat is Augmented Reality Image Tracking
What is Augmented Reality Image Tracking
 
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling ExtensionsUI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
 
Energy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina JonuziEnergy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina Jonuzi
 
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppAI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
 
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdfVitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdf
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
 
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, FactsALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
 

SeedStack feature tour

  • 2. Outline Overview of the full stack Java framework Business framework Web framework Frontend/backend integration Tooling
  • 3. OVERVIEW OF THE FULL STACK
  • 4. What is SeedStack? A full-stack development solution – Java backend – Web frontend A scalable architecture for enterprise software An extensible ecosystem of add-ons
  • 5. General architecture Java framework Web framework Add-on 1 Business framework Add-on 4 Add-on 2 Add-on 3 Add-on 5 Add-on 6 Add-on 7  REST APIs Application backend  REST APIs Application frontend
  • 6. Modularity Modularity at every level of the stack – Clear separation of APIs from impl. – One module per concern – Powerful extension mechanisms (plugins, fragments, API/SPI) Automatic integration of modules – Auto-discovery – Every module just works without effort
  • 7. Distribution Global packaging of all modules Archetypes for quick project creation Each organization can roll its own custom distribution 16.4 16.7 16.11
  • 8. Add-ons Persistence: JDBC, JPA, MongoDB, Redis, Neo4J, Solr, ElasticSearch Communication: JMS, Web-Services, JavaMail, MQTT Bridges: W20 bridge, Spring bridge Features: dynamic i18n, batch monitoring, import/export, audit, validation, cache, scheduling UI themes: simple, business, material
  • 10. Core Java framework modules Kernel Lifecycle LoggingConfiguration Diagnostic Commands Bindings Web CLI Testing Transactions Security REST Metrics Services
  • 11. Kernel + plugin architecture A concern per plugin Each plugin is responsible for: 1. Submitting classpath scan requests to the kernel 2. Providing initialization, startup and shutdown code 3. Building a Guice module The kernel orchestrates all plugins: – Resolve dependencies between plugins – Invoke init, startup and shutdown code
  • 12. Sample plugin public class MyPlugin extends AbstractPlugin { private final Set<Class<?>> annotatedClasses = new HashSet<>(); @Override public String name() { return "my-plugin"; } @Override public Collection<ClasspathScanRequest> classpathScanRequests() { return classpathScanRequestBuilder().annotationType(Service.class).build(); } @Override public InitState init(InitContext initContext) { annotatedClasses.addAll( initContext.scannedClassesByAnnotationClass().get(Service.class) ); return InitState.INITIALIZED; } @Override public Object nativeUnitModule() { return (Module) binder -> annotatedClasses.forEach(binder::bind); } }   
  • 13. Dependency injection Each plugin provides a Guice module – Define injection bindings – Is dynamically created by the plugin All modules are aggregated and used to produce a global injector Only javax.inject API is used in application code
  • 14. Modular configuration Configuration files go in META-INF/configuration – They are scanned upon startup – They are merged into one unique configuration Configuration values can be accessed from anywhere in the application Feature-rich: profiles, macros, environment variables, system properties, override, converters, …
  • 15. Sample configuration [org.seedstack] jdbc.datasources = main-datasource jpa.units = my-unit [org.seedstack.seed] core.application-id = my-app core.application-name = My application server.port<heroku> = ${env:PORT} [org.seedstack.jdbc.datasource.main-datasource] driver = org.hsqldb.jdbcDriver url = jdbc:hsqldb:mem:store [org.seedstack.jpa.unit.my-unit] datasource = main-datasource property.hibernate.dialect = org.hibernate.dialect.HSQLDialect property.hibernate.hbm2ddl.auto = update [org.seedstack.samples.myapp.domain.*] jpa-unit = my-unit
  • 16. Exceptions and diagnostic Readable, content-rich technical exceptions: – Templatable message and fix advice – Concise list of causes – Online reference if relevant When an unexpected exception occurs: – Extensive diagnostic info is collected – A JSON diagnostic report is dumped to the filesystem if possible Custom diagnostic collectors and reporters can be plugged in Great support tool
  • 17. Sample exception trace org.seedstack.seed.SeedException: (CORE) Unexpected exception Causes ------ 1. java.lang.RuntimeException: (JPA) No persisted classes in unit 2. (JPA) No classes were found belonging to JPA unit "my-unit". Fix --- Verify that the classes are correctly scanned and they are configured to belong to the JPA unit "my-unit". Online information ------------------ http://seedstack.org/addons/jpa#configuration Stacktrace ---------- ...
  • 18. Security Based on Apache Shiro Modular permission-based security model Built-in and pluggable security realms: – Static configuration – LDAP – X509 certificate Fine-grained data obfuscation
  • 19. REST JAX-RS 2.0 through Jersey 2 Hypermedia capable: – JSON-HOME for discovering entry resources – Registry of rels – Builder of HAL representations and links Swagger generator via add-on
  • 20. More… Fully injectable Servlet and Filters WebSockets Command-line parsing Transactions Metrics collection and reporting Applicative SSH shell
  • 21. Benefits Lays ground for software componentization at the enterprise scale: – Provides and promotes modularity – Enables quick integration of components without effort Solves common technical challenges once for the whole organization
  • 24. Levels of abstraction Annotations Interfaces Base classes Low framework coupling Low dev speed High framework coupling High dev speed
  • 25. Entities public class Customer extends BaseEntity<String> { private String email; private Address address; public Customer (String email) { this.email = email; } @Override public String getEntityId() { return this.email; } // … more }
  • 26. Value Objects public class Address extends BaseValueObject { private final String street; private final String city; private final ZipCode zipCode; public Address(String street, String city, ZipCode zipCode) { this.street = street; this.city = city; this.zipCode = zipCode; } // … more }
  • 27. Aggregates public class Order extends BaseAggregateRoot<OrderId> { private OrderId orderId; private Date checkoutDate; private double totalPrice; public Order(OrderId orderId) { this.orderId = orderId; } @Override public OrderId getEntityId() { return this.orderId ; } // … more }
  • 28. Services Define an interface: @Service public interface CheckoutService { public Invoice checkout(Order order); } And one or more implementation(s): @Named(“creditCard") public class CreditCardCheckoutService implements CheckoutService { @Override public Invoice checkout(Order order) { ... } } Qualifies implementation if there are multiple ones
  • 29. Repositories Basic repositories without effort: @Inject @Jpa private Repository<Customer, String> customerRepository; Can be extended with custom methods: public interface CustomerRepository extends GenericRepository<Customer, String> { List<Customer> findByName(String firstName, String lastName); } @Jpa public class CustomerJpaRepository extends BaseJpaRepository<Customer, String> implements CustomerRepository { @Override public List<Customer> findByName (String firstName, String lastName) { ... } } Also available with other technologies Qualifies implementation if there are multiple ones
  • 30. Factories Constructor-based factories without effort: @Inject private Factory<Customer> customerFactory; Can be extended with custom methods: public interface CustomerFactory extends GenericFactory<Customer> { Customer createCustomer(String email, String firstName, String lastName); } public class CustomerFactoryImpl extends BaseFactory<Customer> implements CustomerFactory { @Override public Customer createCustomer(String email, String firstName, String lastName) { ... } } Can be plugged in with identity generators (provided or custom)
  • 31. More… Domain policies Domain events DTO/Aggregate assembling Finders and pagination
  • 32. Benefits Proven approach to produce quality and maintainable software Promotes software industry best-practices Homogenize business code accross projects Design for reuse
  • 34. Loader + fragment architecture Allows composability of Web frontends Each fragment contains: – A manifest describing its contents – Static assets like modules, stylesheets, templates, … The W20 loader aggregates all fragments and orchestrate the initialization of the Single-Page Application
  • 36. Sample fragment { "id": "my-fragment", "name": "My awesome fragment", "modules": { "module1": "{my-fragment}/modules/module1" }, "...": { … }, "...": { … } } Identity 1. Modules are loaded by the W20 loader first 2. Then each loaded module can process fragment sections to further initialize the application   Paths can be relative to the fragment manifest Additional abitrary section 
  • 37. Sample configuration { "/path/to/my-fragment.w20.json": { "modules": { "module1": { … } }, "vars": { "var1": "value1" } } } Fragment manifest URL Module configuration object Define values of fragment manifest’s variables
  • 38. Features AngularJS integration Culture and internationalization Integration with backend security Navigation and menu management Hypermedia Pluggable CSS frameworks Theming
  • 42. Benefits Provides a component architecture for Web frontends Provides useful services for Web enterprise applications (security, i18n, navigation …) Provides theming support Solves common technical challenges once for the whole organization
  • 44. Features Seamless Java/Web integration: – Auto-detects W20 fragments in classpath – Implements REST API required by frontend – Dynamically generates the W20 configuration and the masterpage Can be extended through an SPI Enables activation of a front/back feature simply by adding a dependency
  • 46. SeedStack tools Maven plugin: – Generate: generate projects from scratch – Run: run a project from command-line – Package: creates a runnable unique JAR Yeoman generator for pure-frontend modules Grunt plugin for bundling and minification
  • 48. Open-Source Business-friendly license: MPL 2.0 100% open-source: – Core frameworks – 25+ official add-ons – Tools – Documentation (CC BY-SA) Can be extended with proprietary add-ons without restriction