package speiger.src.builder; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.UnaryOperator; import speiger.src.builder.mappers.IMapper; import speiger.src.builder.processor.TemplateProcess; @SuppressWarnings("javadoc") public class ModulePackage { private static final BiConsumer VOID = (K, V) -> {}; public static final ClassType[] TYPE = ClassType.values(); final ClassType keyType; final ClassType valueType; Set blocked = new HashSet<>(); Map nameRemapper = new HashMap<>(); Map splitters = new HashMap<>(); List> blockedFilters = new ArrayList<>(); List mappers = new ArrayList<>(); Set flags = new LinkedHashSet<>(); Set globalFlags; Map flaggedValues = new HashMap<>(); BiConsumer requirements = VOID; public ModulePackage(Set globalFlags, ClassType keyType, ClassType valueType) { this.globalFlags = globalFlags; this.keyType = keyType; this.valueType = valueType; } public void finish() { requirements = VOID; mappers.sort(Comparator.comparing(IMapper::getSearchValue, Comparator.comparingInt(String::length).reversed())); mappers.sort(Comparator.comparing(IMapper::getSearchValue, this::sort)); } public void setRequirements(BiConsumer requirements) { this.requirements = requirements; } public boolean isSame() { return keyType == valueType; } public boolean isEnumValid() { return keyType == ClassType.OBJECT; } public ClassType getKeyType() { return keyType; } public ClassType getValueType() { return valueType; } public void addFlag(String flag) { flags.add(flag); } public void addGlobalFlag(String flag) { globalFlags.add(flag); } public void addValue(String key, int value) { flaggedValues.put(key, value); } public void addRequirement(String fileName, RequiredType type) { requirements.accept(fileName, type); } public void addMapper(IMapper mapper) { mappers.add(mapper); } public void addBlockedFilter(Predicate filter) { blockedFilters.add(filter); } public void addBlockedFiles(String... names) { blocked.addAll(Arrays.asList(names)); } public void addSplitter(String fileName, String splitter) { splitters.put(fileName, splitter); } public void addRemapper(String fileName, String actualName) { nameRemapper.put(fileName, actualName); } public void process(String fileName, Consumer result) { if(isBlocked(fileName)) return; String splitter = String.format(splitters.getOrDefault(fileName, keyType.getFileType()), keyType.getFileType(), valueType.getFileType()); String newName = String.format(nameRemapper.getOrDefault(fileName, "%s"+fileName), splitter); TemplateProcess process = new TemplateProcess(newName+".java"); process.setPathBuilder(new PathBuilder(keyType.getPathType())); process.addFlags(flags); process.addFlags(globalFlags); process.addMappers(mappers); process.addValues(flaggedValues); result.accept(process); } private boolean isBlocked(String fileName) { if(blocked.contains(fileName)) return true; for(int i = 0,m=blockedFilters.size();i createPackages(Set globalFlags) { List list = new ArrayList<>(); for(ClassType key : TYPE) { for(ClassType value : TYPE) { list.add(new ModulePackage(globalFlags, key, value)); } } return list; } private int sort(String key, String value) { if(value.contains(key)) return 1; else if(key.contains(value)) return -1; return 0; } class PathBuilder implements UnaryOperator { String before; public PathBuilder(String before) { this.before = before; } @Override public Path apply(Path t) { return t.subpath(0, 6).resolve(before).resolve(t.subpath(6, t.getNameCount())); } } }