This is an automated email from the ASF dual-hosted git repository.

amichair pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/aries-rsa.git

commit e5bd3cc85414591dff2c38304697d20d0e42e00d
Author: Amichai Rothman <[email protected]>
AuthorDate: Thu Apr 30 01:41:12 2026 +0300

    ARIES-2204 Fix EventAdmin event properties not spec-compliant
---
 .../aries/rsa/core/event/EventAdminSender.java     | 64 ++++++++++++++++------
 1 file changed, 48 insertions(+), 16 deletions(-)

diff --git 
a/rsa/src/main/java/org/apache/aries/rsa/core/event/EventAdminSender.java 
b/rsa/src/main/java/org/apache/aries/rsa/core/event/EventAdminSender.java
index 724362e1..9c8ce797 100644
--- a/rsa/src/main/java/org/apache/aries/rsa/core/event/EventAdminSender.java
+++ b/rsa/src/main/java/org/apache/aries/rsa/core/event/EventAdminSender.java
@@ -20,15 +20,19 @@ package org.apache.aries.rsa.core.event;
 
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+import java.security.cert.X509Certificate;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
 import org.osgi.service.event.Event;
 import org.osgi.service.event.EventAdmin;
 import org.osgi.service.remoteserviceadmin.EndpointDescription;
+import org.osgi.service.remoteserviceadmin.ExportReference;
 import org.osgi.service.remoteserviceadmin.ImportReference;
 import org.osgi.service.remoteserviceadmin.RemoteServiceAdminEvent;
 
@@ -73,32 +77,60 @@ public class EventAdminSender {
         notifyEventAdmins(event);
     }
 
-    private Map<String, Object> createProps(RemoteServiceAdminEvent rsaEvent) {
+    private static <K, V> void putIfNotNull(Map<K, V> map, K key, V val) {
+        if (val != null) {
+            map.put(key, val);
+        }
+    }
+
+    private Map<String, Object> createProps(RemoteServiceAdminEvent rsae) {
         Map<String, Object> props = new HashMap<>();
-        Bundle bundle = rsaEvent.getSource();
+        // bundle properties
+        Bundle bundle = rsae.getSource();
         props.put("bundle", bundle);
         props.put("bundle.id", bundle.getBundleId());
         props.put("bundle.symbolicname", bundle.getSymbolicName());
-        props.put("bundle.version", bundle.getVersion());
-        props.put("bundle.signer", ""); // TODO What to put here
-        Throwable exception = rsaEvent.getException();
+
+        String version = bundle.getHeaders().get("Bundle-Version");
+        Version v = version != null ? new Version(version) : 
Version.emptyVersion;
+        putIfNotNull(props, "bundle.version", v);
+
+        Map<X509Certificate, List<X509Certificate>> signers = 
bundle.getSignerCertificates(Bundle.SIGNERS_ALL);
+        if (signers != null) {
+            String[] names = signers.keySet().stream()
+                    .map(cert -> cert.getSubjectX500Principal().getName())
+                    .filter(s -> s != null && !s.isEmpty())
+                    .toArray(String[]::new);
+            if (names.length > 0) {
+                props.put("bundle.signer", names);
+            }
+        }
+
+        // exception properties
+        Throwable exception = rsae.getException();
         if (exception != null) {
             props.put("exception", exception);
             props.put("exception.class", exception.getClass().getName());
-            props.put("exception.message", exception.getMessage());
-        }
-        if (rsaEvent.getExportReference() != null) {
-            EndpointDescription endpoint = 
rsaEvent.getExportReference().getExportedEndpoint();
-            props.put("endpoint.framework.uuid", endpoint.getFrameworkUUID());
-            props.put("endpoint.id", endpoint.getId());
-            props.put("objectClass", endpoint.getInterfaces());
+            putIfNotNull(props, "exception.message", exception.getMessage());
         }
-        ImportReference importReference = rsaEvent.getImportReference();
-        if (importReference != null && importReference.getImportedEndpoint() 
!= null) {
-            props.put("service.imported.configs", 
importReference.getImportedEndpoint().getConfigurationTypes());
+
+        // endpoint properties
+        ImportReference importReference = rsae.getImportReference();
+        ExportReference exportReference = rsae.getExportReference();
+        EndpointDescription endpoint = importReference == null ? null : 
importReference.getImportedEndpoint();
+        endpoint = endpoint == null && exportReference != null ? 
exportReference.getExportedEndpoint() : endpoint;
+        if (endpoint != null) {
+            putIfNotNull(props, "endpoint.service.id", 
endpoint.getServiceId());
+            putIfNotNull(props, "endpoint.framework.uuid", 
endpoint.getFrameworkUUID());
+            putIfNotNull(props, "endpoint.id", endpoint.getId());
+            props.put("objectClass", endpoint.getInterfaces().toArray(new 
String[0]));
+            putIfNotNull(props, "service.imported.configs", 
endpoint.getConfigurationTypes());
         }
+
+        // general properties
         props.put("timestamp", System.currentTimeMillis());
-        props.put("event", rsaEvent);
+        props.put("event", rsae);
+
         return props;
     }
 }

Reply via email to