/* * 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() { 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(getText())).append(""); } for (Tag Tag : getTags()) { ret.append("").append(StringEscapeUtils.escapeXml10(Tag.getName())).append(""); } ret.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; } }