package org.jruby.util;

import java.io.IOException;
import java.io.InputStream;

import java.nio.channels.Channel;
import java.nio.file.attribute.FileTime;

Represents a directory in a jar.

Jars do not necessarily have to contain entries for a directory. However, from ruby's point of view, if a jar contains entry /foo/bar, it already contains /foo directory. This resource permits just that.

/** * Represents a directory in a jar. * * <p>Jars do not necessarily have to contain entries for a directory. However, from ruby's point of * view, if a jar contains entry /foo/bar, it already contains /foo directory. This resource permits * just that.</p> */
class JarDirectoryResource extends JarResource { private final String path; private final String[] contents; JarDirectoryResource(String jarPath, boolean rootSlashPrefix, String path, String[] contents) { super(jarPath, rootSlashPrefix); this.path = path; this.contents = contents; } @Override public String entryName() { return path; } @Override public boolean isDirectory() { return true; } @Override public boolean isFile() { return false; } @Override public long length() { // this pseudo-directory doesn't take up any space return 0L; } @Override public long lastModified() { // Iterating over matching entries is expensive, so let's return that we've never been modified return 0L; } public FileTime creationTime() { return null; // NOTE: not implemented } public FileTime lastAccessTime() { return null; // NOTE: not implemented } public FileTime lastModifiedTime() { return null; // NOTE: not implemented } @Override public String[] list() { return contents; } public boolean isRoot() { return "/".equals(path); } @Override public InputStream openInputStream() throws IOException { throw new ResourceException.FileIsDirectory(path); } @Override public Channel openChannel(final int flags, int perm) throws ResourceException { // opening a directory seems to blow up with EACCESS in jruby // (although MRI allows instantiation but blows up on read). // So mimicking that for now. throw new ResourceException.PermissionDenied(absolutePath()); } @Override public <T> T unwrap(Class<T> type) { throw new UnsupportedOperationException("unwrap: " + type.getName()); } }