X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.filesystem.services%2Fsrc%2Forg%2Fsimantics%2Ffilesystem%2Fservices%2Finternal%2Fsizetracker%2FSizeTrackerImpl.java;fp=bundles%2Forg.simantics.filesystem.services%2Fsrc%2Forg%2Fsimantics%2Ffilesystem%2Fservices%2Finternal%2Fsizetracker%2FSizeTrackerImpl.java;h=b1ca0aaa24d9b34a3bfda9336ad992010db42447;hb=26313671f3eb6e4d7f41b7a3a2505ca47d26273c;hp=0000000000000000000000000000000000000000;hpb=3edbf85ff8a7f1bd596857a24b1bdebd66943d6b;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.filesystem.services/src/org/simantics/filesystem/services/internal/sizetracker/SizeTrackerImpl.java b/bundles/org.simantics.filesystem.services/src/org/simantics/filesystem/services/internal/sizetracker/SizeTrackerImpl.java new file mode 100644 index 000000000..b1ca0aaa2 --- /dev/null +++ b/bundles/org.simantics.filesystem.services/src/org/simantics/filesystem/services/internal/sizetracker/SizeTrackerImpl.java @@ -0,0 +1,92 @@ +package org.simantics.filesystem.services.internal.sizetracker; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.function.Consumer; +import java.util.function.LongConsumer; + +import org.simantics.filesystem.services.sizetracker.SizeChangeEvent; +import org.simantics.filesystem.services.sizetracker.SizeTracker; +import org.simantics.utils.datastructures.file.DirectorySizeTracker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Tuukka Lehtonen + * @since 1.31.0 + * + * TODO: change to use quiet time and "post notification" to throttle updates + */ +public class SizeTrackerImpl implements SizeTracker { + + private Logger logger = LoggerFactory.getLogger(SizeTrackerImpl.class); + + private Path path; + private DirectorySizeServiceImpl service; + private DirectorySizeTracker tracker; + private CopyOnWriteArrayList> listeners = new CopyOnWriteArrayList<>(); + private volatile long oldSize = 0L; + + private LongConsumer theListener = newSize -> { + long os = oldSize; + oldSize = newSize; + //logger.info(path + ": size changed: " + ((double) os / (1024.0*1024.0)) + " MB -> " + ((double) newSize / (1024.0*1024.0)) + " MB"); + fireSizeChange(os, newSize); + }; + + public SizeTrackerImpl(DirectorySizeServiceImpl service, Path path) throws IOException { + this.service = service; + this.path = path; + this.tracker = DirectorySizeTracker.startTracker(theListener); + } + + public SizeTrackerImpl start() throws IOException { + new Thread(() -> { + try { + synchronized (SizeTrackerImpl.this) { + if (tracker != null) + tracker.track(path); + } + } catch (IOException e) { + logger.error("Failed to start tracking size of directory " + path, e); + } + }, "SizeTrackerStarter").start(); + return this; + } + + @Override + public synchronized void close() throws IOException { + if (tracker == null) + return; + tracker.close(); + tracker = null; + service.removeTracker(path); + } + + @Override + public Path path() { + return path; + } + + @Override + public long size() { + return oldSize; + } + + @Override + public void addListener(Consumer listener) { + listeners.add(listener); + } + + @Override + public void removeListener(Consumer listener) { + listeners.remove(listener); + } + + private void fireSizeChange(long oldSize, long newSize) { + SizeChangeEvent e = new SizeChangeEventImpl(path, oldSize, newSize); + listeners.forEach(c -> c.accept(e)); + } + +}