Author: cschneider
Date: Fri May 17 07:28:03 2013
New Revision: 1483673

URL: http://svn.apache.org/r1483673
Log:
DOSGI-184 Split Endpoint repository from TopologyManagerExport

Added:
    
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/ExportServiceTest.java
      - copied, changed from r1483403, 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/ExportServiceTest.java
Removed:
    
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/ExportServiceTest.java
Modified:
    
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifier.java
    
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
    
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifierTest.java
    
cxf/dosgi/trunk/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestCustomIntent.java
    
cxf/dosgi/trunk/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestExportRestService.java
    
cxf/dosgi/trunk/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestExportService.java

Modified: 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifier.java
URL: 
http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifier.java?rev=1483673&r1=1483672&r2=1483673&view=diff
==============================================================================
--- 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifier.java
 (original)
+++ 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifier.java
 Fri May 17 07:28:03 2013
@@ -25,6 +25,7 @@ import java.util.Hashtable;
 import java.util.List;
 
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
 import org.osgi.framework.Filter;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
@@ -38,26 +39,33 @@ import org.slf4j.LoggerFactory;
  * Tracks EndpointListeners and allows to notify them of endpoints
  */
 public class EndpointListenerNotifier {
-    private static final Logger LOG = 
LoggerFactory.getLogger(EndpointListenerNotifier.class);
+    private static final String ENDPOINT_LISTENER_FILTER =
+               "(&(" + Constants.OBJECTCLASS + "=" + 
EndpointListener.class.getName() + ")"
+               + "(" + EndpointListener.ENDPOINT_LISTENER_SCOPE + "=*))";
+       private static final Logger LOG = 
LoggerFactory.getLogger(EndpointListenerNotifier.class);
     private BundleContext bctx;
     private ServiceTracker stEndpointListeners;
-    private EndpointRepository exportRepository;
 
-    public EndpointListenerNotifier(BundleContext bctx, EndpointRepository 
exportRepository) {
+    public EndpointListenerNotifier(BundleContext bctx, final 
EndpointRepository endpointRepository) {
         this.bctx = bctx;
-        this.exportRepository = exportRepository;
-        this.stEndpointListeners = new ServiceTracker(bctx, 
EndpointListener.class.getName(), null) {
+        Filter filter;
+               try {
+                       filter = bctx.createFilter(ENDPOINT_LISTENER_FILTER);
+               } catch (InvalidSyntaxException e) {
+                       throw new RuntimeException("Unexpected exception 
creating filter", e);
+               }
+        this.stEndpointListeners = new ServiceTracker(bctx, filter, null) {
             @Override
             public Object addingService(ServiceReference epListenerRef) {
                 LOG.debug("new EndpointListener detected");
-                notifyListenerOfAllExistingExports(epListenerRef);
+                notifyListenerOfAdding(epListenerRef, 
endpointRepository.getAllEndpoints());
                 return super.addingService(epListenerRef);
             }
 
             @Override
             public void modifiedService(ServiceReference epListenerRef, Object 
service) {
                 LOG.debug("EndpointListener modified");
-                notifyListenerOfAllExistingExports(epListenerRef);
+                notifyListenerOfAdding(epListenerRef, 
endpointRepository.getAllEndpoints());
                 super.modifiedService(epListenerRef, service);
             }
 
@@ -73,29 +81,15 @@ public class EndpointListenerNotifier {
         stEndpointListeners.close();
     }
     
-    private void notifyListenerOfAllExistingExports(
-            ServiceReference reference) {
-        Collection<EndpointDescription> registrations = 
exportRepository.getAllEndpoints();
-        notifyListenerOfAdding(reference, registrations);
-    }
-    
     void nofifyEndpointListenersOfAdding(Collection<EndpointDescription> 
endpoints) {
-        ServiceReference[] epListeners = getEndpointListeners(bctx);
-        for (ServiceReference eplistener : epListeners) {
+        for (ServiceReference eplistener : 
stEndpointListeners.getServiceReferences()) {
             notifyListenerOfAdding(eplistener, endpoints);
         }
     }
     
-    void notifyAllListenersOfRemoval(Collection<EndpointDescription> 
endpoints) {
-        ServiceReference[] refs = getEndpointListeners(bctx);
-        for (ServiceReference epListenerReference : refs) {
-            notifyListenersOfRemoval(epListenerReference, endpoints);
-        }
-    }
-    
     void notifyListenersOfRemoval(Collection<EndpointDescription> endpoints) {
         for (ServiceReference epListenerReference : 
stEndpointListeners.getServiceReferences()) {
-            notifyListenersOfRemoval(epListenerReference, endpoints);
+            notifyListenerOfRemoval(epListenerReference, endpoints);
         }
     }
     
@@ -120,7 +114,7 @@ public class EndpointListenerNotifier {
 
     }
 
-    void notifyListenersOfRemoval(ServiceReference epListenerReference,
+    void notifyListenerOfRemoval(ServiceReference epListenerReference,
                                           Collection<EndpointDescription> 
endpoints) {
         EndpointListener epl = 
(EndpointListener)bctx.getService(epListenerReference);
         List<Filter> filters = 
getFiltersFromEndpointListenerScope(epListenerReference, bctx);
@@ -182,23 +176,6 @@ public class EndpointListenerNotifier {
         }
         return matchingFilters;
     }
-
-    /** 
-     * Find all EndpointListeners; They must have the Scope property otherwise 
they have to be ignored
-     * @param bctx
-     * @return
-     * @throws InvalidSyntaxException
-     */
-    private static ServiceReference[] getEndpointListeners(BundleContext bctx) 
{
-        ServiceReference[] result = null;
-        try {
-            String filter = "(" + EndpointListener.ENDPOINT_LISTENER_SCOPE + 
"=*)";
-            result = 
bctx.getServiceReferences(EndpointListener.class.getName(), filter);
-        } catch (InvalidSyntaxException e) {
-            LOG.error(e.getMessage(), e);
-        }
-        return (result == null) ? new ServiceReference[]{} : result;
-    }
    
     /**
      * Retrieve endpoint properties as Dictionary

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=1483673&r1=1483672&r2=1483673&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
 Fri May 17 07:28:03 2013
@@ -18,10 +18,93 @@
  */
 package org.apache.cxf.dosgi.topologymanager.exporter;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
+import org.osgi.framework.ServiceReference;
 import org.osgi.service.remoteserviceadmin.EndpointDescription;
+import org.osgi.service.remoteserviceadmin.RemoteServiceAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Holds all endpoints that are exported by a TopologyManager.
+ * 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 {
+       private static final Logger LOG = 
LoggerFactory.getLogger(EndpointRepository.class);
+
+    private final Map<ServiceReference, 
+                      Map<RemoteServiceAdmin, 
Collection<EndpointDescription>>> exportedServices = 
+        new LinkedHashMap<ServiceReference, Map<RemoteServiceAdmin, 
Collection<EndpointDescription>>>();
+    
+    /**
+     * Remove all services exported by the given rsa and notify listeners
+     * @param rsa
+     * @return list of removed endpoints
+     */
+    synchronized List<EndpointDescription> 
removeRemoteServiceAdmin(RemoteServiceAdmin rsa) {
+       List<EndpointDescription> removedEndpoints = new 
ArrayList<EndpointDescription>();
+       for (Map<RemoteServiceAdmin, Collection<EndpointDescription>> exports : 
exportedServices
+                       .values()) {
+               if (exports.containsKey(rsa)) {
+                       removedEndpoints.addAll(exports.get(rsa));
+                       exports.remove(rsa);
+               }
+       }
+       return removedEndpoints;
+    }
+    
+    synchronized List<EndpointDescription> removeService(ServiceReference 
sref) {
+       List<EndpointDescription> removedEndpoints = new 
ArrayList<EndpointDescription>();
+       if (exportedServices.containsKey(sref)) {
+               Map<RemoteServiceAdmin, Collection<EndpointDescription>> rsas = 
exportedServices.get(sref);
+               for (Map.Entry<RemoteServiceAdmin, 
Collection<EndpointDescription>> entry : rsas.entrySet()) {
+                       if (entry.getValue() != null) {
+                               removedEndpoints.addAll(entry.getValue());
+                       }
+               }
+               exportedServices.remove(sref);
+       }
+       return removedEndpoints;
+    }
+    
+    synchronized void addService(ServiceReference sref) {
+       LOG.info("TopologyManager: adding service to exportedServices list to 
export it --- from bundle:  "
+                       + sref.getBundle().getSymbolicName());
+       exportedServices.put(sref,
+                       new LinkedHashMap<RemoteServiceAdmin, 
Collection<EndpointDescription>>());
+    }
+    
+    synchronized void addEndpoints(ServiceReference sref, RemoteServiceAdmin 
rsa, List<EndpointDescription> endpoints) {
+       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);
+    }
+    
+    synchronized Collection<EndpointDescription> getAllEndpoints() {
+       List<EndpointDescription> endpoints = new 
ArrayList<EndpointDescription>();
+       for (Map<RemoteServiceAdmin, Collection<EndpointDescription>> exports : 
exportedServices.values()) {
+               for (Collection<EndpointDescription> regs : exports.values()) {
+                       if (regs != null) {
+                               endpoints.addAll(regs);
+                       }
+               }
+       }
+       return endpoints;
+    }
+
+    synchronized Set<ServiceReference> getServices() {
+       return exportedServices.keySet();
+       }
 
-public interface EndpointRepository {
-    Collection<EndpointDescription> getAllEndpoints();
 }

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=1483673&r1=1483672&r2=1483673&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
 Fri May 17 07:28:03 2013
@@ -20,10 +20,7 @@ package org.apache.cxf.dosgi.topologyman
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -55,7 +52,7 @@ import org.slf4j.LoggerFactory;
  * <li> When a service is unpublished the EndpointListeners are notified.
  *      The endpoints are not closed as the ExportRegistration takes care of 
this  
  */
-public class TopologyManagerExport implements EndpointRepository {
+public class TopologyManagerExport {
 
     private static final String DOSGI_SERVICES = "(" + 
RemoteConstants.SERVICE_EXPORTED_INTERFACES + "=*)";
 
@@ -66,27 +63,22 @@ public class TopologyManagerExport imple
     private final ExecutorService execService;
     private final RemoteServiceAdminTracker remoteServiceAdminTracker;
     private final ServiceListener serviceListener;
-
-    /**
-     * Holds all services that are exported by this TopologyManager for each 
ServiceReference that should be
-     * exported a map is maintained which contains information on the 
endpoints for each RemoteAdminService
-     */
-    private final Map<ServiceReference, 
-                      Map<RemoteServiceAdmin, 
Collection<EndpointDescription>>> exportedServices = 
-        new LinkedHashMap<ServiceReference, Map<RemoteServiceAdmin, 
Collection<EndpointDescription>>>();
+       private final EndpointRepository endpointRepo;
 
     public TopologyManagerExport(BundleContext ctx, RemoteServiceAdminTracker 
rsaTracker) {
+        endpointRepo = new EndpointRepository();
+        epListenerNotifier = createEndpointListenerNotifier(ctx, endpointRepo);
         execService = new ThreadPoolExecutor(5, 10, 50, TimeUnit.SECONDS, new 
LinkedBlockingQueue<Runnable>());
         bctx = ctx;
         this.remoteServiceAdminTracker = rsaTracker;
         this.remoteServiceAdminTracker.addListener(new 
RemoteServiceAdminLifeCycleListener() {
-
             public void added(RemoteServiceAdmin rsa) {
                 triggerExportForRemoteServiceAdmin(rsa);
             }
 
             public void removed(RemoteServiceAdmin rsa) {
-                removeRemoteServiceAdmin(rsa);
+                List<EndpointDescription> endpoints = 
endpointRepo.removeRemoteServiceAdmin(rsa);
+                epListenerNotifier.notifyListenersOfRemoval(endpoints);
             }
         });
         serviceListener = new ServiceListener() {
@@ -99,12 +91,17 @@ public class TopologyManagerExport imple
                     }
                 } else if (event.getType() == ServiceEvent.UNREGISTERING) {
                     LOG.debug("Received UNREGISTERING ServiceEvent: {}", 
event);
-                    removeService(sref);
+                    List<EndpointDescription> endpoints = 
endpointRepo.removeService(sref);
+                    epListenerNotifier.notifyListenersOfRemoval(endpoints);
                 }
             }
         };
+
         
-        epListenerNotifier = new EndpointListenerNotifier(ctx, this);
+    }
+    
+    protected EndpointListenerNotifier 
createEndpointListenerNotifier(BundleContext ctx, EndpointRepository 
endpointRepository) {
+       return new EndpointListenerNotifier(ctx, endpointRepository);
     }
     
     /**
@@ -114,85 +111,36 @@ public class TopologyManagerExport imple
         return sref.getProperty(RemoteConstants.SERVICE_EXPORTED_INTERFACES) 
!= null;
     }
 
-    /**
-     * Remove all services exported by the given rsa and notify listeners
-     * @param rsa
-     */
-    protected void removeRemoteServiceAdmin(RemoteServiceAdmin rsa) {
-        synchronized (exportedServices) {
-            for (Map<RemoteServiceAdmin, Collection<EndpointDescription>> 
exports : exportedServices
-                .values()) {
-                if (exports.containsKey(rsa)) {
-                    Collection<EndpointDescription> endpoints = 
exports.get(rsa);
-                    
this.epListenerNotifier.notifyAllListenersOfRemoval(endpoints);
-                    exports.remove(rsa);
-                }
-            }
-        }
-    }
-
-    protected void triggerExportForRemoteServiceAdmin(RemoteServiceAdmin rsa) {
-        LOG.debug("triggerExportImportForRemoteSericeAdmin()");
-
-        synchronized (exportedServices) {
-            for (ServiceReference serviceRef : exportedServices.keySet()) {
-                Map<RemoteServiceAdmin, Collection<EndpointDescription>> 
rsaExports = exportedServices.get(serviceRef);
-                String bundleName = serviceRef.getBundle().getSymbolicName();
-                if (rsaExports.containsKey(rsa)) {
-                    // already handled....
-                    LOG.debug("service from bundle {} is already handled by 
this RSA", bundleName);
-                } else {
-                    // trigger export of this service....
-                    LOG.debug("service from bundle {} is to be exported by 
this RSA", bundleName);
-                    exportService(serviceRef);
-                }
-            }
-        }
-
-    }
+       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);
-        remoteServiceAdminTracker.open();
         exportExistingServices();
     }
 
     public void stop() {
         execService.shutdown();
-        remoteServiceAdminTracker.close();
         bctx.removeServiceListener(serviceListener);
         epListenerNotifier.stop();
     }
-
-    void removeService(ServiceReference sref) {
-        synchronized (exportedServices) {
-            if (exportedServices.containsKey(sref)) {
-                Map<RemoteServiceAdmin, Collection<EndpointDescription>> rsas 
= exportedServices.get(sref);
-                for (Map.Entry<RemoteServiceAdmin, 
Collection<EndpointDescription>> entry : rsas.entrySet()) {
-                    if (entry.getValue() != null) {
-                        Collection<EndpointDescription> registrations = 
entry.getValue();
-                        
this.epListenerNotifier.notifyListenersOfRemoval(registrations);
-                    }
-                }
-
-                exportedServices.remove(sref);
-            }
-        }
-    }
     
     protected void exportService(ServiceReference sref) {
-        // add to local list of services that should/are be exported
-        synchronized (exportedServices) {
-            LOG.info("TopologyManager: adding service to exportedServices list 
to export it --- from bundle:  "
-                      + sref.getBundle().getSymbolicName());
-            exportedServices.put(sref,
-                                 new LinkedHashMap<RemoteServiceAdmin, 
Collection<EndpointDescription>>());
-        }
+       endpointRepo.addService(sref);
         triggerExport(sref);
     }
 
-    private void triggerExport(final ServiceReference sref) {
+    protected void triggerExport(final ServiceReference sref) {
         execService.execute(new Runnable() {
             public void run() {
                 doExportService(sref);
@@ -200,32 +148,21 @@ public class TopologyManagerExport imple
         });
     }
 
-    private void doExportService(final ServiceReference sref) {
+    protected void doExportService(final ServiceReference sref) {
         LOG.debug("Exporting service");
-
-        Map<RemoteServiceAdmin, Collection<EndpointDescription>> exports = 
null;
-
-        synchronized (exportedServices) {
-            exports = Collections.synchronizedMap(exportedServices.get(sref));
-        }
-        // FIXME: Not thread safe...?
-        if (exports == null) {
-            return;
-        }
-        if (remoteServiceAdminTracker == null || 
remoteServiceAdminTracker.size() == 0) {
+        List<RemoteServiceAdmin> rsaList = remoteServiceAdminTracker.getList();
+        if (rsaList.size() == 0) {
             LOG.error(
                     "No RemoteServiceAdmin available! Unable to export service 
from bundle {}, interfaces: {}",
                     sref.getBundle().getSymbolicName(),
                     
sref.getProperty(org.osgi.framework.Constants.OBJECTCLASS));
         }
 
-
-        for (final RemoteServiceAdmin remoteServiceAdmin : 
remoteServiceAdminTracker
-                .getList()) {
+        for (final RemoteServiceAdmin remoteServiceAdmin : rsaList) {
             LOG.info("TopologyManager: handling remoteServiceAdmin "
                     + remoteServiceAdmin);
 
-            if (exports.containsKey(remoteServiceAdmin)) {
+            if (endpointRepo.isAlreadyExportedForRsa(sref, 
remoteServiceAdmin)) {
                 // already handled by this remoteServiceAdmin
                 LOG.debug("already handled by this remoteServiceAdmin -> 
skipping");
             } else {
@@ -233,21 +170,18 @@ public class TopologyManagerExport imple
                 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");
-                    exports.put(remoteServiceAdmin, null);
                 } else {
-                       List<EndpointDescription> endpoints = new 
ArrayList<EndpointDescription>();
                        for (ExportRegistration exportReg : exportRegs) {
                                                
endpoints.add(getExportedEndpoint(exportReg));
                                        }
                     LOG.info("TopologyManager: export sucessful Endpoints: 
{}", endpoints);
-                    // enqueue in local list of endpoints
-                    exports.put(remoteServiceAdmin, endpoints);
-
                     
epListenerNotifier.nofifyEndpointListenersOfAdding(endpoints);
                 }
+                endpointRepo.addEndpoints(sref, remoteServiceAdmin, endpoints);
             }
         }
     }
@@ -262,20 +196,6 @@ public class TopologyManagerExport imple
         return (ref == null) ? null : ref.getExportedEndpoint(); 
     }
     
-    public Collection<EndpointDescription> getAllEndpoints() {
-        List<EndpointDescription> registrations = new 
ArrayList<EndpointDescription>();
-        synchronized (exportedServices) {
-            for (Map<RemoteServiceAdmin, Collection<EndpointDescription>> 
exports : exportedServices.values()) {
-                for (Collection<EndpointDescription> regs : exports.values()) {
-                    if (regs != null) {
-                        registrations.addAll(regs);
-                    }
-                }
-            }
-        }
-        return registrations;
-    }
-
     private void exportExistingServices() {
         try {
                        ServiceReference[] references = 
bctx.getServiceReferences(null, DOSGI_SERVICES);

Modified: 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifierTest.java
URL: 
http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifierTest.java?rev=1483673&r1=1483672&r2=1483673&view=diff
==============================================================================
--- 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifierTest.java
 (original)
+++ 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifierTest.java
 Fri May 17 07:28:03 2013
@@ -93,7 +93,7 @@ public class EndpointListenerNotifierTes
         endpoints.add(epd);
         endpoints.add(epd2);
 
-        tm.notifyListenersOfRemoval(sref, endpoints);
+        tm.notifyListenerOfRemoval(sref, endpoints);
 
         c.verify();
         EasyMock.verify(epl);

Copied: 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/ExportServiceTest.java
 (from r1483403, 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/ExportServiceTest.java)
URL: 
http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/ExportServiceTest.java?p2=cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/ExportServiceTest.java&p1=cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/ExportServiceTest.java&r1=1483403&r2=1483673&rev=1483673&view=diff
==============================================================================
--- 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/ExportServiceTest.java
 (original)
+++ 
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/ExportServiceTest.java
 Fri May 17 07:28:03 2013
@@ -16,27 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.cxf.dosgi.topologymanager;
+package org.apache.cxf.dosgi.topologymanager.exporter;
 
-import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
 
+import 
org.apache.cxf.dosgi.topologymanager.rsatracker.RemoteServiceAdminLifeCycleListener;
+import 
org.apache.cxf.dosgi.topologymanager.rsatracker.RemoteServiceAdminTracker;
 import org.easymock.IAnswer;
 import org.easymock.classextension.EasyMock;
 import org.easymock.classextension.IMocksControl;
 import org.junit.Test;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceEvent;
 import org.osgi.framework.ServiceListener;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.remoteserviceadmin.EndpointDescription;
-import org.osgi.service.remoteserviceadmin.EndpointListener;
 import org.osgi.service.remoteserviceadmin.ExportReference;
 import org.osgi.service.remoteserviceadmin.ExportRegistration;
 import org.osgi.service.remoteserviceadmin.RemoteConstants;
@@ -52,139 +50,108 @@ public class ExportServiceTest {
      * @throws Exception 
      */
     @SuppressWarnings("unchecked")
-    @Test
+       @Test
     public void testServiceExport() throws Exception {
-
-        final Semaphore sema = new Semaphore(1);
-        sema.acquire(); 
-        
-        String scope = "(objectClass=abc)";
-     
-        IMocksControl c = EasyMock.createNiceControl();
-        
+        IMocksControl c = EasyMock.createControl();
         
         BundleContext bctx = c.createMock(BundleContext.class);
-        
-        Bundle topMgrBundle = c.createMock(Bundle.class);
-        
         RemoteServiceAdmin rsa = c.createMock(RemoteServiceAdmin.class);
-        final ServiceReference rsaSref = c.createMock(ServiceReference.class);
-        EndpointListener epl = c.createMock(EndpointListener.class);
-        final ServiceReference eplSref = c.createMock(ServiceReference.class);
-        
EasyMock.expect(eplSref.getProperty(EasyMock.same(EndpointListener.ENDPOINT_LISTENER_SCOPE)))
-            .andReturn(scope).anyTimes();
-        
EasyMock.expect(eplSref.getBundle()).andReturn(topMgrBundle).anyTimes();
+        final EndpointListenerNotifier mockEpListenerNotifier = 
c.createMock(EndpointListenerNotifier.class);
+        mockEpListenerNotifier.start();
+        EasyMock.expectLastCall().once();
+
+        final ServiceReference sref = createUserServiceBundle(c);
+
+        
EasyMock.expect(bctx.getServiceReferences(EasyMock.<String>anyObject(), 
EasyMock.<String>anyObject()))
+               .andReturn(null).atLeastOnce();
+
+        RemoteServiceAdminTracker rsaTracker = createSingleRsaTracker(c, rsa);
+
+               EndpointDescription endpoint = createEndpoint(c);
+               ExportRegistration exportRegistration = 
createExportRegistration(c, endpoint);
+
+               // Main assertions
+        simulateUserServicePublished(bctx, sref);
+        EasyMock.expect(rsa.exportService(EasyMock.same(sref), (Map<String, 
Object>)EasyMock.anyObject()))
+               
.andReturn(Collections.singletonList(exportRegistration)).once();
+        
mockEpListenerNotifier.nofifyEndpointListenersOfAdding(EasyMock.eq(Collections.singletonList(endpoint)));
+        EasyMock.expectLastCall().once();
 
-        final ServiceReference sref = c.createMock(ServiceReference.class);
-        
EasyMock.expect(sref.getProperty(EasyMock.same(RemoteConstants.SERVICE_EXPORTED_INTERFACES)))
-            .andReturn("*").anyTimes();
-        Bundle srefBundle = c.createMock(Bundle.class);
-        EasyMock.expect(sref.getBundle()).andReturn(srefBundle).anyTimes();
-        
+        c.replay();
         
-        EndpointDescription endpoint = c.createMock(EndpointDescription.class);
-
-        Map<String, Object> props = new HashMap<String, Object>();
-        String[] objs = new String[1];
-        objs[0] = "abc";
-        props.put("objectClass", objs);
-        EasyMock.expect(endpoint.getProperties()).andReturn(props).anyTimes();
-
-        ExportRegistration exportRegistration = 
c.createMock(ExportRegistration.class);
-        ExportReference exportReference = c.createMock(ExportReference.class);
-
-        
EasyMock.expect(exportRegistration.getExportReference()).andReturn(exportReference).anyTimes();
-        
EasyMock.expect(exportReference.getExportedEndpoint()).andReturn(endpoint).anyTimes();
-
-        List<ExportRegistration> ret = new ArrayList<ExportRegistration>();
-        ret.add(exportRegistration);
-        EasyMock.expect(rsa.exportService(EasyMock.same(sref),
-                                          (Map<String, 
Object>)EasyMock.anyObject())).andReturn(ret)
-            .once();
-
-        epl.endpointAdded((EndpointDescription)EasyMock.anyObject(), 
(String)EasyMock.anyObject());
-        EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
-
-            public Object answer() throws Throwable {
-                System.out.println("Call made !!!");
-                sema.release();
-                return null;
-            }
-            
-        }).once();
-
-        //BCTX
-        bctx.addServiceListener((ServiceListener)EasyMock.anyObject(), 
(String)EasyMock.anyObject());
-        EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
-
-            public Object answer() throws Throwable {
-                System.out.println("->   addServiceListener: "
-                                   + EasyMock.getCurrentArguments()[1]);
-                ServiceListener sl = 
(ServiceListener)EasyMock.getCurrentArguments()[0];
+               TopologyManagerExport topManager = new 
TopologyManagerExport(bctx, rsaTracker) {
 
-                if 
("(objectClass=org.osgi.service.remoteserviceadmin.RemoteServiceAdmin)"
-                    .equals(EasyMock.getCurrentArguments()[1])) {
-                    ServiceEvent se = new 
ServiceEvent(ServiceEvent.REGISTERED, rsaSref);
-                    sl.serviceChanged(se);
-                } else if 
("(objectClass=org.osgi.service.remoteserviceadmin.EndpointListener)"
-                    .equals(EasyMock.getCurrentArguments()[1])) {
-                    ServiceEvent se = new 
ServiceEvent(ServiceEvent.REGISTERED, eplSref);
-                    sl.serviceChanged(se);
-                }
+                       /**
+                        * Replace epListenerNotifier with mock
+                        */
+                       @Override
+                       protected EndpointListenerNotifier 
createEndpointListenerNotifier(BundleContext ctx, 
+                                       EndpointRepository endpointRepository) {
+                               return mockEpListenerNotifier;
+                       }
+
+                       /**
+                        * To avoid async call
+                        */
+                       @Override
+                       protected void triggerExport(ServiceReference sref) {
+                               doExportService(sref);
+                       }
+               
+        };
+        topManager.start();
+        c.verify();
 
-                return null;
-            }
-        }).anyTimes();
+    }
 
-        bctx.addServiceListener((ServiceListener)EasyMock.anyObject());
+       private void simulateUserServicePublished(BundleContext bctx,
+                       final ServiceReference sref) {
+               bctx.addServiceListener((ServiceListener)EasyMock.anyObject());
         EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
-
             public Object answer() throws Throwable {
-                System.out.println("->   addServiceListener ");
-
+                System.out.println("Simulating publishing the user service");
                 ServiceListener sl = 
(ServiceListener)EasyMock.getCurrentArguments()[0];
-
                 ServiceEvent se = new ServiceEvent(ServiceEvent.REGISTERED, 
sref);
                 sl.serviceChanged(se);
-                se = new ServiceEvent(ServiceEvent.REGISTERED, eplSref);
-                sl.serviceChanged(se);
-                se = new ServiceEvent(ServiceEvent.REGISTERED, rsaSref);
-                sl.serviceChanged(se);
-
                 return null;
             }
-        }).anyTimes();
-
-        
EasyMock.expect(bctx.getService(EasyMock.same(rsaSref))).andReturn(rsa).anyTimes();
-        
EasyMock.expect(bctx.getService(EasyMock.same(eplSref))).andReturn(epl).atLeastOnce();
-
-        ServiceReference[] refs = new ServiceReference[1];
-        refs[0] = eplSref;
-        EasyMock
-            .expect(
-                    
bctx.getServiceReferences(EasyMock.same(EndpointListener.class.getName()),
-                                              EasyMock
-                                                  .same("("
-                                                        + 
EndpointListener.ENDPOINT_LISTENER_SCOPE
-                                                        + 
"=*)"))).andReturn(refs).anyTimes();
-        
-        EasyMock.expect(bctx.createFilter(EasyMock.same(scope)))
-            .andReturn(FrameworkUtil.createFilter(scope)).anyTimes();
-
-        
-        c.replay();
+        }).once();
+       }
 
-        //        TopologyManager tm = new TopologyManager(bctx);
-        //        tm.start();
+       private RemoteServiceAdminTracker createSingleRsaTracker(IMocksControl 
c,
+                       RemoteServiceAdmin rsa) {
+               RemoteServiceAdminTracker rsaTracker = 
c.createMock(RemoteServiceAdminTracker.class);
+        
rsaTracker.addListener(EasyMock.<RemoteServiceAdminLifeCycleListener>anyObject());
+        EasyMock.expectLastCall().once();
+        
EasyMock.expect(rsaTracker.getList()).andReturn(Collections.singletonList(rsa));
+               return rsaTracker;
+       }
+
+       private ExportRegistration createExportRegistration(IMocksControl c,
+                       EndpointDescription endpoint) {
+               ExportRegistration exportRegistration = 
c.createMock(ExportRegistration.class);
+        ExportReference exportReference = c.createMock(ExportReference.class);
+        
EasyMock.expect(exportRegistration.getExportReference()).andReturn(exportReference).anyTimes();
+        
EasyMock.expect(exportReference.getExportedEndpoint()).andReturn(endpoint).anyTimes();
+               return exportRegistration;
+       }
 
-        Activator a = new Activator();
-        a.start(bctx);
-        
-        // Wait until the EndpointListener.endpointAdded call was made as the 
controlflow is asynchronous
-        sema.tryAcquire(30, TimeUnit.SECONDS);
-        
-        c.verify();
+       private EndpointDescription createEndpoint(IMocksControl c) {
+        Map<String, Object> props = new HashMap<String, Object>();
+        props.put(RemoteConstants.ENDPOINT_ID, "1");
+        props.put(Constants.OBJECTCLASS, new String[]{"abc"});
+        props.put(RemoteConstants.SERVICE_IMPORTED_CONFIGS, "cxf");
+               return new EndpointDescription(props);
+       }
 
-    }
+       private ServiceReference createUserServiceBundle(IMocksControl c) {
+               final ServiceReference sref = 
c.createMock(ServiceReference.class);
+        
EasyMock.expect(sref.getProperty(EasyMock.same(RemoteConstants.SERVICE_EXPORTED_INTERFACES)))
+            .andReturn("*").anyTimes();
+        Bundle srefBundle = c.createMock(Bundle.class);
+        EasyMock.expect(sref.getBundle()).andReturn(srefBundle).atLeastOnce();
+        
EasyMock.expect(srefBundle.getSymbolicName()).andReturn("serviceBundleName").atLeastOnce();
+               return sref;
+       }
 
 }

Modified: 
cxf/dosgi/trunk/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestCustomIntent.java
URL: 
http://svn.apache.org/viewvc/cxf/dosgi/trunk/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestCustomIntent.java?rev=1483673&r1=1483672&r2=1483673&view=diff
==============================================================================
--- 
cxf/dosgi/trunk/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestCustomIntent.java
 (original)
+++ 
cxf/dosgi/trunk/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestCustomIntent.java
 Fri May 17 07:28:03 2013
@@ -76,7 +76,7 @@ public class TestCustomIntent extends Ab
     public static Option[] configure() throws Exception {
         return new Option[] {
                 MultiBundleTools.getDistro(),
-                
systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("DEBUG"),
+                
systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),
                 mavenBundle().groupId("org.apache.servicemix.bundles")
                     
.artifactId("org.apache.servicemix.bundles.junit").version("4.9_2"),
                 mavenBundle().groupId("org.apache.cxf.dosgi.samples")

Modified: 
cxf/dosgi/trunk/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestExportRestService.java
URL: 
http://svn.apache.org/viewvc/cxf/dosgi/trunk/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestExportRestService.java?rev=1483673&r1=1483672&r2=1483673&view=diff
==============================================================================
--- 
cxf/dosgi/trunk/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestExportRestService.java
 (original)
+++ 
cxf/dosgi/trunk/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestExportRestService.java
 Fri May 17 07:28:03 2013
@@ -41,7 +41,7 @@ public class TestExportRestService exten
     public static Option[] configure() throws Exception {
         return new Option[] {
                 MultiBundleTools.getDistroWithDiscovery(),
-                
systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("DEBUG"),
+                
systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),
                 mavenBundle().groupId("org.apache.servicemix.bundles")
                     
.artifactId("org.apache.servicemix.bundles.junit").version("4.9_2"),
                 mavenBundle().groupId("org.apache.cxf.dosgi.samples")

Modified: 
cxf/dosgi/trunk/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestExportService.java
URL: 
http://svn.apache.org/viewvc/cxf/dosgi/trunk/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestExportService.java?rev=1483673&r1=1483672&r2=1483673&view=diff
==============================================================================
--- 
cxf/dosgi/trunk/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestExportService.java
 (original)
+++ 
cxf/dosgi/trunk/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestExportService.java
 Fri May 17 07:28:03 2013
@@ -57,7 +57,7 @@ public class TestExportService extends A
     public static Option[] configure() throws Exception {
         return new Option[] {
                 MultiBundleTools.getDistroWithDiscovery(),
-                
systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("DEBUG"),
+                
systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),
                 mavenBundle().groupId("org.apache.servicemix.bundles")
                     
.artifactId("org.apache.servicemix.bundles.junit").version("4.9_2"),
                 mavenBundle().groupId("org.apache.cxf.dosgi.samples")


Reply via email to