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

PPTX
Enterprise software strategy with SeedStack
PPTX
SeedStack, the lean development stack
PPTX
Domain-Driven Design with SeedStack
PPTX
Seedstack introduction (at the OW2Con)
KEY
Yii Introduction
PDF
JavaCro'15 - Web UI best practice integration with Java EE 7 - Peter Lehto
PDF
JavaCro'15 - GP GUI form generators - Daniel Strmečki
PDF
JavaCro'14 - Vaadin web application integration for Enterprise systems – Pete...
Enterprise software strategy with SeedStack
SeedStack, the lean development stack
Domain-Driven Design with SeedStack
Seedstack introduction (at the OW2Con)
Yii Introduction
JavaCro'15 - Web UI best practice integration with Java EE 7 - Peter Lehto
JavaCro'15 - GP GUI form generators - Daniel Strmečki
JavaCro'14 - Vaadin web application integration for Enterprise systems – Pete...

What's hot (20)

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

Similar to SeedStack feature tour (20)

PPTX
seminar ppt presentation PRANIT KUMAR SAHOO.pptx
PDF
Understanding the Software Development Frameworks.pdf
PPTX
jkhefkjhl,jvhl,jesvliutguinternship.pptx
PDF
Domain-Driven Design with SeedStack, OW2con'2018, June 7-8, 2018, Paris
 
PDF
SeedStack - the lean development stack, OW2con'16, Paris.
 
PDF
Application Technologis to learn in Full Stack Java Development
PDF
Rocking the microservice world with Helidon-LAOUCTour2023.pdf
PPTX
java web framework standard.20180412
PPTX
Becoming-a-Full-Stack-Developer-With-Full-Stack-Course.pptx.pptx
PPTX
JHipster presentation by Gaetan Bloch
PPTX
What Is A Technology Stack?
PPTX
Full Stack Developer Course in Chandigarh
PDF
Developer Productivity with Forge, Java EE 6 and Arquillian
PDF
Bledar Gjocaj - Java open source
PPTX
Java Full Stack course traning in hyderabad
PDF
Tech Stacks The Building Blocks of Modern Applications
PDF
Viktor Turskyi "Effective NodeJS Application Development"
PDF
Java Full Stack course in hyderabad
PPTX
fullstackjava hnad madebysujadevelopedbyown.pptx
seminar ppt presentation PRANIT KUMAR SAHOO.pptx
Understanding the Software Development Frameworks.pdf
jkhefkjhl,jvhl,jesvliutguinternship.pptx
Domain-Driven Design with SeedStack, OW2con'2018, June 7-8, 2018, Paris
 
SeedStack - the lean development stack, OW2con'16, Paris.
 
Application Technologis to learn in Full Stack Java Development
Rocking the microservice world with Helidon-LAOUCTour2023.pdf
java web framework standard.20180412
Becoming-a-Full-Stack-Developer-With-Full-Stack-Course.pptx.pptx
JHipster presentation by Gaetan Bloch
What Is A Technology Stack?
Full Stack Developer Course in Chandigarh
Developer Productivity with Forge, Java EE 6 and Arquillian
Bledar Gjocaj - Java open source
Java Full Stack course traning in hyderabad
Tech Stacks The Building Blocks of Modern Applications
Viktor Turskyi "Effective NodeJS Application Development"
Java Full Stack course in hyderabad
fullstackjava hnad madebysujadevelopedbyown.pptx
Ad

Recently uploaded (20)

PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
PPTX
Reimagine Home Health with the Power of Agentic AI​
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PPTX
Introduction to Artificial Intelligence
PPTX
history of c programming in notes for students .pptx
PDF
Nekopoi APK 2025 free lastest update
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PPTX
Odoo POS Development Services by CandidRoot Solutions
PDF
AI in Product Development-omnex systems
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PDF
Understanding Forklifts - TECH EHS Solution
PPTX
Essential Infomation Tech presentation.pptx
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PDF
top salesforce developer skills in 2025.pdf
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PDF
System and Network Administraation Chapter 3
Which alternative to Crystal Reports is best for small or large businesses.pdf
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
Reimagine Home Health with the Power of Agentic AI​
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Introduction to Artificial Intelligence
history of c programming in notes for students .pptx
Nekopoi APK 2025 free lastest update
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
Odoo POS Development Services by CandidRoot Solutions
AI in Product Development-omnex systems
Adobe Illustrator 28.6 Crack My Vision of Vector Design
wealthsignaloriginal-com-DS-text-... (1).pdf
Understanding Forklifts - TECH EHS Solution
Essential Infomation Tech presentation.pptx
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
top salesforce developer skills in 2025.pdf
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Wondershare Filmora 15 Crack With Activation Key [2025
System and Network Administraation Chapter 3

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