Author: vvalchev
Date: Wed Apr 4 07:03:35 2012
New Revision: 1309270
URL: http://svn.apache.org/viewvc?rev=1309270&view=rev
Log:
Fixed FELIX-3428 NPE in UPnP Web Console Plugin (again)
https://issues.apache.org/jira/browse/FELIX-3428
Modified:
felix/trunk/webconsole-plugins/upnp/src/main/java/org/apache/felix/webconsole/plugins/upnp/internal/ControlServlet.java
felix/trunk/webconsole-plugins/upnp/src/main/java/org/apache/felix/webconsole/plugins/upnp/internal/WebConsolePlugin.java
Modified:
felix/trunk/webconsole-plugins/upnp/src/main/java/org/apache/felix/webconsole/plugins/upnp/internal/ControlServlet.java
URL:
http://svn.apache.org/viewvc/felix/trunk/webconsole-plugins/upnp/src/main/java/org/apache/felix/webconsole/plugins/upnp/internal/ControlServlet.java?rev=1309270&r1=1309269&r2=1309270&view=diff
==============================================================================
---
felix/trunk/webconsole-plugins/upnp/src/main/java/org/apache/felix/webconsole/plugins/upnp/internal/ControlServlet.java
(original)
+++
felix/trunk/webconsole-plugins/upnp/src/main/java/org/apache/felix/webconsole/plugins/upnp/internal/ControlServlet.java
Wed Apr 4 07:03:35 2012
@@ -37,6 +37,7 @@ import org.json.JSONException;
import org.json.JSONObject;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
+import org.osgi.service.log.LogService;
import org.osgi.service.upnp.UPnPAction;
import org.osgi.service.upnp.UPnPDevice;
import org.osgi.service.upnp.UPnPIcon;
@@ -95,7 +96,8 @@ public class ControlServlet extends Http
response.setDateHeader("Last-Modified", LAST_MODIFIED);
//$NON-NLS-1$
InputStream in = icon.getInputStream();
- if (null == in) { // this is buggy implementations
+ if (null == in)
+ { // this is buggy implementations
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
@@ -142,7 +144,11 @@ public class ControlServlet extends Http
if (refs[i] != null
&& refs[i].getProperty(UPnPDevice.PARENT_UDN) == null)
{
- json.append("devices", deviceTreeToJSON(refs[i]));
//$NON-NLS-1$
+ JSONObject deviceJSON = deviceTreeToJSON(refs[i]);
+ if (null != deviceJSON)
+ {
+ json.append("devices", deviceJSON); //$NON-NLS-1$
+ }
}
}
}
@@ -159,8 +165,7 @@ public class ControlServlet extends Http
UPnPService service = requireService(request);
UPnPAction action = service.getAction(require("actionID",
request)); //$NON-NLS-1$
- json = invoke(
- action, //
+ json = invoke(action, //
request.getParameterValues("names"), //$NON-NLS-1$
request.getParameterValues("vals")); //$NON-NLS-1$
}
@@ -221,6 +226,13 @@ public class ControlServlet extends Http
Object[] refs = tracker.getServiceReferences();
Object parentUdn = ref.getProperty(UPnPDevice.UDN);
+ if (parentUdn == null)
+ {
+ plugin.log(LogService.LOG_ERROR,
+ "Invalid device, no UDN property specified for " + device);
+ return null;
+ }
+
JSONObject json = deviceToJSON(ref, device);
// add child devices
@@ -241,7 +253,11 @@ public class ControlServlet extends Http
else if (parentUdn.equals(parent))
{
device = (UPnPDevice) tracker.getService(ref);
- json.append("children", deviceTreeToJSON(ref)); //$NON-NLS-1$
+ JSONObject deviceJSON = deviceTreeToJSON(ref);
+ if (null != deviceJSON)
+ {
+ json.append("children", deviceJSON); //$NON-NLS-1$
+ }
}
}
return json;
@@ -296,14 +312,14 @@ public class ControlServlet extends Http
value = "---"; //$NON-NLS-1$
json.append("variables", new JSONObject() // //$NON-NLS-1$
- .put("name", vars[i].getName()) // //$NON-NLS-1$
- .put("value", value) // //$NON-NLS-1$
- .put("defalt", vars[i].getDefaultValue()) // //$NON-NLS-1$
- .put("min", vars[i].getMinimum()) // //$NON-NLS-1$
- .put("max", vars[i].getMaximum()) // //$NON-NLS-1$
- .put("step", vars[i].getStep()) // //$NON-NLS-1$
- .put("allowed", vars[i].getAllowedValues()) // //$NON-NLS-1$
- .put("sendsEvents", vars[i].sendsEvents()) // //$NON-NLS-1$
+ .put("name", vars[i].getName()) // //$NON-NLS-1$
+ .put("value", value) // //$NON-NLS-1$
+ .put("defalt", vars[i].getDefaultValue()) // //$NON-NLS-1$
+ .put("min", vars[i].getMinimum()) // //$NON-NLS-1$
+ .put("max", vars[i].getMaximum()) // //$NON-NLS-1$
+ .put("step", vars[i].getStep()) // //$NON-NLS-1$
+ .put("allowed", vars[i].getAllowedValues()) // //$NON-NLS-1$
+ .put("sendsEvents", vars[i].sendsEvents()) // //$NON-NLS-1$
);
}
@@ -350,15 +366,24 @@ public class ControlServlet extends Http
final UPnPStateVariable var =
action.getStateVariable(names[i]);
final String upnpType = var.getUPnPDataType();
final Object argObj;
- if (UPnPStateVariable.TYPE_STRING.equals(upnpType)) {
+ if (UPnPStateVariable.TYPE_STRING.equals(upnpType))
+ {
argObj = vals[i];
- } else if (UPnPStateVariable.TYPE_CHAR.equals(upnpType)) {
+ }
+ else if (UPnPStateVariable.TYPE_CHAR.equals(upnpType))
+ {
argObj = new Character(vals[i].charAt(0));
- } else if (UPnPStateVariable.TYPE_BIN_BASE64.equals(upnpType))
{
- argObj = Base64.decodeBase64(vals[i]);
- } else if (UPnPStateVariable.TYPE_BIN_HEX.equals(upnpType)) {
+ }
+ else if (UPnPStateVariable.TYPE_BIN_BASE64.equals(upnpType))
+ {
+ argObj = Base64.decodeBase64(vals[i]);
+ }
+ else if (UPnPStateVariable.TYPE_BIN_HEX.equals(upnpType))
+ {
argObj = Hex.decode(vals[i]);
- } else {
+ }
+ else
+ {
Class javaType = var.getJavaDataType();
Constructor constructor = javaType.getConstructor(new
Class[] { String.class });
argObj = constructor.newInstance(new Object[] { vals[i] });
@@ -393,9 +418,9 @@ public class ControlServlet extends Http
}
json.append("output", new JSONObject() // //$NON-NLS-1$
- .put("name", key)// //$NON-NLS-1$
- .put("type", var.getUPnPDataType()) // //$NON-NLS-1$
- .put("value", value)); //$NON-NLS-1$
+ .put("name", key)// //$NON-NLS-1$
+ .put("type", var.getUPnPDataType()) // //$NON-NLS-1$
+ .put("value", value)); //$NON-NLS-1$
}
}
return json;
@@ -447,16 +472,19 @@ public class ControlServlet extends Http
throw new IllegalArgumentException("Service '" + urn + "' not found!");
}
+ private final WebConsolePlugin plugin;
+
/**
* Creates new XML-RPC handler.
*
* @param bc the bundle context
* @param iconServlet the icon servlet.
*/
- ControlServlet(BundleContext bc, ServiceTracker tracker)
+ ControlServlet(BundleContext bc, ServiceTracker tracker, WebConsolePlugin
plugin)
{
this.bc = bc;
this.tracker = tracker;
+ this.plugin = plugin;
}
/**
Modified:
felix/trunk/webconsole-plugins/upnp/src/main/java/org/apache/felix/webconsole/plugins/upnp/internal/WebConsolePlugin.java
URL:
http://svn.apache.org/viewvc/felix/trunk/webconsole-plugins/upnp/src/main/java/org/apache/felix/webconsole/plugins/upnp/internal/WebConsolePlugin.java?rev=1309270&r1=1309269&r2=1309270&view=diff
==============================================================================
---
felix/trunk/webconsole-plugins/upnp/src/main/java/org/apache/felix/webconsole/plugins/upnp/internal/WebConsolePlugin.java
(original)
+++
felix/trunk/webconsole-plugins/upnp/src/main/java/org/apache/felix/webconsole/plugins/upnp/internal/WebConsolePlugin.java
Wed Apr 4 07:03:35 2012
@@ -64,7 +64,7 @@ public class WebConsolePlugin extends Si
public void activate(BundleContext bundleContext)
{
super.activate(bundleContext);
- controller = new ControlServlet(bundleContext, tracker);
+ controller = new ControlServlet(bundleContext, tracker, this);
}
/**