Use newer Java 7 File API where possible

This commit is contained in:
filoghost 2020-06-26 15:05:55 +02:00
parent a8be658769
commit 7755a4ab3e
9 changed files with 177 additions and 108 deletions

View File

@ -36,7 +36,6 @@ import me.filoghost.chestcommands.menu.settings.MenuSettings;
import me.filoghost.chestcommands.parser.MenuParser;
import me.filoghost.chestcommands.task.RefreshMenusTask;
import me.filoghost.chestcommands.util.ErrorCollector;
import me.filoghost.chestcommands.util.FileUtils;
import me.filoghost.chestcommands.util.Utils;
import me.filoghost.updatechecker.UpdateChecker;
import org.bstats.bukkit.MetricsLite;
@ -46,11 +45,17 @@ import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class ChestCommands extends JavaPlugin {
@ -148,8 +153,13 @@ public class ChestCommands extends JavaPlugin {
public ErrorCollector load() {
ErrorCollector errors = new ErrorCollector();
menuManager.clear();
boolean isFreshInstall = !getDataFolder().isDirectory();
getDataFolder().mkdirs();
boolean isFreshInstall = !Files.isDirectory(getDataPath());
try {
Files.createDirectories(getDataPath());
} catch (IOException e) {
errors.addError("Plugin failed to load, couldn't create data folder.");
return errors;
}
try {
new UpgradesExecutor(this).run(isFreshInstall);
@ -159,6 +169,7 @@ public class ChestCommands extends JavaPlugin {
PluginConfig settingsYaml = getSettingsConfig();
try {
settingsYaml.createDefault(this);
settingsYaml.load();
settings.load(settingsYaml);
} catch (Throwable t) {
@ -167,6 +178,7 @@ public class ChestCommands extends JavaPlugin {
PluginConfig langYaml = getLangConfig();
try {
langYaml.createDefault(this);
langYaml.load();
lang.load(langYaml);
} catch (Throwable t) {
@ -175,6 +187,7 @@ public class ChestCommands extends JavaPlugin {
PluginConfig placeholdersYaml = getPlaceholdersConfig();
try {
placeholdersYaml.createDefault(this);
placeholdersYaml.load();
placeholders.load(placeholdersYaml, errors);
} catch (Throwable t) {
@ -182,16 +195,35 @@ public class ChestCommands extends JavaPlugin {
}
// Load the menus
File menusFolder = getMenusFolder();
Path menusPath = getMenusPath();
if (!menusFolder.isDirectory()) {
// Create the directory with the default menu
menusFolder.mkdirs();
FileUtils.saveResourceSafe(this, "menu" + File.separator + "example.yml");
if (!Files.isDirectory(menusPath)) {
// Create the menu folder with the example menu
try {
Files.createDirectories(menusPath);
} catch (IOException e) {
getLogger().log(Level.SEVERE, "Couldn't create \"" + menusPath.getFileName() + "\" folder");
}
PluginConfig exampleMenu = new PluginConfig(getDataPath(Paths.get("menu", "example.yml")));
try {
exampleMenu.createDefault(this);
} catch (Throwable t) {
logConfigLoadException(exampleMenu, t);
}
}
List<PluginConfig> menusList = getMenuConfigs(menusFolder);
for (PluginConfig menuConfig : menusList) {
List<Path> menuPaths;
try {
menuPaths = getMenusPathList();
} catch (IOException e) {
getLogger().log(Level.SEVERE, "Couldn't fetch files inside the folder \"" + getMenusPath().getFileName() + "\"", e);
menuPaths = Collections.emptyList();
}
for (Path menuFile : menuPaths) {
PluginConfig menuConfig = new PluginConfig(menuFile);
try {
menuConfig.load();
} catch (Throwable t) {
@ -232,36 +264,35 @@ public class ChestCommands extends JavaPlugin {
}
public PluginConfig getLangConfig() {
return new PluginConfig(this, "lang.yml");
return new PluginConfig(getDataPath("lang.yml"));
}
public PluginConfig getSettingsConfig() {
return new PluginConfig(this, "config.yml");
return new PluginConfig(getDataPath("config.yml"));
}
public PluginConfig getPlaceholdersConfig() {
return new PluginConfig(this, "custom-placeholders.yml");
return new PluginConfig(getDataPath("custom-placeholders.yml"));
}
public File getMenusFolder() {
return new File(getDataFolder(), "menu");
public Path getMenusPath() {
return getDataPath("menu");
}
/**
* Loads all the configuration files recursively into a list.
* Returns a list of YML menu files.
*/
public List<PluginConfig> getMenuConfigs(File file) {
List<PluginConfig> list = new ArrayList<>();
if (file.isDirectory()) {
for (File subFile : file.listFiles()) {
list.addAll(getMenuConfigs(subFile));
}
} else if (file.isFile()) {
if (file.getName().endsWith(".yml")) {
list.add(new PluginConfig(this, file));
}
public List<Path> getMenusPathList() throws IOException {
try (Stream<Path> paths = Files.walk(getMenusPath(), FileVisitOption.FOLLOW_LINKS)) {
return paths.filter(Files::isRegularFile)
.filter(this::isYmlPath)
.collect(Collectors.toList());
}
return list;
}
private boolean isYmlPath(Path path) {
return path.getFileName().toString().toLowerCase().endsWith(".yml");
}
@ -278,6 +309,18 @@ public class ChestCommands extends JavaPlugin {
return instance;
}
public Path getDataPath() {
return getDataFolder().toPath();
}
public Path getDataPath(Path path) {
return getDataPath().resolve(path);
}
public Path getDataPath(String path) {
return getDataPath().resolve(path);
}
public MenuManager getMenuManager() {
return menuManager;
}

View File

@ -14,65 +14,92 @@
*/
package me.filoghost.chestcommands.config.yaml;
import me.filoghost.chestcommands.ChestCommands;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
import java.io.File;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
/**
* A simple utility class to manage configurations with a file associated to them.
*/
public class PluginConfig extends YamlConfiguration {
private File file;
private Plugin plugin;
private final Path path;
public PluginConfig(Plugin plugin, File file) {
super();
this.file = file;
this.plugin = plugin;
public PluginConfig(Path path) {
this.path = path;
}
public PluginConfig(Plugin plugin, String name) {
this(plugin, new File(plugin.getDataFolder(), name));
public Path getPath() {
return path;
}
public void load() throws IOException, InvalidConfigurationException {
public void createDefault(ChestCommands plugin) throws IOException {
if (!path.startsWith(plugin.getDataPath())) {
throw new IOException("Config file " + path + " must be inside " + plugin.getDataPath());
}
if (!file.isFile()) {
if (plugin.getResource(file.getName()) != null) {
plugin.saveResource(file.getName(), false);
} else {
if (file.getParentFile() != null) {
file.getParentFile().mkdirs();
if (Files.exists(path)) {
return;
}
if (path.getParent() != null) {
Files.createDirectories(path.getParent());
}
Path absoluteDataPath = plugin.getDataPath().toAbsolutePath();
Path absoluteConfigPath = path.toAbsolutePath();
if (absoluteConfigPath.startsWith(absoluteDataPath)) {
Path relativeConfigPath = absoluteDataPath.relativize(absoluteConfigPath);
String defaultConfigURL = StreamSupport.stream(relativeConfigPath.spliterator(), false)
.map(Path::toString)
.collect(Collectors.joining("/"));
try (InputStream defaultFile = plugin.getResource(defaultConfigURL)) {
if (defaultFile != null) {
Files.copy(defaultFile, path);
return;
}
file.createNewFile();
}
}
Files.createFile(path);
}
public void load() throws IOException, InvalidConfigurationException {
// To reset all the values when loading
for (String section : this.getKeys(false)) {
set(section, null);
}
load(file);
try (BufferedReader reader = Files.newBufferedReader(path)) {
load(reader);
}
}
public void save() throws IOException {
this.save(file);
}
if (path.getParent() != null) {
Files.createDirectories(path.getParent());
}
public Plugin getPlugin() {
return plugin;
}
String data = saveToString();
public File getFile() {
return file;
try (BufferedWriter writer = Files.newBufferedWriter(path)) {
writer.write(data);
}
}
public String getFileName() {
return file.getName();
return path.getFileName().toString();
}
}

View File

@ -14,6 +14,7 @@
*/
package me.filoghost.chestcommands.config.yaml;
import me.filoghost.chestcommands.ChestCommands;
import me.filoghost.chestcommands.util.FormatUtils;
import java.io.IOException;
@ -54,7 +55,7 @@ public class SpecialConfig {
if (defaultValue != null) {
defaultValuesMap.put(configKey, defaultValue);
} else {
config.getPlugin().getLogger().warning("The field " + field.getName() + " was not provided with a default value, please inform the developer.");
ChestCommands.getInstance().getLogger().warning("The field " + field.getName() + " was not provided with a default value, please inform the developer.");
}
} catch (Exception ex) {
@ -104,7 +105,7 @@ public class SpecialConfig {
field.set(this, FormatUtils.addColors(config.getString(configKey))); // Always add colors
} else {
config.getPlugin().getLogger().warning("Unknown field type: " + field.getType().getName() + " (" + field.getName() + "). Please inform the developer.");
ChestCommands.getInstance().getLogger().warning("Unknown field type: " + field.getType().getName() + " (" + field.getName() + "). Please inform the developer.");
}
} else {

View File

@ -18,9 +18,9 @@ import me.filoghost.chestcommands.config.yaml.PluginConfig;
import me.filoghost.chestcommands.util.Preconditions;
import org.bukkit.configuration.InvalidConfigurationException;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@ -45,13 +45,13 @@ public abstract class Upgrade {
try {
createBackupFile(getOriginalFile());
} catch (IOException e) {
throw new UpgradeException("couldn't create backup of file \"" + getOriginalFile().getName() + "\"", e);
throw new UpgradeException("couldn't create backup of file \"" + getOriginalFile().getFileName() + "\"", e);
}
try {
saveChanges();
} catch (IOException e) {
throw new UpgradeException("couldn't save upgraded file \"" + getUpgradedFile().getName() + "\"", e);
throw new UpgradeException("couldn't save upgraded file \"" + getUpgradedFile().getFileName() + "\"", e);
}
}
@ -68,16 +68,16 @@ public abstract class Upgrade {
}
}
private void createBackupFile(File file) throws IOException {
private void createBackupFile(Path path) throws IOException {
String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy.MM.dd-HH.mm"));
String backupName = file.getName() + "_" + date + ".backup";
String backupName = path.getFileName() + "_" + date + ".backup";
Files.copy(file.toPath(), file.toPath().resolveSibling(backupName), StandardCopyOption.REPLACE_EXISTING);
Files.copy(path, path.resolveSibling(backupName), StandardCopyOption.REPLACE_EXISTING);
}
public abstract File getOriginalFile();
public abstract Path getOriginalFile();
public abstract File getUpgradedFile();
public abstract Path getUpgradedFile();
protected abstract void computeChanges() throws UpgradeException;

View File

@ -15,7 +15,6 @@
package me.filoghost.chestcommands.legacy;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
@ -35,7 +34,7 @@ public class UpgradesDoneRegistry {
this.upgradesDone = new HashSet<>();
if (Files.isRegularFile(saveFile)) {
try (Stream<String> lines = Files.lines(saveFile, StandardCharsets.UTF_8)) {
try (Stream<String> lines = Files.lines(saveFile)) {
lines.filter(s -> !s.startsWith("#"))
.forEach(upgradesDone::add);
}
@ -65,7 +64,8 @@ public class UpgradesDoneRegistry {
lines.add("# WARNING: manually editing this file is not recommended");
lines.add("#");
lines.addAll(upgradesDone);
Files.write(saveFile, lines, StandardCharsets.UTF_8);
Files.createDirectories(saveFile.getParent());
Files.write(saveFile, lines);
needSave = false;
}
}

View File

@ -21,7 +21,6 @@ import me.filoghost.chestcommands.legacy.upgrades.MenuUpgrade;
import me.filoghost.chestcommands.legacy.upgrades.PlaceholdersUpgrade;
import me.filoghost.chestcommands.legacy.upgrades.SettingsUpgrade;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
@ -33,7 +32,7 @@ import java.util.stream.Collectors;
public class UpgradesExecutor {
private final ChestCommands plugin;
private List<Upgrade> failedUpgrades;
private List<Path> failedUpgrades;
private UpgradesDoneRegistry upgradesDoneRegistry;
public UpgradesExecutor(ChestCommands plugin) {
@ -59,14 +58,19 @@ public class UpgradesExecutor {
String legacyCommandSeparator = readLegacyCommandSeparator();
SettingsUpgrade settingsUpgrade = new SettingsUpgrade(plugin);
PlaceholdersUpgrade placeholdersUpgrade = new PlaceholdersUpgrade(plugin);
List<MenuUpgrade> menuUpgrades = getMenuConfigs().stream()
.map(menuConfig -> new MenuUpgrade(menuConfig, legacyCommandSeparator))
.collect(Collectors.toList());
runIfNecessary(UpgradeID.V4_CONFIG, settingsUpgrade);
PlaceholdersUpgrade placeholdersUpgrade = new PlaceholdersUpgrade(plugin);
runIfNecessary(UpgradeID.V4_PLACEHOLDERS, placeholdersUpgrade);
runIfNecessary(UpgradeID.V4_MENUS, menuUpgrades);
try {
List<MenuUpgrade> menuUpgrades = plugin.getMenusPathList().stream()
.map(menuPath -> new MenuUpgrade(new PluginConfig(menuPath), legacyCommandSeparator))
.collect(Collectors.toList());
runIfNecessary(UpgradeID.V4_MENUS, menuUpgrades);
} catch (IOException e) {
failedUpgrades.add(plugin.getMenusPath());
}
}
try {
@ -79,7 +83,7 @@ public class UpgradesExecutor {
// Success only if no upgrade failed
if (!failedUpgrades.isEmpty()) {
String failedConversionFiles = failedUpgrades.stream()
.map(upgrade -> upgrade.getOriginalFile().getName())
.map(Path::toString)
.collect(Collectors.joining(", "));
throw new UpgradeExecutorException("Failed to automatically upgrade the following files: " + failedConversionFiles);
}
@ -100,11 +104,6 @@ public class UpgradesExecutor {
return legacyCommandSeparator;
}
private List<PluginConfig> getMenuConfigs() {
File menusFolder = plugin.getMenusFolder();
return plugin.getMenuConfigs(menusFolder);
}
private void runIfNecessary(UpgradeID upgradeID, Upgrade upgradeTask) {
runIfNecessary(upgradeID, Collections.singletonList(upgradeTask));
@ -124,12 +123,12 @@ public class UpgradesExecutor {
if (modified) {
plugin.getLogger().info(
"Automatically upgraded configuration file \""
+ upgradeTask.getUpgradedFile().getName() + "\" with newer configuration nodes. "
+ upgradeTask.getUpgradedFile().getFileName() + "\" with newer configuration nodes. "
+ "A backup of the old file has been saved.");
}
} catch (UpgradeException e) {
failedAnyUpgrade = true;
failedUpgrades.add(upgradeTask);
failedUpgrades.add(upgradeTask.getOriginalFile());
logUpgradeException(upgradeTask, e);
}
}

View File

@ -20,8 +20,8 @@ import me.filoghost.chestcommands.legacy.UpgradeException;
import me.filoghost.chestcommands.util.Strings;
import org.bukkit.configuration.ConfigurationSection;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@ -38,13 +38,13 @@ public class MenuUpgrade extends Upgrade {
}
@Override
public File getOriginalFile() {
return menuConfig.getFile();
public Path getOriginalFile() {
return menuConfig.getPath();
}
@Override
public File getUpgradedFile() {
return menuConfig.getFile();
public Path getUpgradedFile() {
return menuConfig.getPath();
}
@Override

View File

@ -21,46 +21,43 @@ import me.filoghost.chestcommands.legacy.UpgradeException;
import me.filoghost.chestcommands.util.Strings;
import org.apache.commons.lang.StringEscapeUtils;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
public class PlaceholdersUpgrade extends Upgrade {
private final PluginConfig newPlaceholdersConfig;
private final File oldPlaceholdersFile;
private List<String> lines;
private final Path oldPlaceholdersFile;
public PlaceholdersUpgrade(ChestCommands plugin) {
this.newPlaceholdersConfig = plugin.getPlaceholdersConfig();
this.oldPlaceholdersFile = new File(plugin.getDataFolder(), "placeholders.yml");
this.oldPlaceholdersFile = plugin.getDataPath("placeholders.yml");
}
@Override
public File getOriginalFile() {
public Path getOriginalFile() {
return oldPlaceholdersFile;
}
@Override
public File getUpgradedFile() {
return newPlaceholdersConfig.getFile();
public Path getUpgradedFile() {
return newPlaceholdersConfig.getPath();
}
@Override
protected void computeChanges() throws UpgradeException {
if (!oldPlaceholdersFile.isFile()) {
if (!Files.isRegularFile(oldPlaceholdersFile)) {
return;
}
// Do NOT load the new placeholder configuration from disk, as it should only contain placeholders imported from the old file
List<String> lines;
try {
lines = Files.readAllLines(oldPlaceholdersFile.toPath(), StandardCharsets.UTF_8);
lines = Files.readAllLines(oldPlaceholdersFile);
} catch (IOException e) {
throw new UpgradeException("couldn't read file \"" + oldPlaceholdersFile.getName() + "\"", e);
throw new UpgradeException("couldn't read file \"" + oldPlaceholdersFile.getFileName() + "\"", e);
}
for (String line : lines) {
@ -85,7 +82,9 @@ public class PlaceholdersUpgrade extends Upgrade {
@Override
protected void saveChanges() throws IOException {
oldPlaceholdersFile.delete();
try {
Files.deleteIfExists(oldPlaceholdersFile);
} catch (IOException ignored) {}
newPlaceholdersConfig.save();
}

View File

@ -20,8 +20,8 @@ import me.filoghost.chestcommands.config.yaml.PluginConfig;
import me.filoghost.chestcommands.legacy.Upgrade;
import me.filoghost.chestcommands.legacy.UpgradeException;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Set;
public class SettingsUpgrade extends Upgrade {
@ -39,13 +39,13 @@ public class SettingsUpgrade extends Upgrade {
}
@Override
public File getOriginalFile() {
return settingsConfig.getFile();
public Path getOriginalFile() {
return settingsConfig.getPath();
}
@Override
public File getUpgradedFile() {
return settingsConfig.getFile();
public Path getUpgradedFile() {
return settingsConfig.getPath();
}
@Override