diff --git a/api/pom.xml b/api/pom.xml
index c5d10af0b..4ad4fcb9b 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.0-SNAPSHOT
+ 4.1-SNAPSHOT
4.0.0
diff --git a/api/src/main/java/me/lucko/luckperms/api/Node.java b/api/src/main/java/me/lucko/luckperms/api/Node.java
index f6bb02d7e..b845853e7 100644
--- a/api/src/main/java/me/lucko/luckperms/api/Node.java
+++ b/api/src/main/java/me/lucko/luckperms/api/Node.java
@@ -32,22 +32,59 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
+import java.util.stream.Stream;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
/**
- * Represents a permission node.
+ * Represents a LuckPerms "node".
*
- *
All implementations of this interface must be immutable.
+ * The {@link Node} class encapsulates more than just permission assignments.
+ * Nodes are used to store data about inherited groups, as well as assigned
+ * prefixes, suffixes and meta values.
*
- * Use the {@link NodeFactory} to obtain and construct instances.
+ * Combining these various states into one object (a "node") means that a
+ * holder only has to have one type of data set (a set of nodes) in order to
+ * take on various properties.
*
+ * It is recommended that users of the API make use of {@link Stream}s
+ * to manipulate data and obtain the required information.
+ *
+ * This interface provides a number of methods to read the attributes of the
+ * node, as well as methods to query and extract additional state and properties
+ * from these settings.
+ *
+ * Nodes have the following attributes:
+ *
+ *
+ * - {@link #getPermission() permission} - the actual permission string
+ * - {@link #getValuePrimitive() value} - the value of the node (false for negated)
+ * - {@link #isOverride() override} - if the node is marked as having special priority over other nodes
+ * - {@link #getServer() server} - the specific server where this node should apply
+ * - {@link #getWorld() world} - the specific world where this node should apply
+ * - {@link #getContexts() context} - the additional contexts required for this node to apply
+ * - {@link #getExpiry() expiry} - the time when this node should expire
+ *
+ *
+ * Nodes can also fall into the following sub categories.
+ *
+ *
+ * - normal - just a regular permission
+ * - {@link #isGroupNode() group node} - a "group node" marks that the holder should inherit data from another group
+ * - {@link #isPrefix() prefix} - represents an assigned prefix
+ * - {@link #isSuffix() suffix} - represents an assigned suffix
+ * - {@link #isMeta() meta} - represents an assigned meta option
+ *
+ *
+ * The core node state must be immutable in all implementations.
+ *
+ * @see NodeFactory for obtaining and constructing instances.
* @since 2.6
*/
@Immutable
-public interface Node extends Map.Entry {
+public interface Node {
/**
* Gets the permission string
@@ -64,7 +101,6 @@ public interface Node extends Map.Entry {
*
* @return the permission's value
*/
- @Override
@Nonnull
default Boolean getValue() {
return getValuePrimitive();
@@ -394,6 +430,15 @@ public interface Node extends Map.Entry {
return equals(other, StandardNodeEquality.IGNORE_VALUE_OR_IF_TEMPORARY);
}
+ /**
+ * Constructs a new builder initially containing the current properties of
+ * this node.
+ *
+ * @return a new builder
+ * @since 4.1
+ */
+ Builder toBuilder();
+
/**
* Builds a Node instance
*/
diff --git a/bukkit/pom.xml b/bukkit/pom.xml
index cbe9bc382..1c5bda5ad 100644
--- a/bukkit/pom.xml
+++ b/bukkit/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.0-SNAPSHOT
+ 4.1-SNAPSHOT
4.0.0
diff --git a/bungee/pom.xml b/bungee/pom.xml
index 3ea490153..f02996a3e 100644
--- a/bungee/pom.xml
+++ b/bungee/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.0-SNAPSHOT
+ 4.1-SNAPSHOT
4.0.0
diff --git a/common/pom.xml b/common/pom.xml
index a1347597a..086c8301f 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.0-SNAPSHOT
+ 4.1-SNAPSHOT
4.0.0
diff --git a/common/src/main/java/me/lucko/luckperms/common/api/delegates/misc/ApiNodeFactory.java b/common/src/main/java/me/lucko/luckperms/common/api/delegates/misc/ApiNodeFactory.java
index 0614d327d..bc457ea9f 100644
--- a/common/src/main/java/me/lucko/luckperms/common/api/delegates/misc/ApiNodeFactory.java
+++ b/common/src/main/java/me/lucko/luckperms/common/api/delegates/misc/ApiNodeFactory.java
@@ -52,8 +52,7 @@ public final class ApiNodeFactory implements me.lucko.luckperms.api.NodeFactory
@Nonnull
@Override
public Node.Builder newBuilderFromExisting(@Nonnull Node other) {
- Objects.requireNonNull(other, "other");
- return NodeFactory.builder(other);
+ return Objects.requireNonNull(other, "other").toBuilder();
}
@Nonnull
diff --git a/common/src/main/java/me/lucko/luckperms/common/api/delegates/misc/ApiPlatformInfo.java b/common/src/main/java/me/lucko/luckperms/common/api/delegates/misc/ApiPlatformInfo.java
index a0a66ca3f..068a8ad16 100644
--- a/common/src/main/java/me/lucko/luckperms/common/api/delegates/misc/ApiPlatformInfo.java
+++ b/common/src/main/java/me/lucko/luckperms/common/api/delegates/misc/ApiPlatformInfo.java
@@ -50,7 +50,7 @@ public class ApiPlatformInfo implements PlatformInfo {
@Override
public double getApiVersion() {
- return 4.0;
+ return 4.1;
}
@Nonnull
diff --git a/common/src/main/java/me/lucko/luckperms/common/locale/CommandSpec.java b/common/src/main/java/me/lucko/luckperms/common/locale/CommandSpec.java
index 07bfc8dde..dde85bdc4 100644
--- a/common/src/main/java/me/lucko/luckperms/common/locale/CommandSpec.java
+++ b/common/src/main/java/me/lucko/luckperms/common/locale/CommandSpec.java
@@ -55,7 +55,7 @@ public enum CommandSpec {
)
),
DEBUG("Produce debugging output", "/%s debug"),
- VERBOSE("Manage verbose permission checking", "/%s verbose [filter]",
+ VERBOSE("Manage verbose permission checking", "/%s verbose [filter]",
Arg.list(
Arg.create("on|record|off|paste", true, "whether to enable/disable logging, or to paste the logged output"),
Arg.create("filter", false, "the filter to match entries against")
diff --git a/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java b/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java
index 4c3928d40..10e37343f 100644
--- a/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java
+++ b/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java
@@ -686,7 +686,7 @@ public abstract class PermissionHolder {
Node previous = existing.get();
// Create a new node with the same properties, but add the expiry dates together
- Node newNode = NodeFactory.builder(node).setExpiry(previous.getExpiryUnixTime() + node.getSecondsTilExpiry()).build();
+ Node newNode = node.toBuilder().setExpiry(previous.getExpiryUnixTime() + node.getSecondsTilExpiry()).build();
// Remove the old node & add the new one.
ImmutableCollection before = getEnduringNodes().values();
diff --git a/common/src/main/java/me/lucko/luckperms/common/node/ForwardingNode.java b/common/src/main/java/me/lucko/luckperms/common/node/ForwardingNode.java
index 74c859b40..18c58d60b 100644
--- a/common/src/main/java/me/lucko/luckperms/common/node/ForwardingNode.java
+++ b/common/src/main/java/me/lucko/luckperms/common/node/ForwardingNode.java
@@ -230,12 +230,7 @@ public abstract class ForwardingNode implements Node {
}
@Override
- public String getKey() {
- return delegate().getKey();
- }
-
- @Override
- public Boolean setValue(Boolean value) {
- return delegate().setValue(value);
+ public Builder toBuilder() {
+ return delegate().toBuilder();
}
}
diff --git a/common/src/main/java/me/lucko/luckperms/common/node/ImmutableNode.java b/common/src/main/java/me/lucko/luckperms/common/node/ImmutableNode.java
index 4b3e3c357..60b027dd0 100644
--- a/common/src/main/java/me/lucko/luckperms/common/node/ImmutableNode.java
+++ b/common/src/main/java/me/lucko/luckperms/common/node/ImmutableNode.java
@@ -162,6 +162,11 @@ public final class ImmutableNode implements Node {
this.hashCode = calculateHashCode();
}
+ @Override
+ public Builder toBuilder() {
+ return new NodeBuilder(this);
+ }
+
@Nonnull
@Override
public String getPermission() {
@@ -443,16 +448,6 @@ public final class ImmutableNode implements Node {
public abstract boolean areEqual(@Nonnull ImmutableNode o1, @Nonnull ImmutableNode o2);
}
- @Override
- public Boolean setValue(Boolean value) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getKey() {
- return getPermission();
- }
-
private static String internString(String s) {
return s == null ? null : s.intern();
}
diff --git a/common/src/main/java/me/lucko/luckperms/common/node/NodeFactory.java b/common/src/main/java/me/lucko/luckperms/common/node/NodeFactory.java
index a55d7838d..a47888bca 100644
--- a/common/src/main/java/me/lucko/luckperms/common/node/NodeFactory.java
+++ b/common/src/main/java/me/lucko/luckperms/common/node/NodeFactory.java
@@ -62,10 +62,6 @@ public final class NodeFactory {
return new NodeBuilder(s);
}
- public static Node.Builder builder(Node other) {
- return new NodeBuilder(other);
- }
-
public static Node.Builder buildGroupNode(String groupName) {
return new NodeBuilder(groupNode(groupName));
}
diff --git a/nukkit/pom.xml b/nukkit/pom.xml
index ad5f48393..ef8a1bb7d 100644
--- a/nukkit/pom.xml
+++ b/nukkit/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.0-SNAPSHOT
+ 4.1-SNAPSHOT
4.0.0
diff --git a/pom.xml b/pom.xml
index 9ffdde9a2..3fd1fb0b4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
me.lucko.luckperms
luckperms
- 4.0-SNAPSHOT
+ 4.1-SNAPSHOT
api
diff --git a/sponge/pom.xml b/sponge/pom.xml
index 0e9e33cbe..b08931a00 100644
--- a/sponge/pom.xml
+++ b/sponge/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.0-SNAPSHOT
+ 4.1-SNAPSHOT
4.0.0
diff --git a/sponge/sponge-service-api6/pom.xml b/sponge/sponge-service-api6/pom.xml
index a2cd24609..edfc024de 100644
--- a/sponge/sponge-service-api6/pom.xml
+++ b/sponge/sponge-service-api6/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.0-SNAPSHOT
+ 4.1-SNAPSHOT
../../pom.xml
4.0.0
diff --git a/sponge/sponge-service-api7/pom.xml b/sponge/sponge-service-api7/pom.xml
index 6576f4661..dd134ae26 100644
--- a/sponge/sponge-service-api7/pom.xml
+++ b/sponge/sponge-service-api7/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.0-SNAPSHOT
+ 4.1-SNAPSHOT
../../pom.xml
4.0.0
diff --git a/sponge/sponge-service/pom.xml b/sponge/sponge-service/pom.xml
index ba12e90dc..dc4cc16a9 100644
--- a/sponge/sponge-service/pom.xml
+++ b/sponge/sponge-service/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.0-SNAPSHOT
+ 4.1-SNAPSHOT
../../pom.xml
4.0.0