From 69ca58d0dba6c3ae547dfbd8ae38d464a09b23c6 Mon Sep 17 00:00:00 2001 From: Alex Palaistras Date: Sat, 8 Dec 2018 19:45:02 +0000 Subject: [PATCH] xmpp-addr: Backfill missing class method for Java 1.7 This backfills missing class methods for `java.nio.charset.StandardCharsets` and `java.util.Objects` for compatibility with platforms which do not support these (mainly Android SDK versions <= 18). --- .../java/rocks/xmpp/addr/AbstractJid.java | 10 ++--- .../main/java/rocks/xmpp/addr/FullJid.java | 37 +++++++++++++------ .../java/rocks/xmpp/addr/MalformedJid.java | 7 ++-- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/libs/xmpp-addr/src/main/java/rocks/xmpp/addr/AbstractJid.java b/libs/xmpp-addr/src/main/java/rocks/xmpp/addr/AbstractJid.java index 5b286a717..963c3a491 100644 --- a/libs/xmpp-addr/src/main/java/rocks/xmpp/addr/AbstractJid.java +++ b/libs/xmpp-addr/src/main/java/rocks/xmpp/addr/AbstractJid.java @@ -25,7 +25,7 @@ package rocks.xmpp.addr; import java.text.Collator; -import java.util.Objects; +import java.util.Arrays; /** * Abstract Jid implementation for both full and bare JIDs. @@ -75,14 +75,14 @@ abstract class AbstractJid implements Jid { } Jid other = (Jid) o; - return Objects.equals(getLocal(), other.getLocal()) - && Objects.equals(getDomain(), other.getDomain()) - && Objects.equals(getResource(), other.getResource()); + return (getLocal() == other.getLocal() || getLocal() != null && getLocal().equals(other.getLocal())) + && (getDomain() == other.getDomain() || getDomain() != null && getDomain().equals(other.getDomain())) + && (getResource() == other.getResource() || getResource() != null && getResource().equals(other.getResource())); } @Override public final int hashCode() { - return Objects.hash(getLocal(), getDomain(), getResource()); + return Arrays.hashCode(new String[]{getLocal(), getDomain(), getResource()}); } /** diff --git a/libs/xmpp-addr/src/main/java/rocks/xmpp/addr/FullJid.java b/libs/xmpp-addr/src/main/java/rocks/xmpp/addr/FullJid.java index 2fcda3c42..24130fd1b 100644 --- a/libs/xmpp-addr/src/main/java/rocks/xmpp/addr/FullJid.java +++ b/libs/xmpp-addr/src/main/java/rocks/xmpp/addr/FullJid.java @@ -29,10 +29,9 @@ import rocks.xmpp.precis.PrecisProfiles; import rocks.xmpp.util.cache.LruCache; import java.net.IDN; -import java.nio.charset.StandardCharsets; +import java.nio.charset.Charset; import java.text.Normalizer; import java.util.Map; -import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -109,6 +108,10 @@ final class FullJid extends AbstractJid { final String unescapedLocalPart; + if (domain == null) { + throw new NullPointerException(); + } + if (doUnescape) { unescapedLocalPart = unescape(local); } else { @@ -126,7 +129,7 @@ final class FullJid extends AbstractJid { // character MUST be stripped before any other canonicalization steps // are taken. // Also validate, that the domain name can be converted to ASCII, i.e. validate the domain name (e.g. must not start with "_"). - final String strDomain = IDN.toASCII(LABEL_SEPARATOR_FINAL.matcher(Objects.requireNonNull(domain)).replaceAll(""), IDN.USE_STD3_ASCII_RULES); + final String strDomain = IDN.toASCII(LABEL_SEPARATOR_FINAL.matcher(domain).replaceAll(""), IDN.USE_STD3_ASCII_RULES); enforcedLocalPart = escapedLocalPart != null ? PrecisProfiles.USERNAME_CASE_MAPPED.enforce(escapedLocalPart) : null; enforcedResource = resource != null ? PrecisProfiles.OPAQUE_STRING.enforce(resource) : null; // See https://tools.ietf.org/html/rfc5895#section-2 @@ -152,7 +155,7 @@ final class FullJid extends AbstractJid { @Override public Jid withLocal(CharSequence local) { - if (Objects.equals(local, this.getLocal())) { + if (local == this.getLocal() || local != null && local.equals(this.getLocal())) { return this; } return new FullJid(local, getDomain(), getResource(), false, null); @@ -160,7 +163,7 @@ final class FullJid extends AbstractJid { @Override public Jid withResource(CharSequence resource) { - if (Objects.equals(resource, this.getResource())) { + if (resource == this.getResource() || resource != null && resource.equals(this.getResource())) { return this; } return new FullJid(getLocal(), getDomain(), resource, false, asBareJid()); @@ -168,7 +171,10 @@ final class FullJid extends AbstractJid { @Override public Jid atSubdomain(CharSequence subdomain) { - return new FullJid(getLocal(), Objects.requireNonNull(subdomain) + "." + getDomain(), getResource(), false, null); + if (subdomain == null) { + throw new NullPointerException(); + } + return new FullJid(getLocal(), subdomain + "." + getDomain(), getResource(), false, null); } @Override @@ -206,7 +212,9 @@ final class FullJid extends AbstractJid { * @see XEP-0106: JID Escaping */ static Jid of(String jid, final boolean doUnescape) { - Objects.requireNonNull(jid, "jid must not be null."); + if (jid == null) { + throw new NullPointerException("jid must not be null."); + } jid = jid.trim(); @@ -278,7 +286,9 @@ final class FullJid extends AbstractJid { } private static void validateDomain(String domain) { - Objects.requireNonNull(domain, "domain must not be null."); + if (domain == null) { + throw new NullPointerException("domain must not be null."); + } if (domain.contains("@")) { // Prevent misuse of API. throw new IllegalArgumentException("domain must not contain a '@' sign"); @@ -297,7 +307,7 @@ final class FullJid extends AbstractJid { if (value.length() == 0) { throw new IllegalArgumentException(part + " must not be empty."); } - if (value.toString().getBytes(StandardCharsets.UTF_8).length > 1023) { + if (value.toString().getBytes(Charset.forName("UTF-8")).length > 1023) { throw new IllegalArgumentException(part + " must not be greater than 1023 bytes."); } } @@ -391,7 +401,7 @@ final class FullJid extends AbstractJid { */ @Override public final Jid withLocal(CharSequence local) { - if (Objects.equals(local, this.getLocal())) { + if (local == this.getLocal() || local != null && local.equals(this.getLocal())) { return this; } return new FullJid(local, getDomain(), getResource(), false, null); @@ -408,7 +418,7 @@ final class FullJid extends AbstractJid { */ @Override public final Jid withResource(CharSequence resource) { - if (Objects.equals(resource, this.getResource())) { + if (resource == this.getResource() || resource != null && resource.equals(this.getResource())) { return this; } return new FullJid(getLocal(), getDomain(), resource, false, asBareJid()); @@ -424,7 +434,10 @@ final class FullJid extends AbstractJid { */ @Override public final Jid atSubdomain(CharSequence subdomain) { - return new FullJid(getLocal(), Objects.requireNonNull(subdomain) + "." + getDomain(), getResource(), false, null); + if (subdomain != null) { + throw new NullPointerException(); + } + return new FullJid(getLocal(), subdomain + "." + getDomain(), getResource(), false, null); } /** diff --git a/libs/xmpp-addr/src/main/java/rocks/xmpp/addr/MalformedJid.java b/libs/xmpp-addr/src/main/java/rocks/xmpp/addr/MalformedJid.java index ae99af7c0..f8605bfc1 100644 --- a/libs/xmpp-addr/src/main/java/rocks/xmpp/addr/MalformedJid.java +++ b/libs/xmpp-addr/src/main/java/rocks/xmpp/addr/MalformedJid.java @@ -24,8 +24,6 @@ package rocks.xmpp.addr; -import java.util.Objects; - /** * Represents a malformed JID in order to handle the jid-malformed error. *

@@ -96,7 +94,10 @@ public final class MalformedJid extends AbstractJid { @Override public Jid atSubdomain(CharSequence subdomain) { - return new MalformedJid(localPart, Objects.requireNonNull(subdomain) + "." + domainPart, resourcePart, cause); + if (subdomain == null) { + throw new NullPointerException(); + } + return new MalformedJid(localPart, subdomain + "." + domainPart, resourcePart, cause); } @Override