/** * Creates a {@link TypeReference} for the item type, * if this {@link TypeReference} represents a collection type. * Otherwise returns an identical type. */ public TypeReference toItemType() { // if we are to reinstitute this check, check JAXB annotations only // assert annotations.length==0; // not designed to work with adapters. Type base = Utils.REFLECTION_NAVIGATOR.getBaseClass(type, Collection.class); if(base==null) return this; // not a collection return new TypeReference(tagName, Utils.REFLECTION_NAVIGATOR.getTypeArgument(base,0)); }
/** * Gets the parameterization of the given base type. * * <p> * For example, given the following * <pre>{@code * interface Foo<T> extends List<List<T>> {} * interface Bar extends Foo<String> {} * }</pre> * This method works like this: * <pre>{@code * getBaseClass( Bar, List ) = List<List<String> * getBaseClass( Bar, Foo ) = Foo<String> * getBaseClass( Foo<? extends Number>, Collection ) = Collection<List<? extends Number>> * getBaseClass( ArrayList<? extends BigInteger>, List ) = List<? extends BigInteger> * }</pre> * * @param type * The type that derives from {@code baseType} * @param baseType * The class whose parameterization we are interested in. * @return * The use of {@code baseType} in {@code type}. * or null if the type is not assignable to the base type. * @since 2.0 FCS */ public static @Nullable Type getBaseType(@NotNull Type type, @NotNull Class baseType) { return Utils.REFLECTION_NAVIGATOR.getBaseClass(type, baseType); }
} else if( Collection.class.isAssignableFrom(rawType) ) { Type bt = Utils.REFLECTION_NAVIGATOR.getBaseClass(fieldType,Collection.class); if(bt instanceof ParameterizedType) itemType = (Class) Utils.REFLECTION_NAVIGATOR.erasure(((ParameterizedType)bt).getActualTypeArguments()[0]);
public Adapter(ClassDeclT adapterType,Navigator<TypeT,ClassDeclT,?,?> nav) { this.adapterType = adapterType; TypeT baseClass = nav.getBaseClass(nav.use(adapterType), nav.asDecl(XmlAdapter.class)); // because the parameterization of XmlJavaTypeAdapter requires that the class derives from XmlAdapter. assert baseClass!=null; if(nav.isParameterizedType(baseClass)) defaultType = nav.getTypeArgument(baseClass,0); else defaultType = nav.ref(Object.class); if(nav.isParameterizedType(baseClass)) customType = nav.getTypeArgument(baseClass,1); else customType = nav.ref(Object.class); } }
/** * Checks if the given adapter is applicable to the declared property type. */ private boolean isApplicable(XmlJavaTypeAdapter jta, T declaredType ) { if(jta==null) return false; T type = reader().getClassValue(jta,"type"); if(nav().isSameType(declaredType, type)) return true; // for types explicitly marked in XmlJavaTypeAdapter.type() T ad = reader().getClassValue(jta,"value"); T ba = nav().getBaseClass(ad, nav().asDecl(XmlAdapter.class)); if(!nav().isParameterizedType(ba)) return true; // can't check type applicability. assume Object, which means applicable to any. T inMemType = nav().getTypeArgument(ba, 1); return nav().isSubClassOf(declaredType,inMemType); }
public T getIndividualType() { if(adapter!=null) return adapter.defaultType; T raw = getRawType(); if(!isCollection()) { return raw; } else { if(nav().isArrayButNotByteArray(raw)) return nav().getComponentType(raw); T bt = nav().getBaseClass(raw, nav().asDecl(Collection.class) ); if(nav().isParameterizedType(bt)) return nav().getTypeArgument(bt,0); else return nav().ref(Object.class); } }
public MapPropertyInfoImpl(ClassInfoImpl<T,C,F,M> ci, PropertySeed<T,C,F,M> seed) { super(ci, seed); XmlElementWrapper xe = seed.readAnnotation(XmlElementWrapper.class); xmlName = calcXmlName(xe); nil = xe!=null && xe.nillable(); T raw = getRawType(); T bt = nav().getBaseClass(raw, nav().asDecl(Map.class) ); assert bt!=null; // Map property is only for Maps if(nav().isParameterizedType(bt)) { keyType = nav().getTypeArgument(bt,0); valueType = nav().getTypeArgument(bt,1); } else { keyType = valueType = nav().ref(Object.class); } }
if(nav().isSameType(type, defaultType)) type = nav.erasure(getIndividualType()); if(nav.getBaseClass(type,je)!=null) yield = addGenericElement(r); else type = nav.erasure(getIndividualType()); if (nav.getBaseClass(type,je) != null) { yield = addGenericElement(r, info);
/** * Creates a {@link TypeReference} for the item type, * if this {@link TypeReference} represents a collection type. * Otherwise returns an identical type. */ public TypeReference toItemType() { // if we are to reinstitute this check, check JAXB annotations only // assert annotations.length==0; // not designed to work with adapters. Type base = Utils.REFLECTION_NAVIGATOR.getBaseClass(type, Collection.class); if(base==null) return this; // not a collection return new TypeReference(tagName, Utils.REFLECTION_NAVIGATOR.getTypeArgument(base,0)); }
T baseClass = nav().getBaseClass(elementType,nav().asDecl(JAXBElement.class)); if(baseClass==null) throw new IllegalAnnotationException( T list = nav().getBaseClass(tOfJAXBElementT,nav().asDecl(List.class)); if(list==null) { isCollection = false;
/** * Gets the parameterization of the given base type. * * <p> * For example, given the following * <pre>{@code * interface Foo<T> extends List<List<T>> {} * interface Bar extends Foo<String> {} * }</pre> * This method works like this: * <pre>{@code * getBaseClass( Bar, List ) = List<List<String> * getBaseClass( Bar, Foo ) = Foo<String> * getBaseClass( Foo<? extends Number>, Collection ) = Collection<List<? extends Number>> * getBaseClass( ArrayList<? extends BigInteger>, List ) = List<? extends BigInteger> * }</pre> * * @param type * The type that derives from {@code baseType} * @param baseType * The class whose parameterization we are interested in. * @return * The use of {@code baseType} in {@code type}. * or null if the type is not assignable to the base type. * @since 2.0 FCS */ public static @Nullable Type getBaseType(@NotNull Type type, @NotNull Class baseType) { return Utils.REFLECTION_NAVIGATOR.getBaseClass(type, baseType); }
} else if( Collection.class.isAssignableFrom(rawType) ) { Type bt = Utils.REFLECTION_NAVIGATOR.getBaseClass(fieldType,Collection.class); if(bt instanceof ParameterizedType) itemType = (Class) Utils.REFLECTION_NAVIGATOR.erasure(((ParameterizedType)bt).getActualTypeArguments()[0]);
public Adapter(ClassDeclT adapterType,Navigator<TypeT,ClassDeclT,?,?> nav) { this.adapterType = adapterType; TypeT baseClass = nav.getBaseClass(nav.use(adapterType), nav.asDecl(XmlAdapter.class)); // because the parameterization of XmlJavaTypeAdapter requires that the class derives from XmlAdapter. assert baseClass!=null; if(nav.isParameterizedType(baseClass)) defaultType = nav.getTypeArgument(baseClass,0); else defaultType = nav.ref(Object.class); if(nav.isParameterizedType(baseClass)) customType = nav.getTypeArgument(baseClass,1); else customType = nav.ref(Object.class); } }
public MapPropertyInfoImpl(ClassInfoImpl<T,C,F,M> ci, PropertySeed<T,C,F,M> seed) { super(ci, seed); XmlElementWrapper xe = seed.readAnnotation(XmlElementWrapper.class); xmlName = calcXmlName(xe); nil = xe!=null && xe.nillable(); T raw = getRawType(); T bt = nav().getBaseClass(raw, nav().asDecl(Map.class) ); assert bt!=null; // Map property is only for Maps if(nav().isParameterizedType(bt)) { keyType = nav().getTypeArgument(bt,0); valueType = nav().getTypeArgument(bt,1); } else { keyType = valueType = nav().ref(Object.class); } }
public T getIndividualType() { if(adapter!=null) return adapter.defaultType; T raw = getRawType(); if(!isCollection()) { return raw; } else { if(nav().isArrayButNotByteArray(raw)) return nav().getComponentType(raw); T bt = nav().getBaseClass(raw, nav().asDecl(Collection.class) ); if(nav().isParameterizedType(bt)) return nav().getTypeArgument(bt,0); else return nav().ref(Object.class); } }
/** * Checks if the given adapter is applicable to the declared property type. */ private boolean isApplicable(XmlJavaTypeAdapter jta, T declaredType ) { if(jta==null) return false; T type = reader().getClassValue(jta,"type"); if(nav().isSameType(declaredType, type)) return true; // for types explicitly marked in XmlJavaTypeAdapter.type() T ad = reader().getClassValue(jta,"value"); T ba = nav().getBaseClass(ad, nav().asDecl(XmlAdapter.class)); if(!nav().isParameterizedType(ba)) return true; // can't check type applicability. assume Object, which means applicable to any. T inMemType = nav().getTypeArgument(ba, 1); return nav().isSubClassOf(declaredType,inMemType); }
if(nav().isSameType(type, defaultType)) type = nav.erasure(getIndividualType()); if(nav.getBaseClass(type,je)!=null) yield = addGenericElement(r); else type = nav.erasure(getIndividualType()); if (nav.getBaseClass(type,je) != null) { yield = addGenericElement(r, info);
/** * Creates a {@link TypeReference} for the item type, * if this {@link TypeReference} represents a collection type. * Otherwise returns an identical type. */ public TypeReference toItemType() { // if we are to reinstitute this check, check JAXB annotations only // assert annotations.length==0; // not designed to work with adapters. Type base = Utils.REFLECTION_NAVIGATOR.getBaseClass(type, Collection.class); if(base==null) return this; // not a collection return new TypeReference(tagName, Utils.REFLECTION_NAVIGATOR.getTypeArgument(base,0)); }
T baseClass = nav().getBaseClass(elementType,nav().asDecl(JAXBElement.class)); if(baseClass==null) throw new IllegalAnnotationException( T list = nav().getBaseClass(tOfJAXBElementT,nav().asDecl(List.class)); if(list==null) { isCollection = false;
public Adapter(ClassDeclT adapterType,Navigator<TypeT,ClassDeclT,?,?> nav) { this.adapterType = adapterType; TypeT baseClass = nav.getBaseClass(nav.use(adapterType), nav.asDecl(XmlAdapter.class)); // because the parameterization of XmlJavaTypeAdapter requires that the class derives from XmlAdapter. assert baseClass!=null; if(nav.isParameterizedType(baseClass)) defaultType = nav.getTypeArgument(baseClass,0); else defaultType = nav.ref(Object.class); if(nav.isParameterizedType(baseClass)) customType = nav.getTypeArgument(baseClass,1); else customType = nav.ref(Object.class); } }