From e2ff5ecb0c2de672fa99e337c136e21f4a6b2737 Mon Sep 17 00:00:00 2001 From: Space Walker Date: Thu, 1 Oct 2026 13:06:17 +0200 Subject: [PATCH 1/3] [core] expand identifier with namespaced() and subidentifier() methods --- .../core/impl/mixin/common/IdentifierMixin.java | 15 +++++++++++++++ .../core/impl/util/IdentifierExtensionImpl.java | 15 +++++++++++++++ .../core/impl/mixin/client/IdentifierMixin.java | 15 +++++++++++++++ .../core/impl/util/IdentifierExtensionImpl.java | 15 +++++++++++++++ .../osl/core/api/util/NamespacedIdentifier.java | 15 +++++++++++++++ .../core/impl/util/NamespacedIdentifierImpl.java | 15 +++++++++++++++ 6 files changed, 90 insertions(+) diff --git a/libraries/core/core-mc14w27a-mc1.14.4/src/main/java/net/ornithemc/osl/core/impl/mixin/common/IdentifierMixin.java b/libraries/core/core-mc14w27a-mc1.14.4/src/main/java/net/ornithemc/osl/core/impl/mixin/common/IdentifierMixin.java index fd9ba7781..15fef2885 100644 --- a/libraries/core/core-mc14w27a-mc1.14.4/src/main/java/net/ornithemc/osl/core/impl/mixin/common/IdentifierMixin.java +++ b/libraries/core/core-mc14w27a-mc1.14.4/src/main/java/net/ornithemc/osl/core/impl/mixin/common/IdentifierMixin.java @@ -43,6 +43,11 @@ public String identifier() { return path; } + @Override + public Identifier namespaced(String namespace) { + return new Identifier(namespace, path); + } + @Override public Identifier prefixed(String prefix) { return new Identifier(namespace, prefix + path); @@ -52,4 +57,14 @@ public Identifier prefixed(String prefix) { public Identifier suffixed(String suffix) { return new Identifier(namespace, path + suffix); } + + @Override + public Identifier subidentifier(int beginIndex) { + return new Identifier(namespace, path.substring(beginIndex)); + } + + @Override + public Identifier subidentifier(int beginIndex, int endIndex) { + return new Identifier(namespace, path.substring(beginIndex, endIndex)); + } } diff --git a/libraries/core/core-mc14w27a-mc1.14.4/src/main/java/net/ornithemc/osl/core/impl/util/IdentifierExtensionImpl.java b/libraries/core/core-mc14w27a-mc1.14.4/src/main/java/net/ornithemc/osl/core/impl/util/IdentifierExtensionImpl.java index fdd50f999..e6174de75 100644 --- a/libraries/core/core-mc14w27a-mc1.14.4/src/main/java/net/ornithemc/osl/core/impl/util/IdentifierExtensionImpl.java +++ b/libraries/core/core-mc14w27a-mc1.14.4/src/main/java/net/ornithemc/osl/core/impl/util/IdentifierExtensionImpl.java @@ -16,6 +16,11 @@ default String identifier() { throw new AbstractMethodError(); } + @Override + default Identifier namespaced(String namespace) { + throw new AbstractMethodError(); + } + @Override default Identifier prefixed(String prefix) { throw new AbstractMethodError(); @@ -25,4 +30,14 @@ default Identifier prefixed(String prefix) { default Identifier suffixed(String suffix) { throw new AbstractMethodError(); } + + @Override + default Identifier subidentifier(int beginIndex) { + throw new AbstractMethodError(); + } + + @Override + default Identifier subidentifier(int beginIndex, int endIndex) { + throw new AbstractMethodError(); + } } diff --git a/libraries/core/core-mca1.0.1_01-mc14w26c/src/main/java/net/ornithemc/osl/core/impl/mixin/client/IdentifierMixin.java b/libraries/core/core-mca1.0.1_01-mc14w26c/src/main/java/net/ornithemc/osl/core/impl/mixin/client/IdentifierMixin.java index 3c02a22e0..3745a469c 100644 --- a/libraries/core/core-mca1.0.1_01-mc14w26c/src/main/java/net/ornithemc/osl/core/impl/mixin/client/IdentifierMixin.java +++ b/libraries/core/core-mca1.0.1_01-mc14w26c/src/main/java/net/ornithemc/osl/core/impl/mixin/client/IdentifierMixin.java @@ -47,6 +47,11 @@ public String identifier() { return path; } + @Override + public Identifier namespaced(String namespace) { + return new Identifier(namespace, path); + } + @Override public Identifier prefixed(String prefix) { return new Identifier(namespace, prefix + path); @@ -56,4 +61,14 @@ public Identifier prefixed(String prefix) { public Identifier suffixed(String suffix) { return new Identifier(namespace, path + suffix); } + + @Override + public Identifier subidentifier(int beginIndex) { + return new Identifier(namespace, path.substring(beginIndex)); + } + + @Override + public Identifier subidentifier(int beginIndex, int endIndex) { + return new Identifier(namespace, path.substring(beginIndex, endIndex)); + } } diff --git a/libraries/core/core-mca1.0.1_01-mc14w26c/src/main/java/net/ornithemc/osl/core/impl/util/IdentifierExtensionImpl.java b/libraries/core/core-mca1.0.1_01-mc14w26c/src/main/java/net/ornithemc/osl/core/impl/util/IdentifierExtensionImpl.java index 5822351c6..b088d4720 100644 --- a/libraries/core/core-mca1.0.1_01-mc14w26c/src/main/java/net/ornithemc/osl/core/impl/util/IdentifierExtensionImpl.java +++ b/libraries/core/core-mca1.0.1_01-mc14w26c/src/main/java/net/ornithemc/osl/core/impl/util/IdentifierExtensionImpl.java @@ -16,6 +16,11 @@ default String identifier() { throw new AbstractMethodError(); } + @Override + default Identifier namespaced(String namespace) { + throw new AbstractMethodError(); + } + @Override default Identifier prefixed(String prefix) { throw new AbstractMethodError(); @@ -25,4 +30,14 @@ default Identifier prefixed(String prefix) { default Identifier suffixed(String suffix) { throw new AbstractMethodError(); } + + @Override + default Identifier subidentifier(int beginIndex) { + throw new AbstractMethodError(); + } + + @Override + default Identifier subidentifier(int beginIndex, int endIndex) { + throw new AbstractMethodError(); + } } diff --git a/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifier.java b/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifier.java index 8871125b5..dfdc98600 100644 --- a/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifier.java +++ b/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifier.java @@ -35,6 +35,11 @@ public interface NamespacedIdentifier { */ String identifier(); + /** + * @return a copy of this {@code NamespacedIdentifier} with the given namespace. + */ + NamespacedIdentifier namespaced(String namespace); + /** * @return a copy of this {@code NamespacedIdentifier} with the given prefix. */ @@ -45,4 +50,14 @@ public interface NamespacedIdentifier { */ NamespacedIdentifier suffixed(String suffix); + /** + * @return a copy of this {@code NamespacedIdentifier} that is a subidentifier of this identifier. + */ + NamespacedIdentifier subidentifier(int beginIndex); + + /** + * @return a copy of this {@code NamespacedIdentifier} that is a subidentifier of this identifier. + */ + NamespacedIdentifier subidentifier(int beginIndex, int endIndex); + } diff --git a/libraries/core/src/main/java/net/ornithemc/osl/core/impl/util/NamespacedIdentifierImpl.java b/libraries/core/src/main/java/net/ornithemc/osl/core/impl/util/NamespacedIdentifierImpl.java index 9080f4152..5d422ef79 100644 --- a/libraries/core/src/main/java/net/ornithemc/osl/core/impl/util/NamespacedIdentifierImpl.java +++ b/libraries/core/src/main/java/net/ornithemc/osl/core/impl/util/NamespacedIdentifierImpl.java @@ -55,6 +55,11 @@ public String identifier() { return identifier; } + @Override + public NamespacedIdentifier namespaced(String namespace) { + return new NamespacedIdentifierImpl(namespace, identifier); + } + @Override public NamespacedIdentifier prefixed(String prefix) { return new NamespacedIdentifierImpl(namespace, prefix + identifier); @@ -64,4 +69,14 @@ public NamespacedIdentifier prefixed(String prefix) { public NamespacedIdentifier suffixed(String suffix) { return new NamespacedIdentifierImpl(namespace, identifier + suffix); } + + @Override + public NamespacedIdentifier subidentifier(int beginIndex) { + return new NamespacedIdentifierImpl(namespace, identifier.substring(beginIndex)); + } + + @Override + public NamespacedIdentifier subidentifier(int beginIndex, int endIndex) { + return new NamespacedIdentifierImpl(namespace, identifier.substring(beginIndex, endIndex)); + } } From 7625b8d7ce338845c6a8c04f2192ec94e3e56401 Mon Sep 17 00:00:00 2001 From: Space Walker Date: Tue, 22 Sep 2026 17:09:41 +0200 Subject: [PATCH 2/3] [core] compare string-separators for identifiers --- .../osl/core/api/util/NamespacedIdentifier.java | 9 ++++++++- .../osl/core/api/util/NamespacedIdentifiers.java | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifier.java b/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifier.java index dfdc98600..c6054addd 100644 --- a/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifier.java +++ b/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifier.java @@ -23,7 +23,14 @@ public interface NamespacedIdentifier { * The separator between the namespace and identifier in the {@code String} * representation of a {@code NamespacedIdentifier}. */ - static char SEPARATOR = ':'; + char SEPARATOR = ':'; + + /** + * @return the separator for the {@linkplain String}-representation of this {@code NamespacedIdentifier}. + */ + default char separator() { + return SEPARATOR; + } /** * @return the namespace of this {@code NamespacedIdentifier}. diff --git a/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifiers.java b/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifiers.java index 75b4a1b3a..9e37e41c5 100644 --- a/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifiers.java +++ b/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifiers.java @@ -141,6 +141,6 @@ public static String validateIdentifier(String identifier) { } public static boolean equals(NamespacedIdentifier a, NamespacedIdentifier b) { - return a.namespace().equals(b.namespace()) && a.identifier().equals(b.identifier()); + return a.separator() == b.separator() && a.namespace().equals(b.namespace()) && a.identifier().equals(b.identifier()); } } From 130adb17298ae5ad0a7754386909ce1bd5babf32 Mon Sep 17 00:00:00 2001 From: Space Walker Date: Sun, 18 Oct 2026 10:40:18 +0200 Subject: [PATCH 3/3] [core] add validation check methods to NamespacedIdentifiers --- .../core/api/util/NamespacedIdentifiers.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifiers.java b/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifiers.java index 9e37e41c5..77e96a428 100644 --- a/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifiers.java +++ b/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifiers.java @@ -140,6 +140,36 @@ public static String validateIdentifier(String identifier) { return identifier; } + /** + * @return whether the given {@linkplain NamespacedIdentifier} is valid. + */ + public static boolean isValid(NamespacedIdentifier identifier) { + return isValidNamespace(identifier.namespace()) && isValidIdentifier(identifier.identifier()); + } + + /** + * @return whether the given {@linkplain String} is a valid namespace. + */ + public static boolean isValidNamespace(String namespace) { + return namespace != null && !namespace.isEmpty() + && namespace.chars().allMatch(chr -> chr == '-' || chr == '.' || chr == '_' || (chr >= 'a' && chr <= 'z') || (chr >= '0' && chr <= '9')); + } + + /** + * @return whether the given {@linkplain String} is a valid identifier. + */ + public static boolean isValidIdentifier(String identifier) { + return identifier != null && !identifier.isEmpty() + && identifier.chars().allMatch(chr -> chr == '-' || chr == '.' || chr == '_' || chr == '/' || (chr >= 'a' && chr <= 'z') || (chr >= '0' && chr <= '9')); + } + + /** + * @return whether the given character is allowed in a {@linkplain NamespacedIdentifier} + */ + public static boolean isCharAllowed(int chr) { + return (chr == ':' || chr == '-' || chr == '.' || chr == '_' || chr == '/' || (chr >= 'a' && chr <= 'z') || (chr >= '0' && chr <= '9')); + } + public static boolean equals(NamespacedIdentifier a, NamespacedIdentifier b) { return a.separator() == b.separator() && a.namespace().equals(b.namespace()) && a.identifier().equals(b.identifier()); }