io.avaje.prism.GeneratePrismsPrism Maven / Gradle / Ivy
package io.avaje.prism;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Map;
import javax.annotation.processing.Generated;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Element;
import javax.lang.model.element.VariableElement;
import javax.lang.model.element.AnnotationValue;
import javax.lang.model.type.TypeMirror;
import java.util.HashMap;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.ElementFilter;
/** A Prism representing a {@link io.avaje.prism.GeneratePrisms @GeneratePrisms} annotation. */
@Generated("avaje-prism-generator")
final class GeneratePrismsPrism {
/** store prism value of value */
private final List _value;
public static final String PRISM_TYPE = "io.avaje.prism.GeneratePrisms";
/**
* An instance of the Values inner class whose
* methods return the AnnotationValues used to build this prism.
* Primarily intended to support using Messager.
*/
final Values values;
/** Returns true if the mirror is an instance of {@link io.avaje.prism.GeneratePrisms @GeneratePrisms} is present on the element, else false.
*
* @param mirror mirror.
* @return true if prism is present.
*/
static boolean isInstance(AnnotationMirror mirror) {
return getInstance(mirror) != null;
}
/** Returns true if {@link io.avaje.prism.GeneratePrisms @GeneratePrisms} is present on the element, else false.
*
* @param element element.
* @return true if annotation is present on the element.
*/
static boolean isPresent(Element element) {
return getInstanceOn(element) != null;
}
/** Return a prism representing the {@link io.avaje.prism.GeneratePrisms @GeneratePrisms} annotation present on the given element.
* similar to {@code element.getAnnotation(GeneratePrisms.class)} except that
* an instance of this class rather than an instance of {@link io.avaje.prism.GeneratePrisms @GeneratePrisms}
* is returned.
*
* @param element element.
* @return prism on element or null if no annotation is found.
*/
static GeneratePrismsPrism getInstanceOn(Element element) {
final var mirror = getMirror(element);
if (mirror == null) return null;
return getInstance(mirror);
}
/** Return a Optional representing a nullable {@link io.avaje.prism.GeneratePrisms @GeneratePrisms} annotation on the given element.
* similar to {@code element.getAnnotation(io.avaje.prism.GeneratePrisms.class)} except that
* an Optional of this class rather than an instance of {@link io.avaje.prism.GeneratePrisms}
* is returned.
*
* @param element element.
* @return prism optional for element.
*/
static Optional getOptionalOn(Element element) {
final var mirror = getMirror(element);
if (mirror == null) return Optional.empty();
return getOptional(mirror);
}
/** Return a prism of the {@link io.avaje.prism.GeneratePrisms @GeneratePrisms} annotation from an annotation mirror.
*
* @param mirror mirror.
* @return prism for mirror or null if mirror is an incorrect type.
*/
static GeneratePrismsPrism getInstance(AnnotationMirror mirror) {
if (mirror == null || !PRISM_TYPE.equals(mirror.getAnnotationType().toString())) return null;
return new GeneratePrismsPrism(mirror);
}
/** Return an Optional representing a nullable {@link GeneratePrismsPrism @GeneratePrismsPrism} from an annotation mirror.
* similar to {@code e.getAnnotation(io.avaje.prism.GeneratePrisms.class)} except that
* an Optional of this class rather than an instance of {@link io.avaje.prism.GeneratePrisms @GeneratePrisms}
* is returned.
*
* @param mirror mirror.
* @return prism optional for mirror.
*/
static Optional getOptional(AnnotationMirror mirror) {
if (mirror == null || !PRISM_TYPE.equals(mirror.getAnnotationType().toString())) return Optional.empty();
return Optional.of(new GeneratePrismsPrism(mirror));
}
private GeneratePrismsPrism(AnnotationMirror mirror) {
for (final ExecutableElement key : mirror.getElementValues().keySet()) {
memberValues.put(key.getSimpleName().toString(), mirror.getElementValues().get(key));
}
for (final ExecutableElement member : ElementFilter.methodsIn(mirror.getAnnotationType().asElement().getEnclosedElements())) {
defaults.put(member.getSimpleName().toString(), member.getDefaultValue());
}
List valueMirrors = getArrayValues("value", AnnotationMirror.class);
_value = new ArrayList(valueMirrors.size());
for(AnnotationMirror valueMirror : valueMirrors) {
_value.add(GeneratePrismPrism.getInstance(valueMirror));
}
this.values = new Values(memberValues);
this.mirror = mirror;
this.isValid = valid;
}
/**
* Returns a List<GeneratePrismPrism> representing the value of the {@code value()} member of the Annotation.
* @see io.avaje.prism.GeneratePrisms#value()
*/
public List value() { return _value; }
/**
* Determine whether the underlying AnnotationMirror has no errors.
* True if the underlying AnnotationMirror has no errors.
* When true is returned, none of the methods will return null.
* When false is returned, a least one member will either return null, or another
* prism that is not valid.
*/
final boolean isValid;
/**
* The underlying AnnotationMirror of the annotation
* represented by this Prism.
* Primarily intended to support using Messager.
*/
final AnnotationMirror mirror;
/**
* A class whose members correspond to those of {@link io.avaje.prism.GeneratePrisms @GeneratePrisms}
* but which each return the AnnotationValue corresponding to
* that member in the model of the annotations. Returns null for
* defaulted members. Used for Messager, so default values are not useful.
*/
static final class Values {
private final Map values;
private Values(Map values) {
this.values = values;
}
/** Return the AnnotationValue corresponding to the value()
* member of the annotation, or null when the default value is implied.
*/
AnnotationValue value(){ return values.get("value");}
}
private final Map defaults = new HashMap(10);
private final Map memberValues = new HashMap(10);
private boolean valid = true;
private T getValue(String name, Class clazz) {
final T result = GeneratePrismsPrism.getValue(memberValues, defaults, name, clazz);
if (result == null) valid = false;
return result;
}
private List getArrayValues(String name, final Class clazz) {
final List result = GeneratePrismsPrism.getArrayValues(memberValues, defaults, name, clazz);
if (result == null) valid = false;
return result;
}
/** GeneratePrismPrism inner prism. */
static class GeneratePrismPrism {
/** store prism value of value */
private final TypeMirror _value;
/** store prism value of name */
private final String _name;
/** store prism value of publicAccess */
private final Boolean _publicAccess;
/** store prism value of superClass */
private final TypeMirror _superClass;
/** store prism value of superInterfaces */
private final List _superInterfaces;
public static final String PRISM_TYPE = "io.avaje.prism.GeneratePrism";
/**
* An instance of the Values inner class whose
* methods return the AnnotationValues used to build this prism.
* Primarily intended to support using Messager.
*/
final Values values;
/** Return a prism of the {@link io.avaje.prism.GeneratePrism @GeneratePrism} annotation from an annotation mirror.
*
* @param mirror mirror.
* @return prism for mirror or null if mirror is an incorrect type.
*/
private static GeneratePrismPrism getInstance(AnnotationMirror mirror) {
if (mirror == null || !PRISM_TYPE.equals(mirror.getAnnotationType().toString())) return null;
return new GeneratePrismPrism(mirror);
}
/** Return an Optional representing a nullable {@link GeneratePrismPrism @GeneratePrismPrism} from an annotation mirror.
* similar to {@code e.getAnnotation(io.avaje.prism.GeneratePrism.class)} except that
* an Optional of this class rather than an instance of {@link io.avaje.prism.GeneratePrism @GeneratePrism}
* is returned.
*
* @param mirror mirror.
* @return prism optional for mirror.
*/
private static Optional getOptional(AnnotationMirror mirror) {
if (mirror == null || !PRISM_TYPE.equals(mirror.getAnnotationType().toString())) return Optional.empty();
return Optional.of(new GeneratePrismPrism(mirror));
}
private GeneratePrismPrism(AnnotationMirror mirror) {
for (final ExecutableElement key : mirror.getElementValues().keySet()) {
memberValues.put(key.getSimpleName().toString(), mirror.getElementValues().get(key));
}
for (final ExecutableElement member : ElementFilter.methodsIn(mirror.getAnnotationType().asElement().getEnclosedElements())) {
defaults.put(member.getSimpleName().toString(), member.getDefaultValue());
}
_value = getValue("value", TypeMirror.class);
_name = getValue("name", String.class);
_publicAccess = getValue("publicAccess", Boolean.class);
_superClass = getValue("superClass", TypeMirror.class);
_superInterfaces = getArrayValues("superInterfaces", TypeMirror.class);
this.values = new Values(memberValues);
this.mirror = mirror;
this.isValid = valid;
}
/**
* Returns a TypeMirror representing the value of the {@code java.lang.Class extends java.lang.annotation.Annotation> value()} member of the Annotation.
* @see io.avaje.prism.GeneratePrism#value()
*/
public TypeMirror value() { return _value; }
/**
* Returns a String representing the value of the {@code java.lang.String name()} member of the Annotation.
* @see io.avaje.prism.GeneratePrism#name()
*/
public String name() { return _name; }
/**
* Returns a Boolean representing the value of the {@code boolean publicAccess()} member of the Annotation.
* @see io.avaje.prism.GeneratePrism#publicAccess()
*/
public Boolean publicAccess() { return _publicAccess; }
/**
* Returns a TypeMirror representing the value of the {@code java.lang.Class> superClass()} member of the Annotation.
* @see io.avaje.prism.GeneratePrism#superClass()
*/
public TypeMirror superClass() { return _superClass; }
/**
* Returns a List<TypeMirror> representing the value of the {@code superInterfaces()} member of the Annotation.
* @see io.avaje.prism.GeneratePrism#superInterfaces()
*/
public List superInterfaces() { return _superInterfaces; }
/**
* Determine whether the underlying AnnotationMirror has no errors.
* True if the underlying AnnotationMirror has no errors.
* When true is returned, none of the methods will return null.
* When false is returned, a least one member will either return null, or another
* prism that is not valid.
*/
final boolean isValid;
/**
* The underlying AnnotationMirror of the annotation
* represented by this Prism.
* Primarily intended to support using Messager.
*/
final AnnotationMirror mirror;
/**
* A class whose members correspond to those of {@link io.avaje.prism.GeneratePrism @GeneratePrism}
* but which each return the AnnotationValue corresponding to
* that member in the model of the annotations. Returns null for
* defaulted members. Used for Messager, so default values are not useful.
*/
static final class Values {
private final Map values;
private Values(Map values) {
this.values = values;
}
/** Return the AnnotationValue corresponding to the value()
* member of the annotation, or null when the default value is implied.
*/
AnnotationValue value(){ return values.get("value");}
/** Return the AnnotationValue corresponding to the name()
* member of the annotation, or null when the default value is implied.
*/
AnnotationValue name(){ return values.get("name");}
/** Return the AnnotationValue corresponding to the publicAccess()
* member of the annotation, or null when the default value is implied.
*/
AnnotationValue publicAccess(){ return values.get("publicAccess");}
/** Return the AnnotationValue corresponding to the superClass()
* member of the annotation, or null when the default value is implied.
*/
AnnotationValue superClass(){ return values.get("superClass");}
/** Return the AnnotationValue corresponding to the superInterfaces()
* member of the annotation, or null when the default value is implied.
*/
AnnotationValue superInterfaces(){ return values.get("superInterfaces");}
}
private final Map defaults = new HashMap(10);
private final Map memberValues = new HashMap(10);
private boolean valid = true;
private T getValue(String name, Class clazz) {
final T result = GeneratePrismsPrism.getValue(memberValues, defaults, name, clazz);
if (result == null) valid = false;
return result;
}
private List getArrayValues(String name, final Class clazz) {
final List result = GeneratePrismsPrism.getArrayValues(memberValues, defaults, name, clazz);
if (result == null) valid = false;
return result;
}
}
private static AnnotationMirror getMirror(Element target) {
for (final var m : target.getAnnotationMirrors()) {
final CharSequence mfqn = ((TypeElement) m.getAnnotationType().asElement()).getQualifiedName();
if (PRISM_TYPE.contentEquals(mfqn)) return m;
}
return null;
}
private static T getValue(Map memberValues, Map defaults, String name, Class clazz) {
AnnotationValue av = memberValues.get(name);
if (av == null) av = defaults.get(name);
if (av == null) {
return null;
}
if (clazz.isInstance(av.getValue())) return clazz.cast(av.getValue());
return null;
}
private static List getArrayValues(Map memberValues, Map defaults, String name, final Class clazz) {
AnnotationValue av = memberValues.get(name);
if (av == null) av = defaults.get(name);
if (av == null) {
return List.of();
}
if (av.getValue() instanceof List) {
final List result = new ArrayList<>();
for (final var v : getValueAsList(av)) {
if (clazz.isInstance(v.getValue())) {
result.add(clazz.cast(v.getValue()));
} else {
return List.of();
}
}
return result;
} else {
return List.of();
}
}
@SuppressWarnings("unchecked")
private static List getValueAsList(AnnotationValue av) {
return (List) av.getValue();
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy