This is an automated email from the ASF dual-hosted git repository. amichai pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/aries-rsa.git
commit 528fcfe02b4ec9be69dca6eb527f02fd504eb30f Author: Amichai Rothman <[email protected]> AuthorDate: Tue May 28 16:38:41 2024 +0300 Clean up TopologyManagerExport --- .../exporter/TopologyManagerExport.java | 98 ++++++++-------------- 1 file changed, 37 insertions(+), 61 deletions(-) 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 db91be41..66a81ce5 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 @@ -58,31 +58,28 @@ import org.slf4j.LoggerFactory; public class TopologyManagerExport implements ServiceListener { private static final Logger LOG = LoggerFactory.getLogger(TopologyManagerExport.class); - private final Executor execService; - private final Map<RemoteServiceAdmin, ServiceExportsRepository> endpointRepo; - private ExportPolicy policy; - private Map<Integer, String> typeNames; private final EndpointListenerNotifier notifier; - private Set<ServiceReference<?>> toBeExported; + private final Executor executor; + private final ExportPolicy policy; + private final Map<RemoteServiceAdmin, ServiceExportsRepository> endpointRepo; + private final Set<ServiceReference<?>> toBeExported; - public TopologyManagerExport( - EndpointListenerNotifier notifier, - Executor executor, - ExportPolicy policy) { + public TopologyManagerExport(EndpointListenerNotifier notifier, Executor executor, ExportPolicy policy) { this.notifier = notifier; - this.execService = executor; + this.executor = executor; this.policy = policy; this.endpointRepo = new HashMap<>(); this.toBeExported = new HashSet<>(); - createTypeNames(); } - private void createTypeNames() { - this.typeNames = new HashMap<>(); - this.typeNames.put(ServiceEvent.MODIFIED, "modified"); - this.typeNames.put(ServiceEvent.MODIFIED_ENDMATCH, "modified endmatch"); - this.typeNames.put(ServiceEvent.REGISTERED, "registered"); - this.typeNames.put(ServiceEvent.UNREGISTERING, "unregistering"); + private String getTypeName(ServiceEvent event) { + switch (event.getType()) { + case ServiceEvent.MODIFIED: return "modified"; + case ServiceEvent.MODIFIED_ENDMATCH: return "modified endmatch"; + case ServiceEvent.REGISTERED: return "registered"; + case ServiceEvent.UNREGISTERING: return "unregistering"; + default: return null; + } } // track all service registrations so we can export any services that are configured to be exported @@ -114,28 +111,22 @@ public class TopologyManagerExport implements ServiceListener { } private void modified(ServiceReference<?> sref) { - for (RemoteServiceAdmin rsa : endpointRepo.keySet()) { - ServiceExportsRepository repo = endpointRepo.get(rsa); + for (ServiceExportsRepository repo : endpointRepo.values()) { repo.modifyService(sref); } } private void remove(ServiceReference<?> sref) { toBeExported.remove(sref); - for (RemoteServiceAdmin rsa : endpointRepo.keySet()) { - ServiceExportsRepository repo = endpointRepo.get(rsa); + for (ServiceExportsRepository repo : endpointRepo.values()) { repo.removeService(sref); } } - public String getTypeName(ServiceEvent event) { - return typeNames.get(event.getType()); - } - public void add(RemoteServiceAdmin rsa) { - endpointRepo.put(rsa, new ServiceExportsRepository(rsa, notifier)); - for (ServiceReference<?> serviceRef : toBeExported) { - exportInBackground(serviceRef); + endpointRepo.put(rsa, new ServiceExportsRepository(rsa, notifier)); + for (ServiceReference<?> sref : toBeExported) { + exportInBackground(sref); } } @@ -147,33 +138,27 @@ public class TopologyManagerExport implements ServiceListener { } private void exportInBackground(final ServiceReference<?> sref) { - execService.execute(new Runnable() { - public void run() { - doExport(sref); - } - }); + executor.execute(() -> doExport(sref)); } private void doExport(final ServiceReference<?> sref) { LOG.debug("Exporting service {}", sref); toBeExported.add(sref); - if (endpointRepo.size() == 0) { + if (endpointRepo.isEmpty()) { + Bundle bundle = sref.getBundle(); + String bundleName = bundle == null ? null : bundle.getSymbolicName(); LOG.error("Unable to export service from bundle {}, interfaces: {} as no RemoteServiceAdmin is available. Marked for later export.", - getSymbolicName(sref.getBundle()), - sref.getProperty(org.osgi.framework.Constants.OBJECTCLASS)); + bundleName, sref.getProperty(org.osgi.framework.Constants.OBJECTCLASS)); return; } - for (RemoteServiceAdmin remoteServiceAdmin : endpointRepo.keySet()) { - ServiceExportsRepository repo = endpointRepo.get(remoteServiceAdmin); - Collection<ExportRegistration> regs = exportService(remoteServiceAdmin, sref); - repo.addService(sref, regs); + for (Map.Entry<RemoteServiceAdmin, ServiceExportsRepository> entry : endpointRepo.entrySet()) { + Collection<ExportRegistration> regs = exportService(entry.getKey(), sref); + entry.getValue().addService(sref, regs); } } - private Collection<ExportRegistration> exportService( - final RemoteServiceAdmin rsa, - final ServiceReference<?> sref) { + private Collection<ExportRegistration> exportService(final RemoteServiceAdmin rsa, final ServiceReference<?> sref) { // abort if the service was unregistered by the time we got here // (we check again at the end, but this optimization saves unnecessary heavy processing) if (sref.getBundle() == null) { @@ -183,10 +168,10 @@ public class TopologyManagerExport implements ServiceListener { LOG.debug("exporting Service {} using RemoteServiceAdmin {}", sref, rsa.getClass().getName()); Map<String, ?> addProps = policy.additionalParameters(sref); - Collection<ExportRegistration> exportRegs = rsa.exportService(sref, addProps); + Collection<ExportRegistration> regs = rsa.exportService(sref, addProps); // process successful/failed registrations - for (ExportRegistration reg : exportRegs) { + for (ExportRegistration reg : regs) { if (reg.getException() == null) { EndpointDescription endpoint = reg.getExportReference().getExportedEndpoint(); LOG.info("TopologyManager: export succeeded for {}, endpoint {}, rsa {}", sref, endpoint, rsa.getClass().getName()); @@ -200,36 +185,27 @@ public class TopologyManagerExport implements ServiceListener { // with the unregister event which may have already been handled, so we'll miss it) if (sref.getBundle() == null) { LOG.info("TopologyManager: export reverted for {} since service was unregistered", sref); - for (ExportRegistration reg : exportRegs) { + for (ExportRegistration reg : regs) { reg.close(); } } - return exportRegs; + return regs; } private boolean shouldExport(ServiceReference<?> sref) { Map<String, ?> addProps = policy.additionalParameters(sref); - List<String> exported= StringPlus.normalize(sref.getProperty(RemoteConstants.SERVICE_EXPORTED_INTERFACES)); + List<String> exported = StringPlus.normalize(sref.getProperty(RemoteConstants.SERVICE_EXPORTED_INTERFACES)); List<String> addExported = StringPlus.normalize(addProps.get(RemoteConstants.SERVICE_EXPORTED_INTERFACES)); - return sizeOf(exported) + sizeOf(addExported) > 0; - } - - private int sizeOf(List<String> list) { - return list == null ? 0 : list.size(); - } - - private Object getSymbolicName(Bundle bundle) { - return bundle == null ? null : bundle.getSymbolicName(); + return exported != null && !exported.isEmpty() || addExported != null && !addExported.isEmpty(); } - public void addEPListener(EndpointEventListener epListener, Set<Filter> filters) { + public void addEPListener(EndpointEventListener listener, Set<Filter> filters) { Collection<EndpointDescription> endpoints = new ArrayList<>(); - for (RemoteServiceAdmin rsa : endpointRepo.keySet()) { - ServiceExportsRepository repo = endpointRepo.get(rsa); + for (ServiceExportsRepository repo : endpointRepo.values()) { endpoints.addAll(repo.getAllEndpoints()); } - notifier.add(epListener, filters, endpoints); + notifier.add(listener, filters, endpoints); } public void removeEPListener(EndpointEventListener listener) {
