From 7ff28ff7573db1bbd2d45556305b060e6666f555 Mon Sep 17 00:00:00 2001 From: Stanislav Usenkov Date: Fri, 13 Feb 2015 20:24:41 +0600 Subject: [PATCH] DatabaseContents filtering by serverId. --- .../Backends/DatabaseContents.java | 22 ++++++++++++++++++- .../rscPermissions/Bukkit/BukkitCommands.java | 1 + .../rscPermissions/BukkitPluginMain.java | 1 + .../rscPermissions/IndependentMain.java | 8 ++++++- .../InternalCache/InternalCache.java | 18 ++++++++------- .../ru/simsonic/rscPermissions/Phrases.java | 13 ++++++----- 6 files changed, 47 insertions(+), 16 deletions(-) diff --git a/src/main/java/ru/simsonic/rscPermissions/Backends/DatabaseContents.java b/src/main/java/ru/simsonic/rscPermissions/Backends/DatabaseContents.java index d87e997..3519047 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Backends/DatabaseContents.java +++ b/src/main/java/ru/simsonic/rscPermissions/Backends/DatabaseContents.java @@ -11,7 +11,7 @@ public class DatabaseContents public RowEntity entities[]; public RowPermission permissions[]; public RowInheritance inheritance[]; - public void normalize() + public DatabaseContents normalize() { if(entities == null) entities = new RowEntity[] {}; @@ -83,5 +83,25 @@ public class DatabaseContents entities = le.toArray(new RowEntity[le.size()]); permissions = lp.toArray(new RowPermission[lp.size()]); inheritance = li.toArray(new RowInheritance[li.size()]); + return this; + } + public DatabaseContents filterServerId(String serverId) + { + if(permissions == null) + permissions = new RowPermission[] {}; + if(inheritance == null) + inheritance = new RowInheritance[] {}; + final ArrayList lp = new ArrayList<>(); + final ArrayList li = new ArrayList<>(); + // Permissions + for(RowPermission row : permissions) + if(row.destination.isServerIdApplicable(serverId)) + lp.add(row); + for(RowInheritance row : inheritance) + if(row.destination.isServerIdApplicable(serverId)) + li.add(row); + permissions = lp.toArray(new RowPermission[lp.size()]); + inheritance = li.toArray(new RowInheritance[li.size()]); + return this; } } diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitCommands.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitCommands.java index 1d5a46d..50777a0 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitCommands.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitCommands.java @@ -36,6 +36,7 @@ public class BukkitCommands contents.normalize(); rscp.fileCache.cleanup(); rscp.fileCache.saveContents(contents); + contents.filterServerId(rscp.getServer().getServerId()); rscp.internalCache.fill(contents); final Runnable syncTask = new Runnable() { diff --git a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java index bc74bf6..be7d734 100644 --- a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java +++ b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java @@ -57,6 +57,7 @@ public final class BukkitPluginMain extends JavaPlugin // Restore temporary cached data from json files internalCache.setDefaultGroup(settings.getDefaultGroup()); final DatabaseContents contents = fileCache.retrieveContents(); + contents.filterServerId(getServer().getServerId()); internalCache.fill(contents); consoleLog.log(Level.INFO, "[rscp] Loaded {0} entity, {1} permission and {2} inheritance rows from local cache.", new Integer[] diff --git a/src/main/java/ru/simsonic/rscPermissions/IndependentMain.java b/src/main/java/ru/simsonic/rscPermissions/IndependentMain.java index 5197556..c8af30c 100644 --- a/src/main/java/ru/simsonic/rscPermissions/IndependentMain.java +++ b/src/main/java/ru/simsonic/rscPermissions/IndependentMain.java @@ -24,11 +24,17 @@ public class IndependentMain "rscp_"); if(remoteDb.connect()) { + System.out.println("Retrieving permissions from database into json files."); final DatabaseContents contents = remoteDb.retrieveContents(); contents.normalize(); localJsn.cleanup(); localJsn.saveContents(contents); } - intCache.fill(localJsn.retrieveContents()); + System.out.println("Loading permissions from json files."); + final DatabaseContents contents = localJsn.retrieveContents(); + System.out.println("Filter and calculating permission tree."); + contents.filterServerId("localtest"); + intCache.fill(contents); + System.out.println("Done."); } } diff --git a/src/main/java/ru/simsonic/rscPermissions/InternalCache/InternalCache.java b/src/main/java/ru/simsonic/rscPermissions/InternalCache/InternalCache.java index 6e1dc92..c812648 100644 --- a/src/main/java/ru/simsonic/rscPermissions/InternalCache/InternalCache.java +++ b/src/main/java/ru/simsonic/rscPermissions/InternalCache/InternalCache.java @@ -26,21 +26,23 @@ public class InternalCache } public static class InheritanceLeaf implements Comparable { - public RowInheritance node; - public String instantiator; + public RowInheritance node; + public String instantiator; public InheritanceLeaf[] subleafs; - public String prefix; - public String suffix; + public String prefix; + public String suffix; @Override public int compareTo(InheritanceLeaf other) { return (other.node != null && node != null) ? other.node.compareTo(node) : 0; } } - final HashMap entityTrees = new HashMap<>(); - // Права по сущностям - final HashMap groupPermissions = new HashMap<>(); - final HashMap playerPermissions = new HashMap<>(); + private final HashMap entityTrees = new HashMap<>(); + private final HashMap groupPermissions = new HashMap<>(); + private final HashMap playerPermissions = new HashMap<>(); + private void buildPermissions() + { + } private void buildEntityTree() { final HashSet entitiesWhichInherits = new HashSet<>(); diff --git a/src/main/java/ru/simsonic/rscPermissions/Phrases.java b/src/main/java/ru/simsonic/rscPermissions/Phrases.java index ceb9308..db3ca05 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Phrases.java +++ b/src/main/java/ru/simsonic/rscPermissions/Phrases.java @@ -1,8 +1,10 @@ package ru.simsonic.rscPermissions; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; +import java.nio.channels.Channels; +import java.nio.channels.FileChannel; import java.util.logging.Level; import org.bukkit.configuration.file.YamlConfiguration; @@ -12,7 +14,8 @@ public enum Phrases PLUGIN_DISABLED ("generic.disabled"), PLUGIN_METRICS ("generic.metrics"), PLUGIN_RELOADED ("generic.reloaded"), - FETCHED ("generic.fetched"); + FETCHED ("generic.fetched"), + ; private final String node; private String phrase; private Phrases(String node) @@ -38,11 +41,9 @@ public enum Phrases final File langFile = new File(plugin.getDataFolder(), langName + ".yml"); if(!langFile.isFile()) { - final YamlConfiguration langConfig = YamlConfiguration.loadConfiguration(langFile); + final FileChannel fileChannel = new FileOutputStream(langFile).getChannel(); final InputStream langStream = BukkitPluginMain.class.getResourceAsStream("/languages/" + langName + ".yml"); - YamlConfiguration langSource = YamlConfiguration.loadConfiguration(new InputStreamReader(langStream)); - langConfig.setDefaults(langSource); - langConfig.save(langFile); + fileChannel.transferFrom(Channels.newChannel(langStream), 0, Long.MAX_VALUE); } } catch(IOException ex) { BukkitPluginMain.consoleLog.log(Level.WARNING, "Cannot extract language: {0}", langName);