AssetMonitor class

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

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

Поля (10)

МодификаторыТипИмя
final HytaleLogger LOGGER
boolean var11
AssetMonitorHandler var2
Path var3
Path var3
Path var3
FileChangeTask var4
Path var4
Path var5
Map var6

Методы (11)

МодификаторыВозвратСигнатура
abstract return new ObjectArrayListreturn new ObjectArrayList()
if if(var4 != null)
if if(var2x == null)
public void markChangedvoid markChanged(@Nonnull Path var1)
public void monitorDirectoryFilesvoid monitorDirectoryFiles(@Nonnull Path var1, @Nonnull AssetMonitorHandler var2)
protected void onChangevoid onChange(@Nonnull Path var1, EventKind var2)
public void onDelayedChangevoid onDelayedChange(@Nonnull Path var1, @Nonnull PathEvent var2)
public void removeFileChangeTaskvoid removeFileChangeTask(@Nonnull FileChangeTask var1)
public void removeHookChangeTaskvoid removeHookChangeTask(@Nonnull DirectoryHandlerChangeTask var1)
public void removeMonitorDirectoryFilesvoid removeMonitorDirectoryFiles(@Nonnull Path var1, @Nonnull Object var2)
public void shutdownvoid shutdown()

Исходный код

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

class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.logger.sentry.SkipSentryException;
class="kw">import com.hypixel.hytale.server.core.util.concurrent.ThreadUtil;
class="kw">import com.hypixel.hytale.sneakythrow.SneakyThrow;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.io.FileNotFoundException;
class="kw">import java.io.IOException;
class="kw">import java.nio.file.AccessDeniedException;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.NoSuchFileException;
class="kw">import java.nio.file.Path;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.concurrent.Executors;
class="kw">import java.util.concurrent.ScheduledExecutorService;
class="kw">import java.util.concurrent.ScheduledFuture;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;

class="kw">public class AssetMonitor {
   class="kw">public class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">static class="kw">final ScheduledExecutorService EXECUTOR = Executors.newSingleThreadScheduledExecutor(ThreadUtil.daemon("AssetMonitor Thread"));
   class="kw">private class="kw">final Map<Path, List<AssetMonitorHandler>> directoryMonitors = new ConcurrentHashMap<>();
   class="kw">private class="kw">final Map<Path, FileChangeTask> fileChangeTasks = new ConcurrentHashMap<>();
   class="kw">private class="kw">final Map<Path, Map<AssetMonitorHandler, DirectoryHandlerChangeTask>> directoryHandlerChangeTasks = new ConcurrentHashMap<>();
   @Nonnull
   class="kw">private class="kw">final PathWatcherThread pathWatcherThread = new PathWatcherThread(this::onChange);

   class="kw">public AssetMonitor() class="kw">throws IOException {
      this.pathWatcherThread.start();
   }

   class="kw">public void shutdown() {
      this.pathWatcherThread.shutdown();
   }

   class="kw">public void monitorDirectoryFiles(@Nonnull Path var1, @Nonnull AssetMonitorHandler var2) {
      if (!Files.isDirectory(var1)) {
         throw new IllegalArgumentException(String.valueOf(var1));
      }

      try {
         Path var3 = var1.toAbsolutePath().normalize();
         LOGGER.at(Level.FINE).log("Monitoring Directory: %s", var3);
         this.directoryMonitors.computeIfAbsent(var3, SneakyThrow.sneakyFunction(var1x -> {
            this.pathWatcherThread.addPath(var1x);
            class="kw">return new ObjectArrayList();
         })).add(var2);
      } catch (Exception var4) {
         ((HytaleLogger.Api)LOGGER.at(Level.SEVERE).withCause(new SkipSentryException(var4))).log("Failed to monitor directory: %s", var1);
      }
   }

   class="kw">public void removeMonitorDirectoryFiles(@Nonnull Path var1, @Nonnull Object var2) {
      if (!Files.isDirectory(var1)) {
         throw new IllegalArgumentException(String.valueOf(var1));
      }

      try {
         Path var3 = var1.toAbsolutePath().normalize();
         LOGGER.at(Level.FINE).log("Monitoring Directory: %s", var3);
         this.directoryMonitors.computeIfAbsent(var3, SneakyThrow.sneakyFunction(var1x -> {
            this.pathWatcherThread.addPath(var1x);
            class="kw">return new ObjectArrayList();
         })).removeIf(var1x -> var1x.getKey().equals(var2));
      } catch (Exception var4) {
         ((HytaleLogger.Api)LOGGER.at(Level.SEVERE).withCause(new SkipSentryException(var4))).log("Failed to monitor directory: %s", var1);
      }
   }

   class="kw">protected void onChange(@Nonnull Path var1, EventKind var2) {
      LOGGER.at(Level.FINER).log("onChange: %s of %s", var1, var2);
      Path var3 = var1.toAbsolutePath().normalize();
      FileChangeTask var4 = this.fileChangeTasks.remove(var3);
      if (var4 != null) {
         var4.cancelSchedule();
      }

      for (Map var6 : this.directoryHandlerChangeTasks.values()) {
         for (DirectoryHandlerChangeTask var8 : var6.values()) {
            var8.removePath(var3);
         }
      }

      boolean var11 = var2 == EventKind.ENTRY_CREATE || var2 == EventKind.ENTRY_MODIFY;
      if (var11 && !Files.exists(var3)) {
         LOGGER.at(Level.WARNING).log("The asset file '%s' was deleted before we could load/update it!", var3);
      } else {
         try {
            this.fileChangeTasks.put(var3, new FileChangeTask(this, var3, new PathEvent(var2, System.nanoTime())));
         } catch (NoSuchFileException | FileNotFoundException | AccessDeniedException var9) {
            LOGGER.at(Level.WARNING).log("The asset file '%s' was deleted before we could load/update it!", var3);
         } catch (IOException var10) {
            ((HytaleLogger.Api)LOGGER.at(Level.SEVERE).withCause(var10)).log("Failed to queue asset to be reloaded %s", var3);
         }
      }
   }

   class="kw">public void onDelayedChange(@Nonnull Path var1, @Nonnull PathEvent var2) {
      LOGGER.at(Level.FINER).log("onDelayedChange: %s of %s", var1, var2);

      for (Entry var4 : this.directoryMonitors.entrySet()) {
         Path var5 = var4.getKey();
         if (var1.startsWith(var5)) {
            Map var6 = this.directoryHandlerChangeTasks.computeIfAbsent(var5, var0 -> new ConcurrentHashMap<>());

            for (AssetMonitorHandler var8 : var4.getValue()) {
               try {
                  if (var8.test(var1, var2.getEventKind())) {
                     var6.computeIfAbsent(var8, var2x -> new DirectoryHandlerChangeTask(this, var5, var2x)).addPath(var1, var2);
                  }
               } catch (Exception var10) {
                  ((HytaleLogger.Api)LOGGER.at(Level.SEVERE).withCause(var10))
                     .log("Failed to run directoryHandler.test for parent: %s, %s of %s", var5, var1, var2);
               }
            }
         }
      }
   }

   class="kw">public void removeFileChangeTask(@Nonnull FileChangeTask var1) {
      this.fileChangeTasks.remove(var1.getPath());
   }

   class="kw">public void markChanged(@Nonnull Path var1) {
      for (Entry var3 : this.directoryHandlerChangeTasks.entrySet()) {
         Path var4 = var3.getKey();
         if (var1.startsWith(var4)) {
            for (DirectoryHandlerChangeTask var6 : var3.getValue().values()) {
               var6.markChanged();
            }
         }
      }
   }

   class="kw">public void removeHookChangeTask(@Nonnull DirectoryHandlerChangeTask var1) {
      AssetMonitorHandler var2 = var1.getHandler();
      this.directoryHandlerChangeTasks.compute(var1.getParent(), (var1x, var2x) -> {
         if (var2x == null) {
            class="kw">return null;
         }

         var2x.remove(var2);
         class="kw">return var2x.isEmpty() ? null : var2x;
      });
   }

   @Nonnull
   class="kw">public class="kw">static ScheduledFuture<?> runTask(@Nonnull Runnable var0, long var1) {
      class="kw">return EXECUTOR.scheduleWithFixedDelay(var0, var1, var1, TimeUnit.MILLISECONDS);
   }
}