private JavaClass[] processAdditionalClasses(JavaClass[] classes) {
ArrayList<JavaClass> extraClasses = new ArrayList<JavaClass>();
ArrayList<JavaClass> classesToProcess = new ArrayList<JavaClass>();
for (JavaClass jClass : classes) {
Class xmlElementType = null;
JavaClass javaClass = jClass;
TypeMappingInfo tmi = javaClassToTypeMappingInfos.get(javaClass);
if (tmi != null) {
Class adapterClass = this.typeMappingInfoToAdapterClasses.get(tmi);
if (adapterClass != null) {
JavaClass adapterJavaClass = helper.getJavaClass(adapterClass);
JavaClass newType = helper.getJavaClass(Object.class);
// look for marshal method
for (Object nextMethod : adapterJavaClass.getDeclaredMethods()) {
JavaMethod method = (JavaMethod) nextMethod;
if (method.getName().equals("marshal")) {
JavaClass returnType = method.getReturnType();
if (!returnType.getQualifiedName().equals(newType.getQualifiedName())) {
newType = (JavaClass) returnType;
break;
}
}
}
javaClass = newType;
}
java.lang.annotation.Annotation[] annotations = getAnnotations(tmi);
if (annotations != null) {
for (int j = 0; j < annotations.length; j++) {
java.lang.annotation.Annotation nextAnnotation = annotations[j];
if (nextAnnotation != null) {
if (nextAnnotation instanceof XmlElement) {
XmlElement javaAnnotation = (XmlElement) nextAnnotation;
if (javaAnnotation.type() != XmlElement.DEFAULT.class) {
xmlElementType = javaAnnotation.type();
}
}
}
}
}
}
if (areEquals(javaClass, byte[].class) || areEquals(javaClass, JAVAX_ACTIVATION_DATAHANDLER) || areEquals(javaClass, Source.class) || areEquals(javaClass, Image.class) || areEquals(javaClass, JAVAX_MAIL_INTERNET_MIMEMULTIPART)) {
if (tmi == null || tmi.getXmlTagName() == null) {
ElementDeclaration declaration = new ElementDeclaration(null, javaClass, javaClass.getQualifiedName(), false, XmlElementDecl.GLOBAL.class);
declaration.setTypeMappingInfo(tmi);
getGlobalElements().put(null, declaration);
}
} else if (javaClass.isArray()) {
if (!helper.isBuiltInJavaType(javaClass.getComponentType())) {
extraClasses.add(javaClass.getComponentType());
}
Class generatedClass;
if (null == tmi) {
generatedClass = arrayClassesToGeneratedClasses.get(javaClass.getName());
} else {
generatedClass = CompilerHelper.getExisitingGeneratedClass(tmi, typeMappingInfoToGeneratedClasses, typeMappingInfoToAdapterClasses, helper.getClassLoader());
}
if (generatedClass == null) {
generatedClass = generateWrapperForArrayClass(javaClass, tmi, xmlElementType, extraClasses);
extraClasses.add(helper.getJavaClass(generatedClass));
arrayClassesToGeneratedClasses.put(javaClass.getName(), generatedClass);
}
generatedClassesToArrayClasses.put(generatedClass, javaClass);
typeMappingInfoToGeneratedClasses.put(tmi, generatedClass);
} else if (isCollectionType(javaClass)) {
JavaClass componentClass;
if (javaClass.hasActualTypeArguments()) {
componentClass = (JavaClass) javaClass.getActualTypeArguments().toArray()[0];
if (!componentClass.isPrimitive()) {
extraClasses.add(componentClass);
}
} else {
componentClass = helper.getJavaClass(Object.class);
}
Class generatedClass = CompilerHelper.getExisitingGeneratedClass(tmi, typeMappingInfoToGeneratedClasses, typeMappingInfoToAdapterClasses, helper.getClassLoader());
if (generatedClass == null) {
generatedClass = generateCollectionValue(javaClass, tmi, xmlElementType);
extraClasses.add(helper.getJavaClass(generatedClass));
}
typeMappingInfoToGeneratedClasses.put(tmi, generatedClass);
} else if (isMapType(javaClass)) {
JavaClass keyClass;
JavaClass valueClass;
if (javaClass.hasActualTypeArguments()) {
keyClass = (JavaClass) javaClass.getActualTypeArguments().toArray()[0];
if (!helper.isBuiltInJavaType(keyClass)) {
extraClasses.add(keyClass);
}