package com.kreative.paint.material; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; 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 MaterialResource { private final String branchName; private final String parentName; private final String resourceName; private final String format; protected MaterialResource( String branchName, String parentName, String resourceName, String format ) { this.branchName = branchName; this.parentName = parentName; this.resourceName = resourceName; this.format = format; } public final String getBranchName() { return branchName; } public final String getParentName() { return parentName; } public final String getResourceName() { return resourceName; } public final String getFormat() { return format; } public final boolean isFormat(String format) { return this.format.equalsIgnoreCase(format); } public final boolean isFormat(String format, boolean directory) { return this.format.equalsIgnoreCase(format) && (this.isDirectory() == directory); } public abstract boolean exists(); public abstract boolean isDirectory(); public abstract InputStream getInputStream() throws IOException; public abstract MaterialResource getChild(String href); public abstract List<MaterialResource> listChildren(); public static class FromFile extends MaterialResource { private static final Pattern EXTENSION_PATTERN = Pattern.compile("\\.([a-zA-Z0-9]+)$"); private final File file; public FromFile( String branchName, String parentName, String resourceName, String format, File file ) { super(branchName, parentName, resourceName, format); this.file = file; } @Override public boolean exists() { return file.exists(); } @Override public boolean isDirectory() { return file.isDirectory(); } @Override public InputStream getInputStream() throws IOException { return new FileInputStream(file); } @Override public MaterialResource getChild(String href) { FromFile child = this; if (href != null) { for (String name : href.split("/")) { if (name.length() > 0) { String branchName = child.getBranchName(); String parentName = child.getResourceName(); File childFile = new File(child.file, name); String childName = childFile.getName(); Matcher m = EXTENSION_PATTERN.matcher(childName); String childFormat = m.find() ? m.group(1).toLowerCase() : ""; child = new FromFile(branchName, parentName, childName, childFormat, childFile); } } } return child; } @Override public List<MaterialResource> listChildren() { List<MaterialResource> children = new ArrayList<MaterialResource>(); String branchName = this.getBranchName(); String parentName = this.getResourceName(); File[] files = this.file.listFiles(); Arrays.sort(files, new FileComparator()); for (File childFile : files) { String childName = childFile.getName(); Matcher m = EXTENSION_PATTERN.matcher(childName); String childFormat = m.find() ? m.group(1).toLowerCase() : ""; FromFile child = new FromFile(branchName, parentName, childName, childFormat, childFile); children.add(child); } return children; } private static class FileComparator implements Comparator<File> { @Override public int compare(File a, File b) { return a.getName().compareTo(b.getName()); } } } }