package org.inferred.freebuilder.processor.util.feature;
import static org.inferred.freebuilder.processor.util.feature.SourceLevel.JAVA_8;
import static org.inferred.freebuilder.processor.util.feature.SourceLevel.SOURCE_LEVEL;
import com.google.common.base.Optional;
import org.inferred.freebuilder.processor.util.QualifiedName;
import org.inferred.freebuilder.processor.util.SourceBuilder;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.util.Elements;
/**
* Types in the javax package, if available. Linked to the {@link SourceLevel} by default in tests.
*/
public enum JavaxPackage implements Feature<JavaxPackage> {
AVAILABLE("javax"), UNAVAILABLE("No javax");
/**
* Constant to pass to {@link SourceBuilder#feature(FeatureType)} to get the current status of
* {@link JavaxPackage}.
*/
public static final FeatureType<JavaxPackage> JAVAX =
new FeatureType<JavaxPackage>() {
@Override
protected JavaxPackage testDefault(FeatureSet features) {
boolean isJava8OrHigher = features.get(SOURCE_LEVEL).compareTo(JAVA_8) >= 0;
return isJava8OrHigher ? UNAVAILABLE : AVAILABLE;
}
@Override
protected JavaxPackage forEnvironment(ProcessingEnvironment env, FeatureSet features) {
return hasType(env.getElementUtils(), GENERATED) ? AVAILABLE : UNAVAILABLE;
}
};
private static final QualifiedName GENERATED = QualifiedName.of("javax.annotation", "Generated");
private final String humanReadableFormat;
JavaxPackage(String humanReadableFormat) {
this.humanReadableFormat = humanReadableFormat;
}
/**
* Parameterized type for {@code java.util.function.Consumer<T>}, if available.
*/
public Optional<QualifiedName> generated() {
return ifAvailable(GENERATED);
}
@Override
public String toString() {
return humanReadableFormat;
}
private static boolean hasType(Elements elements, QualifiedName type) {
return elements.getTypeElement(type.toString()) != null;
}
private <T> Optional<T> ifAvailable(T value) {
return (this == AVAILABLE) ? Optional.of(value) : Optional.<T>absent();
}
}