DirectoryHandlerChangeTask class

Пакет: com.hypixel.hytale.server.core.asset.monitor

Файл: com/hypixel/hytale/server/core/asset/monitor/DirectoryHandlerChangeTask.java

implements: Runnable

Поля (7)

МодификаторыТипИмя
final HytaleLogger LOGGER
ObjectArrayList var1
ObjectListIterator var4
Entry var5
Set var7
Map var8
var8

Методы (7)

МодификаторыВозвратСигнатура
public void addPathvoid addPath(Path var1, PathEvent var2)
public void cancelSchedulevoid cancelSchedule()
public AssetMonitor getAssetMonitorAssetMonitor getAssetMonitor()
public AssetMonitorHandler getHandlerAssetMonitorHandler getHandler()
public Path getParentPath getParent()
public void markChangedvoid markChanged()
public void removePathvoid removePath(Path var1)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.asset.monitor;

class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectListIterator;
class="kw">import java.nio.file.Path;
class="kw">import java.util.Comparator;
class="kw">import java.util.HashSet;
class="kw">import java.util.Map;
class="kw">import java.util.Set;
class="kw">import java.util.AbstractMap.SimpleEntry;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.concurrent.ScheduledFuture;
class="kw">import java.util.concurrent.atomic.AtomicBoolean;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;

class="kw">public class DirectoryHandlerChangeTask class="kw">implements Runnable {
   class="kw">public class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">static class="kw">final long ACCUMULATION_DELAY_MILLIS = 1000L;
   class="kw">private class="kw">final AssetMonitor assetMonitor;
   class="kw">private class="kw">final Path parent;
   class="kw">private class="kw">final AssetMonitorHandler handler;
   @Nonnull
   class="kw">private class="kw">final ScheduledFuture<?> task;
   class="kw">private class="kw">final AtomicBoolean changed = new AtomicBoolean(true);
   class="kw">private class="kw">final Map<Path, PathEvent> paths = new ConcurrentHashMap<>();

   class="kw">public DirectoryHandlerChangeTask(AssetMonitor var1, Path var2, AssetMonitorHandler var3) {
      this.assetMonitor = var1;
      this.parent = var2;
      this.handler = var3;
      this.task = AssetMonitor.runTask(this, 1000L);
   }

   @Override
   class="kw">public void run() {
      if (!this.changed.getAndSet(false)) {
         this.cancelSchedule();

         try {
            LOGGER.at(Level.FINER).log("run: %s", this.paths);
            ObjectArrayList var1 = new ObjectArrayList(this.paths.size());

            for (Entry var3 : this.paths.entrySet()) {
               var1.add(new SimpleEntry<>(var3.getKey(), var3.getValue()));
            }

            this.paths.clear();
            var1.sort(Comparator.comparingLong(var0 -> ((PathEvent)var0.getValue()).getTimestamp()));
            Set var7 = new HashSet<>();
            Map var8 = new Object2ObjectOpenHashMap();
            ObjectListIterator var4 = var1.iterator();

            while (var4.hasNext()) {
               Entry var5 = (Entry<Path, PathEvent>)var4.next();
               if (!var7.add(var5.getKey().getFileName().toString())) {
                  LOGGER.at(Level.FINER).log("run handler.accept(%s)", var8);
                  this.handler.accept(var8);
                  var8 = new Object2ObjectOpenHashMap();
                  var7.clear();
               }

               var8.put(var5.getKey(), var5.getValue().getEventKind());
            }

            if (!var8.isEmpty()) {
               LOGGER.at(Level.FINER).log("run handler.accept(%s)", var8);
               this.handler.accept(var8);
            }
         } catch (Exception var6) {
            ((HytaleLogger.Api)LOGGER.at(Level.SEVERE).withCause(var6)).log("Failed to run: %s", this);
         }
      }
   }

   class="kw">public AssetMonitor getAssetMonitor() {
      class="kw">return this.assetMonitor;
   }

   class="kw">public Path getParent() {
      class="kw">return this.parent;
   }

   class="kw">public AssetMonitorHandler getHandler() {
      class="kw">return this.handler;
   }

   class="kw">public void addPath(Path var1, PathEvent var2) {
      LOGGER.at(Level.FINEST).log("addPath(%s, %s): %s", var1, var2, this);
      this.paths.put(var1, var2);
      this.changed.set(true);
   }

   class="kw">public void removePath(Path var1) {
      LOGGER.at(Level.FINEST).log("removePath(%s): %s", var1, this);
      this.paths.remove(var1);
      if (this.paths.isEmpty()) {
         this.cancelSchedule();
      } else {
         this.changed.set(true);
      }
   }

   class="kw">public void markChanged() {
      AssetMonitor.LOGGER.at(Level.FINEST).log("markChanged(): %s", this);
      this.changed.set(true);
   }

   class="kw">public void cancelSchedule() {
      LOGGER.at(Level.FINEST).log("cancelSchedule(): %s", this);
      this.assetMonitor.removeHookChangeTask(this);
      if (this.task != null && !this.task.isDone()) {
         this.task.cancel(false);
      }
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "DirectoryHandlerChangeTask{parent=" + this.parent + ", handler=" + this.handler + ", changed=" + this.changed + ", paths=" + this.paths + "}";
   }
}