protected void addDeviceItem(ICpDeviceItem item, final String itemName, final int level) {
   IRteDeviceItem di = getChild(itemName);
   if (di == null) {
     di = new RteDeviceItem(itemName, level, this);
     addChild(di);
   }
   di.addDevice(item);
 }
 @Override
 public IRteDeviceItem getVendorItem(String vendor) {
   if (getLevel() == EDeviceHierarchyLevel.ROOT.ordinal()) {
     return getChild(vendor);
   }
   IRteDeviceItem root = getRoot();
   if (root != null) {
     return root.getVendorItem(vendor);
   }
   return null;
 }
 /**
  * Creates device tree from list of Packs
  *
  * @param packs collection of packs to use
  * @return device tree as root IRteDeviceItem
  */
 public static IRteDeviceItem createTree(Collection<ICpPack> packs) {
   IRteDeviceItem root = new RteDeviceItem();
   if (packs == null || packs.isEmpty()) return root;
   for (ICpPack pack : packs) {
     Collection<? extends ICpItem> devices = pack.getChildren("devices");
     if (devices == null) continue;
     for (ICpItem item : devices) {
       if (!(item instanceof ICpDeviceItem)) continue;
       ICpDeviceItem deviceItem = (ICpDeviceItem) item;
       root.addDevice(deviceItem);
     }
   }
   return root;
 }
 @Override
 public IRteDeviceItem findItem(final String deviceName, final String vendor) {
   if (fLevel == EDeviceHierarchyLevel.ROOT.ordinal() && vendor != null && !vendor.isEmpty()) {
     String vendorName = Vendor.getOfficialVendorName(vendor);
     IRteDeviceItem dti = getChild(vendorName);
     if (dti != null) return dti.findItem(deviceName, vendorName);
   } else {
     // check if device item can be found directly on this level
     IRteDeviceItem dti = getChild(deviceName);
     if (dti != null && dti.getLevel() > EDeviceHierarchyLevel.SUBFAMILY.ordinal()) return dti;
     // search in children
     Collection<? extends IRteDeviceItem> children = getChildren();
     if (children == null) return null;
     for (IRteDeviceItem child : children) {
       dti = child.findItem(deviceName, vendor);
       if (dti != null && dti.getLevel() > EDeviceHierarchyLevel.SUBFAMILY.ordinal()) return dti;
     }
   }
   return null;
 }