Author: cschneider
Date: Mon May 20 22:03:52 2013
New Revision: 1484615

URL: http://svn.apache.org/r1484615
Log:
DOSGI-184 Fixing concurrency issue and small refactoring

Modified:
    
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointRepository.java
    
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExport.java

Modified: 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointRepository.java
URL: 
http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointRepository.java?rev=1484615&r1=1484614&r2=1484615&view=diff
==============================================================================
--- 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointRepository.java
 (original)
+++ 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointRepository.java
 Mon May 20 22:03:52 2013
@@ -20,6 +20,7 @@ package org.apache.cxf.dosgi.topologyman
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -36,7 +37,7 @@ import org.slf4j.LoggerFactory;
  * For each ServiceReference that is exported a map is maintained which 
contains information
  * on the endpoints for each RemoteAdminService that created the endpoints 
  */
-public class EndpointRepository {
+class EndpointRepository {
        private static final Logger LOG = 
LoggerFactory.getLogger(EndpointRepository.class);
 
     private final Map<ServiceReference, 
@@ -75,20 +76,22 @@ public class EndpointRepository {
     }
     
     synchronized void addService(ServiceReference sref) {
-       LOG.info("TopologyManager: adding service to exportedServices list to 
export it --- from bundle:  "
-                       + sref.getBundle().getSymbolicName());
-       exportedServices.put(sref,
+       if (!exportedServices.containsKey(sref)) {
+               LOG.info("Marking service from bundle {} for export", 
sref.getBundle().getSymbolicName());
+               exportedServices.put(sref,
                        new LinkedHashMap<RemoteServiceAdmin, 
Collection<EndpointDescription>>());
+       }
     }
     
     synchronized void addEndpoints(ServiceReference sref, RemoteServiceAdmin 
rsa, List<EndpointDescription> endpoints) {
+       addService(sref);
        Map<RemoteServiceAdmin, Collection<EndpointDescription>> exports = 
exportedServices.get(sref);
        exports.put(rsa, endpoints);
     }
     
     synchronized boolean isAlreadyExportedForRsa(ServiceReference sref, 
RemoteServiceAdmin rsa) {
        Map<RemoteServiceAdmin, Collection<EndpointDescription>> exports = 
exportedServices.get(sref);
-       return exports.containsKey(rsa);
+       return exports != null && exports.containsKey(rsa);
     }
     
     synchronized Collection<EndpointDescription> getAllEndpoints() {
@@ -103,8 +106,13 @@ public class EndpointRepository {
        return endpoints;
     }
 
-    synchronized Set<ServiceReference> getServices() {
-       return exportedServices.keySet();
-       }
-
+    synchronized Set<ServiceReference> 
getServicesToBeExportedFor(RemoteServiceAdmin rsa) {
+       Set<ServiceReference> servicesToBeExported = new 
HashSet<ServiceReference>();
+       for (ServiceReference sref : exportedServices.keySet()) {
+               if (!isAlreadyExportedForRsa(sref, rsa)) {
+                               servicesToBeExported.add(sref);
+                       }
+               }
+               return servicesToBeExported;
+    }
 }

Modified: 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExport.java
URL: 
http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExport.java?rev=1484615&r1=1484614&r2=1484615&view=diff
==============================================================================
--- 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExport.java
 (original)
+++ 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExport.java
 Mon May 20 22:03:52 2013
@@ -73,7 +73,9 @@ public class TopologyManagerExport {
         this.remoteServiceAdminTracker = rsaTracker;
         this.remoteServiceAdminTracker.addListener(new 
RemoteServiceAdminLifeCycleListener() {
             public void added(RemoteServiceAdmin rsa) {
-                triggerExportForRemoteServiceAdmin(rsa);
+                       for (ServiceReference serviceRef : 
endpointRepo.getServicesToBeExportedFor(rsa)) {
+                               triggerExport(serviceRef);
+                       }
             }
 
             public void removed(RemoteServiceAdmin rsa) {
@@ -87,7 +89,7 @@ public class TopologyManagerExport {
                 if (event.getType() == ServiceEvent.REGISTERED) {
                     LOG.debug("Received REGISTERED ServiceEvent: {}", event);
                     if (shouldExportService(sref)) {
-                        exportService(sref);
+                        triggerExport(sref);
                     }
                 } else if (event.getType() == ServiceEvent.UNREGISTERING) {
                     LOG.debug("Received UNREGISTERING ServiceEvent: {}", 
event);
@@ -111,18 +113,6 @@ public class TopologyManagerExport {
         return sref.getProperty(RemoteConstants.SERVICE_EXPORTED_INTERFACES) 
!= null;
     }
 
-       protected void triggerExportForRemoteServiceAdmin(RemoteServiceAdmin 
rsa) {
-               for (ServiceReference serviceRef : endpointRepo.getServices()) {
-                       String bundleName = 
serviceRef.getBundle().getSymbolicName();
-                       if (endpointRepo.isAlreadyExportedForRsa(serviceRef, 
rsa)) {
-                               LOG.debug("service from bundle {} is already 
handled by this RSA", bundleName);
-                       } else {
-                               LOG.debug("service from bundle {} is to be 
exported by this RSA", bundleName);
-                               exportService(serviceRef);
-                       }
-               }
-       }
-
     public void start() {
         epListenerNotifier.start();
         bctx.addServiceListener(serviceListener);
@@ -135,11 +125,6 @@ public class TopologyManagerExport {
         epListenerNotifier.stop();
     }
     
-    protected void exportService(ServiceReference sref) {
-       endpointRepo.addService(sref);
-        triggerExport(sref);
-    }
-
     protected void triggerExport(final ServiceReference sref) {
         execService.execute(new Runnable() {
             public void run() {
@@ -149,7 +134,7 @@ public class TopologyManagerExport {
     }
 
     protected void doExportService(final ServiceReference sref) {
-        LOG.debug("Exporting service");
+       endpointRepo.addService(sref);
         List<RemoteServiceAdmin> rsaList = remoteServiceAdminTracker.getList();
         if (rsaList.size() == 0) {
             LOG.error(
@@ -166,25 +151,31 @@ public class TopologyManagerExport {
                 // already handled by this remoteServiceAdmin
                 LOG.debug("already handled by this remoteServiceAdmin -> 
skipping");
             } else {
-                // TODO: additional parameter Map ?
-                LOG.debug("exporting ...");
-                Collection<ExportRegistration> exportRegs = remoteServiceAdmin
-                        .exportService(sref, null);
-               List<EndpointDescription> endpoints = new 
ArrayList<EndpointDescription>();
-                if (exportRegs == null) {
-                    // TODO export failed -> What should be done here?
-                    LOG.error("export failed");
-                } else {
-                       for (ExportRegistration exportReg : exportRegs) {
-                                               
endpoints.add(getExportedEndpoint(exportReg));
-                                       }
-                    LOG.info("TopologyManager: export sucessful Endpoints: 
{}", endpoints);
-                    
epListenerNotifier.nofifyEndpointListenersOfAdding(endpoints);
-                }
-                endpointRepo.addEndpoints(sref, remoteServiceAdmin, endpoints);
+                exportServiceUsingRemoteServiceAdmin(sref, remoteServiceAdmin);
             }
         }
     }
+
+       private void exportServiceUsingRemoteServiceAdmin(
+                       final ServiceReference sref,
+                       final RemoteServiceAdmin remoteServiceAdmin) {
+               // TODO: additional parameter Map ?
+               LOG.debug("exporting ...");
+               Collection<ExportRegistration> exportRegs = remoteServiceAdmin
+                       .exportService(sref, null);
+               List<EndpointDescription> endpoints = new 
ArrayList<EndpointDescription>();
+               if (exportRegs == null) {
+                   // TODO export failed -> What should be done here?
+                   LOG.error("export failed");
+               } else {
+                       for (ExportRegistration exportReg : exportRegs) {
+                               endpoints.add(getExportedEndpoint(exportReg));
+                       }
+                   LOG.info("TopologyManager: export sucessful Endpoints: {}", 
endpoints);
+                   
epListenerNotifier.nofifyEndpointListenersOfAdding(endpoints);
+               }
+               endpointRepo.addEndpoints(sref, remoteServiceAdmin, endpoints);
+       }
     
     /**
      * Retrieve exported Endpoint while handling null
@@ -201,7 +192,7 @@ public class TopologyManagerExport {
                        ServiceReference[] references = 
bctx.getServiceReferences(null, DOSGI_SERVICES);
                        if (references != null) {
                            for (ServiceReference sref : references) {
-                               exportService(sref);
+                               triggerExport(sref);
                            }
                        }
                } catch (InvalidSyntaxException e) {


Reply via email to