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

Reply via email to