Fixed FELIX-3669 : NPE in ControlServlet.deviceToJSON
https://issues.apache.org/jira/browse/FELIX-3669

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1391982 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/webconsole-plugins/upnp/src/main/java/org/apache/felix/webconsole/plugins/upnp/internal/ControlServlet.java b/webconsole-plugins/upnp/src/main/java/org/apache/felix/webconsole/plugins/upnp/internal/ControlServlet.java
index cf7cdb3..95a9f4f 100644
--- a/webconsole-plugins/upnp/src/main/java/org/apache/felix/webconsole/plugins/upnp/internal/ControlServlet.java
+++ b/webconsole-plugins/upnp/src/main/java/org/apache/felix/webconsole/plugins/upnp/internal/ControlServlet.java
@@ -55,6 +55,8 @@
 public class ControlServlet extends HttpServlet implements ServiceTrackerCustomizer

 {

 

+    private static final long serialVersionUID = -5789642544511401813L;

+

     private static final SimpleDateFormat DATA_FORMAT = new SimpleDateFormat(

         "EEE, d MMM yyyy HH:mm:ss Z"); //$NON-NLS-1$

 

@@ -227,8 +229,11 @@
 

     private final JSONObject deviceTreeToJSON(ServiceReference ref) throws JSONException

     {

-        UPnPDevice device = (UPnPDevice) tracker.getService(ref);

-        Object[] refs = tracker.getServiceReferences();

+        final UPnPDevice device = (UPnPDevice) tracker.getService(ref);

+        if (null == device)

+        {

+            return null; // the device is dynamically removed

+        }

 

         Object parentUdn = ref.getProperty(UPnPDevice.UDN);

         if (parentUdn == null)

@@ -241,6 +246,7 @@
         JSONObject json = deviceToJSON(ref, device);

 

         // add child devices

+        final Object[] refs = tracker.getServiceReferences();

         for (int i = 0; refs != null && i < refs.length; i++)

         {

             ref = (ServiceReference) refs[i];

@@ -257,7 +263,6 @@
             }

             else if (parentUdn.equals(parent))

             {

-                device = (UPnPDevice) tracker.getService(ref);

                 JSONObject deviceJSON = deviceTreeToJSON(ref);

                 if (null != deviceJSON)

                 {

@@ -456,14 +461,19 @@
             _udn = (String) refs[i].getProperty(UPnPDevice.UDN);

             if (_udn != null && _udn.equals(udn))

             {

-                return (UPnPDevice) tracker.getService(refs[i]);

+                UPnPDevice upnpDevice = (UPnPDevice) tracker.getService(refs[i]);

+                if (null == upnpDevice)

+                {

+                    break; // device not found

+                }

+                return upnpDevice;

             }

         }

 

         throw new IllegalArgumentException("Device '" + udn + "' not found!");

     }

 

-    private final UPnPService getService(UPnPDevice device, String urn)

+    private static final UPnPService getService(UPnPDevice device, String urn)

     {

         UPnPService[] services = device.getServices();

         for (int i = 0; services != null && i < services.length; i++)