package net.filebot.platform.gnome;
import static java.util.Arrays.*;
import static java.util.stream.Collectors.*;
import java.io.File;
import java.net.URI;
import java.util.List;
public class PlatformGVFS implements GVFS {
private File gvfs;
public PlatformGVFS(File gvfs) {
this.gvfs = gvfs;
}
public File getPathForURI(URI uri) {
return Protocol.forName(uri.getScheme()).getFile(gvfs, uri);
}
@Override
public String toString() {
return String.format("%s [%s]", getClass().getSimpleName(), gvfs);
}
public static enum Protocol {
FILE {
@Override
public File getFile(File gvfs, URI uri) {
return new File(uri);
}
@Override
public String getPath(URI uri) {
return new File(uri).getPath();
}
},
SMB {
@Override
public String getPath(URI uri) {
// e.g. smb://10.0.1.5/data/Movies/Avatar.mp4 -> /run/user/1000/gvfs/smb-share:server=10.0.1.5,share=data/Movies/Avatar.mp4
StringBuilder s = new StringBuilder("smb-share:");
s.append("server=").append(uri.getHost());
if (uri.getUserInfo() != null) {
s.append(",user=").append(uri.getUserInfo());
}
s.append(",share=").append(uri.getPath().substring(1));
return s.toString();
}
},
AFP {
@Override
public String getPath(URI uri) {
// e.g. afp://reinhard@10.0.1.5/data/Movies/Avatar.mp4 -> /run/user/1000/gvfs/afp-volume:host=10.0.1.5,user=reinhard,volume=data/Movies/Avatar.mp4
StringBuilder s = new StringBuilder("afp-volume:");
s.append("host=").append(uri.getHost());
if (uri.getUserInfo() != null) {
s.append(",user=").append(uri.getUserInfo());
}
s.append(",volume=").append(uri.getPath().substring(1));
return s.toString();
}
},
SFTP {
@Override
public String getPath(URI uri) {
// e.g. sftp://reinhard@10.0.1.5/home/Movies/Avatar.mp4 -> /run/user/1000/gvfs/sftp:host=10.0.1.5,user=reinhard/home/Movies/Avatar.mp4
StringBuilder s = new StringBuilder("sftp:");
s.append("host=").append(uri.getHost());
if (uri.getUserInfo() != null) {
s.append(",user=").append(uri.getUserInfo());
}
s.append(uri.getPath());
return s.toString();
}
};
public abstract String getPath(URI uri);
public File getFile(File gvfs, URI uri) {
return new File(gvfs, getPath(uri));
}
public static List<String> names() {
return stream(values()).map(Enum::name).collect(toList());
}
public static Protocol forName(String name) {
for (Protocol protocol : values()) {
if (protocol.name().equalsIgnoreCase(name)) {
return protocol;
}
}
throw new IllegalArgumentException(String.format("%s not in %s", name, names()));
}
}
}