From 1427ff04e1ccea059863083e531456070c38cdf0 Mon Sep 17 00:00:00 2001 From: ME1312 Date: Mon, 28 Jun 2021 16:34:49 -0400 Subject: [PATCH] Use `tar.xz` for downloading templates --- SubServers.Bungee/common/pom.xml | 2 +- SubServers.Bungee/pom.xml | 12 ++++++ .../Host/External/ExternalSubCreator.java | 5 ++- .../Bungee/Library/FileScanner.java | 7 +--- .../Packet/PacketExDownloadTemplates.java | 37 ++++++++++++++++-- .../Packet/PacketExUploadTemplates.java | 12 +++++- SubServers.Client/Common/pom.xml | 2 +- SubServers.Host/pom.xml | 16 +++++++- .../SubServers/Host/Library/FileScanner.java | 7 +--- .../Packet/PacketExDownloadTemplates.java | 39 ++++++++++++++++++- 10 files changed, 115 insertions(+), 24 deletions(-) diff --git a/SubServers.Bungee/common/pom.xml b/SubServers.Bungee/common/pom.xml index 3e93a8a7..ee161309 100644 --- a/SubServers.Bungee/common/pom.xml +++ b/SubServers.Bungee/common/pom.xml @@ -28,7 +28,7 @@ net.ME1312.Galaxi GalaxiUtil - 21w26b + 21w27b compile diff --git a/SubServers.Bungee/pom.xml b/SubServers.Bungee/pom.xml index 4f66459c..7ad737be 100644 --- a/SubServers.Bungee/pom.xml +++ b/SubServers.Bungee/pom.xml @@ -43,6 +43,18 @@ 1.1 compile + + org.kamranzafar + jtar + 2.3 + compile + + + org.tukaani + xz + 1.9 + compile + diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java index 6185814d..746aeab5 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java @@ -82,8 +82,9 @@ public class ExternalSubCreator extends SubCreator { } if (host.available && !Util.getDespiteException(() -> Util.reflect(SubProxy.class.getDeclaredField("reloading"), host.plugin), false)) { - host.queue(new PacketExUploadTemplates(host.plugin)); - if (enableRT == null || enableRT) host.queue(new PacketExDownloadTemplates(host.plugin, host)); + host.queue(new PacketExConfigureHost(host.plugin, host), new PacketExUploadTemplates(host.plugin, () -> { + if (enableRT == null || enableRT) host.queue(new PacketExDownloadTemplates(host.plugin, host)); + })); } } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/FileScanner.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/FileScanner.java index ac3e8684..609e5802 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/FileScanner.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/FileScanner.java @@ -19,12 +19,7 @@ public abstract class FileScanner { * @param whitelist File Whitelist */ protected void scan(File dir, String... whitelist) throws IOException { - List files; - try { - files = Util.reflect(Util.class.getDeclaredMethod("zipsearch", File.class, File.class), null, dir, dir); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { - throw new IllegalStateException("Cannot access zipsearch()", e); - } + List files = Util.searchDirectory(dir); if (files.size() <= 0 || whitelist.length <= 0) return; diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExDownloadTemplates.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExDownloadTemplates.java index 587283a0..d20c9bc1 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExDownloadTemplates.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExDownloadTemplates.java @@ -8,10 +8,22 @@ import net.ME1312.SubData.Server.Protocol.PacketStreamOut; import net.ME1312.SubData.Server.SubDataClient; import net.ME1312.SubServers.Bungee.Host.External.ExternalHost; import net.ME1312.SubServers.Bungee.Host.External.ExternalSubCreator; +import net.ME1312.SubServers.Bungee.Host.SubCreator.ServerTemplate; import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger; import net.ME1312.SubServers.Bungee.SubProxy; +import org.kamranzafar.jtar.TarEntry; +import org.kamranzafar.jtar.TarOutputStream; +import org.tukaani.xz.LZMA2Options; +import org.tukaani.xz.XZOutputStream; + +import java.io.File; +import java.io.FileInputStream; import java.io.OutputStream; +import java.util.HashMap; + +import static org.tukaani.xz.LZMA2Options.MODE_FAST; +import static org.tukaani.xz.XZ.CHECK_SHA256; /** * External Host Template Download Packet @@ -39,8 +51,27 @@ public class PacketExDownloadTemplates implements PacketIn, PacketStreamOut { public void send(SubDataClient client, OutputStream stream) throws Throwable { try { if (client.getBlockSize() < DataSize.MBB) client.tempBlockSize(DataSize.MBB); - Util.zip(new UniversalFile(plugin.dir, "SubServers:Templates"), stream); - stream.close(); + HashMap map = Util.getDespiteException(() -> Util.reflect(ExternalSubCreator.class.getDeclaredField("templates"), ((ExternalHost) client.getHandler()).getCreator()), new HashMap<>()); + TarOutputStream tar = new TarOutputStream(new XZOutputStream(stream, new LZMA2Options(MODE_FAST), CHECK_SHA256)); + File dir = new UniversalFile(plugin.dir, "SubServers:Templates"); + + byte[] buffer = new byte[4096]; + for (String file : Util.searchDirectory(dir)) { + int index = file.indexOf(File.separatorChar); + if (index != -1 && !map.containsKey(file.substring(0, index).toLowerCase())) { + + tar.putNextEntry(new TarEntry(new File(dir, file), file.replace(File.separatorChar, '/'))); + FileInputStream in = new FileInputStream(dir.getAbsolutePath() + File.separator + file); + + int len; + while ((len = in.read(buffer)) != -1) { + tar.write(buffer, 0, len); + } + + in.close(); + } + } + tar.close(); Util.isException(() -> Util.reflect(ExternalSubCreator.class.getDeclaredField("enableRT"), host.getCreator(), true)); } catch (Exception e) { @@ -58,6 +89,6 @@ public class PacketExDownloadTemplates implements PacketIn, PacketStreamOut { @Override public int version() { - return 0x0001; + return 0x0002; } } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExUploadTemplates.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExUploadTemplates.java index b0bd3183..d0a6d798 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExUploadTemplates.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExUploadTemplates.java @@ -12,7 +12,9 @@ import net.ME1312.SubServers.Bungee.Host.SubCreator; import net.ME1312.SubServers.Bungee.SubProxy; import java.io.File; +import java.util.Arrays; import java.util.HashMap; +import java.util.LinkedList; import java.util.Map; import java.util.logging.Logger; @@ -20,13 +22,15 @@ import java.util.logging.Logger; * External Host Template Upload Packet */ public class PacketExUploadTemplates implements PacketObjectIn, PacketOut { + private static LinkedList callbacks = new LinkedList(); private SubProxy plugin; /** * New PacketExUploadTemplates */ - public PacketExUploadTemplates(SubProxy plugin) { + public PacketExUploadTemplates(SubProxy plugin, Runnable... callbacks) { this.plugin = plugin; + PacketExUploadTemplates.callbacks.addAll(Arrays.asList(callbacks)); } @SuppressWarnings("unchecked") @@ -50,6 +54,12 @@ public class PacketExUploadTemplates implements PacketObjectIn, PacketO e.printStackTrace(); } } + + LinkedList callbacks = PacketExUploadTemplates.callbacks; + PacketExUploadTemplates.callbacks = new LinkedList(); + for (Runnable r : callbacks) { + r.run(); + } } } diff --git a/SubServers.Client/Common/pom.xml b/SubServers.Client/Common/pom.xml index 8530c4e3..43ed0a57 100644 --- a/SubServers.Client/Common/pom.xml +++ b/SubServers.Client/Common/pom.xml @@ -18,7 +18,7 @@ net.ME1312.Galaxi GalaxiUtil - 21w26b + 21w27b compile diff --git a/SubServers.Host/pom.xml b/SubServers.Host/pom.xml index 3ff25540..d41139ab 100644 --- a/SubServers.Host/pom.xml +++ b/SubServers.Host/pom.xml @@ -30,13 +30,13 @@ net.ME1312.Galaxi GalaxiEngine - 21w26b + 21w27b compile net.ME1312.Galaxi GalaxiUI - 21w26b + 21w27b runtime @@ -51,6 +51,18 @@ 1.1 compile + + org.kamranzafar + jtar + 2.3 + compile + + + org.tukaani + xz + 1.9 + compile + diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Library/FileScanner.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Library/FileScanner.java index 370917c2..babf08ba 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Library/FileScanner.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Library/FileScanner.java @@ -23,12 +23,7 @@ public abstract class FileScanner { * @param whitelist File Whitelist */ protected void scan(File dir, String... whitelist) throws IOException { - List files; - try { - files = Util.reflect(Util.class.getDeclaredMethod("zipsearch", File.class, File.class), null, dir, dir); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { - throw new IllegalStateException("Cannot access zipsearch()", e); - } + List files = Util.searchDirectory(dir); if (files.size() <= 0 || whitelist.length <= 0) return; diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExDownloadTemplates.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExDownloadTemplates.java index 3e9ad98d..c977bccb 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExDownloadTemplates.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExDownloadTemplates.java @@ -9,6 +9,12 @@ import net.ME1312.SubData.Client.SubDataSender; import net.ME1312.SubServers.Host.ExHost; import net.ME1312.SubServers.Host.SubAPI; +import org.kamranzafar.jtar.TarEntry; +import org.kamranzafar.jtar.TarInputStream; +import org.tukaani.xz.XZInputStream; + +import java.io.File; +import java.io.FileOutputStream; import java.io.InputStream; /** @@ -42,7 +48,36 @@ public class PacketExDownloadTemplates implements PacketOut, PacketStreamIn { try { dir.mkdirs(); - Util.unzip(stream, dir); + TarInputStream tar = new TarInputStream(new XZInputStream(stream)); + + byte[] buffer = new byte[4096]; + TarEntry entry; + while ((entry = tar.getNextEntry()) != null) { + File newFile = new File(dir + File.separator + entry.getName().replace('/', File.separatorChar)); + if (newFile.exists()) { + if (newFile.isDirectory()) { + Util.deleteDirectory(newFile); + } else { + newFile.delete(); + } + } + + if (entry.isDirectory()) { + newFile.mkdirs(); + continue; + } else if (!newFile.getParentFile().exists()) { + newFile.getParentFile().mkdirs(); + } + + FileOutputStream fos = new FileOutputStream(newFile); + int len; + while ((len = tar.read(buffer)) != -1) { + fos.write(buffer, 0, len); + } + fos.close(); + } + tar.close(); + host.creator.load(true); host.log.info.println(((first)?"":"New ") + "Remote Template Files Downloaded"); } catch (Exception e) { @@ -54,6 +89,6 @@ public class PacketExDownloadTemplates implements PacketOut, PacketStreamIn { @Override public int version() { - return 0x0001; + return 0x0002; } }