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);
}
}