/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.filesystem; import com.google.common.base.Objects; import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.impl.jar.JarFileSystemImpl; import com.intellij.openapi.vfs.impl.local.LocalFileSystemImpl; import gw.config.CommonServices; import gw.fs.IDirectory; import gw.fs.IResource; import gw.fs.ResourcePath; import gw.plugin.ij.util.FileUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; import java.net.URI; import static com.google.common.base.Preconditions.checkNotNull; public abstract class IDEAResource implements IResource { @Nullable protected VirtualFile _virtualFile; protected final String _path; public IDEAResource(@NotNull VirtualFile virtualFile) { this._virtualFile = checkNotNull(virtualFile); this._path = checkNotNull(FileUtil.removeJarSeparator(virtualFile.getPath())); } public IDEAResource(String dir) { this._path = checkNotNull(dir); } @NotNull @Override public IDirectory getParent() { if (_virtualFile != null) { return new IDEADirectory(_virtualFile.getParent()); } else { return ((IDEAFileSystem) CommonServices.getFileSystem()).getIDirectory(_path.substring(0, _path.lastIndexOf('/'))); } } @Nullable @Override public String getName() { return _virtualFile != null ? _virtualFile.getName() : new File(_path).getName(); } @Override public boolean exists() { if (_virtualFile != null) { return _virtualFile.exists(); } else { return new File(_path).exists(); } } @Override public boolean delete() throws IOException { return false; } @Override public URI toURI() { return new File(_path).toURI(); } @Override public ResourcePath getPath() { return ResourcePath.parse(_path); } @Override public boolean isChildOf(@NotNull IDirectory dir) { String dirPath = ((IDEADirectory) dir)._path; return this._path.length() > dirPath.length() && this._path.startsWith(dirPath) && this._path.charAt(dirPath.length()) == '/'; } @Override public boolean isDescendantOf(@NotNull IDirectory dir) { // note, trailing '/' prevents /root/src2 matching against /root/src if(_path.contains(".jar")) { return _path.startsWith(((IDEADirectory) dir)._path); } else { return (_path + '/').startsWith(((IDEADirectory) dir)._path + '/'); } } @NotNull @Override public File toJavaFile() { return new File(_path.replace('/', File.separatorChar)); } @Override public boolean isJavaFile() { return _virtualFile.getFileSystem() instanceof LocalFileSystemImpl; } public String toString() { return _path; } @Override public boolean equals(@Nullable Object o) { if (o instanceof IDEAResource) { IDEAResource other = (IDEAResource) o; if (Objects.equal(_virtualFile, other._virtualFile)) { return true; } if ((_virtualFile == null || other._virtualFile == null) && Objects.equal(_path, other._path)) { return true; } } return false; } @Override public int hashCode() { return Objects.hashCode(_virtualFile); } @Override public boolean create() { if (_virtualFile == null) { final IDEADirectory parent = (IDEADirectory) getParent(); parent.create(); try { final int index = _path.lastIndexOf('/'); final String name = _path.substring(index + 1); _virtualFile = create(parent._virtualFile, name); parent._virtualFile.refresh(false, true); return true; } catch (IOException e) { throw new RuntimeException(e); } } return true; } protected abstract VirtualFile create(VirtualFile virtualFile, String name) throws IOException; @Nullable public VirtualFile getVirtualFile() { return _virtualFile; } @Nullable public VirtualFile resolveVirtualFile() { if (_virtualFile == null) { //try re-resolve virtual file if it null _virtualFile = LocalFileSystemImpl.getInstance().findFileByPath(_path); if (_virtualFile == null && _path.contains(".jar!")) { _virtualFile = JarFileSystemImpl.getInstance().findFileByPath(_path); } } return _virtualFile; } @Override public boolean isInJar() { return _virtualFile != null && _virtualFile.getFileSystem() instanceof JarFileSystem; } }