From 11e04924c3bebc13965dffb9e8d30d1f5de022cc Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Tue, 22 Nov 2022 18:39:09 +0200 Subject: [PATCH 01/36] start permissions api --- .../treasury/api/permission/Context.java | 40 +++++++++++++++++++ .../lokka30/treasury/api/permission/Node.java | 24 +++++++++++ .../treasury/api/permission/NodeHolder.java | 16 ++++++++ .../treasury/api/permission/NodeType.java | 7 ++++ .../api/permission/PermissionNode.java | 14 +++++++ .../treasury/api/permission/PrefixNode.java | 6 +++ .../treasury/api/permission/SuffixNode.java | 6 +++ 7 files changed, 113 insertions(+) create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/Context.java create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/Node.java create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/NodeHolder.java create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/NodeType.java create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/PermissionNode.java create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/PrefixNode.java create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/SuffixNode.java diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/Context.java b/api/src/main/java/me/lokka30/treasury/api/permission/Context.java new file mode 100644 index 00000000..954df8f7 --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/Context.java @@ -0,0 +1,40 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission; + +import me.lokka30.treasury.api.common.misc.TriState; +import org.jetbrains.annotations.NotNull; + +public final class Context { + + @NotNull + public static Context of(@NotNull String context) { + return new Context(context, TriState.UNSPECIFIED); + } + + @NotNull + public static Context of(@NotNull String context, @NotNull TriState world) { + return new Context(context, world); + } + + private final String context; + private final TriState world; + + private Context(@NotNull String context, @NotNull TriState world) { + this.context = context; + this.world = world; + } + + @NotNull + public String context() { + return this.context; + } + + @NotNull + public TriState isWorldContext() { + return this.world; + } + +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/Node.java b/api/src/main/java/me/lokka30/treasury/api/permission/Node.java new file mode 100644 index 00000000..3b5717fe --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/Node.java @@ -0,0 +1,24 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission; + +import java.util.UUID; +import org.jetbrains.annotations.NotNull; + +public interface Node { + + @NotNull UUID getBoundTo(); + + @NotNull + NodeType nodeType(); + + @NotNull + String key(); + + @NotNull + Data data(); + + void updateData(@NotNull Data data); +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/NodeHolder.java new file mode 100644 index 00000000..914f0c7b --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/NodeHolder.java @@ -0,0 +1,16 @@ +package me.lokka30.treasury.api.permission; + +import java.util.Collection; +import java.util.UUID; +import me.lokka30.treasury.api.common.misc.TriState; +import org.jetbrains.annotations.NotNull; + +public interface NodeHolder { + + @NotNull UUID getUniqueId(); + + @NotNull Collection> nodes(); + + @NotNull TriState hasNode(@NotNull Node node); + +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/NodeType.java b/api/src/main/java/me/lokka30/treasury/api/permission/NodeType.java new file mode 100644 index 00000000..558547b1 --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/NodeType.java @@ -0,0 +1,7 @@ +package me.lokka30.treasury.api.permission; + +public enum NodeType { + PERMISSION, + PREFIX, + SUFFIX +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/PermissionNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/PermissionNode.java new file mode 100644 index 00000000..87c68b66 --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/PermissionNode.java @@ -0,0 +1,14 @@ +package me.lokka30.treasury.api.permission; + +import me.lokka30.treasury.api.common.misc.TriState; +import org.jetbrains.annotations.NotNull; + +public interface PermissionNode extends Node { + + @Override + @NotNull + default NodeType nodeType() { + return NodeType.PERMISSION; + } + +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/PrefixNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/PrefixNode.java new file mode 100644 index 00000000..62d92adc --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/PrefixNode.java @@ -0,0 +1,6 @@ +package me.lokka30.treasury.api.permission; + +// todo +public interface PrefixNode { + +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/SuffixNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/SuffixNode.java new file mode 100644 index 00000000..9eb70c1c --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/SuffixNode.java @@ -0,0 +1,6 @@ +package me.lokka30.treasury.api.permission; + +// todo +public interface SuffixNode { + +} From 2dba23886a041dc7b9a3be6f2e02d1a5e7ad9404 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Tue, 22 Nov 2022 18:53:16 +0200 Subject: [PATCH 02/36] more foundation --- .../treasury/api/permission/Context.java | 7 +++++ .../lokka30/treasury/api/permission/Node.java | 8 +++--- .../treasury/api/permission/NodeFactory.java | 21 +++++++++++++++ .../treasury/api/permission/NodeHolder.java | 16 ++++++++++-- .../treasury/api/permission/NodeType.java | 26 ++++++++++++++++--- .../api/permission/PermissionNode.java | 6 ++++- .../api/permission/PermissionsProvider.java | 19 ++++++++++++++ 7 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/NodeFactory.java create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/Context.java b/api/src/main/java/me/lokka30/treasury/api/permission/Context.java index 954df8f7..89bbc814 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/Context.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/Context.java @@ -9,6 +9,13 @@ public final class Context { + private static final Context GLOBAL = new Context("global", TriState.FALSE); + + @NotNull + public static Context global() { + return GLOBAL; + } + @NotNull public static Context of(@NotNull String context) { return new Context(context, TriState.UNSPECIFIED); diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/Node.java b/api/src/main/java/me/lokka30/treasury/api/permission/Node.java index 3b5717fe..a29186ca 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/Node.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/Node.java @@ -4,21 +4,19 @@ package me.lokka30.treasury.api.permission; -import java.util.UUID; import org.jetbrains.annotations.NotNull; public interface Node { - @NotNull UUID getBoundTo(); + @NotNull + NodeType nodeType(); @NotNull - NodeType nodeType(); + Context context(); @NotNull String key(); @NotNull Data data(); - - void updateData(@NotNull Data data); } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/NodeFactory.java b/api/src/main/java/me/lokka30/treasury/api/permission/NodeFactory.java new file mode 100644 index 00000000..ba74635f --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/NodeFactory.java @@ -0,0 +1,21 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission; + +import org.jetbrains.annotations.NotNull; + +public abstract class NodeFactory { + + @NotNull + public PermissionNode createPermissionNode(@NotNull String permission) { + return this.createPermissionNode(permission, Context.global()); + } + + @NotNull + public abstract PermissionNode createPermissionNode( + @NotNull String permission, @NotNull Context context + ); + +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/NodeHolder.java index 914f0c7b..6f2fceaf 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/NodeHolder.java @@ -1,16 +1,28 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + package me.lokka30.treasury.api.permission; import java.util.Collection; import java.util.UUID; +import java.util.concurrent.CompletableFuture; import me.lokka30.treasury.api.common.misc.TriState; +import me.lokka30.treasury.api.common.response.Response; import org.jetbrains.annotations.NotNull; public interface NodeHolder { @NotNull UUID getUniqueId(); - @NotNull Collection> nodes(); + @NotNull CompletableFuture>>> allNodes(); + + @NotNull CompletableFuture> hasNode(@NotNull Node node); + + @NotNull CompletableFuture>>> allNodesWithType(@NotNull NodeType nodeType); - @NotNull TriState hasNode(@NotNull Node node); + @NotNull CompletableFuture> modifyNode( + @NotNull Node node, @NotNull Data data + ); } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/NodeType.java b/api/src/main/java/me/lokka30/treasury/api/permission/NodeType.java index 558547b1..bdd79b20 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/NodeType.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/NodeType.java @@ -1,7 +1,25 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + package me.lokka30.treasury.api.permission; -public enum NodeType { - PERMISSION, - PREFIX, - SUFFIX +import me.lokka30.treasury.api.common.misc.TriState; +import org.jetbrains.annotations.NotNull; + +public final class NodeType { + + public static final NodeType PERMISSION = new NodeType<>(TriState.class); + + private final Class dataClass; + + private NodeType(@NotNull Class dataClass) { + this.dataClass = dataClass; + } + + @NotNull + public Class dataClass() { + return this.dataClass; + } + } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/PermissionNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/PermissionNode.java index 87c68b66..92bb3e67 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/PermissionNode.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/PermissionNode.java @@ -1,3 +1,7 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + package me.lokka30.treasury.api.permission; import me.lokka30.treasury.api.common.misc.TriState; @@ -7,7 +11,7 @@ public interface PermissionNode extends Node { @Override @NotNull - default NodeType nodeType() { + default NodeType nodeType() { return NodeType.PERMISSION; } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java b/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java new file mode 100644 index 00000000..afe79961 --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java @@ -0,0 +1,19 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission; + +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import me.lokka30.treasury.api.common.response.Response; +import org.jetbrains.annotations.NotNull; + +public interface PermissionsProvider { + + @NotNull + NodeFactory obtainNodeFactory(); + + @NotNull + CompletableFuture> retrieveNodeHolder(@NotNull UUID uuid); +} From 6fde59fc6d40d1432818b49c49c222214c974ff8 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Tue, 22 Nov 2022 18:55:35 +0200 Subject: [PATCH 03/36] allNodesWithContext --- .../java/me/lokka30/treasury/api/permission/NodeHolder.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/NodeHolder.java index 6f2fceaf..d4b36352 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/NodeHolder.java @@ -21,6 +21,8 @@ public interface NodeHolder { @NotNull CompletableFuture>>> allNodesWithType(@NotNull NodeType nodeType); + @NotNull CompletableFuture>>> allNodesWithContext(@NotNull Context context); + @NotNull CompletableFuture> modifyNode( @NotNull Node node, @NotNull Data data ); From 3cea14e469c13ba0647fe4dd8574e0eccd994d72 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Tue, 22 Nov 2022 19:07:49 +0200 Subject: [PATCH 04/36] add weight --- api/src/main/java/me/lokka30/treasury/api/permission/Node.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/Node.java b/api/src/main/java/me/lokka30/treasury/api/permission/Node.java index a29186ca..61f46116 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/Node.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/Node.java @@ -14,6 +14,8 @@ public interface Node { @NotNull Context context(); + int weight(); + @NotNull String key(); From 4ca5ce8999268ddfac119f52aca72f5059b61b53 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Wed, 23 Nov 2022 21:00:08 +0200 Subject: [PATCH 05/36] progress --- .../treasury/api/permission/Context.java | 47 ------------------- .../lokka30/treasury/api/permission/Node.java | 24 ---------- .../treasury/api/permission/NodeFactory.java | 21 --------- .../api/permission/PermissionsProvider.java | 17 +++++-- .../treasury/api/permission/PrefixNode.java | 6 --- .../treasury/api/permission/SuffixNode.java | 6 --- .../api/permission/context/Context.java | 29 ++++++++++++ .../api/permission/context/ContextType.java | 42 +++++++++++++++++ .../treasury/api/permission/node/Node.java | 28 +++++++++++ .../api/permission/node/NodeFactory.java | 42 +++++++++++++++++ .../{ => node/holder}/NodeHolder.java | 21 +++++---- .../node/holder/NodeHolderPlayer.java | 20 ++++++++ .../permission/{ => node/type}/NodeType.java | 2 +- .../{ => node/type}/PermissionNode.java | 4 +- .../api/permission/node/type/PrefixNode.java | 6 +++ .../api/permission/node/type/SuffixNode.java | 6 +++ 16 files changed, 203 insertions(+), 118 deletions(-) delete mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/Context.java delete mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/Node.java delete mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/NodeFactory.java delete mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/PrefixNode.java delete mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/SuffixNode.java create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/context/Context.java create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/context/ContextType.java create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java rename api/src/main/java/me/lokka30/treasury/api/permission/{ => node/holder}/NodeHolder.java (57%) create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java rename api/src/main/java/me/lokka30/treasury/api/permission/{ => node/type}/NodeType.java (91%) rename api/src/main/java/me/lokka30/treasury/api/permission/{ => node/type}/PermissionNode.java (71%) create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/node/type/PrefixNode.java create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/node/type/SuffixNode.java diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/Context.java b/api/src/main/java/me/lokka30/treasury/api/permission/Context.java deleted file mode 100644 index 89bbc814..00000000 --- a/api/src/main/java/me/lokka30/treasury/api/permission/Context.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . - */ - -package me.lokka30.treasury.api.permission; - -import me.lokka30.treasury.api.common.misc.TriState; -import org.jetbrains.annotations.NotNull; - -public final class Context { - - private static final Context GLOBAL = new Context("global", TriState.FALSE); - - @NotNull - public static Context global() { - return GLOBAL; - } - - @NotNull - public static Context of(@NotNull String context) { - return new Context(context, TriState.UNSPECIFIED); - } - - @NotNull - public static Context of(@NotNull String context, @NotNull TriState world) { - return new Context(context, world); - } - - private final String context; - private final TriState world; - - private Context(@NotNull String context, @NotNull TriState world) { - this.context = context; - this.world = world; - } - - @NotNull - public String context() { - return this.context; - } - - @NotNull - public TriState isWorldContext() { - return this.world; - } - -} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/Node.java b/api/src/main/java/me/lokka30/treasury/api/permission/Node.java deleted file mode 100644 index 61f46116..00000000 --- a/api/src/main/java/me/lokka30/treasury/api/permission/Node.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . - */ - -package me.lokka30.treasury.api.permission; - -import org.jetbrains.annotations.NotNull; - -public interface Node { - - @NotNull - NodeType nodeType(); - - @NotNull - Context context(); - - int weight(); - - @NotNull - String key(); - - @NotNull - Data data(); -} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/NodeFactory.java b/api/src/main/java/me/lokka30/treasury/api/permission/NodeFactory.java deleted file mode 100644 index ba74635f..00000000 --- a/api/src/main/java/me/lokka30/treasury/api/permission/NodeFactory.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . - */ - -package me.lokka30.treasury.api.permission; - -import org.jetbrains.annotations.NotNull; - -public abstract class NodeFactory { - - @NotNull - public PermissionNode createPermissionNode(@NotNull String permission) { - return this.createPermissionNode(permission, Context.global()); - } - - @NotNull - public abstract PermissionNode createPermissionNode( - @NotNull String permission, @NotNull Context context - ); - -} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java b/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java index afe79961..71f35ff1 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java @@ -4,16 +4,25 @@ package me.lokka30.treasury.api.permission; +import java.util.Collection; import java.util.UUID; import java.util.concurrent.CompletableFuture; import me.lokka30.treasury.api.common.response.Response; +import me.lokka30.treasury.api.permission.node.NodeFactory; +import me.lokka30.treasury.api.permission.node.holder.NodeHolder; +import me.lokka30.treasury.api.permission.node.holder.NodeHolderPlayer; import org.jetbrains.annotations.NotNull; public interface PermissionsProvider { - @NotNull - NodeFactory obtainNodeFactory(); + @NotNull NodeFactory nodeFactory(); + + @NotNull CompletableFuture> retrievePlayerNodeHolder(@NotNull UUID uuid); + + @NotNull CompletableFuture> retrieveNodeHolder(@NotNull String identifier); + + @NotNull CompletableFuture>> allPlayerNodeHolders(); + + @NotNull CompletableFuture>> allNodeHolders(); - @NotNull - CompletableFuture> retrieveNodeHolder(@NotNull UUID uuid); } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/PrefixNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/PrefixNode.java deleted file mode 100644 index 62d92adc..00000000 --- a/api/src/main/java/me/lokka30/treasury/api/permission/PrefixNode.java +++ /dev/null @@ -1,6 +0,0 @@ -package me.lokka30.treasury.api.permission; - -// todo -public interface PrefixNode { - -} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/SuffixNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/SuffixNode.java deleted file mode 100644 index 9eb70c1c..00000000 --- a/api/src/main/java/me/lokka30/treasury/api/permission/SuffixNode.java +++ /dev/null @@ -1,6 +0,0 @@ -package me.lokka30.treasury.api.permission; - -// todo -public interface SuffixNode { - -} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/context/Context.java b/api/src/main/java/me/lokka30/treasury/api/permission/context/Context.java new file mode 100644 index 00000000..3e79bded --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/context/Context.java @@ -0,0 +1,29 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission.context; + +import org.jetbrains.annotations.NotNull; + +public final class Context { + + private final ContextType type; + private final String value; + + Context(@NotNull ContextType type, @NotNull String value) { + this.type = type; + this.value = value; + } + + @NotNull + public ContextType type() { + return this.type; + } + + @NotNull + public String value() { + return this.value; + } + +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextType.java b/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextType.java new file mode 100644 index 00000000..bcb001f1 --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextType.java @@ -0,0 +1,42 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission.context; + +import org.jetbrains.annotations.NotNull; + +public enum ContextType { + GLOBAL, + WORLD, + SERVER + ; + + private static final Context global = new Context(ContextType.GLOBAL, ""); + + @NotNull + public static Context global() { + return global; + } + + @NotNull + public static Context newContext(@NotNull ContextType type, @NotNull String value) { + if (type == GLOBAL) { + return global; + } + if (value.isEmpty()) { + throw new IllegalArgumentException("value is empty"); + } + boolean hasSpace = false; + for (int i = 0; i < value.length(); i++) { + if (Character.isWhitespace(value.charAt(i))) { + hasSpace = true; + break; + } + } + if (hasSpace) { + throw new IllegalArgumentException("Invalid value: value should not contain spaces!"); + } + return new Context(type, value); + } +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java new file mode 100644 index 00000000..9ae90ddb --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java @@ -0,0 +1,28 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission.node; + +import me.lokka30.treasury.api.permission.context.Context; +import me.lokka30.treasury.api.permission.node.type.NodeType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public interface Node { + + @NotNull NodeType nodeType(); + + @NotNull Context context(); + + @Nullable Integer weight(); + + @NotNull String key(); + + @NotNull Data data(); + + @NotNull Node copyWithNewData( + @NotNull Context context, @Nullable Integer weight, @NotNull Data data + ); + +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java new file mode 100644 index 00000000..b0465526 --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java @@ -0,0 +1,42 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission.node; + +import me.lokka30.treasury.api.common.misc.TriState; +import me.lokka30.treasury.api.permission.context.Context; +import me.lokka30.treasury.api.permission.context.ContextType; +import me.lokka30.treasury.api.permission.node.type.PermissionNode; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class NodeFactory { + + @NotNull + public PermissionNode createPermissionNode(@NotNull String permission) { + return this.createPermissionNode(permission, ContextType.global()); + } + + public PermissionNode createPermissionNode( + @NotNull String permission, @NotNull Context context + ) { + return this.createPermissionNode(permission, context, null); + } + + @NotNull + public PermissionNode createPermissionNode( + @NotNull String permission, @NotNull Context context, @Nullable Integer weight + ) { + return this.createPermissionNode(permission, context, TriState.UNSPECIFIED, weight); + } + + @NotNull + public abstract PermissionNode createPermissionNode( + @NotNull String permission, + @NotNull Context context, + @NotNull TriState value, + @Nullable Integer weight + ); + +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java similarity index 57% rename from api/src/main/java/me/lokka30/treasury/api/permission/NodeHolder.java rename to api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java index d4b36352..747b7d43 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java @@ -2,29 +2,34 @@ * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . */ -package me.lokka30.treasury.api.permission; +package me.lokka30.treasury.api.permission.node.holder; import java.util.Collection; -import java.util.UUID; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import me.lokka30.treasury.api.common.misc.TriState; import me.lokka30.treasury.api.common.response.Response; +import me.lokka30.treasury.api.permission.context.Context; +import me.lokka30.treasury.api.permission.node.Node; +import me.lokka30.treasury.api.permission.node.type.NodeType; import org.jetbrains.annotations.NotNull; public interface NodeHolder { - @NotNull UUID getUniqueId(); + @NotNull String getIdentifier(); @NotNull CompletableFuture>>> allNodes(); - @NotNull CompletableFuture> hasNode(@NotNull Node node); - @NotNull CompletableFuture>>> allNodesWithType(@NotNull NodeType nodeType); @NotNull CompletableFuture>>> allNodesWithContext(@NotNull Context context); - @NotNull CompletableFuture> modifyNode( - @NotNull Node node, @NotNull Data data - ); + @NotNull CompletableFuture> hasNode(@NotNull Node node); + + @NotNull CompletableFuture> hasNode(@NotNull String nodeKey); + + @NotNull CompletableFuture>>> retrieveNodeWithKey(@NotNull String key); + + @NotNull CompletableFuture> insertOrModifyNode(@NotNull Node node); } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java new file mode 100644 index 00000000..c26470bf --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java @@ -0,0 +1,20 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission.node.holder; + +import java.util.UUID; +import org.jetbrains.annotations.NotNull; + +public interface NodeHolderPlayer extends NodeHolder { + + @NotNull UUID getUniqueId(); + + @Override + @NotNull + default String getIdentifier() { + return this.getUniqueId().toString(); + } + +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/NodeType.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/type/NodeType.java similarity index 91% rename from api/src/main/java/me/lokka30/treasury/api/permission/NodeType.java rename to api/src/main/java/me/lokka30/treasury/api/permission/node/type/NodeType.java index bdd79b20..9671215d 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/NodeType.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/type/NodeType.java @@ -2,7 +2,7 @@ * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . */ -package me.lokka30.treasury.api.permission; +package me.lokka30.treasury.api.permission.node.type; import me.lokka30.treasury.api.common.misc.TriState; import org.jetbrains.annotations.NotNull; diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/PermissionNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/type/PermissionNode.java similarity index 71% rename from api/src/main/java/me/lokka30/treasury/api/permission/PermissionNode.java rename to api/src/main/java/me/lokka30/treasury/api/permission/node/type/PermissionNode.java index 92bb3e67..73644a12 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/PermissionNode.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/type/PermissionNode.java @@ -2,9 +2,11 @@ * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . */ -package me.lokka30.treasury.api.permission; +package me.lokka30.treasury.api.permission.node.type; import me.lokka30.treasury.api.common.misc.TriState; +import me.lokka30.treasury.api.permission.node.Node; +import me.lokka30.treasury.api.permission.node.type.NodeType; import org.jetbrains.annotations.NotNull; public interface PermissionNode extends Node { diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/type/PrefixNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/type/PrefixNode.java new file mode 100644 index 00000000..3383caee --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/type/PrefixNode.java @@ -0,0 +1,6 @@ +package me.lokka30.treasury.api.permission.node.type; + +// todo +public interface PrefixNode { + +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/type/SuffixNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/type/SuffixNode.java new file mode 100644 index 00000000..f8f7e340 --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/type/SuffixNode.java @@ -0,0 +1,6 @@ +package me.lokka30.treasury.api.permission.node.type; + +// todo +public interface SuffixNode { + +} From a12c1b3a7f7de8b04e3baf9dd6eb054e661ad320 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Wed, 23 Nov 2022 21:03:30 +0200 Subject: [PATCH 06/36] bring some consistency in NodeFactory --- .../treasury/api/permission/node/NodeFactory.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java index b0465526..6720b858 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java @@ -21,22 +21,29 @@ public PermissionNode createPermissionNode(@NotNull String permission) { public PermissionNode createPermissionNode( @NotNull String permission, @NotNull Context context ) { - return this.createPermissionNode(permission, context, null); + return this.createPermissionNode(permission, context, (Integer) null); } @NotNull public PermissionNode createPermissionNode( @NotNull String permission, @NotNull Context context, @Nullable Integer weight ) { - return this.createPermissionNode(permission, context, TriState.UNSPECIFIED, weight); + return this.createPermissionNode(permission, context, weight, TriState.UNSPECIFIED); + } + + @NotNull + public PermissionNode createPermissionNode( + @NotNull String permission, @NotNull Context context, @NotNull TriState value + ) { + return this.createPermissionNode(permission, context, null, value); } @NotNull public abstract PermissionNode createPermissionNode( @NotNull String permission, @NotNull Context context, - @NotNull TriState value, - @Nullable Integer weight + @Nullable Integer weight, + @NotNull TriState value ); } From 2978084d2a3d7a9c0292ee86f3a33fdf8cf1b83c Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Wed, 23 Nov 2022 21:07:26 +0200 Subject: [PATCH 07/36] retrieveHeldContexts --- .../treasury/api/permission/node/holder/NodeHolder.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java index 747b7d43..ad286de8 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java @@ -30,6 +30,14 @@ public interface NodeHolder { @NotNull CompletableFuture>>> retrieveNodeWithKey(@NotNull String key); + /** + * Retrieves all the {@link Context contexts} this {@code NodeHolder} holds {@link Node nodes} + * under. + * + * @return + */ + @NotNull CompletableFuture>> retrieveHeldContexts(); + @NotNull CompletableFuture> insertOrModifyNode(@NotNull Node node); } From 94defc8fc5d7bfda365eb65e289c5df4116d07c6 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Thu, 24 Nov 2022 21:57:23 +0200 Subject: [PATCH 08/36] simplify space check Co-authored-by: montlikadani --- .../treasury/api/permission/context/ContextType.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextType.java b/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextType.java index bcb001f1..b16ce7cb 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextType.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextType.java @@ -27,14 +27,7 @@ public static Context newContext(@NotNull ContextType type, @NotNull String valu if (value.isEmpty()) { throw new IllegalArgumentException("value is empty"); } - boolean hasSpace = false; - for (int i = 0; i < value.length(); i++) { - if (Character.isWhitespace(value.charAt(i))) { - hasSpace = true; - break; - } - } - if (hasSpace) { + if (value.indexOf(' ') != -1) { throw new IllegalArgumentException("Invalid value: value should not contain spaces!"); } return new Context(type, value); From e698aeb1d78e96681eb6c73f2e53355f930ffeeb Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Sun, 27 Nov 2022 18:19:55 +0200 Subject: [PATCH 09/36] add removeNode --- .../lokka30/treasury/api/permission/node/holder/NodeHolder.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java index ad286de8..9bb91baf 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java @@ -40,4 +40,6 @@ public interface NodeHolder { @NotNull CompletableFuture> insertOrModifyNode(@NotNull Node node); + @NotNull CompletableFuture> removeNode(@NotNull String nodeKey); + } From 4afceec313d39eb98e5be13c6353652eea1d5144 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Sun, 27 Nov 2022 18:21:13 +0200 Subject: [PATCH 10/36] allNodesKeys --- .../treasury/api/permission/node/holder/NodeHolder.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java index 9bb91baf..4012567e 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java @@ -5,6 +5,7 @@ package me.lokka30.treasury.api.permission.node.holder; import java.util.Collection; +import java.util.Map; import java.util.Optional; import java.util.concurrent.CompletableFuture; import me.lokka30.treasury.api.common.misc.TriState; @@ -20,6 +21,8 @@ public interface NodeHolder { @NotNull CompletableFuture>>> allNodes(); + @NotNull CompletableFuture>>> allNodesKeys(); + @NotNull CompletableFuture>>> allNodesWithType(@NotNull NodeType nodeType); @NotNull CompletableFuture>>> allNodesWithContext(@NotNull Context context); From c62b477add6d8f1842a325dfc17eed431615430f Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Sun, 27 Nov 2022 18:21:52 +0200 Subject: [PATCH 11/36] parentNodeHolder --- .../treasury/api/permission/node/holder/NodeHolder.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java index 4012567e..1574abc4 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java @@ -14,11 +14,14 @@ import me.lokka30.treasury.api.permission.node.Node; import me.lokka30.treasury.api.permission.node.type.NodeType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public interface NodeHolder { @NotNull String getIdentifier(); + @Nullable NodeHolder parentNodeHolder(); + @NotNull CompletableFuture>>> allNodes(); @NotNull CompletableFuture>>> allNodesKeys(); From 4abc1edd40f080eb77bbd24fbeb8979b503da70a Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Tue, 29 Nov 2022 14:03:48 +0200 Subject: [PATCH 12/36] add missing annotation so that github actions builds --- .../me/lokka30/treasury/api/permission/node/NodeFactory.java | 1 + 1 file changed, 1 insertion(+) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java index 6720b858..44c94d01 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java @@ -18,6 +18,7 @@ public PermissionNode createPermissionNode(@NotNull String permission) { return this.createPermissionNode(permission, ContextType.global()); } + @NotNull public PermissionNode createPermissionNode( @NotNull String permission, @NotNull Context context ) { From 06b8cc22ece3b7404be8011f4482326208421bcc Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Tue, 29 Nov 2022 17:29:57 +0200 Subject: [PATCH 13/36] NodeHolderGroup --- .../api/permission/node/holder/NodeHolderGroup.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderGroup.java diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderGroup.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderGroup.java new file mode 100644 index 00000000..727a054e --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderGroup.java @@ -0,0 +1,9 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission.node.holder; + +public interface NodeHolderGroup extends NodeHolder { + +} From c102ce07f23e065c1dee177c43d3b5b752346061 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Wed, 30 Nov 2022 21:27:46 +0200 Subject: [PATCH 14/36] require context to be specified for retrieve and insertOrModify --- .../treasury/api/permission/node/holder/NodeHolder.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java index 1574abc4..817f5e32 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java @@ -34,7 +34,9 @@ public interface NodeHolder { @NotNull CompletableFuture> hasNode(@NotNull String nodeKey); - @NotNull CompletableFuture>>> retrieveNodeWithKey(@NotNull String key); + @NotNull CompletableFuture>>> retrieveNode( + @NotNull String key, @NotNull Context context + ); /** * Retrieves all the {@link Context contexts} this {@code NodeHolder} holds {@link Node nodes} @@ -44,7 +46,9 @@ public interface NodeHolder { */ @NotNull CompletableFuture>> retrieveHeldContexts(); - @NotNull CompletableFuture> insertOrModifyNode(@NotNull Node node); + @NotNull CompletableFuture> insertOrModifyNode( + @NotNull Node node, @NotNull Context context + ); @NotNull CompletableFuture> removeNode(@NotNull String nodeKey); From ddef41db6b24fd6de503c20c51095a1f406bc979 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Wed, 30 Nov 2022 21:29:44 +0200 Subject: [PATCH 15/36] also for removeNode --- .../treasury/api/permission/node/holder/NodeHolder.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java index 817f5e32..24686b93 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java @@ -50,6 +50,8 @@ public interface NodeHolder { @NotNull Node node, @NotNull Context context ); - @NotNull CompletableFuture> removeNode(@NotNull String nodeKey); + @NotNull CompletableFuture> removeNode( + @NotNull String nodeKey, @NotNull Context context + ); } From 213884cf9865fcccd46ce933414bfbff26036ec9 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Wed, 30 Nov 2022 21:30:18 +0200 Subject: [PATCH 16/36] remove hasNode(Node) useless --- .../lokka30/treasury/api/permission/node/holder/NodeHolder.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java index 24686b93..d730e4c5 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java @@ -30,8 +30,6 @@ public interface NodeHolder { @NotNull CompletableFuture>>> allNodesWithContext(@NotNull Context context); - @NotNull CompletableFuture> hasNode(@NotNull Node node); - @NotNull CompletableFuture> hasNode(@NotNull String nodeKey); @NotNull CompletableFuture>>> retrieveNode( From 4d47ce8987a158aa671c2052fd88adae3e3732e3 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Wed, 30 Nov 2022 21:35:59 +0200 Subject: [PATCH 17/36] group methods --- .../treasury/api/permission/PermissionsProvider.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java b/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java index 71f35ff1..a8666f53 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java @@ -9,7 +9,7 @@ import java.util.concurrent.CompletableFuture; import me.lokka30.treasury.api.common.response.Response; import me.lokka30.treasury.api.permission.node.NodeFactory; -import me.lokka30.treasury.api.permission.node.holder.NodeHolder; +import me.lokka30.treasury.api.permission.node.holder.NodeHolderGroup; import me.lokka30.treasury.api.permission.node.holder.NodeHolderPlayer; import org.jetbrains.annotations.NotNull; @@ -19,10 +19,10 @@ public interface PermissionsProvider { @NotNull CompletableFuture> retrievePlayerNodeHolder(@NotNull UUID uuid); - @NotNull CompletableFuture> retrieveNodeHolder(@NotNull String identifier); + @NotNull CompletableFuture>> allPlayerNodeHolderIds(); - @NotNull CompletableFuture>> allPlayerNodeHolders(); + @NotNull CompletableFuture> retrieveOrCreateGroup(@NotNull String groupId); - @NotNull CompletableFuture>> allNodeHolders(); + @NotNull CompletableFuture>> allGroupNodeHolderIds(); } From 46e594a834e1b41f39f86d0c492580f441efaddc Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Wed, 30 Nov 2022 22:08:20 +0200 Subject: [PATCH 18/36] do not hardcode contexts and types --- .../api/permission/context/Context.java | 38 ++++++---- .../api/permission/context/ContextSet.java | 75 +++++++++++++++++++ .../api/permission/context/ContextType.java | 35 --------- .../treasury/api/permission/node/Node.java | 6 +- .../permission/node/holder/NodeHolder.java | 19 +---- .../node/holder/NodeHolderPlayer.java | 37 +++++++++ 6 files changed, 141 insertions(+), 69 deletions(-) create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java delete mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/context/ContextType.java diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/context/Context.java b/api/src/main/java/me/lokka30/treasury/api/permission/context/Context.java index 3e79bded..90092737 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/context/Context.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/context/Context.java @@ -4,26 +4,34 @@ package me.lokka30.treasury.api.permission.context; +import java.util.Objects; +import java.util.function.BiPredicate; +import me.lokka30.treasury.api.permission.node.holder.NodeHolder; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; -public final class Context { - - private final ContextType type; - private final String value; - - Context(@NotNull ContextType type, @NotNull String value) { - this.type = type; - this.value = value; - } +public interface Context { + @Contract(value = "_, _ -> new", pure = true) @NotNull - public ContextType type() { - return this.type; + static Context of(@NotNull String key, @NotNull BiPredicate condition) { + Objects.requireNonNull(key, "key"); + Objects.requireNonNull(condition, "condition"); + return new Context() { + @Override + public @NotNull String getKey() { + return key; + } + + @Override + public @NotNull BiPredicate getCondition() { + return condition; + } + }; } - @NotNull - public String value() { - return this.value; - } + @NotNull String getKey(); + + @NotNull BiPredicate getCondition(); } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java b/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java new file mode 100644 index 00000000..efb8a4d8 --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java @@ -0,0 +1,75 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission.context; + +import java.util.Collections; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; + +public final class ContextSet { + + private static final ContextSet EMPTY = new ContextSet(Collections.emptyMap()); + + @NotNull + public static ContextSet empty() { + return EMPTY; + } + + @NotNull + public static ContextSet of(@NotNull Context @NotNull ... contexts) { + Objects.requireNonNull(contexts, "contexts"); + if (contexts.length == 0) { + return empty(); + } + Map map = new ConcurrentHashMap<>(); + for (Context context : contexts) { + map.put(context.getKey(), context); + } + return new ContextSet(map); + } + + private Map contexts; + + @Contract(pure = true) + private ContextSet(Map contexts) { + this.contexts = contexts; + } + + @NotNull + public Optional getContext(@NotNull String contextKey) { + Objects.requireNonNull(contextKey, "contextKey"); + return Optional.ofNullable(this.contexts.get(contextKey)); + } + + public void registerContext(@NotNull Context context) { + Objects.requireNonNull(context, "context"); + if (!this.contexts.containsKey(context.getKey())) { + this.contexts.put(context.getKey(), context); + return; + } + throw new IllegalArgumentException("Context already registered in this context set"); + } + + public boolean hasContext(@NotNull String contextKey) { + Objects.requireNonNull(contextKey, "contextKey"); + return contexts.containsKey(contextKey); + } + + @NotNull + public Set asSet() { + if (this.contexts.isEmpty()) { + return Collections.emptySet(); + } + Set ret = ConcurrentHashMap.newKeySet(); + ret.addAll(this.contexts.values()); + return ret; + } + +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextType.java b/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextType.java deleted file mode 100644 index b16ce7cb..00000000 --- a/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextType.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . - */ - -package me.lokka30.treasury.api.permission.context; - -import org.jetbrains.annotations.NotNull; - -public enum ContextType { - GLOBAL, - WORLD, - SERVER - ; - - private static final Context global = new Context(ContextType.GLOBAL, ""); - - @NotNull - public static Context global() { - return global; - } - - @NotNull - public static Context newContext(@NotNull ContextType type, @NotNull String value) { - if (type == GLOBAL) { - return global; - } - if (value.isEmpty()) { - throw new IllegalArgumentException("value is empty"); - } - if (value.indexOf(' ') != -1) { - throw new IllegalArgumentException("Invalid value: value should not contain spaces!"); - } - return new Context(type, value); - } -} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java index 9ae90ddb..61a79405 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java @@ -4,7 +4,7 @@ package me.lokka30.treasury.api.permission.node; -import me.lokka30.treasury.api.permission.context.Context; +import me.lokka30.treasury.api.permission.context.ContextSet; import me.lokka30.treasury.api.permission.node.type.NodeType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -13,7 +13,7 @@ public interface Node { @NotNull NodeType nodeType(); - @NotNull Context context(); + @NotNull ContextSet contexts(); @Nullable Integer weight(); @@ -22,7 +22,7 @@ public interface Node { @NotNull Data data(); @NotNull Node copyWithNewData( - @NotNull Context context, @Nullable Integer weight, @NotNull Data data + @NotNull ContextSet contexts, @Nullable Integer weight, @NotNull Data data ); } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java index d730e4c5..79f92d36 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java @@ -10,7 +10,6 @@ import java.util.concurrent.CompletableFuture; import me.lokka30.treasury.api.common.misc.TriState; import me.lokka30.treasury.api.common.response.Response; -import me.lokka30.treasury.api.permission.context.Context; import me.lokka30.treasury.api.permission.node.Node; import me.lokka30.treasury.api.permission.node.type.NodeType; import org.jetbrains.annotations.NotNull; @@ -28,28 +27,16 @@ public interface NodeHolder { @NotNull CompletableFuture>>> allNodesWithType(@NotNull NodeType nodeType); - @NotNull CompletableFuture>>> allNodesWithContext(@NotNull Context context); - @NotNull CompletableFuture> hasNode(@NotNull String nodeKey); @NotNull CompletableFuture>>> retrieveNode( - @NotNull String key, @NotNull Context context + @NotNull String key, @NotNull NodeType nodeType ); - /** - * Retrieves all the {@link Context contexts} this {@code NodeHolder} holds {@link Node nodes} - * under. - * - * @return - */ - @NotNull CompletableFuture>> retrieveHeldContexts(); - @NotNull CompletableFuture> insertOrModifyNode( - @NotNull Node node, @NotNull Context context + @NotNull Node node, @NotNull NodeType nodeType ); - @NotNull CompletableFuture> removeNode( - @NotNull String nodeKey, @NotNull Context context - ); + @NotNull CompletableFuture> removeNode(@NotNull String nodeKey); } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java index c26470bf..959ecd46 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java @@ -4,7 +4,15 @@ package me.lokka30.treasury.api.permission.node.holder; +import java.util.Objects; +import java.util.Optional; import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import me.lokka30.treasury.api.common.misc.TriState; +import me.lokka30.treasury.api.common.response.Response; +import me.lokka30.treasury.api.permission.context.ContextSet; +import me.lokka30.treasury.api.permission.node.Node; +import me.lokka30.treasury.api.permission.node.type.NodeType; import org.jetbrains.annotations.NotNull; public interface NodeHolderPlayer extends NodeHolder { @@ -17,4 +25,33 @@ default String getIdentifier() { return this.getUniqueId().toString(); } + /** + * Returns whether the specified {@link ContextSet context set} applies for this player node + * holder. + *

By "applies" it is meant that all the + * {@link me.lokka30.treasury.api.permission.context.Context contexts} defined in the + * specified context set's conditions are met. + * + * @param contextSet context set to probe + * @return applies or not. + */ + boolean contextSetApplies(@NotNull ContextSet contextSet); + + @NotNull + default CompletableFuture> hasPermission(@NotNull String nodeKey) { + Objects.requireNonNull(nodeKey, "nodeKey"); + return retrieveNode(nodeKey, NodeType.PERMISSION).thenApply(resp -> { + if (!resp.isSuccessful()) { + return Response.failure(resp.getFailureReason()); + } + Optional> nodeOpt = resp.getResult(); + if (!nodeOpt.isPresent()) { + return Response.success(TriState.UNSPECIFIED); + } + return Response.success(TriState.fromBoolean(this.contextSetApplies(nodeOpt + .get() + .contexts()))); + }); + } + } From a9669156ccc070875571a73ddbe7e0002c220fa4 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Wed, 30 Nov 2022 22:11:53 +0200 Subject: [PATCH 19/36] fix node factory --- .../api/permission/context/Context.java | 2 ++ .../api/permission/node/NodeFactory.java | 18 +++++++++--------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/context/Context.java b/api/src/main/java/me/lokka30/treasury/api/permission/context/Context.java index 90092737..acdc02d2 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/context/Context.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/context/Context.java @@ -12,6 +12,8 @@ public interface Context { + Context GLOBAL = Context.of("global", ($, $1) -> true); + @Contract(value = "_, _ -> new", pure = true) @NotNull static Context of(@NotNull String key, @NotNull BiPredicate condition) { diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java index 44c94d01..c21d3fab 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java @@ -6,7 +6,7 @@ import me.lokka30.treasury.api.common.misc.TriState; import me.lokka30.treasury.api.permission.context.Context; -import me.lokka30.treasury.api.permission.context.ContextType; +import me.lokka30.treasury.api.permission.context.ContextSet; import me.lokka30.treasury.api.permission.node.type.PermissionNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -15,34 +15,34 @@ public abstract class NodeFactory { @NotNull public PermissionNode createPermissionNode(@NotNull String permission) { - return this.createPermissionNode(permission, ContextType.global()); + return this.createPermissionNode(permission, ContextSet.of(Context.GLOBAL)); } @NotNull public PermissionNode createPermissionNode( - @NotNull String permission, @NotNull Context context + @NotNull String permission, @NotNull ContextSet contextSet ) { - return this.createPermissionNode(permission, context, (Integer) null); + return this.createPermissionNode(permission, contextSet, (Integer) null); } @NotNull public PermissionNode createPermissionNode( - @NotNull String permission, @NotNull Context context, @Nullable Integer weight + @NotNull String permission, @NotNull ContextSet contextSet, @Nullable Integer weight ) { - return this.createPermissionNode(permission, context, weight, TriState.UNSPECIFIED); + return this.createPermissionNode(permission, contextSet, weight, TriState.UNSPECIFIED); } @NotNull public PermissionNode createPermissionNode( - @NotNull String permission, @NotNull Context context, @NotNull TriState value + @NotNull String permission, @NotNull ContextSet contextSet, @NotNull TriState value ) { - return this.createPermissionNode(permission, context, null, value); + return this.createPermissionNode(permission, contextSet, null, value); } @NotNull public abstract PermissionNode createPermissionNode( @NotNull String permission, - @NotNull Context context, + @NotNull ContextSet contextSet, @Nullable Integer weight, @NotNull TriState value ); From 067f29b2c14ffcdaae8d3d5d9aaa824f13f06402 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Sun, 11 Dec 2022 20:03:17 +0200 Subject: [PATCH 20/36] remove ContextSet#registerContext and document it i'm happy with the ContextSet now and I don't think it needs any more changes, and for that reason i've documented it. --- .../api/permission/context/ContextSet.java | 49 +++++++++++++++---- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java b/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java index efb8a4d8..bb8531c3 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java @@ -13,15 +13,35 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; +/** + * Represents a set of {@link Context contexts}, which can be applied for a + * {@link me.lokka30.treasury.api.permission.node.Node}. + *

Class is immutable. Creating it via {@link #of(Context...)}, the returned object is always + * the same. + * + * @author Ivan Pekov + * @since 2.0.0 + */ public final class ContextSet { private static final ContextSet EMPTY = new ContextSet(Collections.emptyMap()); + /** + * Returns the empty context set constant. + * + * @return empty context set + */ @NotNull public static ContextSet empty() { return EMPTY; } + /** + * Creates a new context set of the specified {@link Context contexts} + * + * @param contexts contexts the created context set will contain + * @return new context set + */ @NotNull public static ContextSet of(@NotNull Context @NotNull ... contexts) { Objects.requireNonNull(contexts, "contexts"); @@ -42,26 +62,37 @@ private ContextSet(Map contexts) { this.contexts = contexts; } + /** + * Returns a {@link Optional}, which will be fulfilled with a {@link Context} if this context + * set holds a context, identified by the specified {@code contextKey}. + * + * @param contextKey context key + * @return context if such is found, empty optional otherwise + */ @NotNull public Optional getContext(@NotNull String contextKey) { Objects.requireNonNull(contextKey, "contextKey"); return Optional.ofNullable(this.contexts.get(contextKey)); } - public void registerContext(@NotNull Context context) { - Objects.requireNonNull(context, "context"); - if (!this.contexts.containsKey(context.getKey())) { - this.contexts.put(context.getKey(), context); - return; - } - throw new IllegalArgumentException("Context already registered in this context set"); - } - + /** + * Returns whether a {@link Context} is held under the specified {@code contextKey} in this + * context set. + * + * @param contextKey context key + * @return true if context is held, false otherwise + */ public boolean hasContext(@NotNull String contextKey) { Objects.requireNonNull(contextKey, "contextKey"); return contexts.containsKey(contextKey); } + /** + * Returns this context set as a mutable {@link Set}. Modifying the returned set will not + * affect the context set object this method is called from. + * + * @return set copy representation of this context set + */ @NotNull public Set asSet() { if (this.contexts.isEmpty()) { From 2d79a882636d9cd55da2287250fcaa4836590d9a Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Sun, 11 Dec 2022 20:10:06 +0200 Subject: [PATCH 21/36] remove "hasNode" the same reasoning as in why we removed Account#canAfford in the economy api --- .../api/permission/node/holder/NodeHolder.java | 2 -- .../permission/node/holder/NodeHolderPlayer.java | 14 +++++--------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java index 79f92d36..7c4ef3b4 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java @@ -27,8 +27,6 @@ public interface NodeHolder { @NotNull CompletableFuture>>> allNodesWithType(@NotNull NodeType nodeType); - @NotNull CompletableFuture> hasNode(@NotNull String nodeKey); - @NotNull CompletableFuture>>> retrieveNode( @NotNull String key, @NotNull NodeType nodeType ); diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java index 959ecd46..d356f0cb 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java @@ -5,13 +5,11 @@ package me.lokka30.treasury.api.permission.node.holder; import java.util.Objects; -import java.util.Optional; import java.util.UUID; import java.util.concurrent.CompletableFuture; import me.lokka30.treasury.api.common.misc.TriState; import me.lokka30.treasury.api.common.response.Response; import me.lokka30.treasury.api.permission.context.ContextSet; -import me.lokka30.treasury.api.permission.node.Node; import me.lokka30.treasury.api.permission.node.type.NodeType; import org.jetbrains.annotations.NotNull; @@ -44,13 +42,11 @@ default CompletableFuture> hasPermission(@NotNull String node if (!resp.isSuccessful()) { return Response.failure(resp.getFailureReason()); } - Optional> nodeOpt = resp.getResult(); - if (!nodeOpt.isPresent()) { - return Response.success(TriState.UNSPECIFIED); - } - return Response.success(TriState.fromBoolean(this.contextSetApplies(nodeOpt - .get() - .contexts()))); + return resp + .getResult() + .map(triStateNode -> Response.success(TriState.fromBoolean(this.contextSetApplies( + triStateNode.contexts())))) + .orElseGet(() -> Response.success(TriState.UNSPECIFIED)); }); } From adb9c9a7c19a39232628fd59bcf7316351e8ae09 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Sun, 11 Dec 2022 20:13:51 +0200 Subject: [PATCH 22/36] make ContextSet iterable --- .../api/permission/context/ContextSet.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java b/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java index bb8531c3..2be8608f 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java @@ -5,6 +5,7 @@ package me.lokka30.treasury.api.permission.context; import java.util.Collections; +import java.util.Iterator; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -22,7 +23,7 @@ * @author Ivan Pekov * @since 2.0.0 */ -public final class ContextSet { +public final class ContextSet implements Iterable { private static final ContextSet EMPTY = new ContextSet(Collections.emptyMap()); @@ -103,4 +104,27 @@ public Set asSet() { return ret; } + /** + * {@inheritDoc} + */ + @NotNull + @Override + public Iterator iterator() { + Iterator handle = this.contexts.values().iterator(); + // Iterator#remove default impl throws a UnsupportedOperationException which suits our needs + // we don't return this.contexts.values().iterator() directly as it is likely to have a + // remove() impl + return new Iterator() { + @Override + public boolean hasNext() { + return handle.hasNext(); + } + + @Override + public Context next() { + return handle.next(); + } + }; + } + } From 98269ebafae030467fbea3427e1f9151eea34393 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Sun, 11 Dec 2022 20:16:51 +0200 Subject: [PATCH 23/36] specify nullability --- .../me/lokka30/treasury/api/permission/context/ContextSet.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java b/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java index 2be8608f..6ad28a97 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java @@ -120,6 +120,9 @@ public boolean hasNext() { return handle.hasNext(); } + // NotNull contract because per Iterator javadoc, Iterator#next throws + // NoSuchElementException if !hasNext() = true + @NotNull @Override public Context next() { return handle.next(); From 3a7eb2346eaac0b97d843511826adcbbf15b1789 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Mon, 26 Dec 2022 10:00:43 +0200 Subject: [PATCH 24/36] basic events --- .../api/permission/events/NodeEvent.java | 37 +++++++++++++++++++ .../permission/events/NodeUpdateEvent.java | 23 ++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java new file mode 100644 index 00000000..2f6fc931 --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java @@ -0,0 +1,37 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission.events; + +import me.lokka30.treasury.api.common.event.Cancellable; +import me.lokka30.treasury.api.permission.node.Node; + +public class NodeEvent implements Cancellable { + + private Node node; + private boolean cancelled; + + public NodeEvent(Node node) { + this.node = node; + } + + public Node getNode() { + return this.node; + } + + public void setNode(Node node) { + this.node = node; + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(final boolean cancel) { + this.cancelled = cancel; + } + +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java new file mode 100644 index 00000000..887a5c36 --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java @@ -0,0 +1,23 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission.events; + +import me.lokka30.treasury.api.permission.node.Node; +import me.lokka30.treasury.api.permission.node.holder.NodeHolder; + +public class NodeUpdateEvent extends NodeEvent { + + private final NodeHolder nodeHolder; + + public NodeUpdateEvent(NodeHolder nodeHolder, Node node) { + super(node); + this.nodeHolder = nodeHolder; + } + + public NodeHolder getNodeHolder() { + return nodeHolder; + } + +} From eb81eae93024321fe1db56c15f0ac93f0a714522 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Sat, 7 Jan 2023 14:08:08 +0200 Subject: [PATCH 25/36] use namespacedkey here too --- .../lokka30/treasury/api/permission/events/NodeEvent.java | 6 ++++-- .../treasury/api/permission/events/NodeUpdateEvent.java | 4 +++- .../treasury/api/permission/node/holder/NodeHolder.java | 2 -- .../api/permission/node/holder/NodeHolderGroup.java | 5 +++++ .../api/permission/node/holder/NodeHolderPlayer.java | 6 ------ 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java index 2f6fc931..00024fea 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java @@ -6,21 +6,23 @@ import me.lokka30.treasury.api.common.event.Cancellable; import me.lokka30.treasury.api.permission.node.Node; +import org.jetbrains.annotations.NotNull; public class NodeEvent implements Cancellable { private Node node; private boolean cancelled; - public NodeEvent(Node node) { + public NodeEvent(@NotNull Node node) { this.node = node; } + @NotNull public Node getNode() { return this.node; } - public void setNode(Node node) { + public void setNode(@NotNull Node node) { this.node = node; } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java index 887a5c36..471b451a 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java @@ -6,16 +6,18 @@ import me.lokka30.treasury.api.permission.node.Node; import me.lokka30.treasury.api.permission.node.holder.NodeHolder; +import org.jetbrains.annotations.NotNull; public class NodeUpdateEvent extends NodeEvent { private final NodeHolder nodeHolder; - public NodeUpdateEvent(NodeHolder nodeHolder, Node node) { + public NodeUpdateEvent(@NotNull NodeHolder nodeHolder, @NotNull Node node) { super(node); this.nodeHolder = nodeHolder; } + @NotNull public NodeHolder getNodeHolder() { return nodeHolder; } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java index 7c4ef3b4..d4eb85f9 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java @@ -17,8 +17,6 @@ public interface NodeHolder { - @NotNull String getIdentifier(); - @Nullable NodeHolder parentNodeHolder(); @NotNull CompletableFuture>>> allNodes(); diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderGroup.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderGroup.java index 727a054e..e4d6ce18 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderGroup.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderGroup.java @@ -4,6 +4,11 @@ package me.lokka30.treasury.api.permission.node.holder; +import me.lokka30.treasury.api.common.NamespacedKey; +import org.jetbrains.annotations.NotNull; + public interface NodeHolderGroup extends NodeHolder { + @NotNull NamespacedKey getIdentifier(); + } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java index d356f0cb..f3c4d65c 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java @@ -17,12 +17,6 @@ public interface NodeHolderPlayer extends NodeHolder { @NotNull UUID getUniqueId(); - @Override - @NotNull - default String getIdentifier() { - return this.getUniqueId().toString(); - } - /** * Returns whether the specified {@link ContextSet context set} applies for this player node * holder. From f37c380126faf8adb3ef38be3328164ef4ed5c47 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Thu, 2 Feb 2023 11:56:45 +0200 Subject: [PATCH 26/36] some small changes --- .../treasury/api/permission/PermissionsProvider.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java b/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java index a8666f53..66579ce6 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java @@ -7,6 +7,7 @@ import java.util.Collection; import java.util.UUID; import java.util.concurrent.CompletableFuture; +import me.lokka30.treasury.api.common.NamespacedKey; import me.lokka30.treasury.api.common.response.Response; import me.lokka30.treasury.api.permission.node.NodeFactory; import me.lokka30.treasury.api.permission.node.holder.NodeHolderGroup; @@ -21,8 +22,10 @@ public interface PermissionsProvider { @NotNull CompletableFuture>> allPlayerNodeHolderIds(); - @NotNull CompletableFuture> retrieveOrCreateGroup(@NotNull String groupId); + @NotNull CompletableFuture> retrieveOrCreateGroup(@NotNull NamespacedKey groupId); - @NotNull CompletableFuture>> allGroupNodeHolderIds(); + @NotNull CompletableFuture>> allGroupNodeHolderIds(); + + @NotNull NodeHolderGroup defaultGroup(); } From 82bb05e0c2de3b68769bc4ce8029f4f4b0d81768 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Thu, 16 Feb 2023 09:47:32 +0200 Subject: [PATCH 27/36] change weight to primitive value --- .../main/java/me/lokka30/treasury/api/permission/node/Node.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java index 61a79405..1bf4ff17 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java @@ -15,7 +15,7 @@ public interface Node { @NotNull ContextSet contexts(); - @Nullable Integer weight(); + int weight(); @NotNull String key(); From 789878c02bb5a2b5679fc6ac9d2ecfb55a51ab4e Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Wed, 5 Apr 2023 17:40:20 +0300 Subject: [PATCH 28/36] Update with dev/2.0.0 --- .../api/permission/PermissionsProvider.java | 9 ++++---- .../permission/node/holder/NodeHolder.java | 13 +++++------ .../node/holder/NodeHolderGroup.java | 7 ++---- .../node/holder/NodeHolderPlayer.java | 22 +++++-------------- 4 files changed, 18 insertions(+), 33 deletions(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java b/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java index 66579ce6..1316d661 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java @@ -8,7 +8,6 @@ import java.util.UUID; import java.util.concurrent.CompletableFuture; import me.lokka30.treasury.api.common.NamespacedKey; -import me.lokka30.treasury.api.common.response.Response; import me.lokka30.treasury.api.permission.node.NodeFactory; import me.lokka30.treasury.api.permission.node.holder.NodeHolderGroup; import me.lokka30.treasury.api.permission.node.holder.NodeHolderPlayer; @@ -18,13 +17,13 @@ public interface PermissionsProvider { @NotNull NodeFactory nodeFactory(); - @NotNull CompletableFuture> retrievePlayerNodeHolder(@NotNull UUID uuid); + @NotNull CompletableFuture retrievePlayerNodeHolder(@NotNull UUID uuid); - @NotNull CompletableFuture>> allPlayerNodeHolderIds(); + @NotNull CompletableFuture> allPlayerNodeHolderIds(); - @NotNull CompletableFuture> retrieveOrCreateGroup(@NotNull NamespacedKey groupId); + @NotNull CompletableFuture retrieveOrCreateGroup(@NotNull NamespacedKey groupId); - @NotNull CompletableFuture>> allGroupNodeHolderIds(); + @NotNull CompletableFuture> allGroupNodeHolderIds(); @NotNull NodeHolderGroup defaultGroup(); diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java index d4eb85f9..1870f68d 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java @@ -9,7 +9,6 @@ import java.util.Optional; import java.util.concurrent.CompletableFuture; import me.lokka30.treasury.api.common.misc.TriState; -import me.lokka30.treasury.api.common.response.Response; import me.lokka30.treasury.api.permission.node.Node; import me.lokka30.treasury.api.permission.node.type.NodeType; import org.jetbrains.annotations.NotNull; @@ -19,20 +18,20 @@ public interface NodeHolder { @Nullable NodeHolder parentNodeHolder(); - @NotNull CompletableFuture>>> allNodes(); + @NotNull CompletableFuture>> allNodes(); - @NotNull CompletableFuture>>> allNodesKeys(); + @NotNull CompletableFuture>> allNodesKeys(); - @NotNull CompletableFuture>>> allNodesWithType(@NotNull NodeType nodeType); + @NotNull CompletableFuture>> allNodesWithType(@NotNull NodeType nodeType); - @NotNull CompletableFuture>>> retrieveNode( + @NotNull CompletableFuture>> retrieveNode( @NotNull String key, @NotNull NodeType nodeType ); - @NotNull CompletableFuture> insertOrModifyNode( + @NotNull CompletableFuture insertOrModifyNode( @NotNull Node node, @NotNull NodeType nodeType ); - @NotNull CompletableFuture> removeNode(@NotNull String nodeKey); + @NotNull CompletableFuture removeNode(@NotNull String nodeKey); } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderGroup.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderGroup.java index e4d6ce18..676a11be 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderGroup.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderGroup.java @@ -4,11 +4,8 @@ package me.lokka30.treasury.api.permission.node.holder; -import me.lokka30.treasury.api.common.NamespacedKey; -import org.jetbrains.annotations.NotNull; +import me.lokka30.treasury.api.common.Cause; -public interface NodeHolderGroup extends NodeHolder { - - @NotNull NamespacedKey getIdentifier(); +public interface NodeHolderGroup extends NodeHolder, Cause.NonPlayer { } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java index f3c4d65c..a5f396a5 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java @@ -5,17 +5,14 @@ package me.lokka30.treasury.api.permission.node.holder; import java.util.Objects; -import java.util.UUID; import java.util.concurrent.CompletableFuture; +import me.lokka30.treasury.api.common.Cause; import me.lokka30.treasury.api.common.misc.TriState; -import me.lokka30.treasury.api.common.response.Response; import me.lokka30.treasury.api.permission.context.ContextSet; import me.lokka30.treasury.api.permission.node.type.NodeType; import org.jetbrains.annotations.NotNull; -public interface NodeHolderPlayer extends NodeHolder { - - @NotNull UUID getUniqueId(); +public interface NodeHolderPlayer extends NodeHolder, Cause.Player { /** * Returns whether the specified {@link ContextSet context set} applies for this player node @@ -30,18 +27,11 @@ public interface NodeHolderPlayer extends NodeHolder { boolean contextSetApplies(@NotNull ContextSet contextSet); @NotNull - default CompletableFuture> hasPermission(@NotNull String nodeKey) { + default CompletableFuture hasPermission(@NotNull String nodeKey) { Objects.requireNonNull(nodeKey, "nodeKey"); - return retrieveNode(nodeKey, NodeType.PERMISSION).thenApply(resp -> { - if (!resp.isSuccessful()) { - return Response.failure(resp.getFailureReason()); - } - return resp - .getResult() - .map(triStateNode -> Response.success(TriState.fromBoolean(this.contextSetApplies( - triStateNode.contexts())))) - .orElseGet(() -> Response.success(TriState.UNSPECIFIED)); - }); + return retrieveNode(nodeKey, NodeType.PERMISSION).thenApply(opt -> opt + .map(triStateNode -> TriState.fromBoolean(this.contextSetApplies(triStateNode.contexts()))) + .orElse(TriState.UNSPECIFIED)); } } From f633b43db7d40f04873247675e01b9e55f1633f9 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Sun, 9 Apr 2023 17:48:46 +0300 Subject: [PATCH 29/36] rework nodes made them less complex to understand and work with --- .../api/permission/PermissionsProvider.java | 3 - .../api/permission/events/NodeEvent.java | 8 +- .../permission/events/NodeUpdateEvent.java | 2 +- .../node/DefaultPermissionNodeImpl.java | 76 +++++++++++ .../treasury/api/permission/node/Node.java | 44 ++++-- .../api/permission/node/NodeFactory.java | 50 ------- .../api/permission/node/PermissionNode.java | 128 ++++++++++++++++++ .../api/permission/node/PrefixNode.java | 18 +++ .../api/permission/node/SuffixNode.java | 17 +++ .../permission/node/holder/NodeHolder.java | 59 ++++++-- .../node/holder/NodeHolderPlayer.java | 26 ---- .../api/permission/node/type/NodeType.java | 25 ---- .../permission/node/type/PermissionNode.java | 20 --- .../api/permission/node/type/PrefixNode.java | 6 - .../api/permission/node/type/SuffixNode.java | 6 - 15 files changed, 327 insertions(+), 161 deletions(-) create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/node/DefaultPermissionNodeImpl.java delete mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/node/PermissionNode.java create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/node/PrefixNode.java create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/node/SuffixNode.java delete mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/node/type/NodeType.java delete mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/node/type/PermissionNode.java delete mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/node/type/PrefixNode.java delete mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/node/type/SuffixNode.java diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java b/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java index 1316d661..29ced230 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/PermissionsProvider.java @@ -8,15 +8,12 @@ import java.util.UUID; import java.util.concurrent.CompletableFuture; import me.lokka30.treasury.api.common.NamespacedKey; -import me.lokka30.treasury.api.permission.node.NodeFactory; import me.lokka30.treasury.api.permission.node.holder.NodeHolderGroup; import me.lokka30.treasury.api.permission.node.holder.NodeHolderPlayer; import org.jetbrains.annotations.NotNull; public interface PermissionsProvider { - @NotNull NodeFactory nodeFactory(); - @NotNull CompletableFuture retrievePlayerNodeHolder(@NotNull UUID uuid); @NotNull CompletableFuture> allPlayerNodeHolderIds(); diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java index 00024fea..1cbbbd2b 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java @@ -10,19 +10,19 @@ public class NodeEvent implements Cancellable { - private Node node; + private Node node; private boolean cancelled; - public NodeEvent(@NotNull Node node) { + public NodeEvent(@NotNull Node node) { this.node = node; } @NotNull - public Node getNode() { + public Node getNode() { return this.node; } - public void setNode(@NotNull Node node) { + public void setNode(@NotNull Node node) { this.node = node; } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java index 471b451a..cdfb06c4 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java @@ -12,7 +12,7 @@ public class NodeUpdateEvent extends NodeEvent { private final NodeHolder nodeHolder; - public NodeUpdateEvent(@NotNull NodeHolder nodeHolder, @NotNull Node node) { + public NodeUpdateEvent(@NotNull NodeHolder nodeHolder, @NotNull Node node) { super(node); this.nodeHolder = nodeHolder; } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/DefaultPermissionNodeImpl.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/DefaultPermissionNodeImpl.java new file mode 100644 index 00000000..766b68fb --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/DefaultPermissionNodeImpl.java @@ -0,0 +1,76 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission.node; + +import java.util.Optional; +import me.lokka30.treasury.api.common.misc.TriState; +import me.lokka30.treasury.api.permission.context.ContextSet; +import me.lokka30.treasury.api.permission.node.holder.NodeHolder; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +class DefaultPermissionNodeImpl implements PermissionNode { + + private final String key; + private final int weight; + private final TriState value; + private final boolean inherited; + private final NodeHolder inheritedFrom, owner; + private final ContextSet contextSet; + + DefaultPermissionNodeImpl( + @NotNull String key, + int weight, + @NotNull TriState value, + boolean inherited, + @Nullable NodeHolder inheritedFrom, + @Nullable NodeHolder owner, + @Nullable ContextSet contextSet + ) { + this.key = key; + this.weight = weight; + this.value = value; + this.inherited = inherited; + this.inheritedFrom = inheritedFrom; + this.owner = owner; + this.contextSet = contextSet; + } + + @Override + public @NotNull String key() { + return key; + } + + @Override + public int weight() { + return weight; + } + + @Override + public @NotNull TriState value() { + return value; + } + + @Override + public boolean isInherited() { + return inherited; + } + + @Override + public @NotNull Optional inheritedFrom() { + return Optional.ofNullable(inheritedFrom); + } + + @Override + public @NotNull Optional owner() { + return Optional.ofNullable(owner); + } + + @Override + public @NotNull ContextSet contextSet() { + return contextSet == null ? ContextSet.empty() : contextSet; + } + +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java index 1bf4ff17..52b9d4fe 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java @@ -4,25 +4,49 @@ package me.lokka30.treasury.api.permission.node; +import java.util.Optional; import me.lokka30.treasury.api.permission.context.ContextSet; -import me.lokka30.treasury.api.permission.node.type.NodeType; +import me.lokka30.treasury.api.permission.node.holder.NodeHolder; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -public interface Node { +public interface Node { - @NotNull NodeType nodeType(); + @NotNull + Type type(); - @NotNull ContextSet contexts(); + @NotNull + String key(); int weight(); - @NotNull String key(); + boolean isInherited(); - @NotNull Data data(); + @NotNull + Optional inheritedFrom(); - @NotNull Node copyWithNewData( - @NotNull ContextSet contexts, @Nullable Integer weight, @NotNull Data data - ); + @NotNull + Optional owner(); + + @NotNull + ContextSet contextSet(); + + final class Type { + + public static final Type PERMISSION = new Type(PermissionNode.class); + public static final Type PREFIX = new Type(PrefixNode.class); + public static final Type SUFFIX = new Type(SuffixNode.class); + + private final Class nodeClass; + + public Type(@NotNull Class nodeClass) { + this.nodeClass = nodeClass; + } + + @NotNull + public Class getNodeClass() { + return nodeClass; + } + + } } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java deleted file mode 100644 index c21d3fab..00000000 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/NodeFactory.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . - */ - -package me.lokka30.treasury.api.permission.node; - -import me.lokka30.treasury.api.common.misc.TriState; -import me.lokka30.treasury.api.permission.context.Context; -import me.lokka30.treasury.api.permission.context.ContextSet; -import me.lokka30.treasury.api.permission.node.type.PermissionNode; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public abstract class NodeFactory { - - @NotNull - public PermissionNode createPermissionNode(@NotNull String permission) { - return this.createPermissionNode(permission, ContextSet.of(Context.GLOBAL)); - } - - @NotNull - public PermissionNode createPermissionNode( - @NotNull String permission, @NotNull ContextSet contextSet - ) { - return this.createPermissionNode(permission, contextSet, (Integer) null); - } - - @NotNull - public PermissionNode createPermissionNode( - @NotNull String permission, @NotNull ContextSet contextSet, @Nullable Integer weight - ) { - return this.createPermissionNode(permission, contextSet, weight, TriState.UNSPECIFIED); - } - - @NotNull - public PermissionNode createPermissionNode( - @NotNull String permission, @NotNull ContextSet contextSet, @NotNull TriState value - ) { - return this.createPermissionNode(permission, contextSet, null, value); - } - - @NotNull - public abstract PermissionNode createPermissionNode( - @NotNull String permission, - @NotNull ContextSet contextSet, - @Nullable Integer weight, - @NotNull TriState value - ); - -} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/PermissionNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/PermissionNode.java new file mode 100644 index 00000000..bd615f4e --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/PermissionNode.java @@ -0,0 +1,128 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission.node; + +import java.util.Objects; +import me.lokka30.treasury.api.common.misc.TriState; +import me.lokka30.treasury.api.permission.context.ContextSet; +import me.lokka30.treasury.api.permission.node.holder.NodeHolder; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; + +public interface PermissionNode extends Node { + + @Contract(value = "-> new", pure = true) + @NotNull + static PermissionNode.Builder newBuilder() { + return new PermissionNode.Builder(); + } + + @Contract(value = "_ -> new", pure = true) + @NotNull + static PermissionNode.Builder newBuilder(@NotNull PermissionNode fromNode) { + return new PermissionNode.Builder(fromNode); + } + + @Override + @NotNull + default Node.Type type() { + return Type.PERMISSION; + } + + @NotNull TriState value(); + + final class Builder { + + private String key; + private TriState value; + private int weight; + private boolean inherited; + private NodeHolder owner, inheritedFrom; + private ContextSet contextSet; + + public Builder() { + } + + public Builder(@NotNull PermissionNode fromNode) { + this.key = fromNode.key(); + this.value = fromNode.value(); + this.weight = fromNode.weight(); + this.inherited = fromNode.isInherited(); + this.inheritedFrom = fromNode.inheritedFrom().orElse(null); + this.owner = fromNode.owner().orElse(null); + this.contextSet = fromNode.contextSet(); + } + + public Builder(@NotNull Builder other) { + this.key = other.key; + this.value = other.value; + this.weight = other.weight; + this.inherited = other.inherited; + this.inheritedFrom = other.inheritedFrom; + this.owner = other.owner; + this.contextSet = other.contextSet; + } + + @Contract("-> new") + @NotNull + public Builder copy() { + return new Builder(this); + } + + @Contract("_ -> this") + public Builder withKey(@NotNull String key) { + this.key = key; + return this; + } + + @Contract("_ -> this") + public Builder withValue(@NotNull TriState value) { + this.value = value; + return this; + } + + @Contract("_ -> this") + public Builder withWeight(int weight) { + this.weight = weight; + return this; + } + + @Contract("_ -> this") + public Builder withOwner(@NotNull NodeHolder owner) { + this.owner = owner; + return this; + } + + @Contract("_ -> this") + public Builder withInheritedFrom(@NotNull NodeHolder inheritedFrom) { + this.inherited = true; + this.inheritedFrom = inheritedFrom; + return this; + } + + @Contract("_ -> this") + public Builder withContextSet(@NotNull ContextSet contextSet) { + this.contextSet = contextSet; + return this; + } + + @NotNull + public PermissionNode build() { + Objects.requireNonNull(key, "key"); + Objects.requireNonNull(value, "value"); + return new DefaultPermissionNodeImpl( + key, + weight, + value, + inherited, + inheritedFrom, + owner, + contextSet + ); + } + + } + +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/PrefixNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/PrefixNode.java new file mode 100644 index 00000000..612a95cd --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/PrefixNode.java @@ -0,0 +1,18 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission.node; + +import org.jetbrains.annotations.NotNull; + +// todo: value type?? +public interface PrefixNode extends Node { + + @Override + @NotNull + default Node.Type type() { + return Type.PREFIX; + } + +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/SuffixNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/SuffixNode.java new file mode 100644 index 00000000..1df84d51 --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/SuffixNode.java @@ -0,0 +1,17 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission.node; + +import org.jetbrains.annotations.NotNull; + +// todo: value type?? +public interface SuffixNode extends Node { + + @Override + @NotNull + default Node.Type type() { + return Type.SUFFIX; + } +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java index 1870f68d..1278412e 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java @@ -5,12 +5,15 @@ package me.lokka30.treasury.api.permission.node.holder; import java.util.Collection; +import java.util.HashSet; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.concurrent.CompletableFuture; import me.lokka30.treasury.api.common.misc.TriState; +import me.lokka30.treasury.api.permission.context.ContextSet; import me.lokka30.treasury.api.permission.node.Node; -import me.lokka30.treasury.api.permission.node.type.NodeType; +import me.lokka30.treasury.api.permission.node.PermissionNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -18,20 +21,56 @@ public interface NodeHolder { @Nullable NodeHolder parentNodeHolder(); - @NotNull CompletableFuture>> allNodes(); + @NotNull CompletableFuture> allNodes(); - @NotNull CompletableFuture>> allNodesKeys(); + @NotNull CompletableFuture> allNodesKeys(); - @NotNull CompletableFuture>> allNodesWithType(@NotNull NodeType nodeType); + @NotNull + default CompletableFuture> allNodesWithType(@NotNull Class type) { + return allNodes().thenApply(nodes -> { + Set ret = new HashSet<>(); + for (Node node : nodes) { + if (node.type().getNodeClass().isAssignableFrom(type)) { + ret.add((T) node); + } + } + return ret; + }); + } - @NotNull CompletableFuture>> retrieveNode( - @NotNull String key, @NotNull NodeType nodeType - ); + @NotNull CompletableFuture hasNode(@NotNull String key); + + @NotNull CompletableFuture> retrieveNode(@NotNull String key); + + @NotNull CompletableFuture insertOrModifyNode(@NotNull Node node); + + @NotNull CompletableFuture removeNode(@NotNull String nodeKey); - @NotNull CompletableFuture insertOrModifyNode( - @NotNull Node node, @NotNull NodeType nodeType + @NotNull CompletableFuture retrievePermissionValue(@NotNull String permissionNodeKey); + + @NotNull CompletableFuture retrievePermissionValue( + @NotNull String permissionNodeKey, @NotNull ContextSet specificContextSet ); - @NotNull CompletableFuture removeNode(@NotNull String nodeKey); + @NotNull + default CompletableFuture hasPermission(@NotNull String permissionNodeKey) { + return retrievePermissionValue(permissionNodeKey).thenApply(state -> state == TriState.TRUE); + } + + @NotNull + default CompletableFuture hasPermission( + @NotNull String permissionNodeKey, @NotNull ContextSet specificContextSet + ) { + return retrievePermissionValue( + permissionNodeKey, + specificContextSet + ).thenApply(state -> state == TriState.TRUE); + + } + + @NotNull + default CompletableFuture hasPermission(@NotNull PermissionNode permissionNode) { + return hasPermission(permissionNode.key(), permissionNode.contextSet()); + } } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java index a5f396a5..d80047ff 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolderPlayer.java @@ -4,34 +4,8 @@ package me.lokka30.treasury.api.permission.node.holder; -import java.util.Objects; -import java.util.concurrent.CompletableFuture; import me.lokka30.treasury.api.common.Cause; -import me.lokka30.treasury.api.common.misc.TriState; -import me.lokka30.treasury.api.permission.context.ContextSet; -import me.lokka30.treasury.api.permission.node.type.NodeType; -import org.jetbrains.annotations.NotNull; public interface NodeHolderPlayer extends NodeHolder, Cause.Player { - /** - * Returns whether the specified {@link ContextSet context set} applies for this player node - * holder. - *

By "applies" it is meant that all the - * {@link me.lokka30.treasury.api.permission.context.Context contexts} defined in the - * specified context set's conditions are met. - * - * @param contextSet context set to probe - * @return applies or not. - */ - boolean contextSetApplies(@NotNull ContextSet contextSet); - - @NotNull - default CompletableFuture hasPermission(@NotNull String nodeKey) { - Objects.requireNonNull(nodeKey, "nodeKey"); - return retrieveNode(nodeKey, NodeType.PERMISSION).thenApply(opt -> opt - .map(triStateNode -> TriState.fromBoolean(this.contextSetApplies(triStateNode.contexts()))) - .orElse(TriState.UNSPECIFIED)); - } - } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/type/NodeType.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/type/NodeType.java deleted file mode 100644 index 9671215d..00000000 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/type/NodeType.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . - */ - -package me.lokka30.treasury.api.permission.node.type; - -import me.lokka30.treasury.api.common.misc.TriState; -import org.jetbrains.annotations.NotNull; - -public final class NodeType { - - public static final NodeType PERMISSION = new NodeType<>(TriState.class); - - private final Class dataClass; - - private NodeType(@NotNull Class dataClass) { - this.dataClass = dataClass; - } - - @NotNull - public Class dataClass() { - return this.dataClass; - } - -} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/type/PermissionNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/type/PermissionNode.java deleted file mode 100644 index 73644a12..00000000 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/type/PermissionNode.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . - */ - -package me.lokka30.treasury.api.permission.node.type; - -import me.lokka30.treasury.api.common.misc.TriState; -import me.lokka30.treasury.api.permission.node.Node; -import me.lokka30.treasury.api.permission.node.type.NodeType; -import org.jetbrains.annotations.NotNull; - -public interface PermissionNode extends Node { - - @Override - @NotNull - default NodeType nodeType() { - return NodeType.PERMISSION; - } - -} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/type/PrefixNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/type/PrefixNode.java deleted file mode 100644 index 3383caee..00000000 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/type/PrefixNode.java +++ /dev/null @@ -1,6 +0,0 @@ -package me.lokka30.treasury.api.permission.node.type; - -// todo -public interface PrefixNode { - -} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/type/SuffixNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/type/SuffixNode.java deleted file mode 100644 index f8f7e340..00000000 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/type/SuffixNode.java +++ /dev/null @@ -1,6 +0,0 @@ -package me.lokka30.treasury.api.permission.node.type; - -// todo -public interface SuffixNode { - -} From 2c870d2a0c8fb511070d63e0be2ece38615309af Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Mon, 10 Apr 2023 09:30:23 +0300 Subject: [PATCH 30/36] some changes --- .../api/permission/context/Context.java | 38 +++++++++++++++++-- .../api/permission/context/ContextSet.java | 30 +++++++++++---- .../api/permission/events/NodeEvent.java | 14 ++++++- .../permission/events/NodeRemoveEvent.java | 28 ++++++++++++++ .../permission/events/NodeUpdateEvent.java | 7 +++- .../treasury/api/permission/node/Node.java | 2 +- .../permission/node/holder/NodeHolder.java | 5 ++- 7 files changed, 106 insertions(+), 18 deletions(-) create mode 100644 api/src/main/java/me/lokka30/treasury/api/permission/events/NodeRemoveEvent.java diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/context/Context.java b/api/src/main/java/me/lokka30/treasury/api/permission/context/Context.java index acdc02d2..f14e23c6 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/context/Context.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/context/Context.java @@ -6,22 +6,42 @@ import java.util.Objects; import java.util.function.BiPredicate; +import me.lokka30.treasury.api.common.NamespacedKey; import me.lokka30.treasury.api.permission.node.holder.NodeHolder; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; +/** + * Represents a context, in which a specific thing, a {@link me.lokka30.treasury.api.permission.node.Node} for example, applies. + * + * @author Ivan Pekov + */ public interface Context { - Context GLOBAL = Context.of("global", ($, $1) -> true); + /** + * Returns the global context. If only this context is applied to a + * {@link me.lokka30.treasury.api.permission.node.Node} for example, that node will always + * apply without any other interference. + */ + Context GLOBAL = Context.of(NamespacedKey.of("treasury", "global"), ($, $1) -> true); + /** + * Creates a new context. + * + * @param key context key + * @param condition context condition + * @return new context + */ @Contract(value = "_, _ -> new", pure = true) @NotNull - static Context of(@NotNull String key, @NotNull BiPredicate condition) { + static Context of( + @NotNull NamespacedKey key, @NotNull BiPredicate condition + ) { Objects.requireNonNull(key, "key"); Objects.requireNonNull(condition, "condition"); return new Context() { @Override - public @NotNull String getKey() { + public @NotNull NamespacedKey getKey() { return key; } @@ -32,8 +52,18 @@ static Context of(@NotNull String key, @NotNull BiPredicate }; } - @NotNull String getKey(); + /** + * Returns the {@link NamespacedKey key} of this context. + * + * @return key + */ + @NotNull NamespacedKey getKey(); + /** + * Returns the condition under which this context will apply. + * + * @return condition + */ @NotNull BiPredicate getCondition(); } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java b/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java index 6ad28a97..03381bb8 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/context/ContextSet.java @@ -11,20 +11,23 @@ import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import me.lokka30.treasury.api.common.NamespacedKey; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; /** * Represents a set of {@link Context contexts}, which can be applied for a * {@link me.lokka30.treasury.api.permission.node.Node}. - *

Class is immutable. Creating it via {@link #of(Context...)}, the returned object is always - * the same. + *

Class is immutable. * * @author Ivan Pekov - * @since 2.0.0 */ public final class ContextSet implements Iterable { + private static final ContextSet GLOBAL = new ContextSet(Collections.singletonMap( + Context.GLOBAL.getKey(), + Context.GLOBAL + )); private static final ContextSet EMPTY = new ContextSet(Collections.emptyMap()); /** @@ -37,6 +40,17 @@ public static ContextSet empty() { return EMPTY; } + /** + * Returns the context set constant, which has only 1 context, and that is the + * {@link Context#GLOBAL global} context. + * + * @return global context set + */ + @NotNull + public static ContextSet global() { + return GLOBAL; + } + /** * Creates a new context set of the specified {@link Context contexts} * @@ -49,17 +63,17 @@ public static ContextSet of(@NotNull Context @NotNull ... contexts) { if (contexts.length == 0) { return empty(); } - Map map = new ConcurrentHashMap<>(); + Map map = new ConcurrentHashMap<>(); for (Context context : contexts) { map.put(context.getKey(), context); } return new ContextSet(map); } - private Map contexts; + private Map contexts; @Contract(pure = true) - private ContextSet(Map contexts) { + private ContextSet(Map contexts) { this.contexts = contexts; } @@ -71,7 +85,7 @@ private ContextSet(Map contexts) { * @return context if such is found, empty optional otherwise */ @NotNull - public Optional getContext(@NotNull String contextKey) { + public Optional getContext(@NotNull NamespacedKey contextKey) { Objects.requireNonNull(contextKey, "contextKey"); return Optional.ofNullable(this.contexts.get(contextKey)); } @@ -83,7 +97,7 @@ public Optional getContext(@NotNull String contextKey) { * @param contextKey context key * @return true if context is held, false otherwise */ - public boolean hasContext(@NotNull String contextKey) { + public boolean hasContext(@NotNull NamespacedKey contextKey) { Objects.requireNonNull(contextKey, "contextKey"); return contexts.containsKey(contextKey); } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java index 1cbbbd2b..09c2ea2b 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java @@ -4,6 +4,7 @@ package me.lokka30.treasury.api.permission.events; +import me.lokka30.treasury.api.common.Cause; import me.lokka30.treasury.api.common.event.Cancellable; import me.lokka30.treasury.api.permission.node.Node; import org.jetbrains.annotations.NotNull; @@ -11,10 +12,12 @@ public class NodeEvent implements Cancellable { private Node node; + private Cause cause; private boolean cancelled; - public NodeEvent(@NotNull Node node) { + public NodeEvent(@NotNull Node node, @NotNull Cause cause) { this.node = node; + this.cause = cause; } @NotNull @@ -26,6 +29,15 @@ public void setNode(@NotNull Node node) { this.node = node; } + @NotNull + public Cause getCause() { + return cause; + } + + public void setCause(@NotNull Cause cause) { + this.cause = cause; + } + @Override public boolean isCancelled() { return this.cancelled; diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeRemoveEvent.java b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeRemoveEvent.java new file mode 100644 index 00000000..bbdf7a69 --- /dev/null +++ b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeRemoveEvent.java @@ -0,0 +1,28 @@ +/* + * This file is/was part of Treasury. To read more information about Treasury such as its licensing, see . + */ + +package me.lokka30.treasury.api.permission.events; + +import me.lokka30.treasury.api.common.Cause; +import me.lokka30.treasury.api.permission.node.Node; +import me.lokka30.treasury.api.permission.node.holder.NodeHolder; +import org.jetbrains.annotations.NotNull; + +public class NodeRemoveEvent extends NodeEvent { + + private final NodeHolder nodeHolder; + + public NodeRemoveEvent( + @NotNull NodeHolder nodeHolder, @NotNull Node node, @NotNull Cause cause + ) { + super(node, cause); + this.nodeHolder = nodeHolder; + } + + @NotNull + public NodeHolder getNodeHolder() { + return this.nodeHolder; + } + +} diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java index cdfb06c4..3a6660a7 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java @@ -4,6 +4,7 @@ package me.lokka30.treasury.api.permission.events; +import me.lokka30.treasury.api.common.Cause; import me.lokka30.treasury.api.permission.node.Node; import me.lokka30.treasury.api.permission.node.holder.NodeHolder; import org.jetbrains.annotations.NotNull; @@ -12,8 +13,10 @@ public class NodeUpdateEvent extends NodeEvent { private final NodeHolder nodeHolder; - public NodeUpdateEvent(@NotNull NodeHolder nodeHolder, @NotNull Node node) { - super(node); + public NodeUpdateEvent( + @NotNull NodeHolder nodeHolder, @NotNull Node node, @NotNull Cause cause + ) { + super(node, cause); this.nodeHolder = nodeHolder; } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java index 52b9d4fe..6e6a973c 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java @@ -30,7 +30,7 @@ public interface Node { @NotNull ContextSet contextSet(); - final class Type { + class Type { // not final to allow custom nodes :) public static final Type PERMISSION = new Type(PermissionNode.class); public static final Type PREFIX = new Type(PrefixNode.class); diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java index 1278412e..36bcab66 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java @@ -10,6 +10,7 @@ import java.util.Optional; import java.util.Set; import java.util.concurrent.CompletableFuture; +import me.lokka30.treasury.api.common.Cause; import me.lokka30.treasury.api.common.misc.TriState; import me.lokka30.treasury.api.permission.context.ContextSet; import me.lokka30.treasury.api.permission.node.Node; @@ -42,9 +43,9 @@ default CompletableFuture> allNodesWithType(@NotN @NotNull CompletableFuture> retrieveNode(@NotNull String key); - @NotNull CompletableFuture insertOrModifyNode(@NotNull Node node); + @NotNull CompletableFuture insertOrModifyNode(@NotNull Node node, Cause cause); - @NotNull CompletableFuture removeNode(@NotNull String nodeKey); + @NotNull CompletableFuture removeNode(@NotNull String nodeKey, Cause cause); @NotNull CompletableFuture retrievePermissionValue(@NotNull String permissionNodeKey); From 49ce8997c3ff438bbcc1388fa93243a72fb4504e Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Mon, 10 Apr 2023 09:32:18 +0300 Subject: [PATCH 31/36] forgot annos, whoops --- .../treasury/api/permission/node/holder/NodeHolder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java index 36bcab66..8d5d231f 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/holder/NodeHolder.java @@ -43,9 +43,9 @@ default CompletableFuture> allNodesWithType(@NotN @NotNull CompletableFuture> retrieveNode(@NotNull String key); - @NotNull CompletableFuture insertOrModifyNode(@NotNull Node node, Cause cause); + @NotNull CompletableFuture insertOrModifyNode(@NotNull Node node, @NotNull Cause cause); - @NotNull CompletableFuture removeNode(@NotNull String nodeKey, Cause cause); + @NotNull CompletableFuture removeNode(@NotNull String nodeKey, @NotNull Cause cause); @NotNull CompletableFuture retrievePermissionValue(@NotNull String permissionNodeKey); From 4bd228476114a14b5cee1f96698500503d229d3d Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Wed, 26 Apr 2023 20:34:01 +0300 Subject: [PATCH 32/36] Transform NodeEvent --- .../api/permission/events/NodeEvent.java | 59 ++++++++++++------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java index 09c2ea2b..18900481 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeEvent.java @@ -5,47 +5,62 @@ package me.lokka30.treasury.api.permission.events; import me.lokka30.treasury.api.common.Cause; -import me.lokka30.treasury.api.common.event.Cancellable; import me.lokka30.treasury.api.permission.node.Node; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; -public class NodeEvent implements Cancellable { +public class NodeEvent { - private Node node; - private Cause cause; - private boolean cancelled; + private Result result; - public NodeEvent(@NotNull Node node, @NotNull Cause cause) { - this.node = node; - this.cause = cause; + public NodeEvent(@NotNull Result initialResult) { + this.result = initialResult; } @NotNull public Node getNode() { - return this.node; - } - - public void setNode(@NotNull Node node) { - this.node = node; + return result.getNode(); } @NotNull public Cause getCause() { - return cause; + return result.getCause(); } - public void setCause(@NotNull Cause cause) { - this.cause = cause; + @NotNull + public Result asResult() { + return this.result; } - @Override - public boolean isCancelled() { - return this.cancelled; + public void withNewResult(@NotNull Result result) { + this.result = result; } - @Override - public void setCancelled(final boolean cancel) { - this.cancelled = cancel; + public static class Result { + + @NotNull + @Contract(value = "_, _ -> new", pure = true) + public static Result of(@NotNull Node node, @NotNull Cause cause) { + return new Result(node, cause); + } + + private final Node node; + private final Cause cause; + + private Result(@NotNull Node node, @NotNull Cause cause) { + this.node = node; + this.cause = cause; + } + + @NotNull + public Node getNode() { + return this.node; + } + + @NotNull + public Cause getCause() { + return this.cause; + } } } From afe4506d7d173fee74239a90c27a143be8260869 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Wed, 26 Apr 2023 20:35:02 +0300 Subject: [PATCH 33/36] Update constructors of delegating events --- .../treasury/api/permission/events/NodeRemoveEvent.java | 6 ++---- .../treasury/api/permission/events/NodeUpdateEvent.java | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeRemoveEvent.java b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeRemoveEvent.java index bbdf7a69..86f95c65 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeRemoveEvent.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeRemoveEvent.java @@ -4,8 +4,6 @@ package me.lokka30.treasury.api.permission.events; -import me.lokka30.treasury.api.common.Cause; -import me.lokka30.treasury.api.permission.node.Node; import me.lokka30.treasury.api.permission.node.holder.NodeHolder; import org.jetbrains.annotations.NotNull; @@ -14,9 +12,9 @@ public class NodeRemoveEvent extends NodeEvent { private final NodeHolder nodeHolder; public NodeRemoveEvent( - @NotNull NodeHolder nodeHolder, @NotNull Node node, @NotNull Cause cause + @NotNull NodeHolder nodeHolder, @NotNull NodeEvent.Result initialResult ) { - super(node, cause); + super(initialResult); this.nodeHolder = nodeHolder; } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java index 3a6660a7..64ad58bc 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/events/NodeUpdateEvent.java @@ -4,8 +4,6 @@ package me.lokka30.treasury.api.permission.events; -import me.lokka30.treasury.api.common.Cause; -import me.lokka30.treasury.api.permission.node.Node; import me.lokka30.treasury.api.permission.node.holder.NodeHolder; import org.jetbrains.annotations.NotNull; @@ -14,9 +12,9 @@ public class NodeUpdateEvent extends NodeEvent { private final NodeHolder nodeHolder; public NodeUpdateEvent( - @NotNull NodeHolder nodeHolder, @NotNull Node node, @NotNull Cause cause + @NotNull NodeHolder nodeHolder, @NotNull NodeEvent.Result initialResult ) { - super(node, cause); + super(initialResult); this.nodeHolder = nodeHolder; } From c0540a44b2f1e28bf5a269f024f1c4548e515ff1 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Thu, 6 Jul 2023 21:22:35 +0300 Subject: [PATCH 34/36] Write some javadocs --- .../treasury/api/permission/node/Node.java | 183 ++++++++++++++++-- .../api/permission/node/PermissionNode.java | 118 +++++------ 2 files changed, 214 insertions(+), 87 deletions(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java index 6e6a973c..6d09d9b2 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java @@ -7,41 +7,118 @@ import java.util.Optional; import me.lokka30.treasury.api.permission.context.ContextSet; import me.lokka30.treasury.api.permission.node.holder.NodeHolder; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; +/** + * A {@code Node} represents an object, holding specific information, which can be classified + * under so-called "permissions". + * + * @author Ivan Pekov + */ public interface Node { - @NotNull - Type type(); - - @NotNull - String key(); - + /** + * Returns the {@link Type} of the node. + * + * @return node type + */ + @NotNull Type type(); + + /** + * Returns the {@link String string} key representation of this node + * + * @return key + */ + @NotNull String key(); + + /** + * Returns the weight of this node. A weight represents how effective is this node compared + * to others. + *

+ * For an example, lets say a {@link NodeHolder node holder} has a node with weight 1 that + * permits the usage of the "/give" command. That same node holder also has a node with + * weight 2 that disallows the usage of the "/give" command. The node with the biggest weight + * is to be applied, hence that specific node holder should NOT be able to use the + * "/give" command. + * + * @return node weight + */ int weight(); + /** + * Returns whether this node is inherited. + *

+ * By "inherited" is meant that if that node is retrieved from a {@link NodeHolder node holder} + * instance (e.g. {@link #owner()} {@link Optional#isPresent()} returns {@code true}), does + * that node holder get this node from a parent node holder (say a parent node holder can be + * a {@link me.lokka30.treasury.api.permission.node.holder.NodeHolderGroup group node holder}). + * + * @return is the node inherited + */ boolean isInherited(); - @NotNull - Optional inheritedFrom(); - - @NotNull - Optional owner(); - - @NotNull - ContextSet contextSet(); - + /** + * Returns the {@link NodeHolder node holder} from which this node is inherited from. + * + * @return node holder owner of this node if present, {@link Optional#empty()} otherwise + */ + @NotNull Optional inheritedFrom(); + + /** + * Returns the {@link NodeHolder node holder} owner (origin) of that node. + * + * @return owner if present, {@link Optional#empty()} otherwise + */ + @NotNull Optional owner(); + + /** + * Returns the {@link ContextSet context set}, for which if matched this node applies. + * + * @return context set + */ + @NotNull ContextSet contextSet(); + + /** + * Represents a {@link Node} type. + *

+ * This class can be extended to allow for more robust type implementations. + * + * @author Ivan Pekov + */ class Type { // not final to allow custom nodes :) + /** + * Returns the {@link PermissionNode} type. + */ public static final Type PERMISSION = new Type(PermissionNode.class); + + /** + * Returns the {@link PrefixNode} type. + */ public static final Type PREFIX = new Type(PrefixNode.class); + + /** + * Returns the {@link SuffixNode} type. + */ public static final Type SUFFIX = new Type(SuffixNode.class); private final Class nodeClass; + /** + * Construct a new type. + * + * @param nodeClass the node class to which this type applies to. + */ public Type(@NotNull Class nodeClass) { this.nodeClass = nodeClass; } + /** + * Returns the {@link Class node class} this type applies to. + * + * @return node class + */ @NotNull public Class getNodeClass() { return nodeClass; @@ -49,4 +126,80 @@ public Class getNodeClass() { } + abstract class Builder { + + protected String key; + protected ValueType value; + protected int weight; + protected boolean inherited; + protected NodeHolder owner, inheritedFrom; + protected ContextSet contextSet; + + public Builder() { + } + + public Builder(@NotNull NodeType fromNode) { + this.key = fromNode.key(); + this.weight = fromNode.weight(); + this.inherited = fromNode.isInherited(); + this.inheritedFrom = fromNode.inheritedFrom().orElse(null); + this.owner = fromNode.owner().orElse(null); + this.contextSet = fromNode.contextSet(); + } + + public Builder(@NotNull Builder other) { + this.key = other.key; + this.value = other.value; + this.weight = other.weight; + this.inherited = other.inherited; + this.inheritedFrom = other.inheritedFrom; + this.owner = other.owner; + this.contextSet = other.contextSet; + } + + @Contract("-> new") + @NotNull + public abstract Builder copy(); + + @Contract("_ -> this") + public Builder withKey(@NotNull String key) { + this.key = key; + return this; + } + + @Contract("_ -> this") + public Builder withValue(@NotNull ValueType value) { + this.value = value; + return this; + } + + @Contract("_ -> this") + public Builder withWeight(int weight) { + this.weight = weight; + return this; + } + + @Contract("_ -> this") + public Builder withOwner(@NotNull NodeHolder owner) { + this.owner = owner; + return this; + } + + @Contract("_ -> this") + public Builder withInheritedFrom(@NotNull NodeHolder inheritedFrom) { + this.inherited = true; + this.inheritedFrom = inheritedFrom; + return this; + } + + @Contract("_ -> this") + public Builder withContextSet(@NotNull ContextSet contextSet) { + this.contextSet = contextSet; + return this; + } + + @NotNull + public abstract NodeType build(); + } + } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/PermissionNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/PermissionNode.java index bd615f4e..ff05f7bd 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/PermissionNode.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/PermissionNode.java @@ -11,105 +11,79 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; +/** + * Represents a permission {@link Node node}. A {@code PermissionNode} is exactly what the name + * says - an indication whether a {@link NodeHolder node holder} has a permit to do something (e + * .g. execute a command). + * + * @author Ivan Pekov + */ public interface PermissionNode extends Node { + /** + * Create a new {@code PermissionNode} builder. + * + * @return new permission node builder + */ @Contract(value = "-> new", pure = true) @NotNull - static PermissionNode.Builder newBuilder() { - return new PermissionNode.Builder(); + static PermissionNode.PermissionNodeBuilder newBuilder() { + return new PermissionNode.PermissionNodeBuilder(); } + /** + * Create a new {@code PermissionNode} builder. + * + * @param fromNode a permission node to create the builder from. + * @return new permission node builder + */ @Contract(value = "_ -> new", pure = true) @NotNull - static PermissionNode.Builder newBuilder(@NotNull PermissionNode fromNode) { - return new PermissionNode.Builder(fromNode); + static PermissionNode.PermissionNodeBuilder newBuilder(@NotNull PermissionNode fromNode) { + return new PermissionNode.PermissionNodeBuilder(fromNode); } + /** + * {@inheritDoc} + * + * @return {@inheritDoc} + */ @Override @NotNull default Node.Type type() { return Type.PERMISSION; } + /** + * Returns the value, held by this {@code PermissionNode}, represented by a {@link TriState + * tri-state}. + * + * @return value + * @see TriState + */ @NotNull TriState value(); - final class Builder { - - private String key; - private TriState value; - private int weight; - private boolean inherited; - private NodeHolder owner, inheritedFrom; - private ContextSet contextSet; - - public Builder() { - } - - public Builder(@NotNull PermissionNode fromNode) { - this.key = fromNode.key(); - this.value = fromNode.value(); - this.weight = fromNode.weight(); - this.inherited = fromNode.isInherited(); - this.inheritedFrom = fromNode.inheritedFrom().orElse(null); - this.owner = fromNode.owner().orElse(null); - this.contextSet = fromNode.contextSet(); - } - - public Builder(@NotNull Builder other) { - this.key = other.key; - this.value = other.value; - this.weight = other.weight; - this.inherited = other.inherited; - this.inheritedFrom = other.inheritedFrom; - this.owner = other.owner; - this.contextSet = other.contextSet; - } - - @Contract("-> new") - @NotNull - public Builder copy() { - return new Builder(this); - } - - @Contract("_ -> this") - public Builder withKey(@NotNull String key) { - this.key = key; - return this; - } - - @Contract("_ -> this") - public Builder withValue(@NotNull TriState value) { - this.value = value; - return this; - } + final class PermissionNodeBuilder extends Builder { - @Contract("_ -> this") - public Builder withWeight(int weight) { - this.weight = weight; - return this; + public PermissionNodeBuilder() { + super(); } - @Contract("_ -> this") - public Builder withOwner(@NotNull NodeHolder owner) { - this.owner = owner; - return this; + public PermissionNodeBuilder(PermissionNode other) { + super(other); } - @Contract("_ -> this") - public Builder withInheritedFrom(@NotNull NodeHolder inheritedFrom) { - this.inherited = true; - this.inheritedFrom = inheritedFrom; - return this; + public PermissionNodeBuilder(PermissionNodeBuilder other) { + super(other); } - @Contract("_ -> this") - public Builder withContextSet(@NotNull ContextSet contextSet) { - this.contextSet = contextSet; - return this; + @Override + public @NotNull Builder copy() { + return new PermissionNodeBuilder(this); } - @NotNull - public PermissionNode build() { + @Override + public @NotNull PermissionNode build() { Objects.requireNonNull(key, "key"); Objects.requireNonNull(value, "value"); return new DefaultPermissionNodeImpl( From e23536220b0ecdd671b42decb88c1517fde4b8f5 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Thu, 6 Jul 2023 21:24:31 +0300 Subject: [PATCH 35/36] NotNull --- .../lokka30/treasury/api/permission/node/PermissionNode.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/PermissionNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/PermissionNode.java index ff05f7bd..93d94816 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/PermissionNode.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/PermissionNode.java @@ -69,11 +69,11 @@ public PermissionNodeBuilder() { super(); } - public PermissionNodeBuilder(PermissionNode other) { + public PermissionNodeBuilder(@NotNull PermissionNode other) { super(other); } - public PermissionNodeBuilder(PermissionNodeBuilder other) { + public PermissionNodeBuilder(@NotNull PermissionNodeBuilder other) { super(other); } From 9c2d51710198e264c777ebfcfc3a8e5e18d9f5ae Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Tue, 11 Jul 2023 14:23:59 +0300 Subject: [PATCH 36/36] Document Node.Builder --- .../treasury/api/permission/node/Node.java | 66 +++++++++++++++++++ .../api/permission/node/PermissionNode.java | 10 +++ 2 files changed, 76 insertions(+) diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java index 6d09d9b2..78d2a20e 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/Node.java @@ -126,6 +126,13 @@ public Class getNodeClass() { } + /** + * Represents an abstract representation of a builder for a {@link Node}. + * + * @param the node built + * @param the value type of the node type built + * @author Ivan Pekov + */ abstract class Builder { protected String key; @@ -135,9 +142,17 @@ abstract class Builder { protected NodeHolder owner, inheritedFrom; protected ContextSet contextSet; + /** + * Create a new empty node builder + */ public Builder() { } + /** + * Create a node builder which is a copy from an existing node. + * + * @param fromNode node to copy data from + */ public Builder(@NotNull NodeType fromNode) { this.key = fromNode.key(); this.weight = fromNode.weight(); @@ -147,6 +162,11 @@ public Builder(@NotNull NodeType fromNode) { this.contextSet = fromNode.contextSet(); } + /** + * Create a node builder copy from an existing builder. + * + * @param other other builder to copy values from + */ public Builder(@NotNull Builder other) { this.key = other.key; this.value = other.value; @@ -157,34 +177,69 @@ public Builder(@NotNull Builder other) { this.contextSet = other.contextSet; } + /** + * Copy this node builder in another. + * + * @return a new instance copy of this builder + */ @Contract("-> new") @NotNull public abstract Builder copy(); + /** + * Specify a key of the built node. + * + * @param key key + * @return this builder instance for chaining + */ @Contract("_ -> this") public Builder withKey(@NotNull String key) { this.key = key; return this; } + /** + * Specify a value of the built node. + * + * @param value value + * @return this builder instance for chaining + */ @Contract("_ -> this") public Builder withValue(@NotNull ValueType value) { this.value = value; return this; } + /** + * Specify the weight of the built node. + * + * @param weight weight + * @return this builder instance for chaining + */ @Contract("_ -> this") public Builder withWeight(int weight) { this.weight = weight; return this; } + /** + * Specify a {@link NodeHolder owner} of the built node. + * + * @param owner owner + * @return this builder instance for chaining + */ @Contract("_ -> this") public Builder withOwner(@NotNull NodeHolder owner) { this.owner = owner; return this; } + /** + * Specify a {@link NodeHolder parent} of the built node. + * + * @param inheritedFrom where this node is inherited from + * @return this builder instance for chaining + */ @Contract("_ -> this") public Builder withInheritedFrom(@NotNull NodeHolder inheritedFrom) { this.inherited = true; @@ -192,12 +247,23 @@ public Builder withInheritedFrom(@NotNull NodeHolder inheri return this; } + /** + * Specify a {@link ContextSet context set} for the built node. + * + * @param contextSet the context set of the node + * @return this builder instance for chaining + */ @Contract("_ -> this") public Builder withContextSet(@NotNull ContextSet contextSet) { this.contextSet = contextSet; return this; } + /** + * Builds this builder into the needed node. + * + * @return freshly built node + */ @NotNull public abstract NodeType build(); } diff --git a/api/src/main/java/me/lokka30/treasury/api/permission/node/PermissionNode.java b/api/src/main/java/me/lokka30/treasury/api/permission/node/PermissionNode.java index 93d94816..8b7420c3 100644 --- a/api/src/main/java/me/lokka30/treasury/api/permission/node/PermissionNode.java +++ b/api/src/main/java/me/lokka30/treasury/api/permission/node/PermissionNode.java @@ -77,11 +77,21 @@ public PermissionNodeBuilder(@NotNull PermissionNodeBuilder other) { super(other); } + /** + * {@inheritDoc} + * + * @return {@inheritDoc} + */ @Override public @NotNull Builder copy() { return new PermissionNodeBuilder(this); } + /** + * {@inheritDoc} + * + * @return {@inheritDoc} + */ @Override public @NotNull PermissionNode build() { Objects.requireNonNull(key, "key");