Fix several issues when having more than one RSA
diff --git a/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java b/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java
index 3316a93..b20e53b 100644
--- a/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java
+++ b/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java
@@ -116,7 +116,9 @@
try {
ExportRegistration exportReg = exportService(interfaceNames, serviceReference, serviceProperties);
exportRegs = new ArrayList<>();
- exportRegs.add(exportReg);
+ if (exportReg != null) {
+ exportRegs.add(exportReg);
+ }
store(key, exportRegs);
return exportRegs;
} finally {
@@ -204,6 +206,9 @@
// TODO unget service when export is destroyed
Object serviceO = serviceContext.getService(serviceReference);
Endpoint endpoint = provider.exportService(serviceO, serviceContext, eprops, interfaces);
+ if (endpoint == null) {
+ return null;
+ }
return new ExportRegistrationImpl(serviceReference, endpoint, this);
} catch (Exception e) {
return new ExportRegistrationImpl(this, e);
@@ -291,11 +296,14 @@
for (ExportRegistration exportRegistration : regs) {
if (exportRegistration instanceof ExportRegistrationImpl) {
ExportRegistrationImpl exportRegistrationImpl = (ExportRegistrationImpl) exportRegistration;
- EndpointDescription epd = exportRegistration.getExportReference().getExportedEndpoint();
- // create one copy for each distinct endpoint description
- if (!copiedEndpoints.contains(epd)) {
- copiedEndpoints.add(epd);
- copy.add(new ExportRegistrationImpl(exportRegistrationImpl));
+ if (exportRegistration.getException() == null) {
+ // Can only retrieve reference if we have no exception
+ EndpointDescription epd = exportRegistration.getExportReference().getExportedEndpoint();
+ // create one copy for each distinct endpoint description
+ if (!copiedEndpoints.contains(epd)) {
+ copiedEndpoints.add(epd);
+ copy.add(new ExportRegistrationImpl(exportRegistrationImpl));
+ }
}
}
}
diff --git a/spi/src/main/java/org/apache/aries/rsa/spi/DistributionProvider.java b/spi/src/main/java/org/apache/aries/rsa/spi/DistributionProvider.java
index 31d61bd..ed779d1 100644
--- a/spi/src/main/java/org/apache/aries/rsa/spi/DistributionProvider.java
+++ b/spi/src/main/java/org/apache/aries/rsa/spi/DistributionProvider.java
@@ -29,6 +29,11 @@
String[] getSupportedTypes();
/**
+ * Called by RemoteServiceAdmin to export a service.
+ *
+ * The Distribution provider will be called if no config type was set or
+ * if it supports the config type.
+ *
* @param serviceO service instance to be exported
* @param serviceContext bundle context of the bundle exporting the sevice
* @param effectiveProperties combined properties of the service and additional properties from rsa
diff --git a/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/TopologyManagerExport.java b/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/TopologyManagerExport.java
index e19f7a0..6200a29 100644
--- a/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/TopologyManagerExport.java
+++ b/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/TopologyManagerExport.java
@@ -115,7 +115,8 @@
return;
}
- for (RemoteServiceAdmin remoteServiceAdmin : rsaSet) {
+ HashSet<RemoteServiceAdmin> rsaSetCopy = new HashSet<>(rsaSet);
+ for (RemoteServiceAdmin remoteServiceAdmin : rsaSetCopy) {
LOG.debug("TopologyManager: handling remoteServiceAdmin " + remoteServiceAdmin);
if (endpointRepo.isAlreadyExportedForRsa(sref, remoteServiceAdmin)) {
// already handled by this remoteServiceAdmin
@@ -157,7 +158,7 @@
for (ExportRegistration reg : exportRegs) {
if (reg.getException() == null) {
EndpointDescription endpoint = getExportedEndpoint(reg);
- LOG.debug("TopologyManager: export succeeded for {}, endpoint {}", sref, endpoint);
+ LOG.debug("TopologyManager: export succeeded for {}, endpoint {}, rsa {}", sref, endpoint, remoteServiceAdmin.getClass());
endpoints.add(endpoint);
} else {
LOG.error("TopologyManager: export failed for {}", sref, reg.getException());