/* | |
* Licensed to the Apache Software Foundation (ASF) under one or more | |
* contributor license agreements. See the NOTICE file distributed with | |
* this work for additional information regarding copyright ownership. | |
* The ASF licenses this file to You under the Apache License, Version 2.0 | |
* (the "License"); you may not use this file except in compliance with | |
* the License. You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package org.apache.felix.webconsole.plugins.upnp.internal; | |
import java.io.IOException; | |
import java.io.PrintWriter; | |
import java.util.Arrays; | |
import java.util.Iterator; | |
import java.util.TreeMap; | |
import org.apache.felix.inventory.Format; | |
import org.apache.felix.inventory.InventoryPrinter; | |
import org.apache.felix.utils.json.JSONWriter; | |
import org.apache.felix.webconsole.WebConsoleUtil; | |
import org.osgi.framework.Constants; | |
import org.osgi.framework.ServiceReference; | |
import org.osgi.service.upnp.UPnPAction; | |
import org.osgi.service.upnp.UPnPDevice; | |
import org.osgi.service.upnp.UPnPService; | |
import org.osgi.service.upnp.UPnPStateVariable; | |
import org.osgi.util.tracker.ServiceTracker; | |
/** | |
* Prints the available UPnP devices | |
* | |
*/ | |
class ConfigurationPrinterImpl implements InventoryPrinter, Constants | |
{ | |
private final ServiceTracker tracker; | |
ConfigurationPrinterImpl(ServiceTracker tracker) | |
{ | |
this.tracker = tracker; | |
} | |
/** | |
* @see org.apache.felix.inventory.InventoryPrinter | |
* #print(java.io.PrintWriter, org.apache.felix.inventory.Format, boolean) | |
*/ | |
public void print(PrintWriter pw, Format format, boolean isZip) | |
{ | |
TreeMap componentMap = new TreeMap(); | |
ServiceReference[] refs = tracker.getServiceReferences(); | |
for (int i = 0; refs != null && i < refs.length; i++) | |
{ | |
ServiceReference ref = refs[i]; | |
if (null != ref.getProperty(UPnPDevice.UDN)) // make sure device is valid | |
{ | |
// order components by friendly name | |
componentMap.put(nameOf(ref).toString() + ref.getProperty(SERVICE_ID), | |
ref); | |
} | |
} | |
if (Format.JSON.equals(format)) | |
{ | |
try | |
{ | |
printJSON(componentMap, pw); | |
} | |
catch (IOException e) | |
{ | |
printText(componentMap, pw); | |
} | |
} | |
else | |
{ | |
printText(componentMap, pw); | |
} | |
} | |
private void printJSON(TreeMap componentMap, PrintWriter pw) throws IOException | |
{ | |
final JSONWriter writer = new JSONWriter(pw); | |
writer.object(); | |
writer.key("devices"); | |
writer.array(); | |
// render components | |
for (Iterator ci = componentMap.values().iterator(); ci.hasNext();) | |
{ | |
final ServiceReference ref = (ServiceReference) ci.next(); | |
final UPnPDevice device = (UPnPDevice) tracker.getService(ref); | |
if (device != null) | |
{ | |
writer.value(Serializer.deviceToJSON(ref, device)); | |
} | |
} | |
writer.endArray(); | |
writer.endObject(); | |
writer.flush(); | |
} | |
private void printText(TreeMap componentMap, PrintWriter pw) | |
{ | |
if (componentMap.isEmpty()) | |
{ | |
pw.println("Status: No UPnP devices found"); | |
return; | |
} | |
pw.println("Status: " + componentMap.size() + " UPnP devices found"); | |
pw.println(); | |
// render components | |
for (Iterator ci = componentMap.values().iterator(); ci.hasNext();) | |
{ | |
print(pw, (ServiceReference) ci.next()); | |
} | |
} | |
private static final Object nameOf(ServiceReference ref) | |
{ | |
Object name = ref.getProperty(UPnPDevice.FRIENDLY_NAME); | |
if (null == name) | |
{ | |
name = ref.getProperty(UPnPDevice.UDN); | |
} | |
return name; | |
} | |
private void print(PrintWriter pw, ServiceReference ref) | |
{ | |
pw.println(nameOf(ref)); | |
pw.println(" Properties:"); | |
String[] properties = ref.getPropertyKeys(); | |
Arrays.sort(properties); | |
for (int i = 0; i < properties.length; i++) | |
{ | |
String key = properties[i]; | |
if (OBJECTCLASS.equals(key) || SERVICE_ID.equals(key)) | |
{ | |
continue; | |
} | |
Object val = ref.getProperty(key); | |
val = WebConsoleUtil.toString(val); | |
pw.print(" "); //$NON-NLS-1$ | |
pw.print(key); | |
pw.print(" = "); //$NON-NLS-1$ | |
pw.println(val); | |
} | |
UPnPDevice dev = (UPnPDevice) tracker.getService(ref); | |
if (null == dev) | |
return; | |
UPnPService services[] = dev.getServices(); | |
if (null != services && services.length > 0) | |
{ | |
pw.println(" Services:"); | |
for (int i = 0; i < services.length; i++) | |
{ | |
print(pw, services[i]); | |
} | |
} | |
pw.println(); | |
} | |
private void print(PrintWriter pw, UPnPService serv) | |
{ | |
pw.print(" Service: "); | |
pw.print(serv.getId()); | |
pw.print(", ver "); | |
pw.print(serv.getVersion()); | |
pw.print(" (type = "); | |
pw.print(serv.getType()); | |
pw.println(')'); | |
UPnPAction[] actions = serv.getActions(); | |
if (actions != null && actions.length > 0) | |
{ | |
pw.print(" Actions: "); | |
for (int i = 0; i < actions.length; i++) | |
{ | |
pw.print(actions[i].getName()); | |
if (i < actions.length - 1) | |
{ | |
pw.print(", "); | |
} | |
} | |
pw.println(); | |
} | |
UPnPStateVariable[] vars = serv.getStateVariables(); | |
if (vars != null && vars.length > 0) | |
{ | |
pw.println(" State Vars:"); | |
for (int i = 0; i < vars.length; i++) | |
{ | |
print(pw, vars[i]); | |
} | |
} | |
} | |
private void print(PrintWriter pw, UPnPStateVariable var) | |
{ | |
pw.print(" "); | |
pw.print(var.getName()); | |
pw.print(" ("); | |
pw.print(var.getUPnPDataType()); | |
pw.print(')'); | |
if (var.sendsEvents()) | |
{ | |
pw.print(", sends events"); | |
} | |
if (null != var.getMinimum()) | |
{ | |
pw.print(", min = "); | |
pw.print(var.getMinimum()); | |
} | |
if (null != var.getMaximum()) | |
{ | |
pw.print(", max = "); | |
pw.print(var.getMaximum()); | |
} | |
if (null != var.getStep()) | |
{ | |
pw.print(", step = "); | |
pw.print(var.getStep()); | |
} | |
pw.println(); | |
} | |
} |