package xmpp.client.service.chat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.PacketExtension;
import xmpp.client.service.user.UserService;
import xmpp.client.service.user.UserServiceProvider;
public class MessageCreator implements UserServiceProvider {
private final UserService mUserService;
private static MessageCreator instance;
private static String[] dateStringVariants = new String[] {
"yyyy-MM-dd'T'HH:mm:ssZ", "yyyy-MM-dd'T'HH:mm:ss.SZ",
"yyyy-MM-dd'T'HH:mm:ss.S'Z'", "yyyy-MM-dd'T'HH:mm:ss'Z'",
"yyyyMMdd'T'HH:mm:ss" };
public static MessageCreator getInstance(UserService userService) {
if (instance == null) {
instance = new MessageCreator(userService);
} else {
if (instance.getUserService() != userService) {
instance = new MessageCreator(userService);
}
}
return instance;
}
private static Date parseDateString(String datestring) {
if (datestring != null && !datestring.isEmpty()) {
for (final String dateStringVariant : dateStringVariants) {
final SimpleDateFormat sdf = new SimpleDateFormat(
dateStringVariant);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
try {
return sdf.parse(datestring);
} catch (final ParseException e) {
}
}
}
return new Date();
}
public MessageCreator(UserService userService) {
mUserService = userService;
}
public xmpp.client.service.chat.ChatMessage createMessage(Chat chat,
Message smackMessage) {
final String user = smackMessage.getFrom();
final String text = smackMessage.getBody();
final Date date = parseDateString(getDateString(smackMessage));
if ((chat.getChatType() == ChatCodes.CHAT_MULTI && (user.equals(chat
.getIdentifier())))) {
return new InfoMessage(date, text, user);
} else if (chat.getChatType() == ChatCodes.CHAT_MULTI) {
return new xmpp.client.service.chat.multi.MultiChatMessage(date,
text, user);
} else if (chat.getChatType() == ChatCodes.CHAT_SINGLE) {
return new xmpp.client.service.chat.single.SingleChatMessage(date,
text, user);
} else {
return null;
}
}
private String getDateString(Message smackMessage) {
String datestring = null;
PacketExtension pe = smackMessage.getExtension("jabber:x:delay");// XEP-0091
if (pe == null) {
pe = smackMessage.getExtension("urn:xmpp:delay");// XEP-0203
}
if (pe != null && pe.toXML() != null) {
final String xml = pe.toXML();
String[] arr = xml.split("stamp='");
if (arr.length > 1) {
arr = arr[1].split("'");
if (arr.length > 1) {
datestring = arr[0];
}
} else {
arr = xml.split("stamp=\"");
if (arr.length > 1) {
arr = arr[1].split("\"");
if (arr.length > 1) {
datestring = arr[0];
}
}
}
}
return datestring;
}
@Override
public UserService getUserService() {
return mUserService;
}
}