package de.mas.wiiu.jnus.fuse_wiiu.implementation; import java.io.File; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Optional; import java.util.Timer; import java.util.TimerTask; import de.mas.wiiu.jnus.fuse_wiiu.interfaces.FuseContainer; import de.mas.wiiu.jnus.fuse_wiiu.interfaces.FuseDirectory; import de.mas.wiiu.jnus.fuse_wiiu.utils.FuseContainerWrapper; import lombok.val; /** * Representation of a directory on the OS filesystem. For every children of this directory the FuseContainerWrapper is used to create children if needed. * * @author Maschell * */ public class FSFuseContainer extends GroupFuseContainer { private final File curDir; private final Timer timer = new Timer(); public FSFuseContainer(Optional parent, File input) { super(parent); this.curDir = input; // Check every 5 minutes if the children of this directory have been accessed in the last 5 minutes. timer.schedule(new TimerTask() { public void run() { removeUnused(5 * 60 * 1000); } }, 5 * 60 * 1000, 5 * 60 * 1000); } @Override public void deinit() { // Stop the timers so this can be collected by the GC. timer.cancel(); timer.purge(); } Map> existingFiles = new HashMap<>(); /** * Add FuseContainer for the children of this directory, but only if they are missing. */ private void updateFolder() { for (File f : curDir.listFiles()) { Collection t = existingFiles.get(f); if (t != null && !t.isEmpty()) { boolean missing = false; for (String cur : t) { if (!hasFuseContainer(cur)) { missing = true; break; } } if (missing) { for (String cur : t) { removeFuseContainer(cur); } existingFiles.remove(f); } else { continue; } } val fuseContainers = FuseContainerWrapper.createFuseContainer(Optional.of(this), f); for (Entry e : fuseContainers.entrySet()) { addFuseContainer(e.getKey(), e.getValue()); } existingFiles.put(f, fuseContainers.keySet()); } } @Override protected void doInit() { updateFolder(); } }