/*
* Juick
* Copyright (C) 2008-2011, Ugnich Anton
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
package com.juick.xmpp.extensions;
import com.juick.Tag;
import com.juick.xmpp.StanzaChild;
import com.juick.xmpp.utils.XmlUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.StringEscapeUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
/**
*
* @author Ugnich Anton
*/
public class JuickMessage extends com.juick.Message implements StanzaChild {
public final static String XMLNS = "http://juick.com/message";
public final static String TagName = "juick";
private SimpleDateFormat df;
public JuickMessage() {
df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
}
@Override
public String getXMLNS() {
return XMLNS;
}
@Override
public JuickMessage parse(XmlPullParser parser) throws XmlPullParserException, IOException, ParseException {
JuickMessage jmsg = new JuickMessage();
final String sMID = parser.getAttributeValue(null, "mid");
if (sMID != null) {
jmsg.setMid(Integer.parseInt(sMID));
}
final String sRID = parser.getAttributeValue(null, "rid");
if (sRID != null) {
jmsg.setRid(Integer.parseInt(sRID));
}
final String sReplyTo = parser.getAttributeValue(null, "replyto");
if (sReplyTo != null) {
jmsg.setReplyto(Integer.parseInt(sReplyTo));
}
final String sPrivacy = parser.getAttributeValue(null, "privacy");
if (sPrivacy != null) {
jmsg.setPrivacy(Integer.parseInt(sPrivacy));
}
final String sFriendsOnly = parser.getAttributeValue(null, "friendsonly");
if (sFriendsOnly != null) {
jmsg.FriendsOnly = true;
}
final String sReadOnly = parser.getAttributeValue(null, "readonly");
if (sReadOnly != null) {
jmsg.ReadOnly = true;
}
jmsg.setTimestamp(df.parse(parser.getAttributeValue(null, "ts")).toInstant());
jmsg.setAttachmentType(parser.getAttributeValue(null, "attach"));
while (parser.next() == XmlPullParser.START_TAG) {
final String tag = parser.getName();
final String xmlns = parser.getNamespace();
if (tag.equals("body")) {
jmsg.setText(XmlUtils.getTagText(parser));
} else if (tag.equals(JuickUser.TagName) && xmlns != null && xmlns.equals(JuickUser.XMLNS)) {
jmsg.setUser(new JuickUser().parse(parser));
} else if (tag.equals("tag")) {
jmsg.getTags().add(new Tag(XmlUtils.getTagText(parser)));
} else {
XmlUtils.skip(parser);
}
}
return jmsg;
}
@Override
public String toString() {
StringBuilder ret = new StringBuilder("<").append(TagName).append(" xmlns=\"").append(XMLNS).append("\"");
if (getMid() > 0) {
ret.append(" mid=\"").append(getMid()).append("\"");
}
if (getRid() > 0) {
ret.append(" rid=\"").append(getRid()).append("\"");
}
if (getReplyto() > 0) {
ret.append(" replyto=\"").append(getReplyto()).append("\"");
}
ret.append(" privacy=\"").append(getPrivacy()).append("\"");
if (FriendsOnly) {
ret.append(" friendsonly=\"1\"");
}
if (ReadOnly) {
ret.append(" readonly=\"1\"");
}
if (getTimestamp() != null) {
ret.append(" ts=\"").append(df.format(Date.from(getTimestamp()))).append("\"");
}
if (getAttachmentType() != null) {
ret.append(" attach=\"").append(getAttachmentType()).append("\"");
}
ret.append(">");
if (getUser() != null) {
ret.append(JuickUser.toString(getUser()));
}
if (getText() != null) {
ret.append("
").append(StringEscapeUtils.escapeXml10(StringUtils.defaultString(getText()))).append("");
}
for (Tag Tag : getTags()) {
ret.append("").append(StringEscapeUtils.escapeXml10(Tag.getName())).append("");
}
ret.append("").append(TagName).append(">");
return ret.toString();
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof JuickMessage)) {
return false;
}
JuickMessage jmsg = (JuickMessage) obj;
return (this.getMid() == jmsg.getMid() && this.getRid() == jmsg.getRid());
}
@Override
public int compareTo(Object obj) throws ClassCastException {
if (!(obj instanceof JuickMessage)) {
throw new ClassCastException();
}
JuickMessage jmsg = (JuickMessage) obj;
if (this.getMid() != jmsg.getMid()) {
if (this.getMid() > jmsg.getMid()) {
return -1;
} else {
return 1;
}
}
if (this.getRid() != jmsg.getRid()) {
if (this.getRid() < jmsg.getRid()) {
return -1;
} else {
return 1;
}
}
return 0;
}
}