Improvement for IFile class

Former-commit-id: c3b2b924c5e72624cbe35cdf422eeb29136cd533
This commit is contained in:
portlek committed 2019-12-13 12:32:11 +03:00
1 parent cf25db42a0
commit e00a9c301a
9 files changed
+690 -100

No files matched your search

-4
View File
@@ -287,10 +287,6 @@
<artifactId>bukkit</artifactId>
<groupId>org.bukkit</groupId>
</exclusion>
<exclusion>
<artifactId>commons-io</artifactId>
<groupId>commons-io</groupId>
</exclusion>
</exclusions>
</dependency>
@@ -1,15 +1,24 @@
package org.maxgamer.quickshop.File;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.maxgamer.quickshop.Mock.MckFileConfiguration;
import org.maxgamer.quickshop.Util.Copied;
import org.maxgamer.quickshop.Util.Location.LocationOf;
import org.maxgamer.quickshop.Util.Location.StringOf;
import org.maxgamer.quickshop.Util.Util;
import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
public abstract class FileEnvelope implements IFile {
@@ -79,7 +88,7 @@ public abstract class FileEnvelope implements IFile {
fileConfiguration.save(file);
} catch (Exception exception) {
throw new RuntimeException(exception);
throw new IllegalStateException(exception);
}
}
@@ -89,9 +98,140 @@ public abstract class FileEnvelope implements IFile {
return fileConfiguration.get(path);
}
@NotNull
@Override
public Object get(@NotNull String path, @NotNull Object fallback) {
final Object object = fileConfiguration.get(path, fallback);
if (object == null) {
return fallback;
}
return object;
}
@NotNull
@Override
@SuppressWarnings("unchecked")
public <T> T getOrSet(@NotNull String path, @NotNull T fallback) {
final T object = (T) fileConfiguration.get(path, null);
if (object != null) {
return object;
}
set(path, fallback);
return fallback;
}
@NotNull
@Override
public Location getLocation(@NotNull String path) {
return new LocationOf(
getString(path).orElse("")
).value();
}
@Override
public void setLocation(@NotNull String path, @NotNull Location location) {
set(
path,
new StringOf(location).asString()
);
}
@NotNull
@Override
public ItemStack getCustomItemStack(@NotNull String path) {
try {
return Util.deserialize(path);
} catch (Exception exception) {
return new ItemStack(Material.AIR);
}
}
@Override
public void setCustomItemStack(@NotNull String path, @NotNull ItemStack itemStack) {
fileConfiguration.set(path, Util.serialize(itemStack));
}
@NotNull
@Override
public Optional<String> getString(@NotNull String path) {
return Optional.ofNullable(fileConfiguration.getString(path));
}
@Override
public void set(@NotNull String path, @NotNull Object object) {
fileConfiguration.set(path, object);
save();
}
@NotNull
@Override
public List<String> getStringList(@NotNull String path) {
return fileConfiguration.getStringList(path);
}
@Override
public int getInt(@NotNull String path) {
return fileConfiguration.getInt(path);
}
@Override
public double getDouble(@NotNull String path) {
return fileConfiguration.getDouble(path);
}
@Override
public long getLong(@NotNull String path) {
return fileConfiguration.getLong(path);
}
@Override
public byte getByte(@NotNull String path) {
return (byte) fileConfiguration.getInt(path);
}
@Override
public short getShort(@NotNull String path) {
return (short) fileConfiguration.getInt(path);
}
@Override
public boolean getBoolean(@NotNull String path) {
return fileConfiguration.getBoolean(path);
}
@NotNull
@Override
public ConfigurationSection createSection(@NotNull String path) {
final ConfigurationSection configurationSection = fileConfiguration.createSection(path);
save();
return configurationSection;
}
@NotNull
@Override
public ConfigurationSection getSection(@NotNull String path) {
final ConfigurationSection configurationSection = fileConfiguration.getConfigurationSection(path);
return configurationSection == null ? new MckFileConfiguration() : configurationSection;
}
@NotNull
@Override
public ConfigurationSection getOrCreateSection(@NotNull String path) {
ConfigurationSection section = getSection(path);
if (section instanceof MckFileConfiguration) {
section = createSection(path);
}
return section;
}
}
@@ -1,24 +1,211 @@
package org.maxgamer.quickshop.File;
import org.bukkit.Location;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.InputStream;
import java.util.List;
import java.util.Optional;
public interface IFile {
/**
* Creates yml file on the path
*/
void create();
@NotNull
InputStream getInputStream();
/**
* Reloads file
*/
void reload();
/**
* Saves file
*/
void save();
/**
* Gets the object
*
* @param path object path to get
* @return if path does not exist returns null
*/
@Nullable
Object get(@NotNull String path);
void set(@NotNull String path, @NotNull Object object);
/**
* Gets the object with fallback
*
* @param path object path to get
* @param fallback fallback object to get if path does not exist
* @return if path does not exist returns fallback object else the path object
*/
@NotNull
Object get(@NotNull String path, @NotNull Object fallback);
/**
* Gets or sets the object
*
* @param path object path to get
* @param fallback fallback object to get if path does not exist
* @param <T> object type
* @return if path does not exist returns and set the path with fallback object
*/
@NotNull
<T> T getOrSet(@NotNull final String path, @NotNull T fallback);
/**
* Gets location
*
* @param path location path to get
* @return {@link Location}
*/
@NotNull
Location getLocation(@NotNull final String path);
/**
* Sets location into the path
*
* @param path location path to set
* @param location {@link Location}
*/
void setLocation(@NotNull final String path, @NotNull final Location location);
/**
* Pattern:
*
* path:
* (material): 'DIAMOND'
* [amount]: 1
* [data]: 0
* [display-name]: 'Diamond Sword'
* [enchants]:
* DAMAGE_ALL: 10
* FIRE_ASPECT: 2
* [lore]:
* - 'Lore 1'
* - 'Lore 2'
*
* @param path itemstack path to get
* @return {@link ItemStack}
*/
@NotNull
ItemStack getCustomItemStack(@NotNull final String path);
/**
* Sets custom itemstack to path
*
* @param path itemstack path to set
* @param itemStack {@link ItemStack}
*/
void setCustomItemStack(@NotNull final String path, @NotNull final ItemStack itemStack);
/**
* Gets string
*
* @param path string path to get
* @return {@link String}
*/
@NotNull
Optional<String> getString(@NotNull final String path);
/**
* Sets object to path
*
* @param path object path to set
* @param object {@link Object}
*/
void set(@NotNull final String path, @NotNull final Object object);
/**
* Gets string list
*
* @param path string list path to get
* @return string list
*/
@NotNull
List<String> getStringList(@NotNull final String path);
/**
* Gets int
*
* @param path integer path to get
* @return {@link Integer}
*/
int getInt(@NotNull final String path);
/**
* Gets double
*
* @param path double path to get
* @return {@link Double}
*/
double getDouble(@NotNull final String path);
/**
* Gets long
*
* @param path long path to get
* @return {@link Integer}
*/
long getLong(@NotNull String path);
/**
* Gets byte
*
* @param path byte path to get
* @return {@link Byte}
*/
byte getByte(@NotNull final String path);
/**
* Gets short
*
* @param path short path to get
* @return {@link Short}
*/
short getShort(@NotNull String path);
/**
* Gets boolean
*
* @param path boolean path to get
* @return {@link Boolean}
*/
boolean getBoolean(@NotNull final String path);
/**
* Creates configuration section into path
*
* @param path configuration section path to create
* @return {@link ConfigurationSection}
*/
@NotNull
ConfigurationSection createSection(@NotNull String path);
/**
* Gets configuration section from path
*
* @param path configurations section path to get
* @return if there isn't section returns {@link MckFileConfiguration}
*/
@NotNull
ConfigurationSection getSection(@NotNull final String path);
/**
* Gets configuration section from path
* if there is no section It will create
*
* @param path configurations section path to get
* @return {@link ConfigurationSection}
*/
@NotNull
ConfigurationSection getOrCreateSection(@NotNull final String path);
}
@@ -0,0 +1,39 @@
package org.maxgamer.quickshop.Util.Location;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.jetbrains.annotations.NotNull;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public final class LocationOf {
@NotNull
private static final Pattern PATTERN =
Pattern.compile("((?<world>[^:/]+)[:/])?(?<x>[\\-0-9.]+),(?<y>[\\-0-9.]+),(?<z>[\\-0-9.]+)(:(?<yaw>[\\-0-9.]+):(?<pitch>[\\-0-9.]+))?");
@NotNull
private final String text;
public LocationOf(@NotNull String text) {
this.text = text;
}
@NotNull
public Location value() {
final Matcher match = PATTERN.matcher(text.replaceAll("_", "\\."));
if (match.matches())
return new Location(
Bukkit.getWorld(match.group("world")),
Double.parseDouble(match.group("x")),
Double.parseDouble(match.group("y")),
Double.parseDouble(match.group("z")),
match.group("yaw") != null ? Float.parseFloat(match.group("yaw")) : 0F,
match.group("pitch") != null ? Float.parseFloat(match.group("pitch")) : 0F
);
throw new IllegalStateException("Location string has wrong style!");
}
}
@@ -0,0 +1,51 @@
package org.maxgamer.quickshop.Util.Location;
import org.bukkit.Location;
import org.bukkit.World;
import org.jetbrains.annotations.NotNull;
import java.util.Locale;
public final class StringOf {
@NotNull
private final Location location;
@NotNull
private final World world;
public StringOf(@NotNull Location location) {
if (location.getWorld() == null) {
throw new IllegalStateException("World of the location cannot be null!");
}
this.location = location;
this.world = location.getWorld();
}
@NotNull
public String asString() {
String s = world.getName() + ":";
s += String.format(
Locale.ENGLISH,
"%.2f,%.2f,%.2f",
location.getX(), location.getY(), location.getZ()
);
if (location.getYaw() != 0f || location.getPitch() != 0f) {
s += String.format(
Locale.ENGLISH,
":%.2f:%.2f",
location.getYaw(), location.getPitch()
);
}
return s;
}
@NotNull
public String asKey() {
return asString().replaceAll(":", "/").replaceAll("\\.", "_");
}
}
@@ -990,6 +990,20 @@ public class Util {
return text;
}
/**
* Parse colors for the List.
*
* @param list the list
* @return parsed list
*/
public static List<String> parseColours(@NotNull List<String> list) {
final List<String> newList = new ArrayList<>();
list.forEach(s -> newList.add(parseColours(s)));
return newList;
}
/**
* Converts a name like IRON_INGOT into Iron Ingot to improve readability
*
@@ -0,0 +1,257 @@
package org.maxgamer.quickshop.File;
import be.seeseemelk.mockbukkit.MockBukkit;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.inventory.ItemStack;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.maxgamer.quickshop.Mock.MckFileConfiguration;
import org.maxgamer.quickshop.QuickShopTest;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.*;
public class FileEnvelopeTest {
private final List<String> test = new ArrayList<>();
private QuickShopTest plugin;
private IFile json;
private IFile yaml;
@BeforeEach
void start() {
MockBukkit.mock();
plugin = MockBukkit.load(QuickShopTest.class);
json = new JSONFile(plugin, "messages");
json.create();
yaml = new YAMLFile(plugin, "messages");
yaml.create();
test.add("test");
json.set("test.list", test);
yaml.set("test.list", test);
json.set("test.int", 13);
yaml.set("test.int", 13);
json.set("test.boolean", true);
yaml.set("test.boolean", true);
json.set("test.short", (short) 1);
yaml.set("test.short", (short) 1);
json.set("test.long", (long) 1);
yaml.set("test.long", (long) 1);
json.set("test.byte", (byte) 1);
yaml.set("test.byte", (byte) 1);
json.set("test.double", (double) 1);
yaml.set("test.double", (double) 1);
}
@Test
void get() {
assertEquals(
"{0}",
json.get("signs.item")
);
assertEquals(
"{0}",
yaml.get("signs.item")
);
}
@Test
void getString() {
final Optional<String> optionalS = json.getString("shop-staff-cleared");
final Optional<String> optionalSS = yaml.getString("shop-staff-cleared");
if (!optionalS.isPresent() || !optionalSS.isPresent()) {
throw new IllegalArgumentException("There no path called 'shop-staff-cleared'");
}
assertEquals(
"&aSuccessfully removed all staff for your shop.",
optionalS.get()
);
assertEquals(
"&aSuccessfully removed all staff for your shop.",
optionalSS.get()
);
}
@Test
void set() {
json.set("test.test", "test");
yaml.set("test.test", "test");
assertEquals(
"{0}",
json.get("signs.item")
);
assertEquals(
"{0}",
yaml.get("signs.item")
);
}
@Test
void create() {
json.create();
yaml.create();
}
@Test
void save() {
json.save();
yaml.save();
}
@Test
void getWithFallback() {
assertEquals(
"&aSuccessfully removed all staff for your shop.",
json.get("shop-staff-cleared", "test")
);
assertEquals(
"&aSuccessfully removed all staff for your shop.",
yaml.get("shop-staff-cleared", "test")
);
}
@Test
void getOrSet() {
assertEquals(
"test",
json.getOrSet("test.test123", "test")
);
assertEquals(
"test",
yaml.getOrSet("test.test123", "test")
);
assertEquals(
"test",
json.getOrSet("test.test123", "test")
);
assertEquals(
"test",
yaml.getOrSet("test.test123", "test")
);
}
@Test
void getStringList() {
assertEquals(
test,
json.getStringList("test.list")
);
assertEquals(
test,
yaml.getStringList("test.list")
);
}
@Test
void getInt() {
assertEquals(
13,
json.getInt("test.int")
);
assertEquals(
13,
yaml.getInt("test.int")
);
}
@Test
void getDouble() {
assertEquals(
1,
json.getDouble("test.short")
);
assertEquals(
1,
yaml.getDouble("test.short")
);
}
@Test
void getLong() {
assertEquals(
1,
json.getLong("test.short")
);
assertEquals(
1,
yaml.getLong("test.short")
);
}
@Test
void getByte() {
assertEquals(
(byte) 1,
json.getByte("test.short")
);
assertEquals(
(byte) 1,
yaml.getByte("test.short")
);
}
@Test
void getShort() {
assertEquals(
(short) 1,
json.getShort("test.short")
);
assertEquals(
(short) 1,
yaml.getShort("test.short")
);
}
@Test
void getBoolean() {
assertTrue(
json.getBoolean("test.boolean")
);
assertTrue(
yaml.getBoolean("test.boolean")
);
}
@Test
void createSection() {
json.createSection("test.section");
yaml.createSection("test.section");
}
@Test
void getSection() {
assertTrue(
() -> !(json.getSection("test.section") instanceof MckFileConfiguration)
);
assertTrue(
() -> !(yaml.getSection("test.section") instanceof MckFileConfiguration)
);
}
@Test
void getOrCreateSection() {
assertTrue(
() -> !(json.getOrCreateSection("test.section") instanceof MckFileConfiguration)
);
assertTrue(
() -> !(yaml.getOrCreateSection("test.section") instanceof MckFileConfiguration)
);
}
@AfterEach
void stop() {
json.save();
yaml.save();
MockBukkit.unload();
}
}
@@ -1,46 +0,0 @@
package org.maxgamer.quickshop.File;
import be.seeseemelk.mockbukkit.MockBukkit;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.maxgamer.quickshop.QuickShopTest;
import static org.junit.jupiter.api.Assertions.*;
final class JSONFileTest {
private QuickShopTest plugin;
private IFile json;
@BeforeEach
void start() {
MockBukkit.mock();
plugin = MockBukkit.load(QuickShopTest.class);
json = new JSONFile(plugin, "messages");
json.create();
}
@Test
void get() {
assertEquals(
json.get("signs.item"),
"{0}"
);
}
@Test
void set() {
json.set("test.test", "test");
assertEquals(
json.get("signs.item"),
"{0}"
);
}
@AfterEach
void stop() {
json.save();
MockBukkit.unload();
}
}
@@ -1,48 +0,0 @@
package org.maxgamer.quickshop.File;
import be.seeseemelk.mockbukkit.MockBukkit;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.maxgamer.quickshop.QuickShopTest;
import static org.junit.jupiter.api.Assertions.*;
final class YAMLFileTest {
private QuickShopTest plugin;
private IFile yaml;
@BeforeEach
void start() {
MockBukkit.mock();
plugin = MockBukkit.load(QuickShopTest.class);
yaml = new YAMLFile(plugin, "messages");
yaml.create();
}
@Test
void get() {
assertEquals(
yaml.get("signs.item"),
"{0}"
);
}
@Test
void set() {
yaml.set("test.test", "test");
assertEquals(
yaml.get("test.test"),
"test"
);
}
@AfterEach
void stop() {
yaml.save();
MockBukkit.unload();
}
}