1 package org.simantics.filesystem.services.internal.sizetracker;
3 import java.io.IOException;
4 import java.nio.file.Path;
5 import java.util.concurrent.CopyOnWriteArrayList;
6 import java.util.function.Consumer;
7 import java.util.function.LongConsumer;
9 import org.simantics.filesystem.services.sizetracker.SizeChangeEvent;
10 import org.simantics.filesystem.services.sizetracker.SizeTracker;
11 import org.simantics.utils.datastructures.file.DirectorySizeTracker;
12 import org.slf4j.Logger;
13 import org.slf4j.LoggerFactory;
16 * @author Tuukka Lehtonen
19 * TODO: change to use quiet time and "post notification" to throttle updates
21 public class SizeTrackerImpl implements SizeTracker {
23 private Logger logger = LoggerFactory.getLogger(SizeTrackerImpl.class);
26 private DirectorySizeServiceImpl service;
27 private DirectorySizeTracker tracker;
28 private CopyOnWriteArrayList<Consumer<SizeChangeEvent>> listeners = new CopyOnWriteArrayList<>();
29 private volatile long oldSize = 0L;
31 private LongConsumer theListener = newSize -> {
34 //logger.info(path + ": size changed: " + ((double) os / (1024.0*1024.0)) + " MB -> " + ((double) newSize / (1024.0*1024.0)) + " MB");
35 fireSizeChange(os, newSize);
38 public SizeTrackerImpl(DirectorySizeServiceImpl service, Path path) throws IOException {
39 this.service = service;
41 this.tracker = DirectorySizeTracker.startTracker(theListener);
44 public SizeTrackerImpl start() throws IOException {
47 synchronized (SizeTrackerImpl.this) {
51 } catch (IOException e) {
52 logger.error("Failed to start tracking size of directory " + path, e);
54 }, "SizeTrackerStarter").start();
59 public synchronized void close() throws IOException {
64 service.removeTracker(path);
78 public void addListener(Consumer<SizeChangeEvent> listener) {
79 listeners.add(listener);
83 public void removeListener(Consumer<SizeChangeEvent> listener) {
84 listeners.remove(listener);
87 private void fireSizeChange(long oldSize, long newSize) {
88 SizeChangeEvent e = new SizeChangeEventImpl(path, oldSize, newSize);
89 listeners.forEach(c -> c.accept(e));