private Object fromXML()

in src/main/java/com/vmware/vim25/ws/XmlGenDom.java [223:272]


    private Object fromXML(String type, Element root) throws Exception {
        List<Element> subNodes = root.elements();

        if (subNodes.size() == 0) {
            return null;
        }

        if (type.startsWith("ManagedObjectReference")) {
            if (!type.endsWith("[]")) {
                Element e = subNodes.get(0);
                return MorUtil.createMOR(e.attributeValue("type"), e.getText());
            }
            else {
                ManagedObjectReference[] mos = new ManagedObjectReference[subNodes.size()];
                for (int i = 0; i < subNodes.size(); i++) {
                    Element elem = subNodes.get(i);
                    mos[i] = MorUtil.createMOR(elem.attributeValue("type"), elem.getText());
                }
                return mos;
            }
        }
        else if (TypeUtil.isBasicType(type)) {
            List<String> vals = new ArrayList<String>();
            for (Element subNode : subNodes) {
                vals.add(subNode.getText());
            }
            return ReflectUtil.parseToObject(type, vals);
        }
        else if (type.endsWith("[]")) { // array type
            String arrayItemTypeName = type.substring(0, type.length() - 2);
            Class<?> clazz = TypeUtil.getVimClass(arrayItemTypeName);
            Object ao = Array.newInstance(clazz, subNodes.size());

            for (int i = 0; i < subNodes.size(); i++) {
                Element e = subNodes.get(i);
                String xsiType = e.attributeValue(SoapConsts.XSI_TYPE);
                Object o = fromXml(TypeUtil.getVimClass(xsiType == null ? arrayItemTypeName : xsiType), subNodes.get(i));
                Array.set(ao, i, o);
            }
            return ao;
        } else {
            Class<?> vimClass = TypeUtil.getVimClass(type);
            if(vimClass != null) {
                return fromXml(vimClass, subNodes.get(0));
            } else {
                log.error("Vim class not found for type: " + type + ", XML Document: " + subNodes.get(0).asXML());
                return null;
            }
        }
    }