/*
* Copyright (C) 2014 Indeed Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.indeed.imhotep.io.caching;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.indeed.imhotep.io.caching.RemoteFileSystem.RemoteFileInfo;
/**
* Hello world!
*
*/
public class CachedFile {
public static final String DELIMITER = "/";
public static final int CHAR_DELIMITER = '/';
private static RemoteFileSystemMounter mounter = null;
protected String fullPath;
protected RemoteFileInfo info;
protected RemoteFileSystem topFS;
public static final synchronized CachedFile create(String path) {
CachedFile ret;
if (mounter == null) {
try {
mounter = new RemoteFileSystemMounter(null, "/", true);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
ret = new CachedFile();
ret.info = null;
ret.fullPath = path;
ret.topFS = mounter.getTopFileSystem();
return ret;
}
public static final synchronized void initWithFile(String filename,
String root) throws IOException {
mounter = new RemoteFileSystemMounter(filename, root);
}
public static final synchronized void init(List<Map<String, Object>> configData,
String root,
boolean passthrough) throws IOException {
mounter = new RemoteFileSystemMounter(configData, root, passthrough);
}
protected CachedFile() {
this.topFS = null;
this.info = null;
}
protected CachedFile(RemoteFileInfo info, RemoteFileSystem fs) {
this.info = info;
this.topFS = fs;
this.fullPath = info.path;
}
public boolean exists() {
if (info != null) {
return true;
}
info = topFS.stat(fullPath);
if (info == null) {
return false;
}
return true;
}
public boolean isFile() {
if (this.exists() && info.type == RemoteFileInfo.TYPE_FILE) {
return true;
}
return false;
}
public boolean isDirectory() {
if (this.exists() && info.type == RemoteFileInfo.TYPE_DIR) {
return true;
}
return false;
}
public String getName() {
return fullPath.substring(fullPath.lastIndexOf(CHAR_DELIMITER) + 1);
}
public String[] list() {
final List<RemoteFileInfo> infos;
final String[] result;
infos = topFS.readDir(fullPath);
if (infos == null) {
return null;
}
result = new String[infos.size()];
for (int i = 0; i< infos.size(); i++) {
result[i] = infos.get(i).path;
}
return result;
}
public CachedFile[] listFiles() {
final List<RemoteFileInfo> infos;
final CachedFile[] result;
infos = topFS.readDir(fullPath);
if (infos == null) {
return null;
}
result = new CachedFile[infos.size()];
for (int i = 0; i< infos.size(); i++) {
RemoteFileInfo info = infos.get(i);
String path = buildPath(fullPath, info.path);
info.path = path;
result[i] = new CachedFile(info, topFS);
}
return result;
}
public File loadFile() throws IOException {
return topFS.loadFile(fullPath);
}
public File loadDirectory() throws IOException {
final Map<String,File> data;
data = topFS.loadDirectory(fullPath, null);
if (data == null) {
return null;
}
return data.get(fullPath);
}
public String getCanonicalPath() throws IOException {
return this.fullPath;
}
public long length() {
File f;
try {
f = topFS.loadFile(fullPath);
} catch (IOException e) {
e.printStackTrace();
return 0L;
}
return f.length();
}
public static String buildPath(String directory, String filename) {
final String path = directory + DELIMITER + filename;
return path.replace("//", "/");
}
}