Collection.java 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package me.lortseam.completeconfig.collection;
  2. import lombok.Getter;
  3. import lombok.RequiredArgsConstructor;
  4. import me.lortseam.completeconfig.api.ConfigCategory;
  5. import me.lortseam.completeconfig.api.ConfigEntryContainer;
  6. import me.lortseam.completeconfig.exception.IllegalAnnotationTargetException;
  7. import java.lang.reflect.Modifier;
  8. import java.util.*;
  9. import java.util.stream.Collectors;
  10. @RequiredArgsConstructor
  11. public class Collection {
  12. @Getter
  13. private final EntryMap entries;
  14. @Getter
  15. private final CollectionMap collections;
  16. Collection(ConfigEntryContainer container) {
  17. this(new EntryMap(), new CollectionMap());
  18. fill(container);
  19. }
  20. private void fill(ConfigEntryContainer container) {
  21. //TODO
  22. /*if (!findEntries(config, container.getClass()).isEmpty()) {
  23. throw new UnsupportedOperationException("An instance of " + container.getClass() + " is already registered");
  24. }*/
  25. entries.fill(container);
  26. List<ConfigEntryContainer> containers = new ArrayList<>();
  27. for (Class<? extends ConfigEntryContainer> clazz : container.getClasses()) {
  28. containers.addAll(Arrays.stream(clazz.getDeclaredFields()).filter(field -> {
  29. if (Modifier.isStatic(field.getModifiers())) {
  30. return false;
  31. }
  32. if (container.isConfigPOJO()) {
  33. return ConfigEntryContainer.class.isAssignableFrom(field.getType());
  34. }
  35. if (field.isAnnotationPresent(ConfigEntryContainer.Transitive.class)) {
  36. if (!ConfigEntryContainer.class.isAssignableFrom(field.getType())) {
  37. throw new IllegalAnnotationTargetException("Transitive entry " + field + " must implement ConfigEntryContainer");
  38. }
  39. return true;
  40. }
  41. return false;
  42. }).map(field -> {
  43. if (!field.isAccessible()) {
  44. field.setAccessible(true);
  45. }
  46. try {
  47. return (ConfigEntryContainer) field.get(container);
  48. } catch (IllegalAccessException e) {
  49. throw new RuntimeException(e);
  50. }
  51. }).collect(Collectors.toList()));
  52. }
  53. containers.addAll(Arrays.asList(container.getTransitiveConfigEntryContainers()));
  54. for (ConfigEntryContainer c : containers) {
  55. if (c instanceof ConfigCategory) {
  56. collections.fill((ConfigCategory) c);
  57. } else {
  58. fill(c);
  59. }
  60. }
  61. }
  62. }