Skip to content
CAI
Software that uses CAICheck a score

egetman/jes

57.1

Adequate · 21 September 2026

5.3k

lines of production code

Java

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is an event sourcing framework that provides the core infrastructure for building stateful, event-driven applications. It manages the persistence and retrieval of event streams, handles command dispatching, and supports reactive processing through projectors and stateful sagas. The architecture includes pluggable storage backends for events, snapshots, and distributed locks, along with flexible serialization and upcasting capabilities.

Features

Add Stock demo app with startup and shutdown scripts

A new Stock demo application is introduced to showcase basic Jes components. The demo includes a README with usage instructions and two shell scripts: run-demo.sh, which starts a Postgres container, builds the write-part and read-part applications, and launches them; and stop-demo.sh, which terminates the running applications and the Postgres container. The demo allows users to interact with stock items via a web interface at http://localhost:8080/stock.

demo · high confidence

Add clustered environment support with lock and offset implementations

Introduced new lock and offset management components to support clustered/distributed environments. The lock package adds an abstract base for read-write locks with concrete implementations for in-memory, JDBC, and Redis (via Redisson). The offset package provides similar abstractions for tracking and managing state offsets, with in-memory, JDBC, and Redis implementations. These changes enable the framework to coordinate access and track offsets across multiple service instances, preventing duplicate processing in distributed deployments.

src/main/java/store/jesframework/lock · high confidence

Add demo app for the read model

A new demo application is introduced in the read-part module, providing a complete read-model implementation using Spring Boot and Vaadin. The demo includes a Stock UI for managing items, a StockProjector that updates the read model based on domain events, and REST controllers to expose item data. Configuration is handled via application.properties and schema.sql for the PostgreSQL database, with JPA repositories and event serialization options defined in the Spring context.

demo/read-part · high confidence

Add in-memory, JDBC, JPA, and clustered store providers

Introduced new storage backends for the event store: an in-memory provider for testing, JDBC and JPA providers for persistent storage, and a clustered JDBC provider that distributes read queries across replicas while ensuring read-your-own-writes consistency via a write-tracking cache. The \StoreProvider\ interface was also added to define the core event store operations.

src/main/java/store/jesframework/provider · high confidence

Added command bus and JPA event store entities

The framework now includes a command bus implementation (interface and sync/noop variants) for dispatching commands, alongside JPA entity classes (StoreEntry and its binary/string subtypes) and a factory for creating event store entries. This introduces the core messaging and persistence structures for the application.

src/main/java/store/jesframework/bus, src/main/java/store/jesframework/provider/jpa · high confidence

Added common system events for failure tracking and stream management

The framework now includes a set of common system events to improve observability and handle edge cases in event sourcing. New event types include Failure, ProjectionFailure, and SagaFailure to explicitly track handling errors, alongside ContextUpdated for generic updates. Additionally, new events StreamMergedTo, StreamMovedTo, and StreamSplittedTo are introduced to represent stream lifecycle changes, while UnknownTypeResolved handles deserialization of unregistered types.

src/main/java/store/jesframework/common · high confidence

Added database schema definitions for MySQL, PostgreSQL, and H2

New DDL scripts have been added to support MySQL, PostgreSQL (versions 9 and 10), and H2 databases. These scripts define the necessary tables and indexes for the event store, snapshot store, offsets, and distributed locks, enabling the application to operate on these database platforms.

src/main/resources/ddl · high confidence

Added utility classes for validation, JDBC, and configuration

New utility classes have been introduced to the framework: Check provides validation methods for collections, arrays, and maps; PropsReader handles property resolution from system, environment, and jes.properties files with caching; JdbcUtils offers helpers for schema management, database metadata, and SQL type mapping; DaemonThreadFactory creates daemon threads with uncaught exception logging; and Pair is a simple key-value container.

src/main/java/store/jesframework/util · high confidence

Introduce core Event Sourcing framework components

The framework now includes the foundational classes for event sourcing: an Aggregate base class that manages event appliers and stream versioning, an AggregateStore for reading and writing events with snapshot support, a JEventStore interface for low-level event stream operations, and an UnsafeOps utility for advanced stream manipulation like merge, split, and replace. These additions provide the core building blocks for implementing event-sourced aggregates and managing event streams.

src/main/java/store/jesframework · high confidence

Introduce new exception types and command handling infrastructure

The framework now includes a comprehensive set of custom exceptions in the 'store.jesframework.ex' package, including 'AggregateCreationException', 'BrokenHandlerException', 'BrokenReactorException', 'BrokenStoreException', 'EmptyEventStreamException', 'EventStreamRewriteUnsupportedException', 'EventStreamSplitUnsupportedException', 'PropertyNotFoundException', 'SerializationException', and 'VersionMismatchException'. Additionally, the 'store.jesframework.handler' package introduces a new 'CommandHandler' abstract class and supporting utilities ('HandlerUtils', 'Handle' annotation) that enable automatic registration of command handlers via reflection, validating method signatures and invoking them through the command bus.

src/main/java/store/jesframework/ex, src/main/java/store/jesframework/handler · high confidence

Introduce reactive event processing with stateful saga support

The framework now includes a new reactor subsystem in the \store.jesframework.reactors\ package, introducing \Reactor\, \Projector\, and \Saga\ components that process events via a polling trigger mechanism. The \Saga\ class adds support for stateful event-sourced sagas, allowing them to maintain and update internal context through an \AggregateStore\. This enables developers to build complex, stateful workflows that react to domain events while managing their own internal state.

src/main/java/store/jesframework/reactors · high confidence

Introduce snapshot storage and strategy abstractions

The framework now provides a complete snapshotting subsystem. A new \SnapshotStrategy\ interface and implementations (\AlwaysSnapshotStrategy\, \SizeBasedSnapshotStrategy\, \TimeBasedSnapshotStrategy\) allow users to control when snapshots are taken based on event count or time intervals. A \SnapshotProvider\ interface and its implementations (\DefaultSnapshotProvider\, \InMemorySnapshotProvider\, \JdbcSnapshotProvider\, \RedisSnapshotProvider\) enable persisting and retrieving aggregate states in memory, via JDBC, or via Redis. The \DefaultSnapshotProvider\ also introduces a customizable aggregate creation mechanism, allowing users to supply custom constructors or reflection-based instantiation rules.

src/main/java/store/jesframework/snapshot · high confidence

New demo application for the write-side of the event sourcing framework

A new demo application has been added to the write-part module, providing a complete example of an event-sourced system. This includes Spring Boot configuration, REST controllers for creating items and placing orders, command handlers, domain models, and stateful sagas that react to domain events. The demo is configured to connect to a PostgreSQL database and uses JDBC-based providers for locking and offset tracking.

demo/write-part · high confidence

Behavioural changes

Centralized DDL generation for JDBC providers

The JDBC provider now uses a new DDLFactory to generate database schema scripts dynamically based on the underlying database vendor (MySQL, PostgreSQL, H2) and version. This enables support for MySQL in lock, offset, and event store providers, while also maintaining legacy PostgreSQL (v9) and H2 support. The factory handles schema name replacement and content type mapping, ensuring correct DDL generation for each supported database.

src/main/java/store/jesframework/provider/jdbc · medium confidence

Externalizes JDBC SQL statements to properties file

All JDBC SQL statements for the event store, aggregate store, offsets, and locks are now defined in the new \jes.properties\ file. This change moves the SQL queries out of the Java codebase, allowing for easier maintenance and potential database-specific adjustments without recompiling the application.

src/main/resources · high confidence

Refactored serialization API with new Context, Upcaster, and AliasingStrategy components

The serialization module has been refactored to replace the previous TypeRegistry and UpcasterRegistry with a unified Context component that holds all serialization metadata. This introduces new API interfaces including Serializer, Upcaster, and SerializationOption, alongside concrete implementations for Jackson (JSON), Kryo (Binary), and XStream (XML). The Context class now manages format selection, aliasing strategies (FULL\_CLASS\_NAME or SHORT\_CLASS\_NAME), and upcasting rules, enabling more flexible and extensible serialization behavior for events and aggregates.

src/main/java/store/jesframework/serializer · medium confidence

Removed legacy JES core interfaces

The legacy JES core interfaces—BatchLink, Event, JEventStore, Link, SingleLink, and VersionMismatchException—have been removed from the codebase. This change eliminates the previous abstraction layer for event storage and linking, likely as part of a broader refactoring to simplify the event store architecture.

src/main/java/io · high confidence

Test coverage

Added JMH benchmark for store provider read performance; Added JUnit parallel execution and test logging configuration; Added test coverage for command bus and handler components; Added test coverage for core reactor components; Added test coverage for failure handling and common utilities; Added test infrastructure for clustered PostgreSQL and multi-database support; Added tests for clustered JDBC store provider; Added tests for lock implementations; Added tests for snapshot provider and strategy implementations; Added tests for the Offset abstraction; Added unit tests for JDBC DDL generation and JPA store entry factory; Added unit tests for core event-sourcing components; Added unit tests for serializer components; Added unit tests for utility classes.

Dependencies

Update core library and demo app dependencies

The project's root \pom.xml\ has been updated to version 1.2.0, with significant dependency upgrades including Jackson to 2.11.0, XStream to 1.4.15, and JUnit to 5.6.2. Additionally, two new demo modules (\demo/read-part\ and \demo/write-part\) were added, each configured with Spring Boot 2.1.6 and specific JDBC/JPA starters.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.

Score

  • CAI 57 → 57 (-0.1)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 99 → 99 (-0.4)
  • Architecture 100 → 97 (-2.7)
  • Maturity 50 → 50 (+0.0)
  • Readiness 53 → 58 (+4.7)
  • Security 60 → 62 (+1.4)
  • Domain Modelling 74 → 59 (-15.5)

Resolved (13)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • Duplicated block (11 lines × 2) (demo/read-part/src/main/java/store/jesframework/readmodel/view/ItemEditor.java)
  • Duplicated block (5 lines × 2) (demo/read-part/src/main/java/store/jesframework/readmodel/Config.java)
  • Duplicated block (6 lines × 2) (src/main/java/store/jesframework/snapshot/JdbcSnapshotProvider.java)
  • Duplicated block (9 lines × 2) (src/main/java/store/jesframework/offset/JdbcOffset.java)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • No exposed public API
  • Scanner failed to run — not a clean result
  • Test reliability not included
  • dormant codebase — no living knowledge left to concentrate

New (28)

  • Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Duplicated block (12 lines × 2) (demo/read-part/src/main/java/store/jesframework/readmodel/view/ItemEditor.java)
  • Duplicated block (13 lines × 2) (src/main/java/store/jesframework/offset/JdbcOffset.java)
  • Duplicated block (15 lines × 2) (demo/read-part/src/main/java/store/jesframework/readmodel/view/ItemEditor.java)
  • Duplicated block (5 lines × 2) (demo/read-part/src/main/java/store/jesframework/readmodel/Config.java)
  • Duplicated block (5 lines × 2) (src/main/java/store/jesframework/snapshot/JdbcSnapshotProvider.java)
  • Duplicated block (7 lines × 3) (src/main/java/store/jesframework/common/StreamMergedTo.java)
  • Duplicated block (8 lines × 2) (src/main/java/store/jesframework/snapshot/InMemorySnapshotProvider.java)
  • Duplicated block (8 lines × 4) (src/main/java/store/jesframework/lock/JdbcLock.java)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • No assertions: traverseAndMergeShouldMergeTwoStreamsInToOne (src/test/java/store/jesframework/UnsafeOpsTest.java)
  • No assertions: traverseAndSplitShouldProduceTwoStreamsFromOne (src/test/java/store/jesframework/UnsafeOpsTest.java)
  • …and 8 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

egetman/jes was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit ef66922b190698238ee4819da108fe0f1c59acbd — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-fa71c66cabd8.