Fix MinecraftChannelIdentifier parsing to align with vanilla (#1552)
This commit is contained in:
@@ -11,7 +11,6 @@ import static com.google.common.base.Preconditions.checkArgument;
|
|||||||
|
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.regex.Pattern;
|
|
||||||
import net.kyori.adventure.key.Key;
|
import net.kyori.adventure.key.Key;
|
||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
|
||||||
@@ -21,8 +20,6 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
|||||||
*/
|
*/
|
||||||
public final class MinecraftChannelIdentifier implements ChannelIdentifier {
|
public final class MinecraftChannelIdentifier implements ChannelIdentifier {
|
||||||
|
|
||||||
private static final Pattern VALID_IDENTIFIER_REGEX = Pattern.compile("[a-z0-9/\\-_]*");
|
|
||||||
|
|
||||||
private final String namespace;
|
private final String namespace;
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
@@ -39,7 +36,7 @@ public final class MinecraftChannelIdentifier implements ChannelIdentifier {
|
|||||||
* @return a new channel identifier
|
* @return a new channel identifier
|
||||||
*/
|
*/
|
||||||
public static MinecraftChannelIdentifier forDefaultNamespace(String name) {
|
public static MinecraftChannelIdentifier forDefaultNamespace(String name) {
|
||||||
return new MinecraftChannelIdentifier("minecraft", name);
|
return new MinecraftChannelIdentifier(Key.MINECRAFT_NAMESPACE, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -52,14 +49,10 @@ public final class MinecraftChannelIdentifier implements ChannelIdentifier {
|
|||||||
public static MinecraftChannelIdentifier create(String namespace, String name) {
|
public static MinecraftChannelIdentifier create(String namespace, String name) {
|
||||||
checkArgument(!Strings.isNullOrEmpty(namespace), "namespace is null or empty");
|
checkArgument(!Strings.isNullOrEmpty(namespace), "namespace is null or empty");
|
||||||
checkArgument(name != null, "namespace is null or empty");
|
checkArgument(name != null, "namespace is null or empty");
|
||||||
checkArgument(VALID_IDENTIFIER_REGEX.matcher(namespace).matches(),
|
checkArgument(Key.parseableNamespace(namespace),
|
||||||
"namespace is not valid, must match: %s got %s",
|
"namespace is not valid, must match: [a-z0-9_.-] got %s", namespace);
|
||||||
VALID_IDENTIFIER_REGEX.toString(),
|
checkArgument(Key.parseableValue(name),
|
||||||
namespace);
|
"name is not valid, must match: [a-z0-9/._-] got %s", name);
|
||||||
checkArgument(VALID_IDENTIFIER_REGEX.matcher(name).matches(),
|
|
||||||
"name is not valid, must match: %s got %s",
|
|
||||||
VALID_IDENTIFIER_REGEX.toString(),
|
|
||||||
name);
|
|
||||||
return new MinecraftChannelIdentifier(namespace, name);
|
return new MinecraftChannelIdentifier(namespace, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,10 +65,9 @@ public final class MinecraftChannelIdentifier implements ChannelIdentifier {
|
|||||||
public static MinecraftChannelIdentifier from(String identifier) {
|
public static MinecraftChannelIdentifier from(String identifier) {
|
||||||
int colonPos = identifier.indexOf(':');
|
int colonPos = identifier.indexOf(':');
|
||||||
if (colonPos == -1) {
|
if (colonPos == -1) {
|
||||||
throw new IllegalArgumentException("Identifier does not contain a colon.");
|
return create(Key.MINECRAFT_NAMESPACE, identifier);
|
||||||
}
|
} else if (colonPos == 0) {
|
||||||
if (colonPos + 1 == identifier.length()) {
|
return create(Key.MINECRAFT_NAMESPACE, identifier.substring(1));
|
||||||
throw new IllegalArgumentException("Identifier is empty.");
|
|
||||||
}
|
}
|
||||||
String namespace = identifier.substring(0, colonPos);
|
String namespace = identifier.substring(0, colonPos);
|
||||||
String name = identifier.substring(colonPos + 1);
|
String name = identifier.substring(colonPos + 1);
|
||||||
|
@@ -47,17 +47,25 @@ class MinecraftChannelIdentifierTest {
|
|||||||
create("velocity", "test/test2");
|
create("velocity", "test/test2");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void fromIdentifierDefaultNamespace() {
|
||||||
|
assertEquals("minecraft", from("test").getNamespace());
|
||||||
|
assertEquals("minecraft", from(":test").getNamespace());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void fromIdentifierAllowsEmptyName() {
|
||||||
|
from("minecraft:");
|
||||||
|
from(":");
|
||||||
|
from("");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void fromIdentifierThrowsOnBadValues() {
|
void fromIdentifierThrowsOnBadValues() {
|
||||||
assertAll(
|
assertAll(
|
||||||
() -> assertThrows(IllegalArgumentException.class, () -> from("")),
|
|
||||||
() -> assertThrows(IllegalArgumentException.class, () -> from(":")),
|
|
||||||
() -> assertThrows(IllegalArgumentException.class, () -> from(":a")),
|
|
||||||
() -> assertThrows(IllegalArgumentException.class, () -> from("a:")),
|
|
||||||
() -> assertThrows(IllegalArgumentException.class, () -> from("hello:$$$$$$")),
|
() -> assertThrows(IllegalArgumentException.class, () -> from("hello:$$$$$$")),
|
||||||
|
() -> assertThrows(IllegalArgumentException.class, () -> from("he/llo:wor/ld")),
|
||||||
() -> assertThrows(IllegalArgumentException.class, () -> from("hello::"))
|
() -> assertThrows(IllegalArgumentException.class, () -> from("hello::"))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
Reference in New Issue
Block a user