in src/com/vmware/vim25/ws/XmlGenDom.java [203:347]
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 = (Element) subNodes.get(j+i);
mos[j] = createMOR(elem.attributeValue("type"), elem.getText());
}
field.set(obj, mos);
i = i + sizeOfFieldArray -1;
}
else
{
field.set(obj, 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(((Element)subNodes.get(j+i)).getText());
}
String fTrueType = null;
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 = (Element) 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;
}