/*
* Firetweet - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package twitter4j.internal.json;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Arrays;
import java.util.Date;
import twitter4j.DirectMessage;
import twitter4j.HashtagEntity;
import twitter4j.MediaEntity;
import twitter4j.ResponseList;
import twitter4j.TwitterException;
import twitter4j.URLEntity;
import twitter4j.User;
import twitter4j.UserMentionEntity;
import twitter4j.conf.Configuration;
import twitter4j.http.HttpResponse;
import static twitter4j.internal.util.InternalParseUtil.getDate;
import static twitter4j.internal.util.InternalParseUtil.getLong;
import static twitter4j.internal.util.InternalParseUtil.getRawString;
import static twitter4j.internal.util.InternalParseUtil.getUnescapedString;
/**
* A data class representing sent/received direct message.
*
* @author Yusuke Yamamoto - yusuke at mac.com
*/
/* package */final class DirectMessageJSONImpl extends TwitterResponseImpl implements DirectMessage {
/**
*
*/
private static final long serialVersionUID = 8809144846145143089L;
private long id;
private String text;
private String rawText;
private long senderId;
private long recipientId;
private Date createdAt;
private String senderScreenName;
private String recipientScreenName;
private UserMentionEntity[] userMentionEntities;
private URLEntity[] urlEntities;
private HashtagEntity[] hashtagEntities;
private MediaEntity[] mediaEntities;
private User sender;
private User recipient;
/* package */DirectMessageJSONImpl(final HttpResponse res, final Configuration conf) throws TwitterException {
super(res);
final JSONObject json = res.asJSONObject();
init(json);
}
/* package */DirectMessageJSONImpl(final JSONObject json) throws TwitterException {
init(json);
}
@Override
public boolean equals(final Object obj) {
if (null == obj) return false;
if (this == obj) return true;
return obj instanceof DirectMessage && ((DirectMessage) obj).getId() == id;
}
/**
* {@inheritDoc}
*/
@Override
public Date getCreatedAt() {
return createdAt;
}
@Override
public HashtagEntity[] getHashtagEntities() {
return hashtagEntities;
}
/**
* {@inheritDoc}
*/
@Override
public long getId() {
return id;
}
@Override
public MediaEntity[] getMediaEntities() {
return mediaEntities;
}
@Override
public String getRawText() {
return rawText;
}
/**
* {@inheritDoc}
*/
@Override
public User getRecipient() {
return recipient;
}
/**
* {@inheritDoc}
*/
@Override
public long getRecipientId() {
return recipientId;
}
/**
* {@inheritDoc}
*/
@Override
public String getRecipientScreenName() {
return recipientScreenName;
}
/**
* {@inheritDoc}
*/
@Override
public User getSender() {
return sender;
}
/**
* {@inheritDoc}
*/
@Override
public long getSenderId() {
return senderId;
}
/**
* {@inheritDoc}
*/
@Override
public String getSenderScreenName() {
return senderScreenName;
}
/**
* {@inheritDoc}
*/
@Override
public String getText() {
return text;
}
@Override
public URLEntity[] getURLEntities() {
return urlEntities;
}
@Override
public UserMentionEntity[] getUserMentionEntities() {
return userMentionEntities;
}
@Override
public int hashCode() {
return (int) id;
}
@Override
public String toString() {
return "DirectMessageJSONImpl{" +
"id=" + id +
", text='" + text + '\'' +
", rawText='" + rawText + '\'' +
", senderId=" + senderId +
", recipientId=" + recipientId +
", createdAt=" + createdAt +
", senderScreenName='" + senderScreenName + '\'' +
", recipientScreenName='" + recipientScreenName + '\'' +
", userMentionEntities=" + Arrays.toString(userMentionEntities) +
", urlEntities=" + Arrays.toString(urlEntities) +
", hashtagEntities=" + Arrays.toString(hashtagEntities) +
", mediaEntities=" + Arrays.toString(mediaEntities) +
", sender=" + sender +
", recipient=" + recipient +
'}';
}
private void init(final JSONObject json) throws TwitterException {
id = getLong("id", json);
text = getUnescapedString("text", json);
rawText = getRawString("text", json);
senderId = getLong("sender_id", json);
recipientId = getLong("recipient_id", json);
createdAt = getDate("created_at", json);
senderScreenName = getRawString("sender_screen_name", json);
recipientScreenName = getRawString("recipient_screen_name", json);
if (!json.isNull("entities")) {
try {
final JSONObject entities = json.getJSONObject("entities");
int len;
if (!entities.isNull("user_mentions")) {
final JSONArray userMentionsArray = entities.getJSONArray("user_mentions");
len = userMentionsArray.length();
userMentionEntities = new UserMentionEntity[len];
for (int i = 0; i < len; i++) {
userMentionEntities[i] = new UserMentionEntityJSONImpl(userMentionsArray.getJSONObject(i));
}
}
if (!entities.isNull("urls")) {
final JSONArray urlsArray = entities.getJSONArray("urls");
len = urlsArray.length();
urlEntities = new URLEntity[len];
for (int i = 0; i < len; i++) {
urlEntities[i] = new URLEntityJSONImpl(urlsArray.getJSONObject(i));
}
}
if (!entities.isNull("hashtags")) {
final JSONArray hashtagsArray = entities.getJSONArray("hashtags");
len = hashtagsArray.length();
hashtagEntities = new HashtagEntity[len];
for (int i = 0; i < len; i++) {
hashtagEntities[i] = new HashtagEntityJSONImpl(hashtagsArray.getJSONObject(i));
}
}
if (!entities.isNull("media")) {
final JSONArray mediaArray = entities.getJSONArray("media");
len = mediaArray.length();
mediaEntities = new MediaEntity[len];
for (int i = 0; i < len; i++) {
mediaEntities[i] = new MediaEntityJSONImpl(mediaArray.getJSONObject(i));
}
}
} catch (final JSONException jsone) {
throw new TwitterException(jsone);
}
}
try {
sender = new UserJSONImpl(json.getJSONObject("sender"));
recipient = new UserJSONImpl(json.getJSONObject("recipient"));
} catch (final JSONException jsone) {
throw new TwitterException(jsone);
}
}
/* package */
static ResponseList<DirectMessage> createDirectMessageList(final HttpResponse res, final Configuration conf)
throws TwitterException {
try {
final JSONArray list = res.asJSONArray();
final int size = list.length();
final ResponseList<DirectMessage> directMessages = new ResponseListImpl<DirectMessage>(size, res);
for (int i = 0; i < size; i++) {
final JSONObject json = list.getJSONObject(i);
final DirectMessage directMessage = new DirectMessageJSONImpl(json);
directMessages.add(directMessage);
}
return directMessages;
} catch (final JSONException jsone) {
throw new TwitterException(jsone);
} catch (final TwitterException te) {
throw te;
}
}
}