package com.xabber.android.data.entity;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import com.xabber.android.data.log.LogManager;
import org.jxmpp.jid.BareJid;
import org.jxmpp.jid.Jid;
import org.jxmpp.jid.impl.JidCreate;
import org.jxmpp.stringprep.XmppStringprepException;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class UserJid implements Comparable<UserJid>, Parcelable {
private static final String LOG_TAG = UserJid.class.getSimpleName();
public static class UserJidCreateException extends IOException {
}
private final @NonNull Jid jid;
private static int counter = 0;
private static Map<Jid, WeakReference<UserJid>> instances = new ConcurrentHashMap<>();
public static @NonNull UserJid from(@Nullable String string) throws UserJidCreateException {
if (TextUtils.isEmpty(string)) {
throw new UserJidCreateException();
}
Jid jid;
try {
jid = JidCreate.from(string);
} catch (XmppStringprepException e) {
throw new UserJidCreateException();
}
return from(jid);
}
public static @NonNull UserJid from(@Nullable Jid jid) throws UserJidCreateException {
if (jid == null || jid.asBareJid() == null) {
throw new UserJidCreateException();
}
return getUserJid(jid);
}
private static UserJid getUserJid(@NonNull Jid jid) {
WeakReference<UserJid> userJidWeakReference = instances.get(jid);
if (userJidWeakReference != null && userJidWeakReference.get() != null) {
return userJidWeakReference.get();
} else {
UserJid newUserJid = new UserJid(jid);
instances.put(jid, new WeakReference<>(newUserJid));
return newUserJid;
}
}
private UserJid(@NonNull Jid jid) {
this.jid = jid;
counter++;
}
public @NonNull Jid getJid() {
return jid;
}
public @NonNull BareJid getBareJid() {
return jid.asBareJid();
}
public @NonNull UserJid getBareUserJid() {
return getUserJid(jid.asBareJid());
}
@Override
public int compareTo(@NonNull UserJid another) {
return this.getJid().compareTo(another.getJid());
}
@Override
public boolean equals(Object o) {
if (o != null && o instanceof UserJid) {
return getJid().equals(((UserJid) o).getJid());
} else {
return false;
}
}
public boolean equals(Jid jid) {
return jid != null && getJid().equals(jid);
}
@Override
public int hashCode() {
return getJid().hashCode();
}
@Override
public String toString() {
return getJid().toString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(jid.toString());
}
public static final Parcelable.Creator<UserJid> CREATOR = new Parcelable.Creator<UserJid>() {
@Override
public UserJid createFromParcel(Parcel parcel) {
try {
return UserJid.from(parcel.readString());
} catch (UserJidCreateException e) {
LogManager.exception(this, e);
return null;
}
}
@Override
public UserJid[] newArray(int size) {
return new UserJid[size];
}
};
}