/* * 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.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() { String ret = ""; ret = "<" + TagName + " xmlns=\"" + XMLNS + "\""; if (getMid() > 0) { ret += " mid=\"" + getMid() + "\""; } if (getRid() > 0) { ret += " rid=\"" + getRid() + "\""; } if (getReplyto() > 0) { ret += " replyto=\"" + getReplyto() + "\""; } ret += " privacy=\"" + getPrivacy() + "\""; if (FriendsOnly) { ret += " friendsonly=\"1\""; } if (ReadOnly) { ret += " readonly=\"1\""; } if (getTimestamp() != null) { ret += " ts=\"" + df.format(Date.from(getTimestamp())) + "\""; } if (getAttachmentType() != null) { ret += " attach=\"" + getAttachmentType() + "\""; } ret += ">"; if (getUser() != null) { ret += JuickUser.toString(getUser()); } if (getText() != null) { ret += "" + StringEscapeUtils.escapeXml10(getText()) + ""; } if (!getTags().isEmpty()) { for (Tag Tag : getTags()) { ret += "" + StringEscapeUtils.escapeXml10(Tag.getName()) + ""; } } ret += ""; return ret; } @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; } }