Skip to content

Oak 12219 (test branch in github.com/apache)#2989

Open
reschke wants to merge 14 commits into
trunkfrom
OAK-12219-test2
Open

Oak 12219 (test branch in github.com/apache)#2989
reschke wants to merge 14 commits into
trunkfrom
OAK-12219-test2

Conversation

@reschke

@reschke reschke commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

No description provided.

seropian and others added 5 commits June 30, 2026 10:55
- pin jackson version to the one in AEM to prevent transitive dep download.

Ai-Assisted-By: claude
@github-actions

github-actions Bot commented Jun 30, 2026

Copy link
Copy Markdown

Commit-Check ❌

Commit rejected by Commit-Check.                                  
                                                                  
  (c).-.(c)    (c).-.(c)    (c).-.(c)    (c).-.(c)    (c).-.(c)  
   / ._. \      / ._. \      / ._. \      / ._. \      / ._. \   
 __\( C )/__  __\( H )/__  __\( E )/__  __\( C )/__  __\( K )/__ 
(_.-/'-'\-._)(_.-/'-'\-._)(_.-/'-'\-._)(_.-/'-'\-._)(_.-/'-'\-._)
   || E ||      || R ||      || R ||      || O ||      || R ||   
 _.' '-' '._  _.' '-' '._  _.' '-' '._  _.' '-' '._  _.' '-' '._ 
(.-./`-´\.-.)(.-./`-´\.-.)(.-./`-´\.-.)(.-./`-´\.-.)(.-./`-´\.-.)
 `-´     `-´  `-´     `-´  `-´     `-´  `-´     `-´  `-´     `-´ 
                                                                  
Commit rejected.                                                  
                                                                  
Type message check failed ==> Merge pull request #2986 from seropian/OAK-12219-Upgrade-Azure-SDK-V8-to-V12-for-oak-blob-azure---rework-

Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework 
The commit message should follow Conventional Commits. See https://www.conventionalcommits.org
Suggest: Commit message does not match the required pattern 

--- Commit 8/14:
Type message check failed ==> Merge pull request #2990 from seropian/OAK-12219-Upgrade-Azure-SDK-V8-to-V12-for-oak-blob-azure---rework-

Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework 
The commit message should follow Conventional Commits. See https://www.conventionalcommits.org
Suggest: Commit message does not match the required pattern 

--- Commit 9/14:
Type message check failed ==> Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#2992)

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- removed oak-run-commons dependency on azure sdk v8 from oak-blob-cloud-azure

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- cached the UserDelegationKey to avoid repeated calls to get it from Azure for every URI.

Ai-Assisted-By: claude 
The commit message should follow Conventional Commits. See https://www.conventionalcommits.org
Suggest: Commit message does not match the required pattern 

--- Commit 10/14:
Type message check failed ==> Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#2994)

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed automated code review findings

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- PropertiesUtil.populate() uses reflection to inject config properties (e.g. cacheSize) into the DataStore returned by createDataStore(). When the class is package-private, Java's reflection access control
    blocks it because the caller is in a different package — even if the individual setter methods are public. Making the class itself public fixes that

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code 
The commit message should follow Conventional Commits. See https://www.conventionalcommits.org
Suggest: Commit message does not match the required pattern 

--- Commit 11/14:
Type message check failed ==> Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#2996)

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* Remove internal service reference from comment

Drop 'e.g. oak-repository-service' — internal detail, not relevant to Apache OSS.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: cache HttpClient in AzureBlobContainerProviderV12

Build the Netty HTTP client once at construction instead of on every
getBlobContainer() call. Also drops dead Properties threading and
duplicate proxy/connection-string overloads in UtilsV12.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: replace wildcard imports with explicit imports

Ai-Assisted-By: claude-code

* OAK-12219: move retryOptions into provider, drop getBlobContainerFromServicePrincipals

retryOptions is now a field built at construction instead of passed
per-call. Service-principal auth reuses the cached BlobServiceClient
instead of rebuilding a client on every call.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: address remaining PR #2982 review comments

Use SystemPropertySupplier for the JVM-property override (reschke),
rename registerService to registerDataStoreService (joerghoh), and
match the suggested "falling back to v8" log wording.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude,claude-code

Ai-Assisted-By: claude-code 
The commit message should follow Conventional Commits. See https://www.conventionalcommits.org
Suggest: Commit message does not match the required pattern 

--- Commit 12/14:
Type message check failed ==> Oak 12219 - upgrade azure sdk v8 to v12 for oak blob azure   rework  (#3014)

* OAK-12287: Update to Apache Parent POM to version 39

* OAK-12287: Update to Apache Parent POM to version 39 - revert removal of bundle-plugin version

* OAK-12289 : disabled blob id tracking for document node store (#2987)

* OAK-12289 : disabled blob id tracking for document node store

* OAK-12289 : fixed test case

* OAK-12259: oak-http: OakServlet mis-parses HTTP Basic credentials

* OAK-12293 : bump commons-io to 2.21.0 (#2997)

* OAK-12293 : bump commons-io to 2.22.0

* OAK-12293 : bump commons-io to 2.21.0

* OAK-12294 : bump commons-codec to 1.20.0 (#2998)

* OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001)

* OAK-12295 : bump mongo-driver-sync to 5.3.1

* OAK-12295 : fixed the compilation issues

* OAK-12296 : bump testcontainers version to 2.0.3 (#3002)

* OAK-12296 : bump testcontainers version to 2.0.3

* OAK-12296 : fixed the junit 4 compatibility issues

* OAK-12296 : fixed compatibulity issues with Junit 4

* OAK-12296 : fixed compatibulity issues with ES tests

* OAK-12296 : incorporated review comments to use withEnv override for ElasticTestServer

* OAK-12244: index nodes that gain a mixin rule, delete stale docs when… (#2949)

* OAK-12244: index nodes that gain a mixin rule, delete stale docs when mixin rule is lost (#2938)

When an existing node's applicable indexing rule changes at runtime (e.g. jcr:mixinTypes
added or removed), FulltextIndexEditor did not update the index because propertiesChanged
was never set — jcr:mixinTypes is not normally listed in a rule's property definitions.

Track wasIndexable (rule matched before) alongside isIndexable() (rule matches after).
In leave(), act on transitions:
- !wasIndexable && isIndexable(): node gained a rule → addOrUpdate
- wasIndexable && !isIndexable(): node lost a rule → deleteDocuments

Tests added:
- PropertyIndexCommonTest: two end-to-end integration tests (all backends)
- LuceneIndexEditor2Test: two unit tests verifying writer.docs / writer.deletedPaths

* OAK-12244: fix mixin type changes not reflected in fulltext index (#2953)

Root cause: when a node gains or loses a mixin type at runtime,
FulltextIndexEditor did not update the index because propertiesChanged
was never set — jcr:mixinTypes is not normally listed in a rule's
property definitions.

Fix: track wasIndexable (rule matched before) alongside isIndexable()
(rule matches after). In leave(), act on the indexing-rule transition:
- !wasIndexable && isIndexable(): node gained a rule → addOrUpdate
- wasIndexable && !isIndexable(): node lost a rule → deleteDocument

Split FulltextIndexWriter into two explicit operations:
- deleteDocumentTree(path): node physically removed; cascade is correct
- deleteDocument(path): node lost indexability at runtime; exact only

The original deleteDocuments used a PrefixQuery that cascaded to all
descendants; in the mixin-loss branch this was a bug — children carrying
their own mixin types were incorrectly evicted from the index.

Additional changes:
- Snapshot FT_OAK_12244_DISABLE once per commit cycle in FulltextIndexEditorContext
  as typeChangeTrackingEnabled so enter() and leave() always agree
- Skip getApplicableIndexingRule(before) on the hot path via hasNodeTypeChange
  guard when neither jcr:primaryType nor jcr:mixinTypes changed
- Register FT_OAK_12244 toggle in ElasticIndexProviderService
- Reuse CommitFailedException code 5 for the deleteDocument error path

Tests:
- PropertyIndexCommonTest: end-to-end integration tests (all backends)
- LuceneIndexEditor2Test: unit tests verifying writer.docs / writer.deletedPaths
- Verified: 1245 tests, 0 failures in oak-lucene

---------

Co-authored-by: Benjamin Habegger <bhabegger@adobe.com>

* OAK-12282 : defining a fixed bound for the AbstractDiskCache (#2978)

* OAK-12282 defining a fixed bound for the AbstractDiskCache
---------

Co-authored-by: patlego <patriquelegault@gmail.com>

* OAK-12303: Update mina-core dependency version to 2.1.15 (#3008) (#3010)

ack @telegrapher

Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com>

* Revert "OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001)" (#3012)

This reverts commit 480eb1454028de792fe603b572def624b6a4cccd.

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- Sonar fixes

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- Sonar fixes

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- pin jackson version to the one in AEM to prevent transitive dep download.

Ai-Assisted-By: claude

* OAK-12219: fix Sonar annotations from PR #2989 CI run

AzureBlobStoreBackendV12:
- RuntimeException -> IllegalStateException in getMetadataRecord/getAllMetadataRecords/deleteAllMetadataRecords
- chain DataStoreException (not unwrapped IOException cause) in write() catch block
- .collect(Collectors.toList()) -> .toList() in commitBlocksAndGetSize
- instanceof pattern matching for BlobStorageException in completeHttpUpload
- nested ternary -> if-else for operation string in presigned URI error log
- return new byte[0] instead of null in readMetadataBytes; update caller check

RegressionCSOV8Test:
- swap assertEquals args to (actual, expected) order per Sonar S3415

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: raise unit-test coverage on new V12 code to clear Sonar gate

PR #2989 failed the quality gate at 67.9% coverage on new code (need 80%).
The Azure ITs that cover blob CRUD don't run in CI, so the new V12 classes
were largely uncovered. Add mock-based unit tests (Mockito mocks the Azure
BlobContainerClient/BlockBlobClient chain) so the SDK-call paths are covered
without a live Azurite endpoint.

New/expanded tests:
- AzureBlobStoreBackendV12MockTest (new): read/getRecord/exists/deleteRecord
  success + 404 + storage-error paths; metadata get/exists/delete; init()
  config parsing (concurrent-request clamping, secondary location, presigned
  URI config); getAllIdentifiers/getAllRecords meta+no-dash filtering;
  getAllMetadataRecords success; write exists/missing/length-collision;
  addMetadataRecord(File); initiateHttpUpload arg validation; data record getters
- AzureHttpRequestLoggingPolicyV12Test (new): verbose on/off process() paths
- AzureDataStoreWrapperTest: createDataStore v8/v12, getDescription, init
  delegation, 3-arg upload, statistics provider getter/setter
- AzureBlobContainerProviderV12Test: service-principal credential branch,
  getEndpointUrl variants

Blended new-code coverage (line+branch) on the new files now ~82% locally.

Also make getOrCreateReferenceKey tolerate a null from a readMetadataBytes
override (production returns empty array; test subclasses may return null).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude

* Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#2992)

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- removed oak-run-commons dependency on azure sdk v8 from oak-blob-cloud-azure

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- cached the UserDelegationKey to avoid repeated calls to get it from Azure for every URI.

Ai-Assisted-By: claude

* Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#2994)

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed automated code review findings

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- PropertiesUtil.populate() uses reflection to inject config properties (e.g. cacheSize) into the DataStore returned by createDataStore(). When the class is package-private, Java's reflection access control
    blocks it because the caller is in a different package — even if the individual setter methods are public. Making the class itself public fixes that

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* Remove internal service reference from comment

Drop 'e.g. oak-repository-service' — internal detail, not relevant to Apache OSS.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: cache HttpClient in AzureBlobContainerProviderV12

Build the Netty HTTP client once at construction instead of on every
getBlobContainer() call. Also drops dead Properties threading and
duplicate proxy/connection-string overloads in UtilsV12.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: replace wildcard imports with explicit imports

Ai-Assisted-By: claude-code

* OAK-12219: move retryOptions into provider, drop getBlobContainerFromServicePrincipals

retryOptions is now a field built at construction instead of passed
per-call. Service-principal auth reuses the cached BlobServiceClient
instead of rebuilding a client on every call.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: address remaining PR #2982 review comments

Use SystemPropertySupplier for the JVM-property override (reschke),
rename registerService to registerDataStoreService (joerghoh), and
match the suggested "falling back to v8" log wording.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude,claude-code

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed comments from #2982

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed comments from #2989

---------

Co-authored-by: Julian Reschke <julian.reschke@gmx.de>
Co-authored-by: Rishabh Kumar <rishabhdaim1991@gmail.com>
Co-authored-by: Julian Reschke <reschke@apache.org>
Co-authored-by: Thomas Mueller <thomasm@apache.org>
Co-authored-by: Benjamin Habegger <bhabegger@adobe.com>
Co-authored-by: Patrique Legault <patrique.legault@gmail.com>
Co-authored-by: patlego <patriquelegault@gmail.com>
Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com> 
The commit message should follow Conventional Commits. See https://www.conventionalcommits.org
Suggest: Commit message does not match the required pattern 

--- Commit 13/14:
Type message check failed ==> Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#3015)

* OAK-12287: Update to Apache Parent POM to version 39

* OAK-12287: Update to Apache Parent POM to version 39 - revert removal of bundle-plugin version

* OAK-12289 : disabled blob id tracking for document node store (#2987)

* OAK-12289 : disabled blob id tracking for document node store

* OAK-12289 : fixed test case

* OAK-12259: oak-http: OakServlet mis-parses HTTP Basic credentials

* OAK-12293 : bump commons-io to 2.21.0 (#2997)

* OAK-12293 : bump commons-io to 2.22.0

* OAK-12293 : bump commons-io to 2.21.0

* OAK-12294 : bump commons-codec to 1.20.0 (#2998)

* OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001)

* OAK-12295 : bump mongo-driver-sync to 5.3.1

* OAK-12295 : fixed the compilation issues

* OAK-12296 : bump testcontainers version to 2.0.3 (#3002)

* OAK-12296 : bump testcontainers version to 2.0.3

* OAK-12296 : fixed the junit 4 compatibility issues

* OAK-12296 : fixed compatibulity issues with Junit 4

* OAK-12296 : fixed compatibulity issues with ES tests

* OAK-12296 : incorporated review comments to use withEnv override for ElasticTestServer

* OAK-12244: index nodes that gain a mixin rule, delete stale docs when… (#2949)

* OAK-12244: index nodes that gain a mixin rule, delete stale docs when mixin rule is lost (#2938)

When an existing node's applicable indexing rule changes at runtime (e.g. jcr:mixinTypes
added or removed), FulltextIndexEditor did not update the index because propertiesChanged
was never set — jcr:mixinTypes is not normally listed in a rule's property definitions.

Track wasIndexable (rule matched before) alongside isIndexable() (rule matches after).
In leave(), act on transitions:
- !wasIndexable && isIndexable(): node gained a rule → addOrUpdate
- wasIndexable && !isIndexable(): node lost a rule → deleteDocuments

Tests added:
- PropertyIndexCommonTest: two end-to-end integration tests (all backends)
- LuceneIndexEditor2Test: two unit tests verifying writer.docs / writer.deletedPaths

* OAK-12244: fix mixin type changes not reflected in fulltext index (#2953)

Root cause: when a node gains or loses a mixin type at runtime,
FulltextIndexEditor did not update the index because propertiesChanged
was never set — jcr:mixinTypes is not normally listed in a rule's
property definitions.

Fix: track wasIndexable (rule matched before) alongside isIndexable()
(rule matches after). In leave(), act on the indexing-rule transition:
- !wasIndexable && isIndexable(): node gained a rule → addOrUpdate
- wasIndexable && !isIndexable(): node lost a rule → deleteDocument

Split FulltextIndexWriter into two explicit operations:
- deleteDocumentTree(path): node physically removed; cascade is correct
- deleteDocument(path): node lost indexability at runtime; exact only

The original deleteDocuments used a PrefixQuery that cascaded to all
descendants; in the mixin-loss branch this was a bug — children carrying
their own mixin types were incorrectly evicted from the index.

Additional changes:
- Snapshot FT_OAK_12244_DISABLE once per commit cycle in FulltextIndexEditorContext
  as typeChangeTrackingEnabled so enter() and leave() always agree
- Skip getApplicableIndexingRule(before) on the hot path via hasNodeTypeChange
  guard when neither jcr:primaryType nor jcr:mixinTypes changed
- Register FT_OAK_12244 toggle in ElasticIndexProviderService
- Reuse CommitFailedException code 5 for the deleteDocument error path

Tests:
- PropertyIndexCommonTest: end-to-end integration tests (all backends)
- LuceneIndexEditor2Test: unit tests verifying writer.docs / writer.deletedPaths
- Verified: 1245 tests, 0 failures in oak-lucene

---------

Co-authored-by: Benjamin Habegger <bhabegger@adobe.com>

* OAK-12282 : defining a fixed bound for the AbstractDiskCache (#2978)

* OAK-12282 defining a fixed bound for the AbstractDiskCache
---------

Co-authored-by: patlego <patriquelegault@gmail.com>

* OAK-12303: Update mina-core dependency version to 2.1.15 (#3008) (#3010)

ack @telegrapher

Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com>

* Revert "OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001)" (#3012)

This reverts commit 480eb1454028de792fe603b572def624b6a4cccd.

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- Sonar fixes

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- Sonar fixes

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- pin jackson version to the one in AEM to prevent transitive dep download.

Ai-Assisted-By: claude

* OAK-12219: fix Sonar annotations from PR #2989 CI run

AzureBlobStoreBackendV12:
- RuntimeException -> IllegalStateException in getMetadataRecord/getAllMetadataRecords/deleteAllMetadataRecords
- chain DataStoreException (not unwrapped IOException cause) in write() catch block
- .collect(Collectors.toList()) -> .toList() in commitBlocksAndGetSize
- instanceof pattern matching for BlobStorageException in completeHttpUpload
- nested ternary -> if-else for operation string in presigned URI error log
- return new byte[0] instead of null in readMetadataBytes; update caller check

RegressionCSOV8Test:
- swap assertEquals args to (actual, expected) order per Sonar S3415

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: raise unit-test coverage on new V12 code to clear Sonar gate

PR #2989 failed the quality gate at 67.9% coverage on new code (need 80%).
The Azure ITs that cover blob CRUD don't run in CI, so the new V12 classes
were largely uncovered. Add mock-based unit tests (Mockito mocks the Azure
BlobContainerClient/BlockBlobClient chain) so the SDK-call paths are covered
without a live Azurite endpoint.

New/expanded tests:
- AzureBlobStoreBackendV12MockTest (new): read/getRecord/exists/deleteRecord
  success + 404 + storage-error paths; metadata get/exists/delete; init()
  config parsing (concurrent-request clamping, secondary location, presigned
  URI config); getAllIdentifiers/getAllRecords meta+no-dash filtering;
  getAllMetadataRecords success; write exists/missing/length-collision;
  addMetadataRecord(File); initiateHttpUpload arg validation; data record getters
- AzureHttpRequestLoggingPolicyV12Test (new): verbose on/off process() paths
- AzureDataStoreWrapperTest: createDataStore v8/v12, getDescription, init
  delegation, 3-arg upload, statistics provider getter/setter
- AzureBlobContainerProviderV12Test: service-principal credential branch,
  getEndpointUrl variants

Blended new-code coverage (line+branch) on the new files now ~82% locally.

Also make getOrCreateReferenceKey tolerate a null from a readMetadataBytes
override (production returns empty array; test subclasses may return null).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude

* Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#2992)

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- removed oak-run-commons dependency on azure sdk v8 from oak-blob-cloud-azure

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- cached the UserDelegationKey to avoid repeated calls to get it from Azure for every URI.

Ai-Assisted-By: claude

* Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#2994)

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed automated code review findings

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- PropertiesUtil.populate() uses reflection to inject config properties (e.g. cacheSize) into the DataStore returned by createDataStore(). When the class is package-private, Java's reflection access control
    blocks it because the caller is in a different package — even if the individual setter methods are public. Making the class itself public fixes that

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* Remove internal service reference from comment

Drop 'e.g. oak-repository-service' — internal detail, not relevant to Apache OSS.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: cache HttpClient in AzureBlobContainerProviderV12

Build the Netty HTTP client once at construction instead of on every
getBlobContainer() call. Also drops dead Properties threading and
duplicate proxy/connection-string overloads in UtilsV12.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: replace wildcard imports with explicit imports

Ai-Assisted-By: claude-code

* OAK-12219: move retryOptions into provider, drop getBlobContainerFromServicePrincipals

retryOptions is now a field built at construction instead of passed
per-call. Service-principal auth reuses the cached BlobServiceClient
instead of rebuilding a client on every call.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: address remaining PR #2982 review comments

Use SystemPropertySupplier for the JVM-property override (reschke),
rename registerService to registerDataStoreService (joerghoh), and
match the suggested "falling back to v8" log wording.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude,claude-code

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed comments from #2982

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed comments from #2989

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed compilation fail because of misplaced comment

---------

Co-authored-by: Julian Reschke <julian.reschke@gmx.de>
Co-authored-by: Rishabh Kumar <rishabhdaim1991@gmail.com>
Co-authored-by: Julian Reschke <reschke@apache.org>
Co-authored-by: Thomas Mueller <thomasm@apache.org>
Co-authored-by: Benjamin Habegger <bhabegger@adobe.com>
Co-authored-by: Patrique Legault <patrique.legault@gmail.com>
Co-authored-by: patlego <patriquelegault@gmail.com>
Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com> 
The commit message should follow Conventional Commits. See https://www.conventionalcommits.org
Suggest: Commit message does not match the required pattern 

--- Commit 14/14:
Type message check failed ==> Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#3016)

* OAK-12287: Update to Apache Parent POM to version 39

* OAK-12287: Update to Apache Parent POM to version 39 - revert removal of bundle-plugin version

* OAK-12289 : disabled blob id tracking for document node store (#2987)

* OAK-12289 : disabled blob id tracking for document node store

* OAK-12289 : fixed test case

* OAK-12259: oak-http: OakServlet mis-parses HTTP Basic credentials

* OAK-12293 : bump commons-io to 2.21.0 (#2997)

* OAK-12293 : bump commons-io to 2.22.0

* OAK-12293 : bump commons-io to 2.21.0

* OAK-12294 : bump commons-codec to 1.20.0 (#2998)

* OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001)

* OAK-12295 : bump mongo-driver-sync to 5.3.1

* OAK-12295 : fixed the compilation issues

* OAK-12296 : bump testcontainers version to 2.0.3 (#3002)

* OAK-12296 : bump testcontainers version to 2.0.3

* OAK-12296 : fixed the junit 4 compatibility issues

* OAK-12296 : fixed compatibulity issues with Junit 4

* OAK-12296 : fixed compatibulity issues with ES tests

* OAK-12296 : incorporated review comments to use withEnv override for ElasticTestServer

* OAK-12244: index nodes that gain a mixin rule, delete stale docs when… (#2949)

* OAK-12244: index nodes that gain a mixin rule, delete stale docs when mixin rule is lost (#2938)

When an existing node's applicable indexing rule changes at runtime (e.g. jcr:mixinTypes
added or removed), FulltextIndexEditor did not update the index because propertiesChanged
was never set — jcr:mixinTypes is not normally listed in a rule's property definitions.

Track wasIndexable (rule matched before) alongside isIndexable() (rule matches after).
In leave(), act on transitions:
- !wasIndexable && isIndexable(): node gained a rule → addOrUpdate
- wasIndexable && !isIndexable(): node lost a rule → deleteDocuments

Tests added:
- PropertyIndexCommonTest: two end-to-end integration tests (all backends)
- LuceneIndexEditor2Test: two unit tests verifying writer.docs / writer.deletedPaths

* OAK-12244: fix mixin type changes not reflected in fulltext index (#2953)

Root cause: when a node gains or loses a mixin type at runtime,
FulltextIndexEditor did not update the index because propertiesChanged
was never set — jcr:mixinTypes is not normally listed in a rule's
property definitions.

Fix: track wasIndexable (rule matched before) alongside isIndexable()
(rule matches after). In leave(), act on the indexing-rule transition:
- !wasIndexable && isIndexable(): node gained a rule → addOrUpdate
- wasIndexable && !isIndexable(): node lost a rule → deleteDocument

Split FulltextIndexWriter into two explicit operations:
- deleteDocumentTree(path): node physically removed; cascade is correct
- deleteDocument(path): node lost indexability at runtime; exact only

The original deleteDocuments used a PrefixQuery that cascaded to all
descendants; in the mixin-loss branch this was a bug — children carrying
their own mixin types were incorrectly evicted from the index.

Additional changes:
- Snapshot FT_OAK_12244_DISABLE once per commit cycle in FulltextIndexEditorContext
  as typeChangeTrackingEnabled so enter() and leave() always agree
- Skip getApplicableIndexingRule(before) on the hot path via hasNodeTypeChange
  guard when neither jcr:primaryType nor jcr:mixinTypes changed
- Register FT_OAK_12244 toggle in ElasticIndexProviderService
- Reuse CommitFailedException code 5 for the deleteDocument error path

Tests:
- PropertyIndexCommonTest: end-to-end integration tests (all backends)
- LuceneIndexEditor2Test: unit tests verifying writer.docs / writer.deletedPaths
- Verified: 1245 tests, 0 failures in oak-lucene

---------

Co-authored-by: Benjamin Habegger <bhabegger@adobe.com>

* OAK-12282 : defining a fixed bound for the AbstractDiskCache (#2978)

* OAK-12282 defining a fixed bound for the AbstractDiskCache
---------

Co-authored-by: patlego <patriquelegault@gmail.com>

* OAK-12303: Update mina-core dependency version to 2.1.15 (#3008) (#3010)

ack @telegrapher

Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com>

* Revert "OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001)" (#3012)

This reverts commit 480eb1454028de792fe603b572def624b6a4cccd.

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- Sonar fixes

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- Sonar fixes

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- pin jackson version to the one in AEM to prevent transitive dep download.

Ai-Assisted-By: claude

* OAK-12219: fix Sonar annotations from PR #2989 CI run

AzureBlobStoreBackendV12:
- RuntimeException -> IllegalStateException in getMetadataRecord/getAllMetadataRecords/deleteAllMetadataRecords
- chain DataStoreException (not unwrapped IOException cause) in write() catch block
- .collect(Collectors.toList()) -> .toList() in commitBlocksAndGetSize
- instanceof pattern matching for BlobStorageException in completeHttpUpload
- nested ternary -> if-else for operation string in presigned URI error log
- return new byte[0] instead of null in readMetadataBytes; update caller check

RegressionCSOV8Test:
- swap assertEquals args to (actual, expected) order per Sonar S3415

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: raise unit-test coverage on new V12 code to clear Sonar gate

PR #2989 failed the quality gate at 67.9% coverage on new code (need 80%).
The Azure ITs that cover blob CRUD don't run in CI, so the new V12 classes
were largely uncovered. Add mock-based unit tests (Mockito mocks the Azure
BlobContainerClient/BlockBlobClient chain) so the SDK-call paths are covered
without a live Azurite endpoint.

New/expanded tests:
- AzureBlobStoreBackendV12MockTest (new): read/getRecord/exists/deleteRecord
  success + 404 + storage-error paths; metadata get/exists/delete; init()
  config parsing (concurrent-request clamping, secondary location, presigned
  URI config); getAllIdentifiers/getAllRecords meta+no-dash filtering;
  getAllMetadataRecords success; write exists/missing/length-collision;
  addMetadataRecord(File); initiateHttpUpload arg validation; data record getters
- AzureHttpRequestLoggingPolicyV12Test (new): verbose on/off process() paths
- AzureDataStoreWrapperTest: createDataStore v8/v12, getDescription, init
  delegation, 3-arg upload, statistics provider getter/setter
- AzureBlobContainerProviderV12Test: service-principal credential branch,
  getEndpointUrl variants

Blended new-code coverage (line+branch) on the new files now ~82% locally.

Also make getOrCreateReferenceKey tolerate a null from a readMetadataBytes
override (production returns empty array; test subclasses may return null).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude

* Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#2992)

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- removed oak-run-commons dependency on azure sdk v8 from oak-blob-cloud-azure

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- cached the UserDelegationKey to avoid repeated calls to get it from Azure for every URI.

Ai-Assisted-By: claude

* Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#2994)

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed automated code review findings

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- PropertiesUtil.populate() uses reflection to inject config properties (e.g. cacheSize) into the DataStore returned by createDataStore(). When the class is package-private, Java's reflection access control
    blocks it because the caller is in a different package — even if the individual setter methods are public. Making the class itself public fixes that

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* Remove internal service reference from comment

Drop 'e.g. oak-repository-service' — internal detail, not relevant to Apache OSS.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: cache HttpClient in AzureBlobContainerProviderV12

Build the Netty HTTP client once at construction instead of on every
getBlobContainer() call. Also drops dead Properties threading and
duplicate proxy/connection-string overloads in UtilsV12.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: replace wildcard imports with explicit imports

Ai-Assisted-By: claude-code

* OAK-12219: move retryOptions into provider, drop getBlobContainerFromServicePrincipals

retryOptions is now a field built at construction instead of passed
per-call. Service-principal auth reuses the cached BlobServiceClient
instead of rebuilding a client on every call.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: address remaining PR #2982 review comments

Use SystemPropertySupplier for the JVM-property override (reschke),
rename registerService to registerDataStoreService (joerghoh), and
match the suggested "falling back to v8" log wording.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude,claude-code

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed comments from #2982

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed comments from #2989

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed compilation fail because of misplaced comment

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed test

Ai-Assisted-By: claude

---------

Co-authored-by: Julian Reschke <julian.reschke@gmx.de>
Co-authored-by: Rishabh Kumar <rishabhdaim1991@gmail.com>
Co-authored-by: Julian Reschke <reschke@apache.org>
Co-authored-by: Thomas Mueller <thomasm@apache.org>
Co-authored-by: Benjamin Habegger <bhabegger@adobe.com>
Co-authored-by: Patrique Legault <patrique.legault@gmail.com>
Co-authored-by: patlego <patriquelegault@gmail.com>
Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com> 
The commit message should follow Conventional Commits. See https://www.conventionalcommits.org
Suggest: Commit message does not match the required pattern

seropian and others added 4 commits June 30, 2026 20:14
AzureBlobStoreBackendV12:
- RuntimeException -> IllegalStateException in getMetadataRecord/getAllMetadataRecords/deleteAllMetadataRecords
- chain DataStoreException (not unwrapped IOException cause) in write() catch block
- .collect(Collectors.toList()) -> .toList() in commitBlocksAndGetSize
- instanceof pattern matching for BlobStorageException in completeHttpUpload
- nested ternary -> if-else for operation string in presigned URI error log
- return new byte[0] instead of null in readMetadataBytes; update caller check

RegressionCSOV8Test:
- swap assertEquals args to (actual, expected) order per Sonar S3415

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude-code
PR #2989 failed the quality gate at 67.9% coverage on new code (need 80%).
The Azure ITs that cover blob CRUD don't run in CI, so the new V12 classes
were largely uncovered. Add mock-based unit tests (Mockito mocks the Azure
BlobContainerClient/BlockBlobClient chain) so the SDK-call paths are covered
without a live Azurite endpoint.

New/expanded tests:
- AzureBlobStoreBackendV12MockTest (new): read/getRecord/exists/deleteRecord
  success + 404 + storage-error paths; metadata get/exists/delete; init()
  config parsing (concurrent-request clamping, secondary location, presigned
  URI config); getAllIdentifiers/getAllRecords meta+no-dash filtering;
  getAllMetadataRecords success; write exists/missing/length-collision;
  addMetadataRecord(File); initiateHttpUpload arg validation; data record getters
- AzureHttpRequestLoggingPolicyV12Test (new): verbose on/off process() paths
- AzureDataStoreWrapperTest: createDataStore v8/v12, getDescription, init
  delegation, 3-arg upload, statistics provider getter/setter
- AzureBlobContainerProviderV12Test: service-principal credential branch,
  getEndpointUrl variants

Blended new-code coverage (line+branch) on the new files now ~82% locally.

Also make getOrCreateReferenceKey tolerate a null from a readMetadataBytes
override (production returns empty array; test subclasses may return null).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude
* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- removed oak-run-commons dependency on azure sdk v8 from oak-blob-cloud-azure

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- cached the UserDelegationKey to avoid repeated calls to get it from Azure for every URI.

Ai-Assisted-By: claude
* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed automated code review findings

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- PropertiesUtil.populate() uses reflection to inject config properties (e.g. cacheSize) into the DataStore returned by createDataStore(). When the class is package-private, Java's reflection access control
    blocks it because the caller is in a different package — even if the individual setter methods are public. Making the class itself public fixes that

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code
@reschke reschke changed the title Oak 12219 test2 Oak 12219 (test branch in github.com/apache) Jul 3, 2026

@reschke reschke left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left a few nit comments.

The wrapper class should be reviewed by somebody with more OSGi knowledge.

*
* @deprecated
*/
@Deprecated

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

forRemoval/since?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure, I thought at it before committing but did not have a clear idea

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added some info about what to use.

/**
* Kept for binary compatibility with existing callers. Use {@link AzureDataStoreWrapper} instead.
*
* @deprecated

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add reason to javadoc tag

import java.io.File;
import java.io.InputStream;
import java.net.URI;
import java.util.*;

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no wildcard imports, please.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah, IDE settings. will change

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

Comment thread .gitignore
oak-shaded-guava/dependency-reduced-pom.xml
.DS_Store
.claude/settings.local.json
pom.xml.versionsBackup

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

where does this come from?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it is from maven release, it makes a pom backup and sometimes it fails to delete it

}
activeImpl.setStatisticsProvider(getStatisticsProvider());
// Registers activeImpl separately as AbstractSharedCachingDataStore so consumers
// bound to that type (e.g. oak-repository-service) get the concrete store directly,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

internal client, will remove comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

log.info("Azure SDK v12 flag: environment variable {}={}", ENV_VAR_V12_ENABLED, useV12);
return useV12;
}
if (config.containsKey(OSGI_CONFIG_V12_ENABLED)) {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so we have an OSGi switch, not a feature toggle, right?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we have env var and OSGI switch, priority in this order

@seropian seropian Jul 3, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FT is not suited because it is only for runtime switches while this is one time choice fixed from startup

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But where's the FT? That's OSGi config, right?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is not changed via FT, but only via OSGI admin config. FT is not suitable because of it's lifecycle that does not have persisted values pushed into the component, but only allows runtime polling for changes from the already initialized comonent.

@reschke reschke left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

left a few nit comments

OSGi wiring should be checked by somebody with more knowledge in that area.

@reschke

reschke commented Jul 6, 2026

Copy link
Copy Markdown
Contributor Author

-> #3003

seropian added a commit to seropian/jackrabbit-oak that referenced this pull request Jul 6, 2026
AzureBlobStoreBackendV12:
- RuntimeException -> IllegalStateException in getMetadataRecord/getAllMetadataRecords/deleteAllMetadataRecords
- chain DataStoreException (not unwrapped IOException cause) in write() catch block
- .collect(Collectors.toList()) -> .toList() in commitBlocksAndGetSize
- instanceof pattern matching for BlobStorageException in completeHttpUpload
- nested ternary -> if-else for operation string in presigned URI error log
- return new byte[0] instead of null in readMetadataBytes; update caller check

RegressionCSOV8Test:
- swap assertEquals args to (actual, expected) order per Sonar S3415

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude-code
seropian added a commit to seropian/jackrabbit-oak that referenced this pull request Jul 6, 2026
PR apache#2989 failed the quality gate at 67.9% coverage on new code (need 80%).
The Azure ITs that cover blob CRUD don't run in CI, so the new V12 classes
were largely uncovered. Add mock-based unit tests (Mockito mocks the Azure
BlobContainerClient/BlockBlobClient chain) so the SDK-call paths are covered
without a live Azurite endpoint.

New/expanded tests:
- AzureBlobStoreBackendV12MockTest (new): read/getRecord/exists/deleteRecord
  success + 404 + storage-error paths; metadata get/exists/delete; init()
  config parsing (concurrent-request clamping, secondary location, presigned
  URI config); getAllIdentifiers/getAllRecords meta+no-dash filtering;
  getAllMetadataRecords success; write exists/missing/length-collision;
  addMetadataRecord(File); initiateHttpUpload arg validation; data record getters
- AzureHttpRequestLoggingPolicyV12Test (new): verbose on/off process() paths
- AzureDataStoreWrapperTest: createDataStore v8/v12, getDescription, init
  delegation, 3-arg upload, statistics provider getter/setter
- AzureBlobContainerProviderV12Test: service-principal credential branch,
  getEndpointUrl variants

Blended new-code coverage (line+branch) on the new files now ~82% locally.

Also make getOrCreateReferenceKey tolerate a null from a readMetadataBytes
override (production returns empty array; test subclasses may return null).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code
* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* Remove internal service reference from comment

Drop 'e.g. oak-repository-service' — internal detail, not relevant to Apache OSS.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: cache HttpClient in AzureBlobContainerProviderV12

Build the Netty HTTP client once at construction instead of on every
getBlobContainer() call. Also drops dead Properties threading and
duplicate proxy/connection-string overloads in UtilsV12.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: replace wildcard imports with explicit imports

Ai-Assisted-By: claude-code

* OAK-12219: move retryOptions into provider, drop getBlobContainerFromServicePrincipals

retryOptions is now a field built at construction instead of passed
per-call. Service-principal auth reuses the cached BlobServiceClient
instead of rebuilding a client on every call.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: address remaining PR #2982 review comments

Use SystemPropertySupplier for the JVM-property override (reschke),
rename registerService to registerDataStoreService (joerghoh), and
match the suggested "falling back to v8" log wording.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude,claude-code

Ai-Assisted-By: claude-code
@sonarqubecloud

sonarqubecloud Bot commented Jul 6, 2026

Copy link
Copy Markdown

seropian added a commit to seropian/jackrabbit-oak that referenced this pull request Jul 8, 2026
seropian added a commit to seropian/jackrabbit-oak that referenced this pull request Jul 8, 2026
AzureBlobStoreBackendV12:
- RuntimeException -> IllegalStateException in getMetadataRecord/getAllMetadataRecords/deleteAllMetadataRecords
- chain DataStoreException (not unwrapped IOException cause) in write() catch block
- .collect(Collectors.toList()) -> .toList() in commitBlocksAndGetSize
- instanceof pattern matching for BlobStorageException in completeHttpUpload
- nested ternary -> if-else for operation string in presigned URI error log
- return new byte[0] instead of null in readMetadataBytes; update caller check

RegressionCSOV8Test:
- swap assertEquals args to (actual, expected) order per Sonar S3415

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude-code
seropian added a commit to seropian/jackrabbit-oak that referenced this pull request Jul 8, 2026
PR apache#2989 failed the quality gate at 67.9% coverage on new code (need 80%).
The Azure ITs that cover blob CRUD don't run in CI, so the new V12 classes
were largely uncovered. Add mock-based unit tests (Mockito mocks the Azure
BlobContainerClient/BlockBlobClient chain) so the SDK-call paths are covered
without a live Azurite endpoint.

New/expanded tests:
- AzureBlobStoreBackendV12MockTest (new): read/getRecord/exists/deleteRecord
  success + 404 + storage-error paths; metadata get/exists/delete; init()
  config parsing (concurrent-request clamping, secondary location, presigned
  URI config); getAllIdentifiers/getAllRecords meta+no-dash filtering;
  getAllMetadataRecords success; write exists/missing/length-collision;
  addMetadataRecord(File); initiateHttpUpload arg validation; data record getters
- AzureHttpRequestLoggingPolicyV12Test (new): verbose on/off process() paths
- AzureDataStoreWrapperTest: createDataStore v8/v12, getDescription, init
  delegation, 3-arg upload, statistics provider getter/setter
- AzureBlobContainerProviderV12Test: service-principal credential branch,
  getEndpointUrl variants

Blended new-code coverage (line+branch) on the new files now ~82% locally.

Also make getOrCreateReferenceKey tolerate a null from a readMetadataBytes
override (production returns empty array; test subclasses may return null).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude
seropian added a commit to seropian/jackrabbit-oak that referenced this pull request Jul 8, 2026
seropian and others added 3 commits July 8, 2026 14:43
)

* OAK-12287: Update to Apache Parent POM to version 39

* OAK-12287: Update to Apache Parent POM to version 39 - revert removal of bundle-plugin version

* OAK-12289 : disabled blob id tracking for document node store (#2987)

* OAK-12289 : disabled blob id tracking for document node store

* OAK-12289 : fixed test case

* OAK-12259: oak-http: OakServlet mis-parses HTTP Basic credentials

* OAK-12293 : bump commons-io to 2.21.0 (#2997)

* OAK-12293 : bump commons-io to 2.22.0

* OAK-12293 : bump commons-io to 2.21.0

* OAK-12294 : bump commons-codec to 1.20.0 (#2998)

* OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001)

* OAK-12295 : bump mongo-driver-sync to 5.3.1

* OAK-12295 : fixed the compilation issues

* OAK-12296 : bump testcontainers version to 2.0.3 (#3002)

* OAK-12296 : bump testcontainers version to 2.0.3

* OAK-12296 : fixed the junit 4 compatibility issues

* OAK-12296 : fixed compatibulity issues with Junit 4

* OAK-12296 : fixed compatibulity issues with ES tests

* OAK-12296 : incorporated review comments to use withEnv override for ElasticTestServer

* OAK-12244: index nodes that gain a mixin rule, delete stale docs when… (#2949)

* OAK-12244: index nodes that gain a mixin rule, delete stale docs when mixin rule is lost (#2938)

When an existing node's applicable indexing rule changes at runtime (e.g. jcr:mixinTypes
added or removed), FulltextIndexEditor did not update the index because propertiesChanged
was never set — jcr:mixinTypes is not normally listed in a rule's property definitions.

Track wasIndexable (rule matched before) alongside isIndexable() (rule matches after).
In leave(), act on transitions:
- !wasIndexable && isIndexable(): node gained a rule → addOrUpdate
- wasIndexable && !isIndexable(): node lost a rule → deleteDocuments

Tests added:
- PropertyIndexCommonTest: two end-to-end integration tests (all backends)
- LuceneIndexEditor2Test: two unit tests verifying writer.docs / writer.deletedPaths

* OAK-12244: fix mixin type changes not reflected in fulltext index (#2953)

Root cause: when a node gains or loses a mixin type at runtime,
FulltextIndexEditor did not update the index because propertiesChanged
was never set — jcr:mixinTypes is not normally listed in a rule's
property definitions.

Fix: track wasIndexable (rule matched before) alongside isIndexable()
(rule matches after). In leave(), act on the indexing-rule transition:
- !wasIndexable && isIndexable(): node gained a rule → addOrUpdate
- wasIndexable && !isIndexable(): node lost a rule → deleteDocument

Split FulltextIndexWriter into two explicit operations:
- deleteDocumentTree(path): node physically removed; cascade is correct
- deleteDocument(path): node lost indexability at runtime; exact only

The original deleteDocuments used a PrefixQuery that cascaded to all
descendants; in the mixin-loss branch this was a bug — children carrying
their own mixin types were incorrectly evicted from the index.

Additional changes:
- Snapshot FT_OAK_12244_DISABLE once per commit cycle in FulltextIndexEditorContext
  as typeChangeTrackingEnabled so enter() and leave() always agree
- Skip getApplicableIndexingRule(before) on the hot path via hasNodeTypeChange
  guard when neither jcr:primaryType nor jcr:mixinTypes changed
- Register FT_OAK_12244 toggle in ElasticIndexProviderService
- Reuse CommitFailedException code 5 for the deleteDocument error path

Tests:
- PropertyIndexCommonTest: end-to-end integration tests (all backends)
- LuceneIndexEditor2Test: unit tests verifying writer.docs / writer.deletedPaths
- Verified: 1245 tests, 0 failures in oak-lucene

---------

Co-authored-by: Benjamin Habegger <bhabegger@adobe.com>

* OAK-12282 : defining a fixed bound for the AbstractDiskCache (#2978)

* OAK-12282 defining a fixed bound for the AbstractDiskCache
---------

Co-authored-by: patlego <patriquelegault@gmail.com>

* OAK-12303: Update mina-core dependency version to 2.1.15 (#3008) (#3010)

ack @telegrapher

Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com>

* Revert "OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001)" (#3012)

This reverts commit 480eb14.

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- Sonar fixes

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- Sonar fixes

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- pin jackson version to the one in AEM to prevent transitive dep download.

Ai-Assisted-By: claude

* OAK-12219: fix Sonar annotations from PR #2989 CI run

AzureBlobStoreBackendV12:
- RuntimeException -> IllegalStateException in getMetadataRecord/getAllMetadataRecords/deleteAllMetadataRecords
- chain DataStoreException (not unwrapped IOException cause) in write() catch block
- .collect(Collectors.toList()) -> .toList() in commitBlocksAndGetSize
- instanceof pattern matching for BlobStorageException in completeHttpUpload
- nested ternary -> if-else for operation string in presigned URI error log
- return new byte[0] instead of null in readMetadataBytes; update caller check

RegressionCSOV8Test:
- swap assertEquals args to (actual, expected) order per Sonar S3415

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: raise unit-test coverage on new V12 code to clear Sonar gate

PR #2989 failed the quality gate at 67.9% coverage on new code (need 80%).
The Azure ITs that cover blob CRUD don't run in CI, so the new V12 classes
were largely uncovered. Add mock-based unit tests (Mockito mocks the Azure
BlobContainerClient/BlockBlobClient chain) so the SDK-call paths are covered
without a live Azurite endpoint.

New/expanded tests:
- AzureBlobStoreBackendV12MockTest (new): read/getRecord/exists/deleteRecord
  success + 404 + storage-error paths; metadata get/exists/delete; init()
  config parsing (concurrent-request clamping, secondary location, presigned
  URI config); getAllIdentifiers/getAllRecords meta+no-dash filtering;
  getAllMetadataRecords success; write exists/missing/length-collision;
  addMetadataRecord(File); initiateHttpUpload arg validation; data record getters
- AzureHttpRequestLoggingPolicyV12Test (new): verbose on/off process() paths
- AzureDataStoreWrapperTest: createDataStore v8/v12, getDescription, init
  delegation, 3-arg upload, statistics provider getter/setter
- AzureBlobContainerProviderV12Test: service-principal credential branch,
  getEndpointUrl variants

Blended new-code coverage (line+branch) on the new files now ~82% locally.

Also make getOrCreateReferenceKey tolerate a null from a readMetadataBytes
override (production returns empty array; test subclasses may return null).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude

* Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#2992)

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- removed oak-run-commons dependency on azure sdk v8 from oak-blob-cloud-azure

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- cached the UserDelegationKey to avoid repeated calls to get it from Azure for every URI.

Ai-Assisted-By: claude

* Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#2994)

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed automated code review findings

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- PropertiesUtil.populate() uses reflection to inject config properties (e.g. cacheSize) into the DataStore returned by createDataStore(). When the class is package-private, Java's reflection access control
    blocks it because the caller is in a different package — even if the individual setter methods are public. Making the class itself public fixes that

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* Remove internal service reference from comment

Drop 'e.g. oak-repository-service' — internal detail, not relevant to Apache OSS.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: cache HttpClient in AzureBlobContainerProviderV12

Build the Netty HTTP client once at construction instead of on every
getBlobContainer() call. Also drops dead Properties threading and
duplicate proxy/connection-string overloads in UtilsV12.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: replace wildcard imports with explicit imports

Ai-Assisted-By: claude-code

* OAK-12219: move retryOptions into provider, drop getBlobContainerFromServicePrincipals

retryOptions is now a field built at construction instead of passed
per-call. Service-principal auth reuses the cached BlobServiceClient
instead of rebuilding a client on every call.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: address remaining PR #2982 review comments

Use SystemPropertySupplier for the JVM-property override (reschke),
rename registerService to registerDataStoreService (joerghoh), and
match the suggested "falling back to v8" log wording.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude,claude-code

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed comments from #2982

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed comments from #2989

---------

Co-authored-by: Julian Reschke <julian.reschke@gmx.de>
Co-authored-by: Rishabh Kumar <rishabhdaim1991@gmail.com>
Co-authored-by: Julian Reschke <reschke@apache.org>
Co-authored-by: Thomas Mueller <thomasm@apache.org>
Co-authored-by: Benjamin Habegger <bhabegger@adobe.com>
Co-authored-by: Patrique Legault <patrique.legault@gmail.com>
Co-authored-by: patlego <patriquelegault@gmail.com>
Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com>
* OAK-12287: Update to Apache Parent POM to version 39

* OAK-12287: Update to Apache Parent POM to version 39 - revert removal of bundle-plugin version

* OAK-12289 : disabled blob id tracking for document node store (#2987)

* OAK-12289 : disabled blob id tracking for document node store

* OAK-12289 : fixed test case

* OAK-12259: oak-http: OakServlet mis-parses HTTP Basic credentials

* OAK-12293 : bump commons-io to 2.21.0 (#2997)

* OAK-12293 : bump commons-io to 2.22.0

* OAK-12293 : bump commons-io to 2.21.0

* OAK-12294 : bump commons-codec to 1.20.0 (#2998)

* OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001)

* OAK-12295 : bump mongo-driver-sync to 5.3.1

* OAK-12295 : fixed the compilation issues

* OAK-12296 : bump testcontainers version to 2.0.3 (#3002)

* OAK-12296 : bump testcontainers version to 2.0.3

* OAK-12296 : fixed the junit 4 compatibility issues

* OAK-12296 : fixed compatibulity issues with Junit 4

* OAK-12296 : fixed compatibulity issues with ES tests

* OAK-12296 : incorporated review comments to use withEnv override for ElasticTestServer

* OAK-12244: index nodes that gain a mixin rule, delete stale docs when… (#2949)

* OAK-12244: index nodes that gain a mixin rule, delete stale docs when mixin rule is lost (#2938)

When an existing node's applicable indexing rule changes at runtime (e.g. jcr:mixinTypes
added or removed), FulltextIndexEditor did not update the index because propertiesChanged
was never set — jcr:mixinTypes is not normally listed in a rule's property definitions.

Track wasIndexable (rule matched before) alongside isIndexable() (rule matches after).
In leave(), act on transitions:
- !wasIndexable && isIndexable(): node gained a rule → addOrUpdate
- wasIndexable && !isIndexable(): node lost a rule → deleteDocuments

Tests added:
- PropertyIndexCommonTest: two end-to-end integration tests (all backends)
- LuceneIndexEditor2Test: two unit tests verifying writer.docs / writer.deletedPaths

* OAK-12244: fix mixin type changes not reflected in fulltext index (#2953)

Root cause: when a node gains or loses a mixin type at runtime,
FulltextIndexEditor did not update the index because propertiesChanged
was never set — jcr:mixinTypes is not normally listed in a rule's
property definitions.

Fix: track wasIndexable (rule matched before) alongside isIndexable()
(rule matches after). In leave(), act on the indexing-rule transition:
- !wasIndexable && isIndexable(): node gained a rule → addOrUpdate
- wasIndexable && !isIndexable(): node lost a rule → deleteDocument

Split FulltextIndexWriter into two explicit operations:
- deleteDocumentTree(path): node physically removed; cascade is correct
- deleteDocument(path): node lost indexability at runtime; exact only

The original deleteDocuments used a PrefixQuery that cascaded to all
descendants; in the mixin-loss branch this was a bug — children carrying
their own mixin types were incorrectly evicted from the index.

Additional changes:
- Snapshot FT_OAK_12244_DISABLE once per commit cycle in FulltextIndexEditorContext
  as typeChangeTrackingEnabled so enter() and leave() always agree
- Skip getApplicableIndexingRule(before) on the hot path via hasNodeTypeChange
  guard when neither jcr:primaryType nor jcr:mixinTypes changed
- Register FT_OAK_12244 toggle in ElasticIndexProviderService
- Reuse CommitFailedException code 5 for the deleteDocument error path

Tests:
- PropertyIndexCommonTest: end-to-end integration tests (all backends)
- LuceneIndexEditor2Test: unit tests verifying writer.docs / writer.deletedPaths
- Verified: 1245 tests, 0 failures in oak-lucene

---------

Co-authored-by: Benjamin Habegger <bhabegger@adobe.com>

* OAK-12282 : defining a fixed bound for the AbstractDiskCache (#2978)

* OAK-12282 defining a fixed bound for the AbstractDiskCache
---------

Co-authored-by: patlego <patriquelegault@gmail.com>

* OAK-12303: Update mina-core dependency version to 2.1.15 (#3008) (#3010)

ack @telegrapher

Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com>

* Revert "OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001)" (#3012)

This reverts commit 480eb14.

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- Sonar fixes

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- Sonar fixes

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- pin jackson version to the one in AEM to prevent transitive dep download.

Ai-Assisted-By: claude

* OAK-12219: fix Sonar annotations from PR #2989 CI run

AzureBlobStoreBackendV12:
- RuntimeException -> IllegalStateException in getMetadataRecord/getAllMetadataRecords/deleteAllMetadataRecords
- chain DataStoreException (not unwrapped IOException cause) in write() catch block
- .collect(Collectors.toList()) -> .toList() in commitBlocksAndGetSize
- instanceof pattern matching for BlobStorageException in completeHttpUpload
- nested ternary -> if-else for operation string in presigned URI error log
- return new byte[0] instead of null in readMetadataBytes; update caller check

RegressionCSOV8Test:
- swap assertEquals args to (actual, expected) order per Sonar S3415

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: raise unit-test coverage on new V12 code to clear Sonar gate

PR #2989 failed the quality gate at 67.9% coverage on new code (need 80%).
The Azure ITs that cover blob CRUD don't run in CI, so the new V12 classes
were largely uncovered. Add mock-based unit tests (Mockito mocks the Azure
BlobContainerClient/BlockBlobClient chain) so the SDK-call paths are covered
without a live Azurite endpoint.

New/expanded tests:
- AzureBlobStoreBackendV12MockTest (new): read/getRecord/exists/deleteRecord
  success + 404 + storage-error paths; metadata get/exists/delete; init()
  config parsing (concurrent-request clamping, secondary location, presigned
  URI config); getAllIdentifiers/getAllRecords meta+no-dash filtering;
  getAllMetadataRecords success; write exists/missing/length-collision;
  addMetadataRecord(File); initiateHttpUpload arg validation; data record getters
- AzureHttpRequestLoggingPolicyV12Test (new): verbose on/off process() paths
- AzureDataStoreWrapperTest: createDataStore v8/v12, getDescription, init
  delegation, 3-arg upload, statistics provider getter/setter
- AzureBlobContainerProviderV12Test: service-principal credential branch,
  getEndpointUrl variants

Blended new-code coverage (line+branch) on the new files now ~82% locally.

Also make getOrCreateReferenceKey tolerate a null from a readMetadataBytes
override (production returns empty array; test subclasses may return null).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude

* Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#2992)

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- removed oak-run-commons dependency on azure sdk v8 from oak-blob-cloud-azure

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- cached the UserDelegationKey to avoid repeated calls to get it from Azure for every URI.

Ai-Assisted-By: claude

* Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#2994)

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed automated code review findings

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- PropertiesUtil.populate() uses reflection to inject config properties (e.g. cacheSize) into the DataStore returned by createDataStore(). When the class is package-private, Java's reflection access control
    blocks it because the caller is in a different package — even if the individual setter methods are public. Making the class itself public fixes that

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* Remove internal service reference from comment

Drop 'e.g. oak-repository-service' — internal detail, not relevant to Apache OSS.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: cache HttpClient in AzureBlobContainerProviderV12

Build the Netty HTTP client once at construction instead of on every
getBlobContainer() call. Also drops dead Properties threading and
duplicate proxy/connection-string overloads in UtilsV12.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: replace wildcard imports with explicit imports

Ai-Assisted-By: claude-code

* OAK-12219: move retryOptions into provider, drop getBlobContainerFromServicePrincipals

retryOptions is now a field built at construction instead of passed
per-call. Service-principal auth reuses the cached BlobServiceClient
instead of rebuilding a client on every call.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: address remaining PR #2982 review comments

Use SystemPropertySupplier for the JVM-property override (reschke),
rename registerService to registerDataStoreService (joerghoh), and
match the suggested "falling back to v8" log wording.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude,claude-code

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed comments from #2982

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed comments from #2989

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed compilation fail because of misplaced comment

---------

Co-authored-by: Julian Reschke <julian.reschke@gmx.de>
Co-authored-by: Rishabh Kumar <rishabhdaim1991@gmail.com>
Co-authored-by: Julian Reschke <reschke@apache.org>
Co-authored-by: Thomas Mueller <thomasm@apache.org>
Co-authored-by: Benjamin Habegger <bhabegger@adobe.com>
Co-authored-by: Patrique Legault <patrique.legault@gmail.com>
Co-authored-by: patlego <patriquelegault@gmail.com>
Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com>
* OAK-12287: Update to Apache Parent POM to version 39

* OAK-12287: Update to Apache Parent POM to version 39 - revert removal of bundle-plugin version

* OAK-12289 : disabled blob id tracking for document node store (#2987)

* OAK-12289 : disabled blob id tracking for document node store

* OAK-12289 : fixed test case

* OAK-12259: oak-http: OakServlet mis-parses HTTP Basic credentials

* OAK-12293 : bump commons-io to 2.21.0 (#2997)

* OAK-12293 : bump commons-io to 2.22.0

* OAK-12293 : bump commons-io to 2.21.0

* OAK-12294 : bump commons-codec to 1.20.0 (#2998)

* OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001)

* OAK-12295 : bump mongo-driver-sync to 5.3.1

* OAK-12295 : fixed the compilation issues

* OAK-12296 : bump testcontainers version to 2.0.3 (#3002)

* OAK-12296 : bump testcontainers version to 2.0.3

* OAK-12296 : fixed the junit 4 compatibility issues

* OAK-12296 : fixed compatibulity issues with Junit 4

* OAK-12296 : fixed compatibulity issues with ES tests

* OAK-12296 : incorporated review comments to use withEnv override for ElasticTestServer

* OAK-12244: index nodes that gain a mixin rule, delete stale docs when… (#2949)

* OAK-12244: index nodes that gain a mixin rule, delete stale docs when mixin rule is lost (#2938)

When an existing node's applicable indexing rule changes at runtime (e.g. jcr:mixinTypes
added or removed), FulltextIndexEditor did not update the index because propertiesChanged
was never set — jcr:mixinTypes is not normally listed in a rule's property definitions.

Track wasIndexable (rule matched before) alongside isIndexable() (rule matches after).
In leave(), act on transitions:
- !wasIndexable && isIndexable(): node gained a rule → addOrUpdate
- wasIndexable && !isIndexable(): node lost a rule → deleteDocuments

Tests added:
- PropertyIndexCommonTest: two end-to-end integration tests (all backends)
- LuceneIndexEditor2Test: two unit tests verifying writer.docs / writer.deletedPaths

* OAK-12244: fix mixin type changes not reflected in fulltext index (#2953)

Root cause: when a node gains or loses a mixin type at runtime,
FulltextIndexEditor did not update the index because propertiesChanged
was never set — jcr:mixinTypes is not normally listed in a rule's
property definitions.

Fix: track wasIndexable (rule matched before) alongside isIndexable()
(rule matches after). In leave(), act on the indexing-rule transition:
- !wasIndexable && isIndexable(): node gained a rule → addOrUpdate
- wasIndexable && !isIndexable(): node lost a rule → deleteDocument

Split FulltextIndexWriter into two explicit operations:
- deleteDocumentTree(path): node physically removed; cascade is correct
- deleteDocument(path): node lost indexability at runtime; exact only

The original deleteDocuments used a PrefixQuery that cascaded to all
descendants; in the mixin-loss branch this was a bug — children carrying
their own mixin types were incorrectly evicted from the index.

Additional changes:
- Snapshot FT_OAK_12244_DISABLE once per commit cycle in FulltextIndexEditorContext
  as typeChangeTrackingEnabled so enter() and leave() always agree
- Skip getApplicableIndexingRule(before) on the hot path via hasNodeTypeChange
  guard when neither jcr:primaryType nor jcr:mixinTypes changed
- Register FT_OAK_12244 toggle in ElasticIndexProviderService
- Reuse CommitFailedException code 5 for the deleteDocument error path

Tests:
- PropertyIndexCommonTest: end-to-end integration tests (all backends)
- LuceneIndexEditor2Test: unit tests verifying writer.docs / writer.deletedPaths
- Verified: 1245 tests, 0 failures in oak-lucene

---------

Co-authored-by: Benjamin Habegger <bhabegger@adobe.com>

* OAK-12282 : defining a fixed bound for the AbstractDiskCache (#2978)

* OAK-12282 defining a fixed bound for the AbstractDiskCache
---------

Co-authored-by: patlego <patriquelegault@gmail.com>

* OAK-12303: Update mina-core dependency version to 2.1.15 (#3008) (#3010)

ack @telegrapher

Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com>

* Revert "OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001)" (#3012)

This reverts commit 480eb14.

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- Sonar fixes

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- Sonar fixes

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- pin jackson version to the one in AEM to prevent transitive dep download.

Ai-Assisted-By: claude

* OAK-12219: fix Sonar annotations from PR #2989 CI run

AzureBlobStoreBackendV12:
- RuntimeException -> IllegalStateException in getMetadataRecord/getAllMetadataRecords/deleteAllMetadataRecords
- chain DataStoreException (not unwrapped IOException cause) in write() catch block
- .collect(Collectors.toList()) -> .toList() in commitBlocksAndGetSize
- instanceof pattern matching for BlobStorageException in completeHttpUpload
- nested ternary -> if-else for operation string in presigned URI error log
- return new byte[0] instead of null in readMetadataBytes; update caller check

RegressionCSOV8Test:
- swap assertEquals args to (actual, expected) order per Sonar S3415

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: raise unit-test coverage on new V12 code to clear Sonar gate

PR #2989 failed the quality gate at 67.9% coverage on new code (need 80%).
The Azure ITs that cover blob CRUD don't run in CI, so the new V12 classes
were largely uncovered. Add mock-based unit tests (Mockito mocks the Azure
BlobContainerClient/BlockBlobClient chain) so the SDK-call paths are covered
without a live Azurite endpoint.

New/expanded tests:
- AzureBlobStoreBackendV12MockTest (new): read/getRecord/exists/deleteRecord
  success + 404 + storage-error paths; metadata get/exists/delete; init()
  config parsing (concurrent-request clamping, secondary location, presigned
  URI config); getAllIdentifiers/getAllRecords meta+no-dash filtering;
  getAllMetadataRecords success; write exists/missing/length-collision;
  addMetadataRecord(File); initiateHttpUpload arg validation; data record getters
- AzureHttpRequestLoggingPolicyV12Test (new): verbose on/off process() paths
- AzureDataStoreWrapperTest: createDataStore v8/v12, getDescription, init
  delegation, 3-arg upload, statistics provider getter/setter
- AzureBlobContainerProviderV12Test: service-principal credential branch,
  getEndpointUrl variants

Blended new-code coverage (line+branch) on the new files now ~82% locally.

Also make getOrCreateReferenceKey tolerate a null from a readMetadataBytes
override (production returns empty array; test subclasses may return null).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Ai-Assisted-By: claude

* Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#2992)

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- removed oak-run-commons dependency on azure sdk v8 from oak-blob-cloud-azure

Ai-Assisted-By: claude

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- cached the UserDelegationKey to avoid repeated calls to get it from Azure for every URI.

Ai-Assisted-By: claude

* Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure   rework  (#2994)

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed automated code review findings

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- PropertiesUtil.populate() uses reflection to inject config properties (e.g. cacheSize) into the DataStore returned by createDataStore(). When the class is package-private, Java's reflection access control
    blocks it because the caller is in a different package — even if the individual setter methods are public. Making the class itself public fixes that

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob upload/download related constants that control memory and streaming behavior

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fix blob block size, prevent size zero

Ai-Assisted-By: claude

Ai-Assisted-By: claude-code

* Remove internal service reference from comment

Drop 'e.g. oak-repository-service' — internal detail, not relevant to Apache OSS.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: cache HttpClient in AzureBlobContainerProviderV12

Build the Netty HTTP client once at construction instead of on every
getBlobContainer() call. Also drops dead Properties threading and
duplicate proxy/connection-string overloads in UtilsV12.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: replace wildcard imports with explicit imports

Ai-Assisted-By: claude-code

* OAK-12219: move retryOptions into provider, drop getBlobContainerFromServicePrincipals

retryOptions is now a field built at construction instead of passed
per-call. Service-principal auth reuses the cached BlobServiceClient
instead of rebuilding a client on every call.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude-code

* OAK-12219: address remaining PR #2982 review comments

Use SystemPropertySupplier for the JVM-property override (reschke),
rename registerService to registerDataStoreService (joerghoh), and
match the suggested "falling back to v8" log wording.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Ai-Assisted-By: claude,claude-code

Ai-Assisted-By: claude-code

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed comments from #2982

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed comments from #2989

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed compilation fail because of misplaced comment

* OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework
- fixed test

Ai-Assisted-By: claude

---------

Co-authored-by: Julian Reschke <julian.reschke@gmx.de>
Co-authored-by: Rishabh Kumar <rishabhdaim1991@gmail.com>
Co-authored-by: Julian Reschke <reschke@apache.org>
Co-authored-by: Thomas Mueller <thomasm@apache.org>
Co-authored-by: Benjamin Habegger <bhabegger@adobe.com>
Co-authored-by: Patrique Legault <patrique.legault@gmail.com>
Co-authored-by: patlego <patriquelegault@gmail.com>
Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants