- migrate auth, manager, data, and agentic persistence to R2DBC
- hard cut pagination, facade, gateway, web, and CLI contracts
- remove legacy database and TSDB adapters and document validation gates
BREAKING CHANGE: platform persistence now requires PostgreSQL 18 with TimescaleDB and the new reactive API contracts.
- fill the missing Javadoc on public methods, records, and types across the dc3-common, dc3-mq, and dc3-tsdb core modules
- document about 350 public constants and enum constants in dc3-common-constant, including the MCP, RabbitMQ, agentic, manager, auth, and data surfaces
- document exception constructors and replace the lombok @RequiredArgsConstructor with explicit documented constructors in ThreadPoolConfig and QuartzService
- translate the remaining non-English section comments in the TSDB store adapters
- verified: check_documentation.py passes, javadoc doclint=all reports zero warnings across all aggregators, and the touched modules compile
Prose rewrapping and table reflow from a project-wide markdown pass;
no content changes. Also reverts two formatter mistakes: restores
MD5(password) in dc3-web/AGENTS.md and drops spurious spaces after
CJK punctuation in README.zh.md / README.ja.md.
Covers root guides (AGENTS/CONTRIBUTING/SECURITY/README.*), module
READMEs across dc3-api/center/common/driver/e2e/gateway, the nginx
guide, dc3/doc/{README,TITLE}.md, and dc3-web docs.
thread: document the three JDK executor beans and the real dc3.thread
keys (the @Async claim was wrong). mqtt: correct the dc3.driver.mqtt
prefix/keys and the Spring Integration + Paho component roles.
Replace hand-written all-assignment constructors with Lombok
@RequiredArgsConstructor across controllers, services, config classes,
event listeners, and tool classes. No behavioral change.
Refresh module READMEs, AGENTS.md, CONTRIBUTING.md, and dc3/doc/
guides to reflect the unified Dockerfile, consolidated compose stacks,
and updated build instructions.
Update @since from 2022.1.0 to 2016.10.1 and @version from 2026.5.5
to 2026.5.17 across all Java source files to reflect the actual
project start date.
Each common module previously declared its EnvironmentPostProcessor
classes twice — via the new META-INF/spring/...EnvironmentPostProcessor.imports
file *and* via the legacy spring.factories — and decorated the classes
with @Configuration even though Spring Boot loads them through
SpringFactoriesLoader, not through the application context.
Drop the @Configuration noise on every Active*ProfileConfig and on the
Driver / Mqtt / Rabbitmq EnvironmentConfig classes, and delete the
duplicate .imports files in agentic, auth, data, driver, gateway,
manager, mqtt, postgres, quartz, rabbitmq, repository, thread, and web.
The remaining META-INF/spring.factories in each module is the single
registration entry point.
Pin three platform-wide infrastructure modules:
- QuartzServiceTest (8) covers all five public methods of the Quartz
scheduler facade:
* createJobWithInterval registers the JobDetail with the supplied
group/name/class and a SimpleTrigger whose repeatInterval matches
the requested seconds and repeatCount = REPEAT_INDEFINITELY;
* createJobWithCron registers a CronTrigger with the supplied
expression and rejects malformed cron strings;
* startScheduler / stopScheduler are no-ops once the scheduler has
been shut down (idempotency requirement during graceful shutdown)
and the underlying SchedulerException is propagated when the
scheduler is live so callers can distinguish "broken" from "closed".
- MqttUtilTest (6) covers MqttConnectOptions construction:
* NONE auth leaves credentials unset even if username/password
fields are populated (defence-in-depth — config switch wins);
* USERNAME auth applies credentials only when both fields are
non-empty; blank username or password is silently dropped (so an
incomplete deployment does not authenticate as a partial principal);
* https hostname verification is always disabled — pinning this
deliberate platform choice so a future refactor cannot silently
enable it and break TLS termination at the gateway.
- ThreadPoolConfigTest (6) + ThreadPropertiesTest (2) cover the
three executors used across the platform:
* ThreadPoolExecutor with corePoolSize / maximumPoolSize from
properties and queue capacity = 2 * maximumPoolSize;
* threads are named with the [T] / [VT] / [ST] prefixes that the
log layout depends on for source-of-task identification;
* the BlockingRejectedExecutionHandler runs the task in the caller
thread when both the pool and queue are full — pinning this
contract because the dropping alternative would silently lose
point values during a re-registration storm;
* virtualThreadExecutor really hands out virtual threads (the
Thread#isVirtual contract) so JDK 21 virtual threads are wired
correctly in production rather than falling back to platform
threads;
* isPoolSizeValid catches misconfiguration where max < core.
Verified locally: 22 cases green across the three modules.
Spring Boot 4.0.6 still loads EnvironmentPostProcessor implementations
via SpringFactoriesLoader from META-INF/spring.factories, not from the
new .imports file. The .imports mechanism only applies to
AutoConfiguration classes.
The previous commit incorrectly deleted all spring.factories files,
which broke profile activation for every service (auth, data, manager,
gateway, etc.). Restore them with only the EnvironmentPostProcessor
entries (EnableAutoConfiguration entries remain removed since those
use AutoConfiguration.imports).
Auto-configuration:
- Replace @Configuration with @AutoConfiguration on 21 classes listed
in AutoConfiguration.imports (InitRunners, topic configs, DalConfig,
MqttConfig, ThreadPoolConfig, RabbitConfig, ExchangeConfig, etc.)
- Add @AutoConfiguration to ExceptionConfig alongside @RestControllerAdvice
WebFlux fixes:
- Replace getServlet().getContextPath() with getReactive().getContextPath()
in WebFilterConfig (servlet API in reactive context)
- Remove redundant @EnableWebFlux and @Slf4j from WebFluxConfig
- Replace deprecated customCodecs().registerWithDefaultConfig() with
defaultCodecs().jacksonJsonEncoder/Decoder()
Driver lifecycle:
- Replace System.exit(1) in DriverRegisterServiceImpl with
ServiceException to allow Spring graceful shutdown
Resource leaks:
- Wrap FileOutputStream in try-with-resources in DeviceServiceImpl
- Wrap BufferedWriter in try-with-resources in CmdUtil
- Rewrite X509Util.loadCertificateWithPassword with try-with-resources
and remove dead if/else branches
Spring Boot 4.x removed the spring.factories mechanism entirely. The
EnableAutoConfiguration entries were already migrated to
AutoConfiguration.imports, but the EnvironmentPostProcessor
registrations were only in the now-defunct spring.factories, meaning
all profile activation and environment configuration was broken.
- Delete all 15 spring.factories files (dead code in Boot 4.x)
- Create EnvironmentPostProcessor.imports for 12 modules, registering
16 EnvironmentPostProcessor implementations that were previously
unreachable
The API-only artifact had no runtime implementation, causing
"Bean Validation API is on the classpath but no implementation
could be found" at startup. The starter bundles Hibernate Validator.
- Bump all module versions from 2025.11.1 to 2026.4.18.3
- Remove orphaned dc3-common-influx dependency and property from root pom.xml
- Standardize dependency comment style in dc3-common/pom.xml
- Merge gRPC dependency groups into single section in dc3-common-api
- Restructure Spring Integration MQTT and Eclipse Paho groups in dc3-common-mqtt
- Fix incorrect comment 'DC3 Common Exception' to 'DC3 Common Related' in dc3-common-postgres
- Add missing blank line before </dependencies> in dc3-common-driver
- Remove stray blank line in root pom.xml dependencyManagement