This is an automated email from the ASF dual-hosted git repository.
sergehuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/unomi.git
The following commit(s) were added to refs/heads/master by this push:
new 89bcbc779 UNOMI-1026: Keep migrated schema createdBy when bundles
re-save (#938)
89bcbc779 is described below
commit 89bcbc779f1a14fffda0f74e9577c2b10c1cb95e
Author: Serge Huber <[email protected]>
AuthorDate: Sun Nov 1 15:19:32 2026 +0100
UNOMI-1026: Keep migrated schema createdBy when bundles re-save (#938)
Co-authored-by: Claude Opus 5.5 <[email protected]>
---
.../unomi/schema/impl/SchemaServiceImpl.java | 6 +--
.../resources/OSGI-INF/blueprint/blueprint.xml | 2 +
.../unomi/schema/impl/SchemaServiceImplTest.java | 46 +++++++++++++++++++++-
3 files changed, 50 insertions(+), 4 deletions(-)
diff --git
a/extensions/json-schema/services/src/main/java/org/apache/unomi/schema/impl/SchemaServiceImpl.java
b/extensions/json-schema/services/src/main/java/org/apache/unomi/schema/impl/SchemaServiceImpl.java
index 5a7068ac1..b814c5213 100644
---
a/extensions/json-schema/services/src/main/java/org/apache/unomi/schema/impl/SchemaServiceImpl.java
+++
b/extensions/json-schema/services/src/main/java/org/apache/unomi/schema/impl/SchemaServiceImpl.java
@@ -115,9 +115,9 @@ public class SchemaServiceImpl extends
AbstractMultiTypeCachingService implement
}
})
.withBundleItemProcessor((bundleContext, jsonSchemaWrapper) ->
{
- contextManager.executeAsSystem(() -> {
- persistenceService.save(jsonSchemaWrapper);
- });
+ // Use saveItem so new schemas get create audit and
existing create audit is
+ // carried over when a bundle re-saves its schemas
(UNOMI-1026 / UNOMI-997).
+ saveItem(jsonSchemaWrapper, JsonSchemaWrapper::getItemId,
JsonSchemaWrapper.ITEM_TYPE);
})
// Efficient tenant-specific processing
.withTenantRefreshCallback((tenantId, oldTenantState,
newTenantState) -> {
diff --git
a/extensions/json-schema/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
b/extensions/json-schema/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index b89e3d003..4969b9762 100644
---
a/extensions/json-schema/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++
b/extensions/json-schema/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -30,6 +30,7 @@
<reference id="tracerService"
interface="org.apache.unomi.tracing.api.TracerService"/>
<reference id="schedulerService"
interface="org.apache.unomi.api.services.SchedulerService" timeout="2000"/>
<reference id="cacheService"
interface="org.apache.unomi.api.services.cache.MultiTypeCacheService" />
+ <reference id="auditService"
interface="org.apache.unomi.api.tenants.AuditService" availability="optional"/>
<!-- Configuration -->
<cm:property-placeholder persistent-id="org.apache.unomi.schema"
update-strategy="reload">
@@ -50,6 +51,7 @@
<property name="schedulerService" ref="schedulerService"/>
<property name="bundleContext" ref="blueprintBundleContext" />
<property name="cacheService" ref="cacheService" />
+ <property name="auditService" ref="auditService"/>
</bean>
<!-- Services -->
diff --git
a/extensions/json-schema/services/src/test/java/org/apache/unomi/schema/impl/SchemaServiceImplTest.java
b/extensions/json-schema/services/src/test/java/org/apache/unomi/schema/impl/SchemaServiceImplTest.java
index 03fcb5e3e..7e8f2ad2b 100644
---
a/extensions/json-schema/services/src/test/java/org/apache/unomi/schema/impl/SchemaServiceImplTest.java
+++
b/extensions/json-schema/services/src/test/java/org/apache/unomi/schema/impl/SchemaServiceImplTest.java
@@ -25,6 +25,7 @@ import org.apache.unomi.schema.api.JsonSchemaWrapper;
import org.apache.unomi.schema.api.ValidationException;
import org.apache.unomi.schema.api.ValidationError;
import org.apache.unomi.services.TestHelper;
+import org.apache.unomi.services.common.security.AuditServiceImpl;
import org.apache.unomi.services.common.security.KarafSecurityService;
import org.apache.unomi.services.impl.*;
import org.apache.unomi.services.impl.cache.MultiTypeCacheServiceImpl;
@@ -91,7 +92,7 @@ public class SchemaServiceImplTest {
// Create predefined schemas
URL schemasUrl =
getClass().getResource("/META-INF/cxs/schemas/predefined-schemas.json");
when(bundleContext.getBundle().findEntries("META-INF/cxs/schemas",
"*.json", true))
-
.thenReturn(Collections.enumeration(Arrays.asList(schemasUrl)));
+ .thenAnswer(invocation ->
Collections.enumeration(Arrays.asList(schemasUrl)));
schedulerService =
TestHelper.createSchedulerService("schema-scheduler-node", persistenceService,
contextManager, bundleContext, null, -1, true, true);
@@ -106,6 +107,7 @@ public class SchemaServiceImplTest {
schemaService.setSchedulerService(schedulerService);
schemaService.setBundleContext(bundleContext);
schemaService.setCacheService(cacheService);
+ schemaService.setAuditService(new AuditServiceImpl());
schemaService.postConstruct();
}
@@ -119,6 +121,48 @@ public class SchemaServiceImplTest {
}
}
+ @Test
+ public void testBundleCreatedSchemaHasCreateAudit() {
+ // UNOMI-1026: a predefined schema saved for the first time (as after
a migration from a
+ // version without schemas) must get create audit.
+ contextManager.executeAsSystem(() -> {
+ JsonSchemaWrapper saved =
persistenceService.load("https://unomi.apache.org/schemas/json/events/test",
JsonSchemaWrapper.class);
+ assertNotNull("Predefined schema should already be persisted",
saved);
+ assertEquals("system-bundle", saved.getCreatedBy());
+ assertNotNull(saved.getCreationDate());
+ assertEquals("system-bundle", saved.getLastModifiedBy());
+ assertNotNull(saved.getLastModificationDate());
+ return null;
+ });
+ }
+
+ @Test
+ public void testBundleResaveKeepsMigratedCreatedBy() {
+ // UNOMI-1026: reloading predefined schemas after migration must not
wipe create audit.
+ final String schemaId =
"https://unomi.apache.org/schemas/json/events/test";
+ final Date migratedAt = new Date(1_700_000_000_000L);
+
+ contextManager.executeAsSystem(() -> {
+ JsonSchemaWrapper existing = persistenceService.load(schemaId,
JsonSchemaWrapper.class);
+ assertNotNull("Predefined schema should already be persisted",
existing);
+ existing.setCreatedBy("system-migration-4.0.0");
+ existing.setCreationDate(migratedAt);
+ persistenceService.save(existing);
+ return null;
+ });
+
+ // Restart the service so the bundle's predefined schemas are loaded
again, as after an upgrade.
+ schemaService.preDestroy();
+ schemaService.postConstruct();
+
+ contextManager.executeAsSystem(() -> {
+ JsonSchemaWrapper reloaded = persistenceService.load(schemaId,
JsonSchemaWrapper.class);
+ assertEquals("system-migration-4.0.0", reloaded.getCreatedBy());
+ assertEquals(migratedAt, reloaded.getCreationDate());
+ return null;
+ });
+ }
+
@Test
public void testPredefinedSchemas() {
// The schema listener in setup should have already loaded the
predefined schemas