package com.vaguehope.onosendai.config; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONTokener; import com.vaguehope.onosendai.util.EqualHelper; import com.vaguehope.onosendai.util.StringHelper; import com.vaguehope.onosendai.util.Titleable; public class Account implements Titleable { private static final String KEY_ID = "id"; private static final String KEY_TITLE = "title"; private static final String KEY_PROVIDER = "provider"; private static final String KEY_USERNAME = "username"; private static final String KEY_PASSWORD = "password"; private static final String KEY_CONSUMER_KEY = "consumerKey"; private static final String KEY_CONSUMER_SECRET = "consumerSecret"; private static final String KEY_ACCESS_TOKEN = "accessToken"; private static final String KEY_ACCESS_SECRET = "accessSecret"; private final String id; private final String title; private final AccountProvider provider; private final String consumerKey; private final String consumerSecret; private final String accessToken; private final String accessSecret; public Account (final String id, final String title, final AccountProvider provider, final String consumerKey, final String consumerSecret, final String accessToken, final String accessSecret) { this.id = id; this.title = title; this.provider = provider; this.consumerKey = consumerKey; this.consumerSecret = consumerSecret; this.accessToken = accessToken; this.accessSecret = accessSecret; } @Override public String getUiTitle () { if (this.title != null && !this.title.isEmpty()) { return String.format("%s (%s)", this.title, this.provider.getUiTitle()); } return String.format("%s (%s)", this.provider.getUiTitle(), this.id); } @Override public String toString () { final StringBuilder s = new StringBuilder(); s.append("Account{").append(this.id) .append(",").append(this.provider) .append("}"); return s.toString(); } @Override public int hashCode () { final int prime = 31; int result = 1; result = prime * result + ((this.id == null) ? 0 : this.id.hashCode()); result = prime * result + ((this.title == null) ? 0 : this.title.hashCode()); result = prime * result + ((this.provider == null) ? 0 : this.provider.hashCode()); result = prime * result + ((this.consumerKey == null) ? 0 : this.consumerKey.hashCode()); result = prime * result + ((this.consumerSecret == null) ? 0 : this.consumerSecret.hashCode()); result = prime * result + ((this.accessToken == null) ? 0 : this.accessToken.hashCode()); result = prime * result + ((this.accessSecret == null) ? 0 : this.accessSecret.hashCode()); return result; } @Override public boolean equals (final Object o) { if (o == null) return false; if (o == this) return true; if (!(o instanceof Account)) return false; final Account that = (Account) o; return EqualHelper.equal(this.id, that.id) && EqualHelper.equal(this.title, that.title) && EqualHelper.equal(this.provider, that.provider) && EqualHelper.equal(this.consumerKey, that.consumerKey) && EqualHelper.equal(this.consumerSecret, that.consumerSecret) && EqualHelper.equal(this.accessToken, that.accessToken) && EqualHelper.equal(this.accessSecret, that.accessSecret); } public String getId () { return this.id; } public String getTitle () { return this.title; } public AccountProvider getProvider () { return this.provider; } public String getConsumerKey () { return this.consumerKey; } public String getConsumerSecret () { return this.consumerSecret; } /** * Also used for username. */ public String getAccessToken () { return this.accessToken; } /** * Also used for password. */ public String getAccessSecret () { return this.accessSecret; } public Account withoutSecrets () { return new Account(this.id, this.title, this.provider, this.consumerKey, null, this.provider == AccountProvider.BUFFER ? null : this.accessToken, null); } public boolean hasSecrets () { switch (this.provider) { case TWITTER: return !StringHelper.isEmpty(this.consumerSecret) && !StringHelper.isEmpty(this.accessSecret); case SUCCESSWHALE: case INSTAPAPER: case HOSAKA: return !StringHelper.isEmpty(this.accessSecret); case BUFFER: return !StringHelper.isEmpty(this.accessToken); default: throw new IllegalArgumentException("Unsupported account provilder: " + this.provider); } } public JSONObject toJson () throws JSONException { final JSONObject json = new JSONObject(); json.put(KEY_ID, this.id); json.put(KEY_TITLE, this.title); json.put(KEY_PROVIDER, String.valueOf(this.provider)); switch (this.provider) { case TWITTER: json.put(KEY_CONSUMER_KEY, this.consumerKey); json.put(KEY_CONSUMER_SECRET, this.consumerSecret); json.put(KEY_ACCESS_TOKEN, this.accessToken); json.put(KEY_ACCESS_SECRET, this.accessSecret); break; case SUCCESSWHALE: case INSTAPAPER: case HOSAKA: json.put(KEY_USERNAME, this.accessToken); json.put(KEY_PASSWORD, this.accessSecret); break; case BUFFER: json.put(KEY_ACCESS_TOKEN, this.accessToken); break; default: throw new IllegalArgumentException("Unsupported account provilder: " + this.provider); } return json; } public static Account parseJson (final String json) throws JSONException { if (json == null) return null; return parseJson((JSONObject) new JSONTokener(json).nextValue()); } public static Account parseJson (final JSONObject json) throws JSONException { if (json == null) return null; final String id = json.getString(KEY_ID); final AccountProvider provider = AccountProvider.parse(json.getString(KEY_PROVIDER)); Account account; switch (provider) { case TWITTER: account = parseTwitterAccount(json, id); break; case SUCCESSWHALE: account = parseUsernamePasswordLikeAccount(json, id, AccountProvider.SUCCESSWHALE); break; case INSTAPAPER: account = parseUsernamePasswordLikeAccount(json, id, AccountProvider.INSTAPAPER); break; case HOSAKA: account = parseUsernamePasswordLikeAccount(json, id, AccountProvider.HOSAKA); break; case BUFFER: account = parseBufferAccount(json, id); break; default: throw new IllegalArgumentException("Unknown provider: " + provider); } return account; } private static Account parseTwitterAccount (final JSONObject accountJson, final String id) throws JSONException { final String title = accountJson.optString(KEY_TITLE, null); final String consumerKey = accountJson.getString(KEY_CONSUMER_KEY); final String consumerSecret = accountJson.optString(KEY_CONSUMER_SECRET); final String accessToken = accountJson.getString(KEY_ACCESS_TOKEN); final String accessSecret = accountJson.optString(KEY_ACCESS_SECRET); return new Account(id, title, AccountProvider.TWITTER, consumerKey, consumerSecret, accessToken, accessSecret); } private static Account parseUsernamePasswordLikeAccount (final JSONObject accountJson, final String id, final AccountProvider provider) throws JSONException { final String accessToken = accountJson.getString(KEY_USERNAME); final String accessSecret = accountJson.optString(KEY_PASSWORD); final String title = accountJson.optString(KEY_TITLE, accessToken); return new Account(id, title, provider, null, null, accessToken, accessSecret); } private static Account parseBufferAccount (final JSONObject accountJson, final String id) { final String title = accountJson.optString(KEY_TITLE, null); final String accessToken = accountJson.optString(KEY_ACCESS_TOKEN); return new Account(id, title, AccountProvider.BUFFER, null, null, accessToken, null); } }