Field coreField = accessor.getClass().getDeclaredField("core");
coreField.setAccessible(true);
accessor = (Accessor) coreField.get(accessor);
} catch (Throwable e) {
throw new BuildException("Unable to access private fields of AdaptedAccessor class", e);
}
}
if (accessor instanceof Accessor.FieldReflection) {
Accessor.FieldReflection fieldReflection = (Accessor.FieldReflection) accessor;
property.setField(fieldReflection.f);
} else if (accessor instanceof Accessor.GetterSetterReflection) {
Accessor.GetterSetterReflection getterSetterReflection = (Accessor.GetterSetterReflection) accessor;
property.setGetter(getterSetterReflection.getter);
property.setSetter(getterSetterReflection.setter);
} else {
throw new BuildException("Unknown property accessor type '" + accessor.getClass().getName() + "' for property " + property);
}
if (runtimePropertyInfo instanceof RuntimeAttributePropertyInfo) {
RuntimeAttributePropertyInfo attributeProperty = (RuntimeAttributePropertyInfo) runtimePropertyInfo;
property.setXmlStyle(Property.XmlStyle.ATTRIBUTE);
property.setXmlName(attributeProperty.getXmlName());
property.setRequired(attributeProperty.isRequired());
if (property.isCollection()) property.setXmlList(true);
} else if (runtimePropertyInfo instanceof RuntimeElementPropertyInfo) {
RuntimeElementPropertyInfo elementProperty = (RuntimeElementPropertyInfo) runtimePropertyInfo;
property.setXmlStyle(Property.XmlStyle.ELEMENT);
if (!elementProperty.isValueList()) {
property.setXmlName(elementProperty.getXmlName());
for (RuntimeTypeRef typeRef : elementProperty.getTypes()) {
ElementMapping elementMapping = createXmlMapping(property, typeRef);
property.getElementMappings().add(elementMapping);
}
property.setRequired(elementProperty.isRequired());
property.setNillable(elementProperty.isCollectionNillable());
} else {
property.setXmlList(true);
if (elementProperty.getTypes().size() != 1) throw new BuildException("Expected 1 element mapped to property " + property + " but there are " + elementProperty.getTypes().size() + " mappings");
RuntimeTypeRef elementType = elementProperty.getTypes().get(0);
ElementMapping elementMapping = createXmlMapping(property, elementType);
elementMapping.setNillable(false);
property.getElementMappings().add(elementMapping);
property.setXmlName(elementType.getTagName());
property.setRequired(false);
property.setNillable(false);
}
} else if (runtimePropertyInfo instanceof RuntimeReferencePropertyInfo) {
RuntimeReferencePropertyInfo referenceProperty = (RuntimeReferencePropertyInfo) runtimePropertyInfo;
property.setXmlStyle(Property.XmlStyle.ELEMENT_REF);
for (RuntimeElement re : referenceProperty.getElements()) {
ElementMapping elementMapping;
if (re instanceof RuntimeElementInfo) {
RuntimeElementInfo runtimeElement = (RuntimeElementInfo) re;
elementMapping = createXmlMapping(property, runtimeElement);
} else {
RuntimeClassInfo runtimeClassInfo = (RuntimeClassInfo) re;
elementMapping = createXmlMapping(property, runtimeClassInfo);
}
property.getElementMappings().add(elementMapping);
}
property.setNillable(referenceProperty.isCollectionNillable());
property.setXmlAny(referenceProperty.getWildcard() != null);
property.setLax(referenceProperty.getWildcard() == WildcardMode.LAX);
property.setMixed(referenceProperty.isMixed());
} else if (runtimePropertyInfo instanceof RuntimeValuePropertyInfo) {
property.setXmlStyle(Property.XmlStyle.VALUE);
if (property.isCollection()) property.setXmlList(true);
} else {
throw new BuildException("Unknown property type " + runtimePropertyInfo.getClass().getName());
}
return property;
}