public ArrayList<Property> getFieldPropertiesForClass(JavaClass cls, TypeInfo info, boolean onlyPublic) {
ArrayList properties = new ArrayList();
if (cls == null) { return properties; }
for (Iterator<JavaField> fieldIt = cls.getDeclaredFields().iterator(); fieldIt.hasNext(); ) {
JavaField nextField = fieldIt.next();
if (!helper.isAnnotationPresent(nextField, XmlTransient.class)) {
int modifiers = nextField.getModifiers();
if (!Modifier.isStatic(modifiers) && !Modifier.isTransient(modifiers) && ((Modifier.isPublic(nextField.getModifiers()) && onlyPublic) || !onlyPublic)) {
Property property = null;
if(helper.isAnnotationPresent((JavaHasAnnotations)nextField, XmlElements.class)) {
property = new ChoiceProperty(helper);
property.setElement((JavaHasAnnotations)nextField);
XmlElements xmlElements = (XmlElements)helper.getAnnotation(property.getElement(), XmlElements.class);
XmlElement[] elements = xmlElements.value();
ArrayList<Property> choiceProperties = new ArrayList<Property>(elements.length);
for(int i = 0; i < elements.length; i++) {
XmlElement next = elements[i];
Property choiceProp = new Property();
String name = next.name();
String namespace = next.namespace();
QName qName = null;
if (!namespace.equals("##default")) {
qName = new QName(namespace, name);
} else {
qName = new QName(name);
}
choiceProp.setPropertyName(property.getPropertyName());
choiceProp.setType(helper.getJavaClass(next.type()));
choiceProp.setSchemaName(qName);
choiceProp.setSchemaType(getSchemaTypeFor(helper.getJavaClass(next.type())));
choiceProp.setElement(property.getElement());
choiceProperties.add(choiceProp);
}
((ChoiceProperty)property).setChoiceProperties(choiceProperties);
}
else if(helper.isAnnotationPresent((JavaHasAnnotations)nextField, XmlAnyElement.class)) {
property = new AnyProperty(helper);
property.setElement((JavaHasAnnotations)nextField);
XmlAnyElement anyElement = (XmlAnyElement)helper.getAnnotation((JavaHasAnnotations)nextField, XmlAnyElement.class);
((AnyProperty)property).setLax(anyElement.lax());
((AnyProperty)property).setDomHandlerClass(anyElement.value());
} else if(helper.isAnnotationPresent((JavaHasAnnotations)nextField, XmlElementRef.class) || helper.isAnnotationPresent((JavaHasAnnotations)nextField, XmlElementRefs.class)) {
property = new ReferenceProperty(helper);
XmlElementRef[] elementRefs;
XmlElementRef ref = (XmlElementRef)helper.getAnnotation((JavaHasAnnotations)nextField, XmlElementRef.class);
if(ref != null) {
elementRefs = new XmlElementRef[]{ref};
} else {
XmlElementRefs refs = (XmlElementRefs)helper.getAnnotation((JavaHasAnnotations)nextField, XmlElementRefs.class);
elementRefs = refs.value();
info.setHasElementRefs(true);
}
for(XmlElementRef nextRef:elementRefs) {
String name = nextRef.name();
String namespace = nextRef.namespace();
if(namespace.equals("##default")) {
namespace = "";
}
QName qname = new QName(namespace, name);
ElementDeclaration referencedElement = this.globalElements.get(qname);
if(referencedElement != null) {
addReferencedElement((ReferenceProperty)property, referencedElement);
//((ReferenceProperty)property).addReferencedElement(referencedElement);
}
}
} else {
property = new Property(helper);
property.setElement((JavaHasAnnotations)nextField);
}
JavaClass ptype = (JavaClass) nextField.getResolvedType();
property.setType(ptype);
if (helper.isAnnotationPresent(property.getElement(), XmlJavaTypeAdapter.class)) {
XmlJavaTypeAdapter adapter = (XmlJavaTypeAdapter) helper.getAnnotation(property.getElement(), XmlJavaTypeAdapter.class);
property.setAdapterClass(adapter.value());
} else if (info.getAdaptersByClass().get(ptype) != null) {
property.setAdapterClass(info.getAdapterClass(ptype));
}
if (property.hasAdapterClass()) {
ptype = property.getValueType();
}
property.setGenericType(helper.getGenericType(nextField));
property.setPropertyName(nextField.getName());
if (helper.isAnnotationPresent(property.getElement(), XmlAttachmentRef.class) && areEquals(ptype, JAVAX_ACTIVATION_DATAHANDLER)) {
property.setIsSwaAttachmentRef(true);
property.setSchemaType(XMLConstants.SWA_REF_QNAME);
} else if (areEquals(ptype, JAVAX_ACTIVATION_DATAHANDLER) || areEquals(ptype, byte[].class) || areEquals(ptype, Byte[].class) || areEquals(ptype, Image.class) || areEquals(ptype, Source.class) || areEquals(ptype, JAVAX_MAIL_INTERNET_MIMEMULTIPART)) {
property.setIsMtomAttachment(true);
property.setSchemaType(XMLConstants.BASE_64_BINARY_QNAME);
}
if (helper.isAnnotationPresent(property.getElement(), XmlMimeType.class)) {
property.setMimeType(((XmlMimeType) helper.getAnnotation(property.getElement(), XmlMimeType.class)).value());
}
// Get schema-type info if specified and set it on the property for later use:
if (helper.isAnnotationPresent(property.getElement(), XmlSchemaType.class)) {
XmlSchemaType schemaType = (XmlSchemaType) helper.getAnnotation(property.getElement(), XmlSchemaType.class);
QName schemaTypeQname = new QName(XMLConstants.SCHEMA_INSTANCE_URL, schemaType.name());
property.setSchemaType(schemaTypeQname);
}
if(helper.isAnnotationPresent(property.getElement(), XmlAttribute.class)) {
property.setIsAttribute(true);
property.setIsRequired(((XmlAttribute)helper.getAnnotation(property.getElement(), XmlAttribute.class)).required());
}
if(helper.isAnnotationPresent(property.getElement(), XmlAnyAttribute.class)) {
property.setIsAttribute(true);
}
// Check for XmlElement annotation and set required (a.k.a. minOccurs) accordingly
if (helper.isAnnotationPresent(property.getElement(), XmlElement.class)) {
property.setIsRequired(((XmlElement) helper.getAnnotation(property.getElement(), XmlElement.class)).required());
}
// Figure out schema name and namesapce
property.setSchemaName(getQNameForProperty(Introspector.decapitalize(nextField.getName()), nextField));
properties.add(property);
}
}
}
return properties;