blob: 71e8d817e257b915e0dbcb740962d792e276a38b [file] [log] [blame]
/*
* 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.upnp.basedriver.export;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.upnp.UPnPDevice;
/*
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class DeviceNode {
private ServiceReference sr;
private boolean isRootNode;
private String udn ;
private boolean hasChild;
private int numberOfSons;
private ArrayList children;
private DeviceNode parent;
public DeviceNode(ServiceReference sr){
//PRE: argument is always UPnPDevice service reference
if (sr == null)
throw new IllegalArgumentException("null is not a valid arg in DeviceNode constructor");
this.sr = sr;
udn = (String) sr.getProperty(UPnPDevice.UDN);
parent=null;
isRootNode = (sr.getProperty(UPnPDevice.PARENT_UDN) == null);
String[] sons = ((String[]) sr.getProperty(UPnPDevice.CHILDREN_UDN));
hasChild = (sons != null);
if (hasChild) {
children = new ArrayList();
numberOfSons = sons.length;
}
}
public ServiceReference getReference(){
return sr;
}
public UPnPDevice getDevice(BundleContext ctx){
return (UPnPDevice)ctx.getService(sr);
}
public void attach(DeviceNode node){
if (node == null)
throw new IllegalArgumentException("null is not a valid arg in DeviceNode.attach() method");
node.parent = this;
children.add(node);
}
public DeviceNode dethatch(String name){
DeviceNode dn = this.search(name);
if(dn==null)
return null;
if(dn.parent!=null){
Iterator list = dn.parent.children.iterator();
while (list.hasNext()) {
DeviceNode x = (DeviceNode) list.next();
if(x.udn.equals(name)){
list.remove();
break;
}
}
}
dn.parent=null;
return dn;
}
public Collection getAllChildren(){
if((this.children==null)||(this.children.size()==0))
return null;
Vector v = new Vector(this.children);
Iterator list = this.children.iterator();
while (list.hasNext()) {
DeviceNode x = (DeviceNode) list.next();
Collection c = x.getAllChildren();
if(c==null) continue;
v.addAll(c);
}
return v;
}
public Collection getChildren(){
if((this.children==null)||(this.children.size()==0))
return null;
return this.children;
}
/**
* @param name <code>String</code> that contain the UDN to look for
* @return return a <code>DeviceNode</code> that have the UDN equals to name and <br>
* if there is any <code>DeviceNode</code> with the proper UDN value return <code>null</code>
*/
public DeviceNode search(String name){
if (name == null)
throw new IllegalArgumentException("null is not a valid arg in DeviceNode.search() method");
if (name.equals(udn))
return this;
else if (hasChild){
Iterator list = children.iterator();
while (list.hasNext()){
DeviceNode child = (DeviceNode)list.next();
DeviceNode node = child.search(name);
if (node != null) return node;
}
}
return null;
}
/**
*
* @param udn
* @return <code>true</code> if and only if this <code>DeviceNode</code>
* contains a DeviceNode with UDN equals to passed argument or if
* its USN is equal to passed argument
*/
public boolean contains(String udn){
return this.search(udn)!=null;
}
public boolean isComplete(){
if (! hasChild) return true;
if (numberOfSons != children.size())return false;
Iterator list = children.iterator();
while (list.hasNext()){
DeviceNode child = (DeviceNode)list.next();
if (! child.isComplete()) return false;
}
return true;
}
public DeviceNode isAttachable(DeviceNode node){
if (node == null)
throw new IllegalArgumentException("null is not a valid arg in DeviceNode.isAttachable() method");
String parentUDN=(String) node.getReference().getProperty(UPnPDevice.PARENT_UDN);
if(parentUDN==null) return null;
return search(parentUDN);
}
public boolean isRoot(){
return isRootNode;
}
public boolean equals(String udn){
return this.udn.equals(udn);
}
public String toString(){
return udn;
}
/**
* @return true if and only
* if the Device doesn't have embedded Device
*/
public boolean isLeaf() {
return !hasChild;
}
}