public JAXBModelImpl( TypeInfoSet<TypeMirror, TypeElement, VariableElement, ExecutableElement> types, AnnotationReader<TypeMirror, TypeElement, VariableElement, ExecutableElement> reader, Collection<Reference> rootClasses, Map<QName, Reference> additionalElementDecls) { this.types = types; this.reader = reader; this.additionalElementDecls = additionalElementDecls; Navigator<TypeMirror, TypeElement, VariableElement, ExecutableElement> navigator = types.getNavigator(); for (ClassInfo<TypeMirror, TypeElement> i : types.beans().values()) { classList.add(i.getName()); } for (ArrayInfo<TypeMirror, TypeElement> a : types.arrays().values()) { String javaName = navigator.getTypeName(a.getType()); classList.add(javaName); } for (EnumLeafInfo<TypeMirror, TypeElement> l : types.enums().values()) { QName tn = l.getTypeName(); if (tn != null) { String javaName = navigator.getTypeName(l.getType()); classList.add(javaName); } } for (Reference ref : rootClasses) refMap.put(ref, getXmlType(ref)); // check for collision between "additional" ones and the ones given to JAXB // and eliminate duplication Iterator<Map.Entry<QName, Reference>> itr = additionalElementDecls.entrySet().iterator(); while (itr.hasNext()) { Map.Entry<QName, Reference> entry = itr.next(); if (entry.getValue() == null) continue; NonElement<TypeMirror, TypeElement> xt = getXmlType(entry.getValue()); assert xt != null; refMap.put(entry.getValue(), xt); if (xt instanceof ClassInfo) { ClassInfo<TypeMirror, TypeElement> xct = (ClassInfo<TypeMirror, TypeElement>) xt; Element<TypeMirror, TypeElement> elem = xct.asElement(); if (elem != null && elem.getElementName().equals(entry.getKey())) { itr.remove(); continue; } } ElementInfo<TypeMirror, TypeElement> ei = types.getElementInfo(null, entry.getKey()); if (ei != null && ei.getContentType() == xt) itr.remove(); } }
private NonElement<TypeMirror, TypeElement> getXmlType(Reference r) { if (r == null) throw new IllegalArgumentException(); XmlJavaTypeAdapter xjta = r.annotations.getAnnotation(XmlJavaTypeAdapter.class); XmlList xl = r.annotations.getAnnotation(XmlList.class); Ref<TypeMirror, TypeElement> ref = new Ref<TypeMirror, TypeElement>(reader, types.getNavigator(), r.type, xjta, xl); return types.getTypeInfo(ref); }
private synchronized XmlSchemaGenerator< TypeMirror, TypeElement, VariableElement, ExecutableElement> getSchemaGenerator() { if (xsdgen == null) { xsdgen = new XmlSchemaGenerator<TypeMirror, TypeElement, VariableElement, ExecutableElement>( types.getNavigator(), types); for (Map.Entry<QName, Reference> e : additionalElementDecls.entrySet()) { Reference value = e.getValue(); if (value != null) { NonElement<TypeMirror, TypeElement> typeInfo = refMap.get(value); if (typeInfo == null) throw new IllegalArgumentException( e.getValue() + " was not specified to JavaCompiler.bind"); TypeMirror type = value.type; xsdgen.add(e.getKey(), !(type != null && type.getKind().isPrimitive()), typeInfo); } else { xsdgen.add(e.getKey(), false, null); } } } return xsdgen; }