package org.jruby.util;
import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.Channel;
import java.nio.channels.Channels;
import java.nio.file.attribute.FileTime;
import java.util.jar.JarEntry;
Represents a file in a jar.
Note: while directories can be contained within a jar, they're still represented by
JarDirectoryResource, since Ruby expects a directory to exist as long as any files in that
directory do, or Dir.glob would break.
/**
* Represents a file in a jar.
*
* <p>
* Note: while directories can be contained within a jar, they're still represented by
* JarDirectoryResource, since Ruby expects a directory to exist as long as any files in that
* directory do, or Dir.glob would break.
* </p>
*/
class JarFileResource extends JarResource {
private final JarCache.JarIndex index;
private final JarEntry entry;
JarFileResource(String jarPath, boolean rootSlashPrefix, JarCache.JarIndex index, JarEntry entry) {
super(jarPath, rootSlashPrefix);
this.index = index;
this.entry = entry;
}
@Override
public String entryName() {
return entry.getName();
}
@Override
public boolean isDirectory() {
return false;
}
@Override
public boolean isFile() {
return true;
}
@Override
public long length() {
return entry.getSize();
}
public FileTime creationTime() {
return entry.getCreationTime();
}
public FileTime lastAccessTime() {
return entry.getLastAccessTime();
}
public FileTime lastModifiedTime() {
return entry.getLastModifiedTime();
}
@Override
public String[] list() {
return null; // Files cannot be listed
}
@Override
public InputStream openInputStream() throws IOException {
return index.getInputStream(entry);
}
@Override
public Channel openChannel(int flags, int perm) throws IOException {
return Channels.newChannel(openInputStream());
}
@Override
public <T> T unwrap(Class<T> type) {
if (type == JarEntry.class) return (T) entry;
throw new UnsupportedOperationException("unwrap: " + type.getName());
}
}