You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by cs...@apache.org on 2013/05/21 00:03:53 UTC

svn commit: r1484615 - in /cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter: EndpointRepository.java TopologyManagerExport.java

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) {