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 fd9ba778..15fef288 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 fdd50f99..e6174de7 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 3c02a22e..3745a469 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 5822351c..b088d472 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 8871125b..c6054add 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}. @@ -35,6 +42,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 +57,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/api/util/NamespacedIdentifiers.java b/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/NamespacedIdentifiers.java index 75b4a1b3..77e96a42 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,7 +140,37 @@ 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.namespace().equals(b.namespace()) && a.identifier().equals(b.identifier()); + return a.separator() == b.separator() && a.namespace().equals(b.namespace()) && a.identifier().equals(b.identifier()); } } 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 9080f415..5d422ef7 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)); + } }