You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by am...@apache.org on 2013/06/12 17:09:31 UTC

svn commit: r1492237 - in /cxf/dosgi/trunk: discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/ dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ dsw/cxf-topology-manager/src/main/java/org/apache/cxf/do...

Author: amichai
Date: Wed Jun 12 15:09:30 2013
New Revision: 1492237

URL: http://svn.apache.org/r1492237
Log:
DOSGI-164 Fix various NullPointerExceptions when using ServiceReference.getBundle()

Modified:
    cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/InterfaceMonitorManager.java
    cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/EventProducer.java
    cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCore.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/main/java/org/apache/cxf/dosgi/topologymanager/util/Utils.java

Modified: cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/InterfaceMonitorManager.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/InterfaceMonitorManager.java?rev=1492237&r1=1492236&r2=1492237&view=diff
==============================================================================
--- cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/InterfaceMonitorManager.java (original)
+++ cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/InterfaceMonitorManager.java Wed Jun 12 15:09:30 2013
@@ -26,6 +26,7 @@ import java.util.concurrent.CopyOnWriteA
 
 import org.apache.cxf.dosgi.discovery.local.util.Utils;
 import org.apache.zookeeper.ZooKeeper;
+import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.remoteserviceadmin.EndpointDescription;
@@ -139,21 +140,12 @@ public class InterfaceMonitorManager {
         for (ServiceReference sref : relatedServiceListeners) {
             Object service = bctx.getService(sref);
             try {
-                if (!(service instanceof EndpointListener)) { // including null
-                    continue;
-                }
-                EndpointListener epl = (EndpointListener) service;
-                LOG.debug("matching {} against {}", epd, currentScope);
-                if (Utils.matchFilter(bctx, currentScope, epd)) {
-                    LOG.debug("Matched {} against {}", epd, currentScope);
-                    if (isAdded) {
-                        LOG.info("calling EndpointListener.endpointAdded: " + epl + " from bundle "
-                            + sref.getBundle().getSymbolicName() + " for endpoint: " + epd);
-                        epl.endpointAdded(epd, currentScope);
-                    } else {
-                        LOG.info("calling EndpointListener.endpointRemoved: " + epl + " from bundle "
-                            + sref.getBundle().getSymbolicName() + " for endpoint: " + epd);
-                        epl.endpointRemoved(epd, currentScope);
+                if (service instanceof EndpointListener) {
+                    EndpointListener epl = (EndpointListener) service;
+                    LOG.trace("matching {} against {}", epd, currentScope);
+                    if (Utils.matchFilter(bctx, currentScope, epd)) {
+                        LOG.debug("Matched {} against {}", epd, currentScope);
+                        notifyListener(epd, currentScope, isAdded, sref.getBundle(), epl);
                     }
                 }
             } finally {
@@ -164,6 +156,21 @@ public class InterfaceMonitorManager {
         }
     }
 
+    private void notifyListener(EndpointDescription epd, String currentScope, boolean isAdded,
+                                Bundle eplBundle, EndpointListener epl) {
+        if (eplBundle == null) {
+            LOG.info("listening service was unregistered, ignoring");
+        } else if (isAdded) {
+            LOG.info("calling EndpointListener.endpointAdded: " + epl + " from bundle "
+                    + eplBundle.getSymbolicName() + " for endpoint: " + epd);
+            epl.endpointAdded(epd, currentScope);
+        } else {
+            LOG.info("calling EndpointListener.endpointRemoved: " + epl + " from bundle "
+                    + eplBundle.getSymbolicName() + " for endpoint: " + epd);
+            epl.endpointRemoved(epd, currentScope);
+        }
+    }
+
     public synchronized void close() {
         for (Interest interest : interestingScopes.values()) {
             interest.im.close();

Modified: cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/EventProducer.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/EventProducer.java?rev=1492237&r1=1492236&r2=1492237&view=diff
==============================================================================
--- cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/EventProducer.java (original)
+++ cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/EventProducer.java Wed Jun 12 15:09:30 2013
@@ -20,6 +20,7 @@ package org.apache.cxf.dosgi.dsw.service
 
 import java.util.List;
 
+import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
@@ -89,12 +90,15 @@ public class EventProducer {
             if (listenerRefs != null) {
                 for (ServiceReference sref : listenerRefs) {
                     RemoteServiceAdminListener rsal = (RemoteServiceAdminListener)bctx.getService(sref);
-                    try {
-                        LOG.debug("notify RemoteServiceAdminListener {} of bundle {}",
-                                rsal, sref.getBundle().getSymbolicName());
-                        rsal.remoteAdminEvent(rsae);
-                    } finally {
-                        if (rsal != null) {
+                    if (rsal != null) {
+                        try {
+                            Bundle bundle = sref.getBundle();
+                            if (bundle != null) {
+                                LOG.debug("notify RemoteServiceAdminListener {} of bundle {}",
+                                        rsal, bundle.getSymbolicName());
+                                rsal.remoteAdminEvent(rsae);
+                            }
+                        } finally {
                             bctx.ungetService(sref);
                         }
                     }

Modified: cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCore.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCore.java?rev=1492237&r1=1492236&r2=1492237&view=diff
==============================================================================
--- cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCore.java (original)
+++ cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCore.java Wed Jun 12 15:09:30 2013
@@ -119,12 +119,13 @@ public class RemoteServiceAdminCore impl
         try {
             // do the export
             List<ExportRegistration> exportRegs = exportInterfaces(interfaces, serviceReference, serviceProperties);
-
-            // enlist initial export registrations in global list of exportRegistrations
-            synchronized (exportedServices) {
-                exportedServices.put(key, new ArrayList<ExportRegistration>(exportRegs));
+            if (!exportRegs.isEmpty()) {
+                // enlist initial export registrations in global list of exportRegistrations
+                synchronized (exportedServices) {
+                    exportedServices.put(key, new ArrayList<ExportRegistration>(exportRegs));
+                }
+                eventProducer.publishNotification(exportRegs);
             }
-            eventProducer.publishNotification(exportRegs);
             return exportRegs;
         } finally {
             synchronized (exportedServices) {
@@ -147,16 +148,22 @@ public class RemoteServiceAdminCore impl
             return Collections.emptyList();
         }
         List<ExportRegistration> exportRegs = new ArrayList<ExportRegistration>(1);
-        Object serviceObject = bctx.getService(serviceReference);
-        BundleContext callingContext = serviceReference.getBundle().getBundleContext();
+        Object service = bctx.getService(serviceReference);
+        Bundle bundle = serviceReference.getBundle();
+
+        // if service has been unregistered in the meantime
+        if (service == null || bundle == null) {
+            LOG.info("service has been unregistered, aborting export");
+            return exportRegs;
+        }
 
         for (String iface : interfaces) {
             LOG.info("creating server for interface " + iface);
             // this is an extra sanity check, but do we really need it now?
-            Class<?> interfaceClass = ClassUtils.getInterfaceClass(serviceObject, iface);
+            Class<?> interfaceClass = ClassUtils.getInterfaceClass(service, iface);
             if (interfaceClass != null) {
-                ExportResult exportResult = handler.createServer(serviceReference, bctx, callingContext,
-                    serviceProperties, interfaceClass, serviceObject);
+                ExportResult exportResult = handler.createServer(serviceReference, bctx, bundle.getBundleContext(),
+                    serviceProperties, interfaceClass, service);
                 LOG.info("created server for interface " + iface);
                 EndpointDescription epd = new EndpointDescription(exportResult.getEndpointProps());
                 ExportRegistrationImpl exportRegistration = new ExportRegistrationImpl(serviceReference, epd, this);
@@ -261,7 +268,7 @@ public class RemoteServiceAdminCore impl
     }
 
     private boolean isCreatedByThisRSA(ServiceReference sref) {
-        return (sref.getBundle() != null) && sref.getBundle().equals(bctx.getBundle());
+        return bctx.getBundle().equals(sref.getBundle()); // sref bundle can be null
     }
 
     public Collection<ExportReference> getExportedServices() {

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=1492237&r1=1492236&r2=1492237&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 Wed Jun 12 15:09:30 2013
@@ -26,6 +26,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.cxf.dosgi.topologymanager.util.Utils;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.remoteserviceadmin.EndpointDescription;
 import org.osgi.service.remoteserviceadmin.RemoteServiceAdmin;
@@ -76,9 +77,8 @@ class EndpointRepository {
 
     synchronized void addService(ServiceReference sref) {
         if (!exportedServices.containsKey(sref)) {
-            LOG.info("Marking service from bundle {} for export", sref.getBundle().getSymbolicName());
-            exportedServices.put(sref,
-                                 new LinkedHashMap<RemoteServiceAdmin, Collection<EndpointDescription>>());
+            LOG.info("Marking service from bundle {} for export", Utils.getBundleName(sref));
+            exportedServices.put(sref, new LinkedHashMap<RemoteServiceAdmin, Collection<EndpointDescription>>());
         }
     }
 

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=1492237&r1=1492236&r2=1492237&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 Wed Jun 12 15:09:30 2013
@@ -28,6 +28,7 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.cxf.dosgi.topologymanager.util.SimpleServiceTracker;
 import org.apache.cxf.dosgi.topologymanager.util.SimpleServiceTrackerListener;
+import org.apache.cxf.dosgi.topologymanager.util.Utils;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceEvent;
@@ -144,7 +145,7 @@ public class TopologyManagerExport {
         List<RemoteServiceAdmin> rsaList = remoteServiceAdminTracker.getAllServices();
         if (rsaList.isEmpty()) {
             LOG.error("No RemoteServiceAdmin available! Unable to export service from bundle {}, interfaces: {}",
-                    sref.getBundle().getSymbolicName(),
+                    Utils.getBundleName(sref),
                     sref.getProperty(org.osgi.framework.Constants.OBJECTCLASS));
         }
 

Modified: cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/util/Utils.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/util/Utils.java?rev=1492237&r1=1492236&r2=1492237&view=diff
==============================================================================
--- cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/util/Utils.java (original)
+++ cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/util/Utils.java Wed Jun 12 15:09:30 2013
@@ -24,8 +24,10 @@ import java.util.UUID;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
 import org.osgi.service.remoteserviceadmin.EndpointDescription;
 
 public final class Utils {
@@ -71,4 +73,9 @@ public final class Utils {
             return uuid;
         }
     }
+
+    public static String getBundleName(ServiceReference sref) {
+        Bundle bundle = sref.getBundle();
+        return bundle == null ? "<unregistered>" : bundle.getSymbolicName();
+    }
 }