in src/main/java/com/vmware/vim25/ws/XmlGenDom.java [278:395]
private Object fromXml(Class<?> clazz, Element node) throws Exception {
Object obj = clazz.newInstance();
List<Element> subNodes = node.elements();
int sizeOfSubNodes = subNodes.size();
for (int i = 0; i < sizeOfSubNodes; i++) {
Element e = subNodes.get(i);
String tagName = e.getName();
Field field = null;
if (TypeUtil.isPrimitiveType(tagName)) {
field = clazz.getField("_" + tagName);
}
else {
field = clazz.getField(tagName);
}
Class<?> fType = field.getType();
boolean isFieldArray = fType.isArray();
//if field is an array, adjust it to the component type
if (isFieldArray) {
fType = fType.getComponentType();
}
Class fRealType = fType;
String xsiType = e.attributeValue(SoapConsts.XSI_TYPE);
if (xsiType != null && (!xsiType.startsWith("xsd:"))) {
fRealType = TypeUtil.getVimClass(xsiType);
}
if (fRealType == ManagedObjectReference.class) { // MOR
if (isFieldArray) {
int sizeOfFieldArray = getNumberOfSameTags(subNodes, sizeOfSubNodes, i, tagName);
ManagedObjectReference[] mos = new ManagedObjectReference[sizeOfFieldArray];
for (int j = 0; j < sizeOfFieldArray; j++) {
Element elem = subNodes.get(j + i);
mos[j] = MorUtil.createMOR(elem.attributeValue("type"), elem.getText());
}
field.set(obj, mos);
i = i + sizeOfFieldArray - 1;
}
else {
field.set(obj, MorUtil.createMOR(e.attributeValue("type"), e.getText()));
}
}
else if (fRealType.isEnum()) { // Enum type
if (!isFieldArray) {
Object fo = Enum.valueOf(fRealType, e.getText());
field.set(obj, fo);
}
else {
int sizeOfFieldArray = getNumberOfSameTags(subNodes, sizeOfSubNodes, i, tagName);
Object ao = Array.newInstance(fRealType, sizeOfFieldArray);
for (int j = 0; j < sizeOfFieldArray; j++) {
String enumStr = ((Element) subNodes.get(j + i)).getText();
Array.set(ao, j, Enum.valueOf(fRealType, enumStr));
}
field.set(obj, ao);
i = i + sizeOfFieldArray - 1;
}
}
else if (TypeUtil.isBasicType(fRealType)) { // basic data types
if (isFieldArray) {
int sizeOfFieldArray = getNumberOfSameTags(subNodes, sizeOfSubNodes, i, tagName);
List<String> values = new ArrayList<String>();
for (int j = 0; j < sizeOfFieldArray; j++) {
values.add(subNodes.get(j + i).getText());
}
String fTrueType;
if (xsiType != null) {
fTrueType = xsiType.substring("xsd:".length()) + "[]";
}
else {
fTrueType = fRealType.getSimpleName();
if (!fTrueType.endsWith("[]")) {
fTrueType = fTrueType + "[]";
}
}
ReflectUtil.setObjectArrayField(obj, field, fTrueType, values);
i = i + sizeOfFieldArray - 1;
}
else {
if (xsiType != null) {
xsiType = xsiType.substring("xsd:".length());
ReflectUtil.setObjectField(obj, field, xsiType, e.getText());
}
else {
ReflectUtil.setObjectField(obj, field, fRealType.getSimpleName(), e.getText());
}
}
}
else { //VIM type
if (isFieldArray) {
int sizeOfFieldArray = getNumberOfSameTags(subNodes, sizeOfSubNodes, i, tagName);
// arrayTypeName = arrayTypeName.substring(0, arrayTypeName.length()-2);
Object ao = Array.newInstance(fType, sizeOfFieldArray);
String fGenericType = fType.getSimpleName();
for (int j = 0; j < sizeOfFieldArray; j++) {
Element elem = subNodes.get(j + i);
String elemXsiType = elem.attributeValue(SoapConsts.XSI_TYPE);
String elemType = elemXsiType != null ? elemXsiType : fGenericType;
Object o = fromXml(TypeUtil.getVimClass(elemType), elem);
Array.set(ao, j, o);
}
field.set(obj, ao);
i = i + sizeOfFieldArray - 1;
}
else { // single VIM
Object o = fromXml(fRealType, e);
field.set(obj, o);
}
}
}
return obj;
}