From e8357c1c6070938f3a6bc763980cce28a631b4b3 Mon Sep 17 00:00:00 2001 From: Chaos Date: Wed, 9 Feb 2022 19:19:19 +0100 Subject: [PATCH 1/3] Should be Working! --- .../de/steamwar/core/WorldEditWrapper14.java | 5 + .../de/steamwar/core/WorldEditWrapper8.java | 5 + .../de/steamwar/core/WorldEditWrapper.java | 3 +- .../de/steamwar/sql/StandaloneProvider.java | 130 ++++++++++++++---- 4 files changed, 119 insertions(+), 24 deletions(-) diff --git a/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java b/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java index f23e7fc..78a6be9 100644 --- a/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java +++ b/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java @@ -115,6 +115,11 @@ public class WorldEditWrapper14 implements WorldEditWrapper.IWorldEditWrapper { } } + @Override + public File getWorldEditSchematicFolder() { + return WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getWorkingDirectoryFile(WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getConfiguration().saveDir); + } + private static class MCEditSchematicReader extends NBTSchematicReader { private final NBTInputStream inputStream; diff --git a/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java b/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java index 2b1cb0e..d08383f 100644 --- a/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java +++ b/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java @@ -88,6 +88,11 @@ public class WorldEditWrapper8 implements WorldEditWrapper.IWorldEditWrapper { return new SchematicReader(new NBTInputStream(is)).read(WorldEdit.getInstance().getServer().getWorlds().get(0).getWorldData()); } + @Override + public File getWorldEditSchematicFolder() { + return WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getWorkingDirectoryFile(WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getConfiguration().saveDir); + } + private static class SpongeSchematicReader implements ClipboardReader { private final NBTInputStream inputStream; diff --git a/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java b/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java index 0b860ee..8cb80e4 100644 --- a/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java +++ b/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java @@ -5,6 +5,7 @@ import com.sk89q.worldedit.extent.clipboard.Clipboard; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -17,7 +18,7 @@ public class WorldEditWrapper { InputStream getPlayerClipboard(Player player, boolean schemFormat); void setPlayerClipboard(Player player, InputStream is, boolean schemFormat); Clipboard getClipboard(InputStream is, boolean schemFormat) throws IOException; - + File getWorldEditSchematicFolder(); } static WorldEditPlugin getWorldEditPlugin() { diff --git a/SpigotCore_Main/src/de/steamwar/sql/StandaloneProvider.java b/SpigotCore_Main/src/de/steamwar/sql/StandaloneProvider.java index 8e334ae..4b6cde9 100644 --- a/SpigotCore_Main/src/de/steamwar/sql/StandaloneProvider.java +++ b/SpigotCore_Main/src/de/steamwar/sql/StandaloneProvider.java @@ -19,17 +19,25 @@ package de.steamwar.sql; +import com.google.common.collect.Maps; +import de.steamwar.core.WorldEditWrapper; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; +import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; import java.sql.Timestamp; import java.time.Instant; import java.util.*; import java.util.function.Consumer; import java.util.stream.Collectors; +import java.util.stream.Stream; public class StandaloneProvider implements Provider { @Override @@ -192,90 +200,166 @@ public class StandaloneProvider implements Provider { configs.computeIfAbsent(id, player -> new HashMap<>()).remove(config); } + private int nodeId = 1; + private final File schematicDir = WorldEditWrapper.impl.getWorldEditSchematicFolder(); + private final Map nodeById = new HashMap<>(); + private final Map> nodesByParent = new HashMap<>(); + private final Map nodesToPath = new HashMap<>(); + + { + nodesToPath.put(-1, schematicDir.toPath()); + } + + private List mapDir(Integer id) { + try (Stream stream = Files.list(id==null?schematicDir.toPath():nodesToPath.get(id))) { + List list = stream.map(path -> { + File file = path.toFile(); + SchematicNode node = new SchematicNode( + nodeId++, + 0, + file.getName().substring(file.getName().lastIndexOf(".")), + null, + "", + "normal", + file.isDirectory(), + 0, + Timestamp.from(Instant.now()), + file.getName().endsWith(".schem") + ); + nodesToPath.put(node.getId(), path); + nodeById.put(node.getId(), node); + return node; + }).collect(Collectors.toList()); + nodesByParent.putIfAbsent(id == null?-1:id, list); + return list; + } catch (IOException e) { + throw new SecurityException(e); + } + } + @Override - public void createSchematicNode(int owner, String name, Integer parent, String type, String item) {} + public void createSchematicNode(int owner, String name, Integer parent, String type, String item) { + + } @Override public SchematicNode getSchematicNode(int owner, String name, Integer parent) { - return null; + return nodesByParent.get(parent).stream().filter(node -> node.getName().equals(name)).findAny().orElse(null); } @Override public List getSchematicNodeInNode(Integer parent) { - return Collections.emptyList(); + return nodesByParent.computeIfAbsent(parent==null?-1:parent, integer -> mapDir(parent)); } @Override public List getSchematicDirectoryInNode(Integer parent) { - return Collections.emptyList(); + return getSchematicNodeInNode(parent).stream().filter(SchematicNode::isDir).collect(Collectors.toList()); } @Override public SchematicNode getSchematicDirectory(String name, Integer parent) { - return null; + return getSchematicDirectoryInNode(parent).stream().filter(node -> node.getName().equals(name)).findFirst().orElse(null); } @Override public SchematicNode getSchematicNode(String name, Integer parent) { - return null; + return getSchematicNodeInNode(parent).stream().filter(node -> name.equals(node.getName())).findFirst().orElse(null); } @Override public SchematicNode getSchematicNode(int id) { - return null; + return nodeById.getOrDefault(id, null); } @Override - public List getAccessibleSchematicsOfTypeInParent(int owner, String schemType, Integer parent) { - return Collections.emptyList(); + public List getAccessibleSchematicsOfTypeInParent(int ignored, String schemType, Integer parent) { + return getSchematicDirectoryInNode(parent).stream().filter(node -> node.getType().equals(schemType)).collect(Collectors.toList()); } @Override - public List getAllAccessibleSchematicsOfType(int user, String schemType) { - return Collections.emptyList(); + public List getAllAccessibleSchematicsOfType(int ignored, String schemType) { + return getAllSchematicsAccessibleByUser(ignored).stream().filter(node -> schemType.equals(node.getType())).collect(Collectors.toList()); } @Override - public List getAllSchematicsOfType(int owner, String schemType) { - return Collections.emptyList(); + public List getAllSchematicsOfType(int ignored, String schemType) { + return getAllAccessibleSchematicsOfType(ignored, schemType); } @Override public List getAllSchematicsOfType(String schemType) { - return Collections.emptyList(); + return getAllAccessibleSchematicsOfType(-1, schemType); } @Override - public List getSchematicsAccessibleByUser(int user, Integer parent) { - return Collections.emptyList(); + public List getSchematicsAccessibleByUser(int ignored, Integer parent) { + return getSchematicNodeInNode(parent); } @Override public List getAllSchematicsAccessibleByUser(int user) { - return Collections.emptyList(); + return nodesByParent.values().stream().reduce((schematicNodes, schematicNodes2) -> { + schematicNodes.addAll(schematicNodes2); + return schematicNodes; + }).orElse(new ArrayList<>()); } @Override public List getAllParentsOfNode(int node) { - return Collections.emptyList(); + List allSchematicsAccessibleByUser = getAllSchematicsAccessibleByUser(node); + allSchematicsAccessibleByUser.remove(getSchematicNode(node)); + return allSchematicsAccessibleByUser; } @Override public Integer countNodes() { - return 0; + return nodesByParent.values().stream().map(List::size).reduce((Integer::sum)).orElse(0); } @Override - public void updateSchematicNode(SchematicNode node) {} + public void updateSchematicNode(SchematicNode node) { + try { + Path newPath = new File(nodesToPath.get(node.getParent() == null?-1:node.getParent()).toFile(), node.getName() + (node.getSchemFormat()?".schem":".schematic")).toPath(); + Files.move(nodesToPath.get(node.getId()), newPath); + nodesToPath.put(node.getId(), newPath); + } catch (IOException e) { + throw new SecurityException(e); + } + } @Override - public void deleteSchematicNode(SchematicNode node) {} + public void deleteSchematicNode(SchematicNode node) { + try { + Files.deleteIfExists(nodesToPath.get(node.getId())); + nodeById.remove(node.getId()); + nodesByParent.get(node.getParent() == null?-1:node.getId()).remove(node); + nodesToPath.remove(node.getId()); + } catch (IOException e) { + throw new SecurityException(e); + } + } @Override public InputStream getSchematicData(SchematicNode node) throws IOException { - return null; + return Files.newInputStream(nodesToPath.get(node.getId())); } @Override - public void saveSchematicNode(SchematicNode node, InputStream blob, boolean newFormat) {} + public void saveSchematicNode(SchematicNode node, InputStream blob, boolean newFormat) { + try { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + byte[] bucket = new byte[1024]; + int nReadBytes; + + while((nReadBytes = blob.read(bucket, 0, bucket.length)) !=-1){ + byteArrayOutputStream.write(bucket, 0, nReadBytes); + } + + byte[] bytes = byteArrayOutputStream.toByteArray(); + Files.write(nodesToPath.get(node.getId()), bytes, StandardOpenOption.TRUNCATE_EXISTING); + } catch (IOException e) { + throw new SecurityException(e); + } + } } From bc1f268022a8682305efe86461a29ae08e7c10a1 Mon Sep 17 00:00:00 2001 From: Chaos Date: Wed, 9 Feb 2022 19:53:43 +0100 Subject: [PATCH 2/3] Pr Stuff --- .../de/steamwar/core/WorldEditWrapper14.java | 5 ---- .../de/steamwar/core/WorldEditWrapper8.java | 5 ---- .../de/steamwar/core/WorldEditWrapper.java | 4 +++- .../de/steamwar/sql/StandaloneProvider.java | 24 +++++++------------ 4 files changed, 12 insertions(+), 26 deletions(-) diff --git a/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java b/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java index 78a6be9..f23e7fc 100644 --- a/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java +++ b/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java @@ -115,11 +115,6 @@ public class WorldEditWrapper14 implements WorldEditWrapper.IWorldEditWrapper { } } - @Override - public File getWorldEditSchematicFolder() { - return WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getWorkingDirectoryFile(WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getConfiguration().saveDir); - } - private static class MCEditSchematicReader extends NBTSchematicReader { private final NBTInputStream inputStream; diff --git a/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java b/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java index d08383f..2b1cb0e 100644 --- a/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java +++ b/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java @@ -88,11 +88,6 @@ public class WorldEditWrapper8 implements WorldEditWrapper.IWorldEditWrapper { return new SchematicReader(new NBTInputStream(is)).read(WorldEdit.getInstance().getServer().getWorlds().get(0).getWorldData()); } - @Override - public File getWorldEditSchematicFolder() { - return WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getWorkingDirectoryFile(WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getConfiguration().saveDir); - } - private static class SpongeSchematicReader implements ClipboardReader { private final NBTInputStream inputStream; diff --git a/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java b/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java index 8cb80e4..58d5ee1 100644 --- a/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java +++ b/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java @@ -18,7 +18,9 @@ public class WorldEditWrapper { InputStream getPlayerClipboard(Player player, boolean schemFormat); void setPlayerClipboard(Player player, InputStream is, boolean schemFormat); Clipboard getClipboard(InputStream is, boolean schemFormat) throws IOException; - File getWorldEditSchematicFolder(); + default File getWorldEditSchematicFolder() { + return WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getWorkingDirectoryFile(WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getConfiguration().saveDir); + } } static WorldEditPlugin getWorldEditPlugin() { diff --git a/SpigotCore_Main/src/de/steamwar/sql/StandaloneProvider.java b/SpigotCore_Main/src/de/steamwar/sql/StandaloneProvider.java index 4b6cde9..97f810a 100644 --- a/SpigotCore_Main/src/de/steamwar/sql/StandaloneProvider.java +++ b/SpigotCore_Main/src/de/steamwar/sql/StandaloneProvider.java @@ -25,10 +25,7 @@ import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; @@ -38,8 +35,13 @@ import java.util.*; import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; +import java.util.zip.GZIPInputStream; public class StandaloneProvider implements Provider { + public StandaloneProvider() { + nodesToPath.put(-1, schematicDir.toPath()); + } + @Override public BauweltMember getBauMember(int ownerID, int memberID) { OfflinePlayer player = Bukkit.getOfflinePlayer(SteamwarUser.get(memberID).getUUID()); @@ -206,10 +208,6 @@ public class StandaloneProvider implements Provider { private final Map> nodesByParent = new HashMap<>(); private final Map nodesToPath = new HashMap<>(); - { - nodesToPath.put(-1, schematicDir.toPath()); - } - private List mapDir(Integer id) { try (Stream stream = Files.list(id==null?schematicDir.toPath():nodesToPath.get(id))) { List list = stream.map(path -> { @@ -342,22 +340,18 @@ public class StandaloneProvider implements Provider { @Override public InputStream getSchematicData(SchematicNode node) throws IOException { - return Files.newInputStream(nodesToPath.get(node.getId())); + return new GZIPInputStream(Files.newInputStream(nodesToPath.get(node.getId()))); } @Override public void saveSchematicNode(SchematicNode node, InputStream blob, boolean newFormat) { - try { - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + try (FileOutputStream stream = new FileOutputStream(nodesToPath.get(node.getId()).toFile())) { byte[] bucket = new byte[1024]; int nReadBytes; while((nReadBytes = blob.read(bucket, 0, bucket.length)) !=-1){ - byteArrayOutputStream.write(bucket, 0, nReadBytes); + stream.write(bucket, 0, nReadBytes); } - - byte[] bytes = byteArrayOutputStream.toByteArray(); - Files.write(nodesToPath.get(node.getId()), bytes, StandardOpenOption.TRUNCATE_EXISTING); } catch (IOException e) { throw new SecurityException(e); } From 5cc6ab21452f07b92df691be09955d18d37eb91a Mon Sep 17 00:00:00 2001 From: Chaos Date: Fri, 11 Feb 2022 21:58:44 +0100 Subject: [PATCH 3/3] refactor(standalone): Move WorldEdit Directory to StandaloneProvider feat(standalone): Add Creating Nodes --- .../de/steamwar/core/WorldEditWrapper.java | 5 +-- .../de/steamwar/sql/StandaloneProvider.java | 36 +++++++++++++++++-- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java b/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java index 58d5ee1..7cfba3b 100644 --- a/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java +++ b/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java @@ -18,12 +18,9 @@ public class WorldEditWrapper { InputStream getPlayerClipboard(Player player, boolean schemFormat); void setPlayerClipboard(Player player, InputStream is, boolean schemFormat); Clipboard getClipboard(InputStream is, boolean schemFormat) throws IOException; - default File getWorldEditSchematicFolder() { - return WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getWorkingDirectoryFile(WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getConfiguration().saveDir); - } } - static WorldEditPlugin getWorldEditPlugin() { + public static WorldEditPlugin getWorldEditPlugin() { return (WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit"); } } diff --git a/SpigotCore_Main/src/de/steamwar/sql/StandaloneProvider.java b/SpigotCore_Main/src/de/steamwar/sql/StandaloneProvider.java index 97f810a..c9c6259 100644 --- a/SpigotCore_Main/src/de/steamwar/sql/StandaloneProvider.java +++ b/SpigotCore_Main/src/de/steamwar/sql/StandaloneProvider.java @@ -203,7 +203,7 @@ public class StandaloneProvider implements Provider { } private int nodeId = 1; - private final File schematicDir = WorldEditWrapper.impl.getWorldEditSchematicFolder(); + private final File schematicDir = WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getWorkingDirectoryFile(WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getConfiguration().saveDir); private final Map nodeById = new HashMap<>(); private final Map> nodesByParent = new HashMap<>(); private final Map nodesToPath = new HashMap<>(); @@ -215,7 +215,7 @@ public class StandaloneProvider implements Provider { SchematicNode node = new SchematicNode( nodeId++, 0, - file.getName().substring(file.getName().lastIndexOf(".")), + file.isDirectory()?file.getName():file.getName().substring(file.getName().lastIndexOf(".")), null, "", "normal", @@ -237,7 +237,35 @@ public class StandaloneProvider implements Provider { @Override public void createSchematicNode(int owner, String name, Integer parent, String type, String item) { + boolean isDir = type == null; + Path p = null; + try { + if(isDir) { + p = Files.createDirectory(new File(nodesToPath.get(parent == null?-1:parent).toFile(), name).toPath()); + } else { + p = Files.createFile(new File(nodesToPath.get(parent == null?-1:parent).toFile(), name + ".schem").toPath()); + } + } catch (IOException e) { + throw new SecurityException(e); + } + File file = p.toFile(); + int id = nodeId++; + nodesToPath.put(id, p); + SchematicNode node = new SchematicNode( + nodeId++, + 0, + file.isDirectory()?file.getName():file.getName().substring(file.getName().lastIndexOf(".")), + null, + "", + "normal", + file.isDirectory(), + 0, + Timestamp.from(Instant.now()), + file.getName().endsWith(".schem") + ); + nodeById.put(id, node); + nodesByParent.get(parent == null?-1:parent).add(node); } @Override @@ -352,6 +380,10 @@ public class StandaloneProvider implements Provider { while((nReadBytes = blob.read(bucket, 0, bucket.length)) !=-1){ stream.write(bucket, 0, nReadBytes); } + + if(newFormat != node.getSchemFormat()) { + nodesToPath.get(node.getId()).toFile().renameTo(new File(nodesToPath.get(node.getId()).toFile().getParentFile(), node.getName() + "." + (newFormat?".schem":"schematic"))); + } } catch (IOException e) { throw new SecurityException(e); }