package net.jangaroo.jooc.input; import net.jangaroo.utils.BOMStripperInputStream; import net.jangaroo.utils.CompilerUtils; 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.List; public class FileInputSource extends DirectoryInputSource { private File sourceDir; private File file; private boolean inSourcePath; private List<InputSource> children; public FileInputSource(final File sourceDir, final File file, boolean inSourcePath) { super(); this.sourceDir = sourceDir; this.file = file; this.inSourcePath = inSourcePath; } public FileInputSource(final File file, boolean inSourcePath) { this(file, file, inSourcePath); } @Override public String getName() { return file.getName(); } @Override public String getPath() { return file.getAbsolutePath(); } @Override public InputStream getInputStream() throws IOException { return isDirectory() ? super.getInputStream() : new BOMStripperInputStream(new FileInputStream(file)); } @Override public String getRelativePath() { try { return sourceDir == null ? file.getCanonicalPath() : sourceDir.equals(file) ? "" : file.getCanonicalPath().substring(sourceDir.getCanonicalPath().length() + 1); } catch (IOException e) { return null; } } @Override public boolean isInSourcePath() { return inSourcePath; } @Override public void close() { } public File getFile() { return file; } public File getSourceDir() { return sourceDir; } @Override public char getFileSeparatorChar() { return File.separatorChar; } @Override public InputSource getParent() { return new FileInputSource(sourceDir, file.getParentFile(), inSourcePath); } @Override public boolean isDirectory() { return file.isDirectory(); } @Override public List<InputSource> list() { if (!isDirectory()) { throw new UnsupportedOperationException("list() not supported for non-directory input sources"); } if (children == null) { children = new ArrayList<InputSource>(); File[] childFiles = file.listFiles(); assert childFiles != null; // since we made sure it is a directory! Arrays.sort(childFiles); // create a predictable order! for (File childFile : childFiles) { children.add(new FileInputSource(sourceDir, childFile, inSourcePath)); } } return children; } @Override public FileInputSource getChild(String path) { if (path.length() == 0) { return this; } File sourceFile = new File(file, path); if (sourceFile.exists()) { String realPath = file == null ? sourceFile.getPath() : CompilerUtils.getRelativePath(file, sourceFile, false); if (File.separatorChar != '/') { path = path.replace(File.separatorChar, '/'); realPath = realPath.replace(File.separatorChar, '/'); } if (path.equals(realPath)) { return new FileInputSource(sourceDir, sourceFile, inSourcePath); } } return null; } }