Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
24796d5
add mockito & update junit to `6.1.3`
PZDonny Oct 17, 2026
bf9cc2b
close reader object after test
PZDonny Oct 17, 2026
956b81c
Add `Versionutils` tests
PZDonny Oct 17, 2026
86b99a8
corrected logic for `#cleanVersionString` & remove `IS_DEV_VERSION` f…
PZDonny Oct 17, 2026
b78b76f
Bump version to 3.8.1
PZDonny Oct 17, 2026
453d921
rename test method from `#tests` to `#shouldBeValidFrameIds`
PZDonny Oct 20, 2026
df6f5ac
Changed DisplayStorage and DBDisplayStorage to abstract classes to ac…
PZDonny Oct 21, 2026
8c03010
create `#connect` method, moving connection logic outside of scheduler
PZDonny Oct 21, 2026
10a6c32
Move some plugin initialization logic into `DisplayAPIInitializer`
PZDonny Oct 21, 2026
c14e43e
Make `DisplayStorage`'s logger `protected`
PZDonny Oct 21, 2026
0e0dac6
Use `ComponentLogger` instead of `Logger`
PZDonny Oct 21, 2026
d0583d4
Use `ComponentLogger` instead of `Logger`
PZDonny Oct 21, 2026
afe0ed8
Use `CommonDisplayStorageUtils` to reduce redundant code
PZDonny Oct 21, 2026
c341115
Use logger instead of console sender
PZDonny Oct 21, 2026
28c8dfb
Fix NPE when an error when trying to msg a player deleting an animati…
PZDonny Oct 21, 2026
54af8a2
Fix deleting through `MySQL` not working as intended
PZDonny Oct 21, 2026
828c5db
let try-with-resource close `blobStream`
PZDonny Oct 21, 2026
2a2d3f9
move connection logic outside of scheduler to `#connect`
PZDonny Oct 21, 2026
2ed709d
Fixed an issue where animations were attempting to be saved and retri…
PZDonny Oct 21, 2026
bcc7d5c
Added integration tests for MySQL and MongoDB storages
PZDonny Oct 21, 2026
4b2d421
improve command usage validation tests
PZDonny Oct 21, 2026
2125dc5
3.8.1 release notes
PZDonny Oct 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>net.donnypz.displayentityutils</groupId>
<artifactId>deu</artifactId>
<version>3.8.0</version>
<version>3.8.1</version>
</parent>

<artifactId>api</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,40 @@

import net.donnypz.displayentityutils.utils.DisplayEntities.DisplayAnimation;
import net.donnypz.displayentityutils.utils.DisplayEntities.DisplayEntityGroup;
import net.kyori.adventure.text.logger.slf4j.ComponentLogger;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.List;

public interface DisplayStorage {
public abstract class DisplayStorage {

boolean isEnabled();
protected final ComponentLogger logger;

boolean saveDisplayEntityGroup(@NotNull DisplayEntityGroup group, @Nullable Player saver);
public DisplayStorage(ComponentLogger logger) {
this.logger = logger;
}

void deleteDisplayEntityGroup(@NotNull String group, @Nullable Player deleter);
public abstract boolean isEnabled();

@Nullable DisplayEntityGroup getDisplayEntityGroup(@NotNull String tag);
public abstract boolean saveDisplayEntityGroup(@NotNull DisplayEntityGroup group, @Nullable Player saver);

boolean saveDisplayAnimation(@NotNull DisplayAnimation animation, @Nullable Player saver);
public abstract void deleteDisplayEntityGroup(@NotNull String group, @Nullable Player deleter);

void deleteDisplayAnimation(@NotNull String tag, @Nullable Player deleter);
public @Nullable abstract DisplayEntityGroup getDisplayEntityGroup(@NotNull String tag);

@Nullable DisplayAnimation getDisplayAnimation(@NotNull String tag);
public abstract boolean saveDisplayAnimation(@NotNull DisplayAnimation animation, @Nullable Player saver);

@NotNull List<String> getGroupTags();
public abstract void deleteDisplayAnimation(@NotNull String tag, @Nullable Player deleter);

@NotNull List<String> getGroupTags(int page, int size);
public @Nullable abstract DisplayAnimation getDisplayAnimation(@NotNull String tag);

@NotNull List<String> getAnimationTags();
public @NotNull abstract List<String> getGroupTags();

@NotNull List<String> getAnimationTags(int page, int size);
public @NotNull abstract List<String> getGroupTags(int page, int size);

public @NotNull abstract List<String> getAnimationTags();

public @NotNull abstract List<String> getAnimationTags(int page, int size);
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,10 @@ public final class VersionUtils {
public static final boolean IS_26_1 = Bukkit.getUnsafe().getProtocolVersion() >= 775;
public static final boolean IS_26_2 = Bukkit.getUnsafe().getProtocolVersion() >= 776;

public static final boolean IS_DEV_VERSION;
private static Particle ENTITY_EFFECT_PARTICLE;
private static Particle ITEM_PARTICLE;

static{
String pluginVer = DisplayAPI.getPlugin().getPluginMeta().getVersion();
IS_DEV_VERSION = isDevVersion(pluginVer);
setParticles();
}

Expand All @@ -47,23 +44,32 @@ private VersionUtils(){}
}

public static boolean isDevVersion(){
return IS_DEV_VERSION;
return isDevVersion(DisplayAPI.getPlugin().getPluginMeta().getVersion());
}

@ApiStatus.Internal
public static boolean isDevVersion(@NotNull String version){
static boolean isDevVersion(@NotNull String version){
String clean = cleanVersionString(version);
return !version.equals(clean);
}

@ApiStatus.Internal
public static @NotNull String cleanVersionString(@NotNull String version){
return version.replaceAll("[^0-9.]", "");
String[] versionNumbers = version.split("\\.");

return versionNumbers[0] +
"." +
versionNumbers[1] +
"." +
versionNumbers[2].split("-")[0];
}

public static boolean isCurrentOlderThan(@NotNull String comparedVersion){
String current = getPluginVersion();
String cleanCurrent = VersionUtils.cleanVersionString(current);
return isOlderThan(getPluginVersion(), comparedVersion);
}

static boolean isOlderThan(@NotNull String version,@NotNull String comparedVersion){
String cleanCurrent = VersionUtils.cleanVersionString(version);
String cleanComparedVersion = VersionUtils.cleanVersionString(comparedVersion);

String[] currentArr = cleanCurrent.split("\\.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,10 @@ void testInvalidConfigs(String configName) {

private DisplayController testConfig(String configName, String packageName){
DisplayController controller;
try (InputStream stream = getClass().getResourceAsStream("/test/controllers/"+packageName+"/" + configName + ".yml")) {
InputStreamReader reader = new InputStreamReader(stream);

try (
InputStream stream = getClass().getResourceAsStream("/test/controllers/"+packageName+"/" + configName + ".yml");
InputStreamReader reader = new InputStreamReader(stream))
{
YamlConfiguration config = YamlConfiguration.loadConfiguration(reader);
controller = DisplayControllerReader.read(
config,
Expand All @@ -62,7 +63,7 @@ private DisplayController testConfig(String configName, String packageName){
logger,
false
);
} catch (IOException e) {
} catch (IOException | NullPointerException e) {
throw new RuntimeException(e);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package net.donnypz.displayentityutils.utils.version;

import org.bukkit.Bukkit;
import org.bukkit.UnsafeValues;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.MockedStatic;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.yaml.snakeyaml.Yaml;

import java.io.InputStream;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.*;

@ExtendWith(MockitoExtension.class)
public class VersionTests {

private static MockedStatic<Bukkit> bukkitMock;

@BeforeAll
static void mockBukkit(){
bukkitMock = Mockito.mockStatic(Bukkit.class);
UnsafeValues unsafeValues = Mockito.mock(UnsafeValues.class);

bukkitMock.when(Bukkit::getUnsafe).thenReturn(unsafeValues);
Mockito.when(unsafeValues.getProtocolVersion()).thenReturn(Integer.MAX_VALUE);
}

@AfterAll
static void closeBukkitMock(){
bukkitMock.close();
}


@ParameterizedTest
@ValueSource(strings = {
"2.3.2-ex-39a286e|2.3.2",
"3.1.0-main|3.1.0",
"3.5.0-PRE|3.5.0",
"3.6.1-develop|3.6.1",
"3.7.0-dev|3.7.0",
"3.8.0-dev-1da350c|3.8.0",
})
void shouldCleanVersionString(String version) {
String[] split = version.split("\\|");
String dirtyVersion = split[0];
String cleanVersion = split[1];

String cleaned = VersionUtils.cleanVersionString(dirtyVersion);

assertEquals(cleaned, cleanVersion);
}


@ParameterizedTest
@ValueSource(strings = {
"2.3.2-ex-39a286e",
"3.1.0-main",
"3.5.3-develop",
"3.5.0-PRE",
"3.7.0-dev",
})
void shouldBeDevVersion(String version) {
boolean isDevVersion = VersionUtils.isDevVersion(version);
assertTrue(isDevVersion, "Version is not a develop version: " + version);
}

@ParameterizedTest
@ValueSource(strings = {
"3.7.0",
"3.6.0",
"3.5.5",
"3.5.1",
"3.6.0",
})
void currentVersionShouldBeNewer(String comparedVersion) {
Yaml yaml = new Yaml();

try (InputStream inputStream = getClass().getResourceAsStream("/plugin.yml")) {
Map<String, Object> config = yaml.load(inputStream);
String currentVersion = (String) config.get("version");

boolean isNewer = VersionUtils.isOlderThan(comparedVersion, currentVersion);

assertTrue(isNewer, "Current version (" + currentVersion + ") should be newer than compared version: " + comparedVersion);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
19 changes: 19 additions & 0 deletions docs/release-notes/3.8.1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
**Release Highlights**
- Breaking API Changes 🔨
- Bug Fixes 🐛

## API Changes
> [!NOTE]
>**New Version:** `3.8.1`

### <ins>Breaking Changes</ins>
- Removed `IS_DEV_VERSION` field from `VersionUtils`
- Changed `DisplayStorage` and `DBDisplayStorage` to abstract classes to accept Logger in constructor
- May require recompilation of plugins depending on `DisplayEntityUtils`


## Bug Fixes / QOL
- Corrected logic for `VersionUtils#cleanVersionString`
- Fixed an `NPE` that occurred when trying to message a player after deleting groups/animations
- Fixed deleting groups/animations not working as intended when using `MySQL` storage
- Fixed saving/deleting animations not working as intended when using `MongoDB` storage
26 changes: 25 additions & 1 deletion plugin/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>net.donnypz.displayentityutils</groupId>
<artifactId>deu</artifactId>
<version>3.8.0</version>
<version>3.8.1</version>
</parent>

<artifactId>plugin</artifactId>
Expand All @@ -26,6 +26,7 @@
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>deg</nonFilteredFileExtension>
<nonFilteredFileExtension>deanim</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
Expand Down Expand Up @@ -150,6 +151,29 @@
<version>2.12.2</version>
<scope>provided</scope>
</dependency>

<!-- Source: https://mvnrepository.com/artifact/org.testcontainers/mysql -->
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mysql</artifactId>
<version>1.21.4</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.3.0</version>
<scope>test</scope>
</dependency>

<!-- Source: https://mvnrepository.com/artifact/org.testcontainers/mongodb -->
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mongodb</artifactId>
<version>1.21.4</version>
<scope>test</scope>
</dependency>
</dependencies>

<dependencyManagement>
Expand Down
Loading
Loading