EntrySet.java 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package me.lortseam.completeconfig.data;
  2. import lombok.extern.log4j.Log4j2;
  3. import me.lortseam.completeconfig.api.ConfigContainer;
  4. import me.lortseam.completeconfig.api.ConfigEntries;
  5. import me.lortseam.completeconfig.api.ConfigEntry;
  6. import me.lortseam.completeconfig.data.text.TranslationIdentifier;
  7. import me.lortseam.completeconfig.exception.IllegalModifierException;
  8. import java.lang.reflect.Field;
  9. import java.lang.reflect.Modifier;
  10. import java.util.Arrays;
  11. import java.util.HashSet;
  12. import java.util.Set;
  13. @Log4j2
  14. public class EntrySet extends DataSet<Entry> {
  15. private static final Set<Field> staticFields = new HashSet<>();
  16. EntrySet(TranslationIdentifier translation) {
  17. super(translation);
  18. }
  19. void resolve(ConfigContainer container) {
  20. for (Class<? extends ConfigContainer> clazz : container.getConfigClasses()) {
  21. Arrays.stream(clazz.getDeclaredFields()).filter(field -> {
  22. if (clazz != container.getClass() && Modifier.isStatic(field.getModifiers())) {
  23. return false;
  24. }
  25. if (clazz.isAnnotationPresent(ConfigEntries.class)) {
  26. return !ConfigContainer.class.isAssignableFrom(field.getType()) && !field.isAnnotationPresent(ConfigContainer.Ignore.class) && !Modifier.isTransient(field.getModifiers());
  27. }
  28. return field.isAnnotationPresent(ConfigEntry.class);
  29. }).map(field -> {
  30. if (Modifier.isFinal(field.getModifiers())) {
  31. throw new IllegalModifierException("Entry field " + field + " must not be final");
  32. }
  33. if (Modifier.isStatic(field.getModifiers())) {
  34. if (staticFields.contains(field)) {
  35. throw new UnsupportedOperationException("Static field has already been resolved: " + field);
  36. }
  37. staticFields.add(field);
  38. }
  39. Entry<?> entry = Entry.of(field, container, translation);
  40. entry.resolve(field);
  41. return entry;
  42. }).forEach(this::add);
  43. }
  44. }
  45. }