private void populateEntityInfo() throws NoSuchMethodException { List<Class> metaClasses = BeanUtils.scanClass("org.zstack", StaticMetamodel.class); for (Class it : metaClasses) { StaticMetamodel at = (StaticMetamodel) it.getAnnotation(StaticMetamodel.class); metaModelClasses.put(at.value(), it); } List<Class> invClasses = BeanUtils.scanClass("org.zstack", Inventory.class); for (Class invClass : invClasses) { EntityInfo info = buildEntityInfo(invClass); if (info.inventoryAnnotation.parent().length > 0) { Parent pat = info.inventoryAnnotation.parent()[0]; Class pinvClass = pat.inventoryClass(); DebugUtils.Assert(pinvClass.isAnnotationPresent(Inventory.class), String.format("inventory[%s]'s parent inventory class[%s] is not annotated by @Inventory", info.inventoryClass.getName(), pinvClass.getName())); EntityInfo pinfo = buildEntityInfo(pinvClass); info.parent = pinfo; pinfo.children.add(info); } } for (EntityInfo e : entityInfos.values()) { e.buildFlatTypeEntityMap(); } }