Repository navigation
Conversation
Settings becomes a tree of records: each nested record is a section of config.yml and each component an option, with its comment in @comment and its default in @default. ConfigMapper binds a parsed file to the records and writes them back, so key names no longer come from field names by reflection. config.yml keeps its keys, order, comments and defaults. - Settings.override and Settings#with change an option through an accessor reference, so a wrong value type is a compile error. - Reloading builds a new tree and swaps one reference. - Strings are escaped when written, an unreadable file is not overwritten, and an unchanged file is not rewritten. - LimitResolver prepares each limit group once per loaded configuration instead of on every getLimit call. - PROTOCOL_SUPPORT_FIX moves to FaweCache#setProtocolSupportFix, since a record cannot hold a runtime flag. Config and ConfigOptComputation are removed and every use of the old Settings fields is migrated.
Settings becomes a tree of records: each nested record is a section of config.yml and each component an option, with its comment in @comment and its default in @default. ConfigMapper binds a parsed file to the records and writes them back, so key names no longer come from field names by reflection. config.yml keeps its keys, order, comments and defaults. - Settings.override and Settings#with change an option through an accessor reference, so a wrong value type is a compile error. - Reloading builds a new tree and swaps one reference. - Strings are escaped when written, an unreadable file is not overwritten, and an unchanged file is not rewritten. - LimitResolver prepares each limit group once per loaded configuration instead of on every getLimit call. - PROTOCOL_SUPPORT_FIX moves to FaweCache#setProtocolSupportFix, since a record cannot hold a runtime flag. Config and ConfigOptComputation are removed and every use of the old Settings fields is migrated.
6ef49ee to
4adf724
Compare
There was a problem hiding this comment.
🔵 Needs a closer look
It is an explicitly Work-In-Progress draft that rewrites the core configuration system and mechanically touches ~70 call sites, which warrants human review before approval.
3 open issues
What changed in this PR
This PR replaces FAWE's legacy reflection-based Config.java configuration system with an immutable, record-based Settings API. Configuration sections become nested Java records whose components are annotated with @Comment/@Default, and a new mapping layer (ConfigMapper, ConfigYaml, ConfigTree, LimitResolver) handles record↔YAML serialization, migration of legacy keys, and limit-group resolution. Roughly 70 call sites are mechanically migrated from uppercase field access (Settings.settings().QUEUE.PARALLEL_THREADS) to accessor methods (Settings.settings().queue().parallelThreads()). The PR is explicitly a Work-In-Progress draft.
Changes:
- Introduce an immutable record-based
Settingsmodel plus a new serialization/migration framework and comprehensive unit tests. - Rewrite
Fawe.setupConfigs()to load/save viaSettings.load/savewith aBuildInfo, and move theFaweCache.protocolSupportFixflag off the global settings object. - Migrate ~70 call sites to the new accessor API and delete
Config.java/ConfigOptComputation.java.
| File | Description |
|---|---|
.../configuration/Settings.java |
New immutable record config model, load/save/migrate/defaults and BuildInfo (context only; not in diff). |
.../configuration/ConfigMapper.java |
Reflection-based record↔YAML mapping, coercion, and defaults. |
.../configuration/ConfigYaml.java |
Hand-rolled UTF-8 YAML reader/writer with quoting/escaping. |
.../configuration/ConfigTree.java |
Dotted-path tree used by migration. |
.../configuration/LimitResolver.java |
Merges limit groups into a resolved FaweLimit ("most generous" semantics). |
.../configuration/{Option,Default,Comment}.java |
Annotations/metadata driving option paths, defaults and comments. |
.../core/Fawe.java |
Rewritten setupConfigs() using Path, Settings.load/save, and BuildInfo. |
.../core/FaweCache.java |
New protocolSupportFix field + setter replacing the old global setting. |
.../test/.../SettingsTest.java, ConfigMapperTest.java |
New unit tests covering save/load, migration, limits and fuzzed text round-tripping. |
.../test/resources/.../config.yml |
Expected-output fixture mirroring the @Comment/@Default text; carries over several comment typos. |
| ~70 migrated call sites | Mechanical switch from uppercase fields to accessor methods. |
Review effort: Balanced
…to refactor/v3/settings-records
…rate schematic limits into default Also makes protocolSupportFix volatile and sets the remaining @SInCE tags to 3.0.0.
…n configuration handling
… into refactor/v3/settings-records
…form from the saved config Also finishes the option to setting rename in javadoc and replaces the assert with Entry.requireType().
…ngs-records Brings in main via v3, including 26.3 support. Config.java stays deleted and Settings.java keeps the records version: ConfigYaml already writes no space after a list key and the comment strings carry no trailing spaces, which is what #3675 and #3676 fixed in the old classes. The 26.3 adapter gets the same record accessors as the other adapters.
- Remove the unused experimental.anvil-queue-mode setting and a duplicated history comment line; existing files have the key reported and removed. - Use var for entry loops and fix minor javadoc in the configuration classes. - Remove savedSettingsLoadBackUnchanged and missingFileGivesDefaults, which repeated anyTextIsReadBackAsWritten and aFileWithNothingToReadGivesTheFallback. - Make the allowed-image-hosts case differ from its default so it can fail, and drop input lines no assertion checked. - Add YAML 1.1 boolean words to the anyTextIsReadBackAsWritten samples.
Co-authored-by: MattBDev <4009945+MattBDev@users.noreply.github.com>
Co-authored-by: MattBDev <4009945+MattBDev@users.noreply.github.com>
|
Marking the PR as ready for review but I still have to update the PR body. Should be done Saturday. I think I have a minor tweak or two to I have to push as well. |
There was a problem hiding this comment.
🟡 Changes recommended
An unresolved critical finding remains: a typo in the config.yml comment (clipboad.on-disk instead of clipboard.use-disk) that must be mirrored in the Settings.java @Comment or the defaultsAreWrittenAsExpected test will fail.
1 open issue
3 resolved since last review
Review effort: Balanced
| # Allows NBT stored in a clipboard to be written to disk | ||
| # - Requires clipboard.use-disk to be enabled | ||
| save-clipboard-nbt-to-disk: true | ||
| # Apply a file lock on the clipboard file (only relevant if clipboad.on-disk is enabled) |
There was a problem hiding this comment.
Fixed the typo in the authoritative Settings.java comment and synced the expected generated config.yml output to clipboard.use-disk.
Co-authored-by: MattBDev <4009945+MattBDev@users.noreply.github.com>


Description
FAWE's
config.ymlis now loaded into read-only Java records. Each setting's default is written next to the setting, and code changes a setting with a method reference such asSettings.History::compressionLevel.Removed API
Settings.settings().QUEUE.PARALLEL_THREADSSettings.settings().queue().parallelThreads()Settings.IMPSettings.settings()Settings.settings().EXPERIMENTAL.PERSISTENT_BRUSHES = falseSettings.override(Settings.Experimental::persistentBrushes, false)Settings.settings().reload(File)Settings.set(Settings.load(Path))Settings.settings().save(File)settings.save(Path)Settings.settings().LIMITS.get("default")Settings.settings().defaultLimits()Settings.settings().PROTOCOL_SUPPORT_FIXFaweCache.INSTANCE.setProtocolSupportFix(boolean)Configand its annotations@Comment,@DefaultPerformance
The new code loads, reloads and saves faster, works out limits more than twice as fast, and allocates much less memory. Reading a setting costs the same.
getLimit, player in no group, stock filegetLimit, player in two groups, 8 groups