An easy, extensible
back-office
Start quickly
It shouldn't be a slow and painful process
Getting initial code
it's only a few clicks away on the initializr
Starting the app for the first time
just run the main Java class
Adding out-of-the-box functionalities
just add the desired maven dependencies
Evolve your app'
Don't reinvent the wheel
Use powerful out-of-the-box tooling and extension capabilities
lots of features are already handled, you just have to configure it
Override and append your own business logic and code
mind (only) your own business !
Write your front-end the way you like it
single-page application, api only, server-generated pages, static pages, mobile app, none, ...
Customize your back-office
Scss builder to show your colors !
Deliver quickly
It remains a Spring-Boot app' !
Use any additional Spring-Boot starter
there are lots of options to pick !
Package your application once, run it everywhere
on your laptop, on premises, on the cloud, ...
Migrate and evolve your database easily
using Liquibase and versionned changesets
Participate
Our goal is to create a common and usable tool
Document, report bugs and help us correct them
the project is on github, open-source and help is most welcome !
Easy public or private auto-configured modules creation
share as you see fit, keep at your discretion
Technologies
Spring 5
Easy, clean and modern Java app's
IoC, AoP, powerful abstractions
clean code, loose coupling of components, testability
Fast and powerful container
easy basic usage, sometimes hard to master, but powerful when needed
Massive ecosystem and third-parties integration
dozens of sub-projects including spring-data, spring-batch, spring-security, spring-ldap, spring-* ......
Spring-Boot 2
Compose your application components !
Auto-configure everything for you, depending on what's on your classpath
@ConditionalOnMissingBean, @ConditionalOnBean, @ConditionalOnClass, @Conditional, @AutoconfigureAfter, @AutoconfigureBefore, ...
Custom auto-configuration can be added
it's the building block of blossom modules
Health, metrics and application monitoring with Actuator
can be queried via JMX, API and blossom interface
Spring-Security
You are in a safe place.
Leading security tool widely used
Web Filters, , stateless or stateful, many existing providers supported, many protocols (OAuth2)
Powerful authorization features
privileges, pre and post authorization on any spring bean, custom voters
JPA / Hibernate
Model and access your data
Standard ORM solution and most popular implementation for relational database
lots of features, but sometimes hard to master for beginners
Database generation has been deactivated by default
we prefer modeling the database schema and run code on top
spring-data-jpa and querydsl add extra-capabilities
use repositories easily and create complex typesafe queries
Elasticsearch
Search and filter anything
Embedded faceted search engine for all your entities
combined with generic implementations of indexation/search engines
Sadly we are stuck in an old version (2.4.6) as of now
we shall provide a Docker/Kubernetes integration in the future
Can be used in standalone mode
it only needs an application configuration change
Liquibase
Source control for your database.
Handles the database schema creation and following updates
through versionned and named/dated changesets executed at startup
Database vendor aware and context-dependant logic
can manage specific datatypes and edge cases
Supports multiple formats
XML, YAML, JSON, SQL
Caffeine
High performance cache implementation
Near optimal cache built for java 8
more recent that some of its concurrents
Supported by the Spring cache Abstraction
could be replaced transparently in the future
Only local and in-memory
it's the sad part :-(
Quartz Scheduler
Tick, tock, goes the clock.
Feature-rich and configurable job scheduling library
recently supported out-of-the-box by Spring-Boot via a starter
Database or in-memory job and triggers store
could be replaced transparently in the future
Use standard Java components (Task, Job, Trigger, Listeners ...)
may execute any Java code you program them to do
Freemarker / Jquery
A bit old-school, but still roaring.
Simple markup, powerful results
freemarker syntax is very easy to learn yet it's everything you need to build a server generated page
Macro and directives allow easy pages and components creation
<#if sufficient><#doNothing/></#if>
Less susceptible to be impacted by the Javascript-world framework frenzy
tell us, should we use Angular, React or Vue instead ?
SPA interfaces using your favorite framework could be added using the Rest API
Features
Core functionalities
No generated code
No classpath scanning for components
Relies on Spring-Boot auto-configuration
Register core functionnalities only
user / role / group management + scheduler + search engine
Configurable default admin user system/system
Security
Privilege plugin system with namespace/feature/right levels
A CurrentUser object is used in the security context
@PreAuthorized are used in Java beans
A <@privilege.has "privilege"> macro is provided for ftl template
Web is secured with a spring-security login flow and session management
REST API is secured with OAuth2
Front-end is not secured by default
An UI web interface provides insight about failed attempts
Interfaces
REST Api and Web interfaces are provided.
Both use Spring-MVC (no webflow as of now)
ControllerAdvices provide common functionalities
filtered menu by privilege, exception handling, current user, current and available locales
Controllers and MenuItems are added only if features are present and actives
@BlossomController and @BlossomApiController
simplifies the creation of pages mapped on /blossom and /blossom/api
Database
Blossom does not override the Spring-Boot defaults
Starts an in-memory h2database, use configuration properties to override the behavior
Blossom tracks and execute every Liquibase changeset on the classpath at startup
taking care of every additional module used, and the order it should be executed (by name)
Blossom validates the JPA entities to the database
giving insight of your code / DB synchronisation state
Cache
Blossom relies on the Spring Cache Abstraction
provides a custom cache resolver, cache manager and cache implementation using Caffeine
Blossom provides a way to configure each Caffeine cache separately
with a @Bean and a provided builder
Blossom adds a few capabilities to the caffeine cache :
- disable a specific cache at runtime
- clearing it fully
- clearing all caches
- display size, hits and misses statistics
Search
An Elasticsearch node is started embedded by default
but you can configure it with application properties
Blossom provides default implementations of SearchEngine and IndexationEngine
to be easily used for blossom-managed entities
Blossom provides a way to add configurable facets to your searches
An omnisearch feature in both ui Web and API allows to run a search across
all availables and enabled SearchEngines
Task scheduling
Blossom relies on spring-boot-starter-quartz
but you can configure it with application properties
Blossom provides a global listener to save traces of trigger executions across restart
to be easily used for blossom-managed entities
Register your custom jobs and triggers using Spring @Beans
Blossom Ui Web provides an interfaces that allows you to start manually a job
Internationalization
Blossom use the Spring-Boot MessageSource as @Primary
which mean you can use a message.properties in your classpath, or define multiple files
It adds a parent MessageSource which does an initial classpath scanning to find all messages files
add files to classpath:/messages/example.properties for them to be picked up automatically
Locales choices can be enabled/disabled with a property, english is default
blossom.languages=en,fr
The UI (web) provides a selector to change the current Locale amongst the available ones
Generic implementations
Generic implementations and abstract objects are provided to help reduce boilerplate code :
JPA entities (AbstractEntity + AbstractAssociationEntity)
Spring-data Repositories (CrudRepository)
DAOs (GenericReadOnlyDao, GenericCrudDao, GenericAssociationDaoImpl)
DTOs (AbstractDTO, AbstractAssociationDTO)
DTOMappers (AbstractDTOMapper)
Services (GenericReadOnlyServiceImpl, GenericCrudServiceImpl, GenericAssociationServiceImpl)
Thoses implementations bring with them
Automatic caching at the DAO layer
Generic event at the Service layer
Exception handling
A @ControllerAdvice handles Exception happening in a @BlossomController
Throwable, HttpRequestMethodNotSupportedException, NoHandlerFoundException, NoSuchElementException, AccessDeniedException
A custom ErrorViewResolver find specific error views depending
on the user being on the back-end or front-end
freemarker templates are located in
src/main/resources/templates/blossom/error/ or src/main/resources/templates/blossom/blossm/error/
E-mailing
Blossom relies on the spring-boot-mail-starter to create a JavaMailSender
using spring.mail.* prefixed properties
Blossom provides a MailSender interface and two implementations
a NoopMailSenderImpl that only logs (if no JavaMailSender is found)
a MailSenderImpl that really sends mails based on Freemarker templates, and offers recipient filtering with regexp
You can use that generic MailSender and use it directly or in business-related mail senders
e.g. UserMailService for account creation and password change mail notifications
Events
Generic Events are published in the ApplicationContext by the generic Service layer
AfterDissociatedEvent, AssociatedEvent, BeforeDeletedEvent, BeforeDissociatedEvent, CreatedEvent, DeletedEvent, UpdatedEvent
You can add your own business related events easily
Extending the above ones or adding your own
They can be processed by custom @EventListener or @TransactionalEventListener
at your convenience
Monitoring
Blossom uses Actuator
only info, endpoints and tracesstats are active by default
A specific HttpTraceRepository is used to index front-end requests to Elasticsearch
default TTL for documents is 7 days, allowing to create the right-side of the dashboard interface with aggregations
A public /status endpoint using the HealthIndicator is available for basic external monitoring
Themes
Blossom uses SCSS and compile the theme at startup
via a CommandLineRunner
Blossom provides a ThemeBuilder to set available SCSS variables and add new themes
the default green theme can be disabled when another one is provided
Current theme variables (colors, ...) are accessibles in the ftl, so they can be used
in any pages and javascript libraries