package com.kreative.paint.material; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public abstract class MaterialLoader { public abstract List<MaterialResource> listResources(); public static class FromFile extends MaterialLoader { private static final Pattern ORDINAL_PATTERN = Pattern.compile("^#([0-9]+) "); private static final Pattern EXTENSION_PATTERN = Pattern.compile("\\.([a-zA-Z0-9]+)$"); private final File root; private final List<MaterialResource> resources; public FromFile(File root) { this.root = root; this.resources = new ArrayList<MaterialResource>(); } @Override public List<MaterialResource> listResources() { if (resources.isEmpty()) loadDirectory(resources, "", "", root); return resources; } private static void loadDirectory( List<MaterialResource> resources, String branchName, String parentName, File parent ) { File[] files = parent.listFiles(); Arrays.sort(files, new FileComparator()); for (File file : files) { String name = file.getName(); if (ignoreFileName(name)) continue; Matcher om = ORDINAL_PATTERN.matcher(name); if (om.find()) name = name.substring(om.end()); Matcher em = EXTENSION_PATTERN.matcher(name); if (em.find()) { String format = em.group(1).toLowerCase(); name = name.substring(0, em.start()); resources.add(new MaterialResource.FromFile(branchName, parentName, name, format, file)); } else if (file.isDirectory()) { loadDirectory(resources, ((branchName.length() > 0) ? branchName : name), name, file); } else { resources.add(new MaterialResource.FromFile(branchName, parentName, name, "", file)); } } } private static boolean ignoreFileName(String name) { return name.startsWith(".") || name.contains("\r") || name.contains("\n") || name.contains("\uF00D") || name.contains("\uF00A") || name.equalsIgnoreCase("Thumbs.db") || name.equalsIgnoreCase("Desktop.ini") || name.equalsIgnoreCase("Desktop.ico"); } private static class FileComparator implements Comparator<File> { @Override public int compare(File a, File b) { return a.getName().compareTo(b.getName()); } } } }