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%2FDirectorySizeServiceImpl.java;fp=bundles%2Forg.simantics.filesystem.services%2Fsrc%2Forg%2Fsimantics%2Ffilesystem%2Fservices%2Finternal%2Fsizetracker%2FDirectorySizeServiceImpl.java;h=db8ec3da1aa6ce5bed9b99ec8a8ec3635db230bf;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/DirectorySizeServiceImpl.java b/bundles/org.simantics.filesystem.services/src/org/simantics/filesystem/services/internal/sizetracker/DirectorySizeServiceImpl.java new file mode 100644 index 000000000..db8ec3da1 --- /dev/null +++ b/bundles/org.simantics.filesystem.services/src/org/simantics/filesystem/services/internal/sizetracker/DirectorySizeServiceImpl.java @@ -0,0 +1,77 @@ +package org.simantics.filesystem.services.internal.sizetracker; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; + +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +import org.simantics.filesystem.services.sizetracker.DirectorySizeService; +import org.simantics.filesystem.services.sizetracker.SizeTracker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Tuukka Lehtonen + * @since 1.31.0 + */ +@Component +public class DirectorySizeServiceImpl implements DirectorySizeService { + + private Logger logger = LoggerFactory.getLogger(DirectorySizeServiceImpl.class); + + private final Map trackers = new HashMap<>(); + + @Override + public SizeTracker track(Path directory) throws IOException { + synchronized (trackers) { + SizeTrackerImpl tracker = trackers.get(directory); + if (tracker != null) + return tracker; + tracker = new SizeTrackerImpl(this, directory); + try { + tracker.start(); + trackers.put(directory, tracker); + return tracker; + } catch (IOException e) { + safeCloseTracker(tracker); + throw e; + } + } + } + + void removeTracker(Path path) { + synchronized (trackers) { + trackers.remove(path); + } + } + + public void shutdown() { + synchronized (trackers) { + trackers.forEach((p,t) -> safeCloseTracker(t)); + trackers.clear(); + } + } + + private void safeCloseTracker(SizeTrackerImpl t) { + try { + t.close(); + } catch (IOException e) { + logger.error("Error closing size tracker {}", t, e); + } + } + + @Activate + public void activate() { + //System.out.println("Activated DirectorySizeServiceImpl"); + } + + @Deactivate + public void deactivate() { + //System.out.println("Deactivated DirectorySizeServiceImpl"); + shutdown(); + } + +}