All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.avaje.inject.generator.BeanConditions Maven / Gradle / Ivy

package io.avaje.inject.generator;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.lang.model.element.Element;

final class BeanConditions {

  final Set requireTypes = new HashSet<>();
  final Set missingTypes = new HashSet<>();
  final Set qualifierNames = new HashSet<>();
  final Set containsProps = new HashSet<>();
  final Set missingProps = new HashSet<>();
  final Set orProfiles = new HashSet<>();
  final Set andProfiles = new HashSet<>();
  final Set notProfiles = new HashSet<>();
  final Map propertyEquals = new HashMap<>();
  final Map propertyNotEquals = new HashMap<>();

  void readAll(Element element) {
    readAllDirect(element);
    readMetaAnnotations(element);
  }

  private void readAllDirect(Element element) {
    RequiresBeanPrism.getAllInstancesOn(element).forEach(this::read);
    RequiresBeanContainerPrism.getOptionalOn(element)
        .ifPresent(container -> container.value().forEach(this::read));
    RequiresPropertyPrism.getAllInstancesOn(element).forEach(this::read);
    RequiresPropertyContainerPrism.getOptionalOn(element)
        .ifPresent(container -> container.value().forEach(this::read));
    ProfilePrism.getOptionalOn(element).ifPresent(this::read);
  }

  private void readMetaAnnotations(Element element) {
    RequiresBeanPrism.getAllOnMetaAnnotations(element).forEach(this::read);
    RequiresBeanContainerPrism.getAllOnMetaAnnotations(element).stream()
        .flatMap(e -> e.value().stream())
        .forEach(this::read);
    RequiresPropertyPrism.getAllOnMetaAnnotations(element).forEach(this::read);
    RequiresPropertyContainerPrism.getAllOnMetaAnnotations(element).stream()
        .flatMap(e -> e.value().stream())
        .forEach(this::read);
    ProfilePrism.getAllOnMetaAnnotations(element).forEach(this::read);
  }

  private void read(ProfilePrism prism) {
    orProfiles.addAll(prism.value());
    andProfiles.addAll(prism.all());
    notProfiles.addAll(prism.none());
  }

  private void read(RequiresBeanPrism prism) {
    prism.value().forEach(t -> requireTypes.add(t.toString()));
    prism.missing().forEach(t -> missingTypes.add(t.toString()));
    qualifierNames.addAll(prism.qualifiers());
  }

  private void read(RequiresPropertyPrism prism) {
    if (!prism.value().isBlank()) {
      if (!prism.notEqualTo().isBlank()) {
        propertyNotEquals.put(prism.value(), prism.notEqualTo());
      } else if (!prism.equalTo().isBlank()) {
        propertyEquals.put(prism.value(), prism.equalTo());
      } else {
        containsProps.add(prism.value());
      }
    }
    missingProps.addAll(prism.missing());
  }

  void addImports(ImportTypeMap importTypes) {
    requireTypes.forEach(importTypes::add);
    missingTypes.forEach(importTypes::add);

    if (!orProfiles.isEmpty() || !andProfiles.isEmpty() || !notProfiles.isEmpty()) {
      importTypes.add("java.util.List");
    }
  }

  boolean isEmpty() {
    return orProfiles.isEmpty()
        && andProfiles.isEmpty()
        && notProfiles.isEmpty()
        && requireTypes.isEmpty()
        && missingTypes.isEmpty()
        && qualifierNames.isEmpty()
        && containsProps.isEmpty()
        && missingProps.isEmpty()
        && propertyEquals.isEmpty()
        && propertyNotEquals.isEmpty();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy