Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
19 changes: 9 additions & 10 deletions src/main/java/net/theevilreaper/xerus/api/kit/BaseKit.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,17 @@

import net.kyori.adventure.key.Key;
import net.theevilreaper.xerus.api.component.ObjectComponent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
* The {@link BaseKit} is an abstract layer implementation of the {@link Kit} interface.
* It contains the general structure of a kit and can be used to define custom implementations.
*
* @author theEvilReaper
* @version 1.0.0
* @version 1.1.0
* @since 1.2.0
**/
public abstract class BaseKit implements Kit {
Expand All @@ -24,48 +23,48 @@
/**
* Creates a new instance of the {@link BaseKit}.
*/
protected BaseKit(@NotNull Key key) {
protected BaseKit(Key key) {

Check warning on line 26 in src/main/java/net/theevilreaper/xerus/api/kit/BaseKit.java

View workflow job for this annotation

GitHub Actions / Build Pull Request Branch (macos-latest)

no @PARAM for key

Check warning on line 26 in src/main/java/net/theevilreaper/xerus/api/kit/BaseKit.java

View workflow job for this annotation

GitHub Actions / Build Pull Request Branch (ubuntu-latest)

no @PARAM for key
this.key = key;
this.components = new HashMap<>();
this.components = new ConcurrentHashMap<>();
}

/**
* {@inheritDoc}
*/
@Override
public <T extends ObjectComponent> void add(@NotNull Class<T> componentClass, @NotNull T component) {
public <T extends ObjectComponent> void add(Class<T> componentClass, T component) {
this.components.computeIfAbsent(componentClass, k -> component);
}

/**
* {@inheritDoc}
*/
@Override
public <T extends ObjectComponent> boolean has(@NotNull Class<T> componentClass) {
public <T extends ObjectComponent> boolean has(Class<T> componentClass) {
return this.components.containsKey(componentClass);
}

/**
* {@inheritDoc}}
*/
@Override
public <T extends ObjectComponent> @Nullable T get(@NotNull Class<T> componentClass) {
public <T extends ObjectComponent> @Nullable T get(Class<T> componentClass) {
return componentClass.cast(this.components.get(componentClass));
}

/**
* {@inheritDoc}
*/
@Override
public <T extends ObjectComponent> @Nullable T remove(@NotNull Class<T> componentClass) {
public <T extends ObjectComponent> @Nullable T remove(Class<T> componentClass) {
return componentClass.cast(this.components.remove(componentClass));
}

/**
* {@inheritDoc}
*/
@Override
public @NotNull Key key() {
public Key key() {
return this.key;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,34 @@

import net.kyori.adventure.key.Key;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.UnmodifiableView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;

/**
* The class represents a default implementation of the {@link KitService} interface.
* It has some basic functionality for managing kits and which players are currently using them.
* If your use case doesn't fit into this please implement your own {@link KitService} implementation.
*
* @author theEvilReaper
* @version 1.1.0
* @version 1.2.0
* @since 1.2.0
**/
public final class DefaultKitService implements KitService {

private static final Logger KIT_LOGGER = LoggerFactory.getLogger(DefaultKitService.class);
private final List<Kit> kits;
private final Map<Key, Kit> kits;

/**
* Creates a new instance of the {@link DefaultKitService}.
*/
DefaultKitService() {
this.kits = new ArrayList<>();
this.kits = new ConcurrentHashMap<>();
}

/**
Expand All @@ -47,42 +45,35 @@ public void clear() {
* {@inheritDoc}
*/
@Override
public void add(@NotNull Kit kit) {
if (kits.contains(kit)) {
public void add(Kit kit) {
if (this.kits.containsKey(kit.key())) {
KIT_LOGGER.info("Overwriting existing kit!");
}
this.kits.add(kit);
this.kits.put(kit.key(), kit);
}

/**
* {@inheritDoc}
*/
@Override
public boolean remove(@NotNull Key identifier) {
return this.kits.removeIf(iKit -> iKit.key().equals(identifier));
public boolean remove(Key identifier) {
return this.kits.remove(identifier) != null;
}

/**
* {@inheritDoc}
*/
@Override
public @NotNull Optional<@Nullable Kit> getKit(@NotNull Key name) {
Kit kit = null;
for (int i = 0; i < kits.size() && kit == null; i++) {
if (kits.get(i).key().equals(name)) {
kit = kits.get(i);
}
}

return Optional.ofNullable(kit);
public Optional<Kit> getKit(Key name) {
return Optional.ofNullable(this.kits.get(name));
}

/**
* {@inheritDoc}
*/
@Contract(pure = true)
@Override
public @NotNull @UnmodifiableView List<Kit> getKits() {
return Collections.unmodifiableList(this.kits);
public @UnmodifiableView List<Kit> getKits() {
return List.copyOf(this.kits.values());
}
}
7 changes: 3 additions & 4 deletions src/main/java/net/theevilreaper/xerus/api/kit/Kit.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,12 @@
import net.kyori.adventure.key.Key;
import net.minestom.server.entity.Player;
import net.theevilreaper.xerus.api.component.Componentable;
import org.jetbrains.annotations.NotNull;

/**
* The {@link Kit} interface provides all basic methods that a kit should have.
*
* @author theEvilReaper
* @version 2.0.0
* @version 2.1.0
* @since 1.2.0
**/
public interface Kit extends Componentable {
Expand All @@ -19,12 +18,12 @@ public interface Kit extends Componentable {
*
* @param player the player to apply the kit to
*/
void apply(@NotNull Player player);
void apply(Player player);

/**
* Returns the identifier of the kit.
*
* @return the underlying value
*/
@NotNull Key key();
Key key();
}
13 changes: 5 additions & 8 deletions src/main/java/net/theevilreaper/xerus/api/kit/KitService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

import net.kyori.adventure.key.Key;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.UnmodifiableView;

import java.util.List;
Expand All @@ -15,7 +13,7 @@
* So he must implement the interface by self and can add additional method to the service.
*
* @author theEvilReaper
* @version 1.0.0
* @version 1.1.0
* @since 1.2.0
**/
public interface KitService {
Expand All @@ -26,7 +24,7 @@ public interface KitService {
* @return the new instance
*/
@Contract(pure = true)
static @NotNull KitService of() {
static KitService of() {
return new DefaultKitService();
}

Expand All @@ -35,15 +33,15 @@ public interface KitService {
*
* @param kit that should be added
*/
void add(@NotNull Kit kit);
void add(Kit kit);

/**
* Remove a kit by the identifier from the kit.
*
* @param identifier the identifier from the kit
* @return true when the kit can be removed otherwise false
*/
boolean remove(@NotNull Key identifier);
boolean remove(Key identifier);

/**
* Clears the underlying data structure.
Expand All @@ -56,14 +54,13 @@ public interface KitService {
* @param name the name of the kit
* @return the fetched kit in an optional
*/
@NotNull Optional<@Nullable Kit> getKit(@NotNull Key name);
Optional<Kit> getKit(Key name);

/**
* Returns a list with all current available kits.
*
* @return the underlying list
*/
@NotNull
@UnmodifiableView
@Contract(pure = true)
List<Kit> getKits();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import net.minestom.server.entity.Player;
import net.minestom.server.event.trait.CancellableEvent;
import net.minestom.server.event.trait.PlayerEvent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

/**
Expand All @@ -16,7 +15,7 @@
public final class PlayerKitChangeEvent implements PlayerEvent, CancellableEvent {

private final Player player;
private final Kit currentKit;
private final @Nullable Kit currentKit;
private final Kit newKit;
private boolean cancelled;

Expand All @@ -26,7 +25,7 @@ public final class PlayerKitChangeEvent implements PlayerEvent, CancellableEvent
* @param currentKit The current kit of the player
* @param newKit The new kit of the player
*/
public PlayerKitChangeEvent(@NotNull Player player, @Nullable Kit currentKit, @NotNull Kit newKit) {
public PlayerKitChangeEvent(Player player, @Nullable Kit currentKit, Kit newKit) {
this.player = player;
this.currentKit = currentKit;
this.newKit = newKit;
Expand All @@ -37,7 +36,7 @@ public PlayerKitChangeEvent(@NotNull Player player, @Nullable Kit currentKit, @N
* @return the involved player
*/
@Override
public @NotNull Player getPlayer() {
public Player getPlayer() {
return player;
}

Expand Down Expand Up @@ -75,7 +74,7 @@ public boolean isCancelled() {
* Returns the new kit for a player
* @return the new kit
*/
public @NotNull Kit getNewKit() {
public Kit getNewKit() {
return newKit;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NotNullByDefault
package net.theevilreaper.xerus.api.kit.event;

Check warning on line 2 in src/main/java/net/theevilreaper/xerus/api/kit/event/package-info.java

View workflow job for this annotation

GitHub Actions / Build Pull Request Branch (macos-latest)

no comment

Check warning on line 2 in src/main/java/net/theevilreaper/xerus/api/kit/event/package-info.java

View workflow job for this annotation

GitHub Actions / Build Pull Request Branch (ubuntu-latest)

no comment

import org.jetbrains.annotations.NotNullByDefault;
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NotNullByDefault
package net.theevilreaper.xerus.api.kit;

Check warning on line 2 in src/main/java/net/theevilreaper/xerus/api/kit/package-info.java

View workflow job for this annotation

GitHub Actions / Build Pull Request Branch (macos-latest)

no comment

Check warning on line 2 in src/main/java/net/theevilreaper/xerus/api/kit/package-info.java

View workflow job for this annotation

GitHub Actions / Build Pull Request Branch (ubuntu-latest)

no comment

import org.jetbrains.annotations.NotNullByDefault;
38 changes: 38 additions & 0 deletions src/test/java/net/theevilreaper/xerus/api/kit/KitServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,42 @@ void testKitGetNonExisting() {
Optional<Kit> fetchedKit = kitService.getKit(Key.key("xerus", "test_kit"));
assertFalse(fetchedKit.isPresent());
}

@Test
void testDuplicateKitAddition() {
assertTrue(kitService.getKits().isEmpty());

Kit kit1 = new TestKit();
Kit kit2 = new TestKit();

kitService.add(kit1);
assertEquals(1, kitService.getKits().size());

// Adding kit with same key must replace existing without duplicating size
kitService.add(kit2);
assertEquals(1, kitService.getKits().size());
assertEquals(kit2, kitService.getKit(kit1.key()).orElse(null));
}

@Test
void testRemoveNonExisting() {
assertFalse(kitService.remove(Key.key("xerus", "non_existing_kit")));
}

@Test
void testClearMultipleKits() {
kitService.add(new TestKit(Key.key("xerus", "kit_1")));
kitService.add(new TestKit(Key.key("xerus", "kit_2")));
assertEquals(2, kitService.getKits().size());

kitService.clear();
assertTrue(kitService.getKits().isEmpty());
}

@Test
void testUnmodifiableKitsList() {
kitService.add(new TestKit());
var kitsList = kitService.getKits();
assertThrows(UnsupportedOperationException.class, () -> kitsList.add(new TestKit(Key.key("xerus", "other"))));
}
}
Loading
Loading