/* * 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; } }