package com.xabber.android.data.entity; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; import com.xabber.android.data.log.LogManager; import org.jxmpp.jid.BareJid; import org.jxmpp.jid.DomainBareJid; import org.jxmpp.jid.FullJid; import org.jxmpp.jid.impl.JidCreate; import org.jxmpp.jid.parts.Localpart; import org.jxmpp.jid.parts.Resourcepart; import org.jxmpp.stringprep.XmppStringprepException; import java.io.Serializable; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class AccountJid implements Comparable<AccountJid>, Parcelable, Serializable { private static final String LOG_TAG = AccountJid.class.getSimpleName(); private final @NonNull FullJid fullJid; private static int counter = 0; private static Map<FullJid, AccountJid> instances = new ConcurrentHashMap<>(); public static AccountJid from(Localpart localpart, DomainBareJid domainBareJid, Resourcepart resource) { return getAccountJid(JidCreate.fullFrom(localpart, domainBareJid, resource)); } public static AccountJid from(@NonNull String string) throws XmppStringprepException { return getAccountJid(JidCreate.fullFrom(string)); } private AccountJid(@NonNull FullJid fullJid) { this.fullJid = fullJid; counter++; } private static AccountJid getAccountJid(@NonNull FullJid fullJid) { AccountJid accountJid = instances.get(fullJid); if (accountJid != null) { return accountJid; } else { AccountJid newAccountJid = new AccountJid(fullJid); instances.put(fullJid, newAccountJid); return newAccountJid; } } public @NonNull FullJid getFullJid() { return fullJid; } @Override public int compareTo(@NonNull AccountJid another) { return this.getFullJid().compareTo(another.getFullJid()); } @Override public boolean equals(Object o) { if (o != null && o instanceof AccountJid) { return getFullJid().equals(((AccountJid) o).getFullJid()); } else { return false; } } @Override public int hashCode() { return getFullJid().hashCode(); } @Override public String toString() { return getFullJid().toString(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(fullJid.toString()); } public static final Parcelable.Creator<AccountJid> CREATOR = new Parcelable.Creator<AccountJid>() { @Override public AccountJid createFromParcel(Parcel parcel) { try { return AccountJid.from(parcel.readString()); } catch (XmppStringprepException e) { LogManager.exception(this, e); return null; } } @Override public AccountJid[] newArray(int size) { return new AccountJid[size]; } }; }