package control;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import model.IliasFile;
import model.IliasFolder;
import model.IliasTreeNode;
import model.persistance.Settings;
/**
* This class stores all Files. Currently a .zip {@link IliasZip} is treated as a "File" and derives from {@link IliasFile}.
*
* @author David
*
*/
public class LocalFileStorage {
private static LocalFileStorage instance;
private final Map<Integer, String> localFileLocations;
private LocalFileStorage() {
this.localFileLocations = new HashMap<Integer, String>();
}
public static LocalFileStorage getInstance() {
if (instance == null) {
instance = new LocalFileStorage();
}
return instance;
}
public void refresh() {
scanFolders(Settings.getInstance().getIliasFolderSettings().getLocalIliasFolderPath());
}
public Set<Integer> getAllLocalFileSizes() {
return localFileLocations.keySet();
}
private void scanFolders(String path) {
File dir = new File(path);
File[] files = dir.listFiles();
for (File file : files) {
if (file.isDirectory()) {
scanFolders(file.getAbsolutePath());
//.zip is not detected as a "file"
} else if (file.isFile() || file.getPath().toLowerCase().endsWith(".zip")) {
localFileLocations.put((int) file.length(), file.getAbsolutePath());
}
}
}
public boolean contains(IliasFile iliasFile) {
return localFileLocations.containsKey(iliasFile.getSize());
}
public void addIliasFile(IliasFile iliasFile, String path) {
localFileLocations.put(iliasFile.getSize(), path);
}
public boolean isFolderSynchronized(IliasFolder folder) {
for (IliasTreeNode node : folder.getChildNodes()) {
if (node instanceof IliasFile) {
IliasFile iliasFile = (IliasFile) node;
if (!contains(iliasFile) && !iliasFile.isIgnored()) {
return false;
}
} else if (node instanceof IliasFolder) {
if (!isFolderSynchronized((IliasFolder) node)) {
return false;
}
}
}
return true;
}
public String suggestDownloadPath(IliasFile iliasFile) {
final List<IliasTreeNode> siblings = iliasFile.getParentFolder().getChildNodes();
for (IliasTreeNode node : siblings) {
if (node instanceof IliasFile) {
final String result = getContainingFolder((IliasFile) node);
if (result != null) {
return result;
}
}
}
return Settings.getInstance().getIliasFolderSettings().getLocalIliasFolderPath();
}
private String getContainingFolder(IliasFile iliasFile) {
final int size = iliasFile.getSize();
String path = localFileLocations.get(size);
if (path == null) {
return null;
}
path = path.substring(0, path.lastIndexOf(File.separator));
return path;
}
public File getFile(IliasFile iliasFile) {
final String location = localFileLocations.get(iliasFile.getSize());
if (location == null) {
return null;
}
return new File(location);
}
}