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

 

Quick-Start

Live demo

Made with Slides.com