The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.
Follows the import procedure in README.md.
source/ the originating repository verbatim — 78 documents, 28 SVGs,
8 manifests, plus .source-revision recording the commit
final/ the SSOT
document.md 729 lines written from the 29 experiment documents, not
concatenated: what was predicted, what was measured, and
where the measurement itself was wrong
evidence/raw 125 outputs, flattened to <experiment>__<file> because
the originals collided (01-baseline.txt appeared three
times) and the audit only globs the top level
evidence/meta one per raw file; command and exitCode are null and the
README says why rather than inventing them
evidence/browser 22 captures
assets/ three diagrams through techviz
.techviz/ their VizSpecs
A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.
Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.
verify-pipeline.py passes. audit-records.py reports no issues.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
242 lines
25 KiB
Plaintext
242 lines
25 KiB
Plaintext
Sub-scope 06 (objectstorage) filesystem + maintenance + readiness + provider + root — manifest and probes
|
|
revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5
|
|
generatedAt=2026-08-30T02:57:19+00:00
|
|
cwd=/shared/codebase/clean-architecture-backend-template/src
|
|
|
|
=== OWNED FILES (main) ===
|
|
f5c77750961b83e3fde720cdc34ae080f61027db main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/FilesystemLocalDevProviderContribution.java 81
|
|
91cae2205b26ddae6c0d9c0968863dfa0bfdb47d main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectControlStore.java 115
|
|
8c0e5d93e163cbf0509f7e68a313559b1c27b0fa main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectDataStore.java 188
|
|
e559bd8b78fddfb364d2885d436be040accba0a0 main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectStorageProvider.java 106
|
|
8e3b9fc5b36ca2f638d77d558dec2e9b24dc129c main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java 158
|
|
ab238c3d53ee1c23245fa2b8dd2037afff881ee0 main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectStreamTransfer.java 193
|
|
8b8b164cee901b373039a3690c0729fdb5f3857a main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/Ed25519LegacyAdoptionApprovalVerifier.java 119
|
|
4332c6cc3f2f81ed460c3df136af8f6d486b6b5d main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyAdoptionApprovalCodec.java 169
|
|
a96a2a891d9b0374e08f43f4e72c50125c37379d main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyAdoptionApprovalDocument.java 112
|
|
9c19cf8a3f428134003079ef8353e2fce52c9e40 main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyAdoptionApprovalReplayRecord.java 39
|
|
83b67717e32806fd52396023a84cf4a6c78a5c62 main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyAdoptionApprovalReplayStore.java 16
|
|
93dc1ebac98d9f6edb3a6d686ae2affc89d56ee8 main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyObjectAdoptionService.java 122
|
|
e11be7109baa8b0251e8690c5c3468da50229a4e main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyObjectInspection.java 20
|
|
d518feeed84a1b234daaa5971a84d6857f295e09 main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyObjectInspector.java 12
|
|
95a00035aa6f388a992c043cd2fea3c93f74cf1d main/java/dev/caskeleton/adapter/outbound/objectstorage/provider/ObjectStorageProvider.java 99
|
|
46013987d2b87fb882137975d82b85f394f1876e main/java/dev/caskeleton/adapter/outbound/objectstorage/provider/ObjectStorageProviderDescriptor.java 56
|
|
82afb574a2c5e902cfe4e0b517942ac4f6940e3d main/java/dev/caskeleton/adapter/outbound/objectstorage/provider/ObjectStorageProviderException.java 43
|
|
08961f7dc0277b6ebc6974a224a82f1720983f79 main/java/dev/caskeleton/adapter/outbound/objectstorage/provider/ObjectStorageProviderOperation.java 46
|
|
dc53066f499c7ff758292c0228aa234c0e560ae7 main/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/CapabilityEvidence.java 64
|
|
5371d00836e05e24e2c0fe257f24adf4d478c0c7 main/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/CapabilityEvidenceSource.java 8
|
|
0be1dcc013142e946f234fdc937607634283e477 main/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/CapabilityEvidenceStatus.java 8
|
|
354ba7ec7b5700e136319b790f8b2b5a5165f5c5 main/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/ObjectStorageCapabilityCard.java 41
|
|
a11b85bc25a10e56de10fdb2adb93ff1dd33be58 main/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/ObjectStorageCapabilityDescriptor.java 69
|
|
55e5092e7d43c10bc020fe5b2181ec09f6853d3d main/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/ObjectStorageCapabilityEvidence.java 71
|
|
eb2acc4d447a9f07b56cd0fffd384fb4b5f629cd main/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/ObjectStorageOperationProfile.java 24
|
|
8f6f807c770b5806be739cbc85f2eb4fdd1ca515 main/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/ObjectStorageReadinessLevel.java 9
|
|
96e3713897b0e8a7b49b373d3ab1db7a6dd333f1 main/java/dev/caskeleton/adapter/outbound/objectstorage/FilesystemObjectStorageAdapter.java 111
|
|
73f8f5957a26e8b847b4fc7278ce9b57b243f13a main/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageConfig.java 73
|
|
9c30d68532834e86015e16fe93e28b033201d1ef main/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageSettings.java 119
|
|
d4e9346f832cc2a9cbd0780096379829a0eced3f main/java/dev/caskeleton/adapter/outbound/objectstorage/S3ObjectStorageAdapter.java 129
|
|
|
|
=== OWNED FILES (test + resources) ===
|
|
ace0020defa378a1510f6ca6040f129e042cb7e8 test/java/dev/caskeleton/adapter/outbound/objectstorage/contract/ObjectStorageProviderContract.java 247
|
|
8c7560b9be41fbc8d952784faaae8634ab6dbdfb test/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectStorageProviderTest.java 77
|
|
91eb70284a74e0cc262a0b33b4f7a1edfbb4ffc9 test/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectStorageRecoveryTest.java 153
|
|
4e1d428672fea90e9b92ddc98874f11f0b0ab501 test/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyAdoptionApprovalVerifierTest.java 145
|
|
e062e3f31a5fea30158239b1695ff2814b655be8 test/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyObjectAdoptionServiceTest.java 109
|
|
ee44b4988b56babe46ac436c242fd2069b43ce4b test/java/dev/caskeleton/adapter/outbound/objectstorage/readiness/ObjectStorageReadinessRegistryTest.java 196
|
|
110b8e4bfefe96f013fe2917d7ab70dc93788a74 test/java/dev/caskeleton/adapter/outbound/objectstorage/FilesystemObjectStorageAdapterTest.java 87
|
|
6c218260e7f11c4eeeba321210f77f0090c87633 test/java/dev/caskeleton/adapter/outbound/objectstorage/LegacyObjectStorageBehaviorTest.java 68
|
|
4ede9de7f100b30be9e8ec7a9863524cef485629 test/java/dev/caskeleton/adapter/outbound/objectstorage/LegacyObjectStorageConfigTest.java 58
|
|
15efccb9cd361f8e77716301fa6276914713c079 test/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageArchitectureTest.java 44
|
|
62ef07fd72f6315d02855f28a0dd674e9ae35504 test/java/dev/caskeleton/adapter/outbound/objectstorage/S3ObjectStorageAdapterIT.java 102
|
|
3ae16ed6b35f3112d8d165082971d600a54c77f1 test/java/dev/caskeleton/adapter/outbound/objectstorage/S3ObjectStorageAdapterTest.java 99
|
|
f4e41f21b45750363e967561a863f5d880c1c601 test/resources/object-storage/minio-provider-evidence.json 25
|
|
|
|
main: 30
|
|
test+resources: 13
|
|
main LOC: 2420 total
|
|
|
|
=== 8.1 reachability: maintenance/** ===
|
|
$ git grep -n 'LegacyObjectAdoptionService\|Ed25519LegacyAdoptionApprovalVerifier\|LegacyAdoptionApprovalReplayStore\|LegacyObjectInspector' -- . | grep -v '/objectstorage/maintenance/'
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java:3:import dev.caskeleton.adapter.outbound.objectstorage.maintenance.LegacyAdoptionApprovalReplayStore;
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java:4:import dev.caskeleton.adapter.outbound.objectstorage.maintenance.LegacyObjectAdoptionService;
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java:5:import dev.caskeleton.adapter.outbound.objectstorage.maintenance.LegacyObjectInspector;
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java:31: LegacyObjectInspector inspector,
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java:33: LegacyAdoptionApprovalReplayStore replayStore,
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java:35: return new LegacyObjectAdoptionService(inspector, publications, replayStore, clock);
|
|
adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:6:import dev.caskeleton.adapter.outbound.objectstorage.maintenance.LegacyAdoptionApprovalReplayStore;
|
|
adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:7:import dev.caskeleton.adapter.outbound.objectstorage.maintenance.LegacyObjectInspector;
|
|
adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:30: .withBean(LegacyObjectInspector.class, () -> mock(LegacyObjectInspector.class))
|
|
adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:34: LegacyAdoptionApprovalReplayStore.class,
|
|
adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:35: () -> mock(LegacyAdoptionApprovalReplayStore.class))
|
|
adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:53: .withBean(LegacyObjectInspector.class, () -> mock(LegacyObjectInspector.class))
|
|
adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:57: LegacyAdoptionApprovalReplayStore.class,
|
|
adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:58: () -> mock(LegacyAdoptionApprovalReplayStore.class))
|
|
exit=0
|
|
|
|
$ git grep -n 'LegacyObjectAdoptionApprovalVerifierPort\|LegacyObjectAdoptionPort' -- . | grep -v '/objectstorage/maintenance/'
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java:7:import dev.caskeleton.application.storage.migration.LegacyObjectAdoptionPort;
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java:30: public LegacyObjectAdoptionPort legacyObjectAdoptionPort(
|
|
adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:9:import dev.caskeleton.application.storage.migration.LegacyObjectAdoptionPort;
|
|
adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:23: .run(context -> assertThat(context).doesNotHaveBean(LegacyObjectAdoptionPort.class));
|
|
adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfigTest.java:45: assertThat(context).hasSingleBean(LegacyObjectAdoptionPort.class);
|
|
application-core/src/main/java/dev/caskeleton/application/storage/migration/LegacyObjectAdoptionApprovalVerifierPort.java:5:public interface LegacyObjectAdoptionApprovalVerifierPort {
|
|
application-core/src/main/java/dev/caskeleton/application/storage/migration/LegacyObjectAdoptionPort.java:5:public interface LegacyObjectAdoptionPort {
|
|
application-core/src/test/java/dev/caskeleton/application/objectstorage/ObjectStorageArchitectureContractTest.java:49: "dev.caskeleton.application.storage.migration.LegacyObjectAdoptionApprovalVerifierPort",
|
|
application-core/src/test/java/dev/caskeleton/application/objectstorage/ObjectStorageArchitectureContractTest.java:50: "dev.caskeleton.application.storage.migration.LegacyObjectAdoptionPort",
|
|
sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/application/poster/migration/AdoptLegacyPosterImageUseCase.java:8:import dev.caskeleton.application.storage.migration.LegacyObjectAdoptionApprovalVerifierPort;
|
|
sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/application/poster/migration/AdoptLegacyPosterImageUseCase.java:9:import dev.caskeleton.application.storage.migration.LegacyObjectAdoptionPort;
|
|
sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/application/poster/migration/AdoptLegacyPosterImageUseCase.java:35: private final LegacyObjectAdoptionPort adoptions;
|
|
sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/application/poster/migration/AdoptLegacyPosterImageUseCase.java:36: private final LegacyObjectAdoptionApprovalVerifierPort approvals;
|
|
sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/application/poster/migration/AdoptLegacyPosterImageUseCase.java:43: LegacyObjectAdoptionPort adoptions,
|
|
sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/application/poster/migration/AdoptLegacyPosterImageUseCase.java:44: LegacyObjectAdoptionApprovalVerifierPort approvals,
|
|
exit=0
|
|
|
|
=== 8.1b reachability: readiness/** and the declared registry file ===
|
|
$ git grep -n 'ObjectStorageCapabilityEvidence\|ObjectStorageCapabilityCard\|ObjectStorageReadinessLevel' -- . | grep -v '/objectstorage/readiness/'
|
|
exit=1
|
|
|
|
$ git grep -rn 'object-storage-readiness' -- . | head -20
|
|
adapter/outbound/objectstorage/CLAUDE.md:13:`docs/registries/object-storage-readiness.yaml`.
|
|
adapter/outbound/objectstorage/CLAUDE.md:44:- Claims above the exact rows in `docs/registries/object-storage-readiness.yaml`.
|
|
adapter/outbound/objectstorage/README.md:11:evidence claims in `docs/registries/object-storage-readiness.yaml`.
|
|
adapter/outbound/objectstorage/build.gradle:46: .resolve('docs/registries/object-storage-readiness.yaml').toFile()
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:32: "object-storage-readiness.yaml",
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:165: invalidSpecialized.resolve("object-storage-readiness.yaml"),
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:174: .hasMessageContaining("object-storage-readiness.yaml");
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:179: fractionalSpecializedVersion.resolve("object-storage-readiness.yaml"),
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:187: .hasMessageContaining("object-storage-readiness.yaml");
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:192: duplicateSpecializedIdentity.resolve("object-storage-readiness.yaml"),
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:204: String specialized = Files.readString(falseProvenance.resolve("object-storage-readiness.yaml"));
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:206: falseProvenance.resolve("object-storage-readiness.yaml"),
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:213: .hasMessageContaining("object-storage-readiness.yaml");
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:218: Files.readString(embeddedFalseProvenance.resolve("object-storage-readiness.yaml"))
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:221: embeddedFalseProvenance.resolve("object-storage-readiness.yaml"),
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:233: .hasMessageContaining("object-storage-readiness.yaml");
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:236: Path fabricatedHeaderFile = fabricatedBranchHeader.resolve("object-storage-readiness.yaml");
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:243: .hasMessageContaining("object-storage-readiness.yaml");
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:246: Path reorderedHeaderFile = reorderedHeader.resolve("object-storage-readiness.yaml");
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/ContractRegistrySchemaGovernanceTest.java:260: .hasMessageContaining("object-storage-readiness.yaml");
|
|
exit=0
|
|
|
|
$ git ls-files | grep -i 'registries/' | head -20
|
|
exit=0
|
|
|
|
=== 8.2 conditional sibling: legacy root adapters vs the new capability ===
|
|
$ grep -n 'autoCreateBucket\|publicAcl' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderBinding.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageSettings.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageConfig.java
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderBinding.java:268: if (settings.autoCreateBucket() || settings.publicAcl()) {
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageSettings.java:46: private boolean autoCreateBucket = true;
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageSettings.java:113: return autoCreateBucket;
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageSettings.java:116: public void setAutoCreateBucket(boolean autoCreateBucket) {
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/ObjectStorageSettings.java:117: this.autoCreateBucket = autoCreateBucket;
|
|
exit=0
|
|
|
|
$ cat -n adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/LegacyObjectStorageActivationGuard.java
|
|
1 package dev.caskeleton.adapter.outbound.objectstorage.config;
|
|
2
|
|
3 import java.util.Arrays;
|
|
4 import org.springframework.context.annotation.Condition;
|
|
5 import org.springframework.context.annotation.ConditionContext;
|
|
6 import org.springframework.core.env.ConfigurableEnvironment;
|
|
7 import org.springframework.core.env.EnumerablePropertySource;
|
|
8 import org.springframework.core.type.AnnotatedTypeMetadata;
|
|
9
|
|
10 /** Activates the deprecated alias only when explicitly present and rejects mixed namespaces. */
|
|
11 public final class LegacyObjectStorageActivationGuard implements Condition {
|
|
12
|
|
13 private static final String LEGACY_PREFIX = "ca-skeleton.objectstorage.";
|
|
14 private static final String CANONICAL_PREFIX = "app.object-storage.";
|
|
15
|
|
16 @Override
|
|
17 public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
|
|
18 boolean legacy = hasPrefix(context, LEGACY_PREFIX);
|
|
19 boolean canonical = hasPrefix(context, CANONICAL_PREFIX);
|
|
20 if (legacy && canonical) {
|
|
21 throw new IllegalStateException(
|
|
22 "legacy and canonical object-storage configuration cannot be combined");
|
|
23 }
|
|
24 return legacy;
|
|
25 }
|
|
26
|
|
27 private static boolean hasPrefix(ConditionContext context, String prefix) {
|
|
28 if (context.getEnvironment() instanceof ConfigurableEnvironment environment) {
|
|
29 for (var propertySource : environment.getPropertySources()) {
|
|
30 if (propertySource instanceof EnumerablePropertySource<?> enumerable
|
|
31 && Arrays.stream(enumerable.getPropertyNames())
|
|
32 .anyMatch(name -> name.startsWith(prefix))) {
|
|
33 return true;
|
|
34 }
|
|
35 }
|
|
36 }
|
|
37 return knownProperties(prefix).stream().anyMatch(context.getEnvironment()::containsProperty);
|
|
38 }
|
|
39
|
|
40 private static java.util.List<String> knownProperties(String prefix) {
|
|
41 if (LEGACY_PREFIX.equals(prefix)) {
|
|
42 return java.util.List.of(
|
|
43 prefix + "backend",
|
|
44 prefix + "base-path",
|
|
45 prefix + "bucket",
|
|
46 prefix + "endpoint",
|
|
47 prefix + "region",
|
|
48 prefix + "access-key",
|
|
49 prefix + "secret-key",
|
|
50 prefix + "path-style-access",
|
|
51 prefix + "auto-create-bucket");
|
|
52 }
|
|
53 return java.util.List.of(
|
|
54 prefix + "enabled",
|
|
55 prefix + "default-destination",
|
|
56 prefix + "legacy.enabled",
|
|
57 prefix + "legacy.backend",
|
|
58 prefix + "legacy.base-path");
|
|
59 }
|
|
60 }
|
|
exit=0
|
|
|
|
$ grep -n 'symbolic link\|isSymbolicLink' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/FilesystemObjectStorageAdapter.java
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:23: if (Files.isSymbolicLink(root)) {
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:24: throw new IllegalArgumentException("local object-storage root cannot be a symbolic link");
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:73: if (Files.isSymbolicLink(target)) {
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:74: throw new IllegalArgumentException("local object target cannot be a symbolic link");
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:86: if (Files.isSymbolicLink(current)) {
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:87: throw new IllegalArgumentException("local object parent cannot be a symbolic link");
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:95: || Files.isSymbolicLink(current)) {
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:109: if (Files.isSymbolicLink(current)) {
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalObjectPathGuard.java:110: throw new IllegalArgumentException("local object parent cannot be a symbolic link");
|
|
exit=0
|
|
|
|
=== 8.3 duplicate mechanism: two capability tables for filesystem-local-dev ===
|
|
$ grep -c 'Support.SUPPORTED' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectStorageProvider.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/FilesystemLocalDevProviderContribution.java
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectStorageProvider.java:6
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/FilesystemLocalDevProviderContribution.java:6
|
|
exit=0
|
|
|
|
$ grep -n 'private static EnumMap' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectStorageProvider.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/FilesystemLocalDevProviderContribution.java
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/LocalDevObjectStorageProvider.java:93: private static EnumMap<Capability, Support> capabilitySupport() {
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/filesystem/FilesystemLocalDevProviderContribution.java:58: private static EnumMap<ObjectStorageProvider.Capability, ObjectStorageProvider.Support>
|
|
exit=0
|
|
|
|
=== 8.4 declared-but-unenforced: adoption claim result ===
|
|
$ grep -n 'ClaimResult claim\|claim !=\|markTerminal\|publications.publish' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/maintenance/LegacyObjectAdoptionService.java
|
|
68: LegacyAdoptionApprovalReplayStore.ClaimResult claim = replayStore.claim(replay);
|
|
69: var published = publications.publish(request.publicationRequest(), inspected.producer());
|
|
70: if (claim != LegacyAdoptionApprovalReplayStore.ClaimResult.TERMINAL_REPLAY) {
|
|
71: replayStore.markTerminal(
|
|
exit=0
|
|
|
|
$ grep -n 'ObjectStorageLegacyMigrationConfig' -B 2 -A 30 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/config/ObjectStorageLegacyMigrationConfig.java | head -45
|
|
25-// This explicit adoption wiring remains active until data/API migration is complete.
|
|
26-@SuppressWarnings("deprecation")
|
|
27:public class ObjectStorageLegacyMigrationConfig {
|
|
28-
|
|
29- @Bean
|
|
30- public LegacyObjectAdoptionPort legacyObjectAdoptionPort(
|
|
31- LegacyObjectInspector inspector,
|
|
32- ManagedObjectPublicationPort publications,
|
|
33- LegacyAdoptionApprovalReplayStore replayStore,
|
|
34- Clock clock) {
|
|
35- return new LegacyObjectAdoptionService(inspector, publications, replayStore, clock);
|
|
36- }
|
|
37-}
|
|
exit=0
|
|
|