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