/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.api.vfs.impl.file;
import com.google.common.io.ByteStreams;
import org.eclipse.che.api.core.ConflictException;
import org.eclipse.che.api.core.ForbiddenException;
import org.eclipse.che.api.core.ServerException;
import org.eclipse.che.api.vfs.Path;
import org.eclipse.che.api.vfs.VirtualFile;
import org.eclipse.che.api.vfs.VirtualFileFilter;
import org.eclipse.che.api.vfs.VirtualFileVisitor;
import org.eclipse.che.commons.lang.Pair;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import static org.eclipse.che.api.vfs.impl.file.LocalVirtualFileSystem.MAX_BUFFER_SIZE;
/**
* Implementation of VirtualFile which uses java.io.File.
*
* @author andrew00x
*/
public class LocalVirtualFile implements VirtualFile {
private final java.io.File ioFile;
private final Path path;
private final LocalVirtualFileSystem fileSystem;
LocalVirtualFile(java.io.File ioFile, Path path, LocalVirtualFileSystem fileSystem) {
this.ioFile = ioFile;
this.path = path;
this.fileSystem = fileSystem;
}
@Override
public String getName() {
return path.getName();
}
@Override
public Path getPath() {
return path;
}
@Override
public boolean exists() {
return toIoFile().exists();
}
@Override
public boolean isRoot() {
return path.isRoot();
}
@Override
public boolean isFile() {
return toIoFile().isFile();
}
@Override
public boolean isFolder() {
return toIoFile().isDirectory();
}
@Override
public VirtualFile getParent() {
return fileSystem.getParent(this);
}
@Override
public List<VirtualFile> getChildren(VirtualFileFilter filter) throws ServerException {
return fileSystem.getChildren(this, filter);
}
@Override
public List<VirtualFile> getChildren() throws ServerException {
return fileSystem.getChildren(this, VirtualFileFilter.ACCEPT_ALL);
}
@Override
public boolean hasChild(Path path) throws ServerException {
return getChild(path) != null;
}
@Override
public VirtualFile getChild(Path path) throws ServerException {
return fileSystem.getChild(this, path);
}
@Override
public InputStream getContent() throws ForbiddenException, ServerException {
return fileSystem.getContent(this);
}
@Override
public byte[] getContentAsBytes() throws ForbiddenException, ServerException {
if (getLength() > MAX_BUFFER_SIZE) {
throw new ForbiddenException("File is too big and might not be retrieved as bytes");
}
try (InputStream content = getContent()) {
return ByteStreams.toByteArray(content);
} catch (IOException e) {
throw new ServerException(e);
}
}
@Override
public String getContentAsString() throws ForbiddenException, ServerException {
return new String(getContentAsBytes());
}
@Override
public VirtualFile updateContent(InputStream content, String lockToken) throws ForbiddenException, ServerException {
fileSystem.updateContent(this, content, lockToken);
return this;
}
@Override
public VirtualFile updateContent(InputStream content) throws ForbiddenException, ServerException {
return updateContent(content, null);
}
@Override
public VirtualFile updateContent(byte[] content, String lockToken) throws ForbiddenException, ServerException {
return updateContent(new ByteArrayInputStream(content), lockToken);
}
@Override
public VirtualFile updateContent(byte[] content) throws ForbiddenException, ServerException {
return updateContent(content, null);
}
@Override
public VirtualFile updateContent(String content, String lockToken) throws ForbiddenException, ServerException {
return updateContent(content.getBytes(), lockToken);
}
@Override
public VirtualFile updateContent(String content) throws ForbiddenException, ServerException {
return updateContent(content, null);
}
@Override
public long getLastModificationDate() {
return toIoFile().lastModified();
}
@Override
public long getLength() throws ServerException {
if (isFolder()) {
return 0;
}
return toIoFile().length();
}
@Override
public Map<String, String> getProperties() throws ServerException {
return fileSystem.getProperties(this);
}
@Override
public String getProperty(String name) throws ServerException {
return fileSystem.getPropertyValue(this, name);
}
@Override
public VirtualFile updateProperties(Map<String, String> properties, String lockToken) throws ForbiddenException, ServerException {
fileSystem.updateProperties(this, properties, lockToken);
return this;
}
@Override
public VirtualFile updateProperties(Map<String, String> properties) throws ForbiddenException, ServerException {
return updateProperties(properties, null);
}
@Override
public VirtualFile setProperty(String name, String value, String lockToken) throws ForbiddenException, ServerException {
fileSystem.setProperty(this, name, value, lockToken);
return this;
}
@Override
public VirtualFile setProperty(String name, String value) throws ForbiddenException, ServerException {
return setProperty(name, value, null);
}
@Override
public LocalVirtualFile copyTo(VirtualFile parent) throws ForbiddenException, ConflictException, ServerException {
return copyTo(parent, null, false);
}
public LocalVirtualFile copyTo(VirtualFile parent, String name, boolean overwrite)
throws ForbiddenException, ConflictException, ServerException {
return fileSystem.copy(this, (LocalVirtualFile)parent, name, overwrite);
}
@Override
public VirtualFile moveTo(VirtualFile parent) throws ForbiddenException, ConflictException, ServerException {
return moveTo(parent, null, false, null);
}
public LocalVirtualFile moveTo(VirtualFile parent, String name, boolean overwrite, String lockToken)
throws ForbiddenException, ConflictException, ServerException {
return fileSystem.move(this, (LocalVirtualFile)parent, name, overwrite, lockToken);
}
@Override
public VirtualFile rename(String newName, String lockToken)
throws ForbiddenException, ConflictException, ServerException {
return fileSystem.rename(this, newName, lockToken);
}
@Override
public VirtualFile rename(String newName) throws ForbiddenException, ConflictException, ServerException {
return rename(newName, null);
}
@Override
public void delete(String lockToken) throws ForbiddenException, ServerException {
fileSystem.delete(this, lockToken);
}
@Override
public void delete() throws ForbiddenException, ServerException {
delete(null);
}
@Override
public InputStream zip() throws ForbiddenException, ServerException {
return fileSystem.zip(this);
}
@Override
public void unzip(InputStream zipped, boolean overwrite, int stripNumber)
throws ForbiddenException, ConflictException, ServerException {
fileSystem.unzip(this, zipped, overwrite, stripNumber);
}
@Override
public InputStream tar() throws ForbiddenException, ServerException {
return fileSystem.tar(this);
}
@Override
public void untar(InputStream tarArchive, boolean overwrite, int stripNumber)
throws ForbiddenException, ConflictException, ServerException {
fileSystem.untar(this, tarArchive, overwrite, stripNumber);
}
@Override
public String lock(long timeout) throws ForbiddenException, ConflictException, ServerException {
return fileSystem.lock(this, timeout);
}
@Override
public VirtualFile unlock(String lockToken) throws ForbiddenException, ConflictException, ServerException {
fileSystem.unlock(this, lockToken);
return this;
}
@Override
public boolean isLocked() throws ServerException {
return fileSystem.isLocked(this);
}
@Override
public VirtualFile createFile(String name, InputStream content) throws ForbiddenException, ConflictException, ServerException {
return fileSystem.createFile(this, name, content);
}
@Override
public VirtualFile createFile(String name, byte[] content) throws ForbiddenException, ConflictException, ServerException {
return createFile(name, content == null ? null : new ByteArrayInputStream(content));
}
@Override
public VirtualFile createFile(String name, String content) throws ForbiddenException, ConflictException, ServerException {
return createFile(name, content == null ? null : content.getBytes());
}
@Override
public VirtualFile createFolder(String name) throws ForbiddenException, ConflictException, ServerException {
return fileSystem.createFolder(this, name);
}
@Override
public LocalVirtualFileSystem getFileSystem() {
return fileSystem;
}
@Override
public void accept(VirtualFileVisitor visitor) throws ServerException {
visitor.visit(this);
}
@Override
public List<Pair<String, String>> countMd5Sums() throws ServerException {
return fileSystem.countMd5Sums(this);
}
@Override
public File toIoFile() {
return ioFile;
}
@Override
public int compareTo(VirtualFile other) {
// To get nice order of items:
// 1. Folders
// 2. Files
if (other == null) {
throw new NullPointerException();
}
if (isFolder()) {
return other.isFolder() ? getName().compareTo(other.getName()) : -1;
} else if (other.isFolder()) {
return 1;
}
return getName().compareTo(other.getName());
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if ((o instanceof LocalVirtualFile)) {
LocalVirtualFile other = (LocalVirtualFile)o;
return Objects.equals(path, other.path)
&& Objects.equals(fileSystem, other.fileSystem);
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(path, fileSystem);
}
@Override
public String toString() {
return path.toString();
}
}