From 2befd7c98f9932d1aab6d72477490d0224000d62 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Mon, 6 Feb 2017 16:36:36 +0300 Subject: juick-xmpp: move ugnich xmpp extensions to tests --- .../java/com/juick/components/XMPPConnection.java | 234 ++++++++++++++++++++ .../main/java/com/juick/components/XMPPServer.java | 4 +- .../configuration/XmppAppConfiguration.java | 6 +- .../com/juick/components/s2s/ConnectionRouter.java | 235 --------------------- .../com/juick/xmpp/extensions/JuickMessage.java | 173 --------------- .../java/com/juick/xmpp/extensions/JuickUser.java | 78 ------- .../java/com/juick/tests/SerializationTests.java | 6 +- .../com/juick/xmpp/extensions/JuickMessage.java | 173 +++++++++++++++ .../java/com/juick/xmpp/extensions/JuickUser.java | 78 +++++++ 9 files changed, 494 insertions(+), 493 deletions(-) create mode 100644 juick-xmpp/src/main/java/com/juick/components/XMPPConnection.java delete mode 100644 juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionRouter.java delete mode 100644 juick-xmpp/src/main/java/com/juick/xmpp/extensions/JuickMessage.java delete mode 100644 juick-xmpp/src/main/java/com/juick/xmpp/extensions/JuickUser.java create mode 100644 src/test/java/com/juick/xmpp/extensions/JuickMessage.java create mode 100644 src/test/java/com/juick/xmpp/extensions/JuickUser.java diff --git a/juick-xmpp/src/main/java/com/juick/components/XMPPConnection.java b/juick-xmpp/src/main/java/com/juick/components/XMPPConnection.java new file mode 100644 index 00000000..a082c4cb --- /dev/null +++ b/juick-xmpp/src/main/java/com/juick/components/XMPPConnection.java @@ -0,0 +1,234 @@ +package com.juick.components; + +import com.juick.User; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import rocks.xmpp.addr.Jid; +import rocks.xmpp.core.XmppException; +import rocks.xmpp.core.stanza.model.Message; +import rocks.xmpp.core.stanza.model.Stanza; +import rocks.xmpp.extensions.component.accept.ExternalComponent; +import rocks.xmpp.extensions.nick.model.Nickname; +import rocks.xmpp.extensions.oob.model.x.OobX; +import rocks.xmpp.util.XmppUtils; + +import javax.xml.bind.JAXBException; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; +import java.io.StringWriter; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author ugnich + */ +public class XMPPConnection implements AutoCloseable { + + private static final Logger logger = LoggerFactory.getLogger(XMPPConnection.class); + + private ExternalComponent router; + private XMPPServer xmpp; + + public XMPPConnection(XMPPServer s2s, String componentName, int componentPort, String password) { + this.xmpp = s2s; + logger.info("stream router start"); + router = ExternalComponent.create(componentName, password, xmpp.getSession().getConfiguration(), "localhost", componentPort); + router.addInboundMessageListener(e -> { + Message message = e.getMessage(); + Jid jid = message.getTo(); + if (jid.getDomain().equals(Jid.of(componentName).getDomain())) { + com.juick.Message jmsg = message.getExtension(com.juick.Message.class); + if (jmsg != null) { + if (jid.getLocal().equals("recomm")) { + sendJuickRecommendation(jmsg); + } else { + if (jmsg.getRid() > 0) { + sendJuickComment(jmsg); + } else if (jmsg.getMid() > 0) { + sendJuickMessage(jmsg); + } + } + } + } else if (jid.getDomain().endsWith(xmpp.HOSTNAME) && (jid.getDomain().equals(xmpp.HOSTNAME) + || jid.getDomain().endsWith("." + xmpp.HOSTNAME))) { + if (logger.isInfoEnabled()) { + try { + logger.info("unhandled message: {}", stanzaToString(message)); + } catch (JAXBException | XMLStreamException ex) { + logger.error("JAXB exception", ex); + } + } + } else { + route(jid.getDomain(), message); + } + }); + try { + router.connect(); + } catch (XmppException e) { + logger.warn("xmpp exception", e); + } + } + + String stanzaToString(Stanza stanza) throws XMLStreamException, JAXBException { + StringWriter stanzaWriter = new StringWriter(); + XMLStreamWriter xmppStreamWriter = XmppUtils.createXmppStreamWriter( + router.getConfiguration().getXmlOutputFactory().createXMLStreamWriter(stanzaWriter)); + router.createMarshaller().marshal(stanza, xmppStreamWriter); + xmppStreamWriter.flush(); + xmppStreamWriter.close(); + return stanzaWriter.toString(); + } + + void route(String domain, Stanza stanza) { + try { + String xml = stanzaToString(stanza); + logger.info("stream router (out): {}", xml); + xmpp.sendOut(domain, xml); + } catch (XMLStreamException | JAXBException e) { + logger.error("JAXB exception", e); + } + + } + + public void sendStanza(Stanza xml) { + router.send(xml); + } + + + + public void sendJuickMessage(com.juick.Message jmsg) { + List jids = new ArrayList<>(); + + if (jmsg.FriendsOnly) { + jids = xmpp.subscriptionService.getJIDSubscribedToUser(jmsg.getUser().getUid(), jmsg.FriendsOnly); + } else { + List users = xmpp.subscriptionService.getSubscribedUsers(jmsg.getUser().getUid(), jmsg.getMid()); + for (User user : users) { + for (String jid : xmpp.userService.getJIDsbyUID(user.getUid())) { + jids.add(jid); + } + } + } + + String txt = "@" + jmsg.getUser().getName() + ":" + jmsg.getTagsString() + "\n"; + String attachment = jmsg.getAttachmentURL(); + if (attachment != null) { + txt += attachment + "\n"; + } + txt += jmsg.getText() + "\n\n"; + txt += "#" + jmsg.getMid() + " http://juick.com/" + jmsg.getMid(); + + Nickname nick = new Nickname("@" + jmsg.getUser().getName()); + + Message msg = new Message(); + msg.setFrom(xmpp.getJid()); + msg.setBody(txt); + msg.setType(Message.Type.CHAT); + msg.setThread("juick-" + jmsg.getMid()); + msg.addExtension(jmsg); + msg.addExtension(nick); + if (attachment != null) { + try { + OobX oob = new OobX(new URI(attachment)); + msg.addExtension(oob); + } catch (URISyntaxException e) { + logger.warn("uri exception", e); + } + } + + for (String jid : jids) { + msg.setTo(Jid.of(jid)); + route(msg.getTo().getDomain(), msg); + } + } + + public void sendJuickComment(com.juick.Message jmsg) { + List users; + String replyQuote; + String replyTo; + + users = xmpp.subscriptionService.getUsersSubscribedToComments(jmsg.getMid(), jmsg.getUser().getUid()); + com.juick.Message replyMessage = jmsg.getReplyto() > 0 ? xmpp.messagesService.getReply(jmsg.getMid(), jmsg.getReplyto()) + : xmpp.messagesService.getMessage(jmsg.getMid()); + replyTo = replyMessage.getUser().getName(); + com.juick.Message fullReply = xmpp.messagesService.getReply(jmsg.getMid(), jmsg.getRid()); + replyQuote = fullReply.getReplyQuote(); + + String txt = "Reply by @" + jmsg.getUser().getName() + ":\n" + replyQuote + "\n@" + replyTo + " "; + String attachment = jmsg.getAttachmentURL(); + if (attachment != null) { + txt += attachment + "\n"; + } + txt += jmsg.getText() + "\n\n" + "#" + jmsg.getMid() + "/" + jmsg.getRid() + " http://juick.com/" + jmsg.getMid() + "#" + jmsg.getRid(); + + Message msg = new Message(); + msg.setFrom(xmpp.getJid()); + msg.setBody(txt); + msg.setType(Message.Type.CHAT); + msg.addExtension(jmsg); + for (User user : users) { + for (String jid : xmpp.userService.getJIDsbyUID(user.getUid())) { + msg.setTo(Jid.of(jid)); + route(msg.getTo().getDomain(), msg); + } + } + } + + public void sendJuickRecommendation(com.juick.Message recomm) { + List users; + com.juick.Message jmsg = xmpp.messagesService.getMessage(recomm.getMid()); + users = xmpp.subscriptionService.getUsersSubscribedToUserRecommendations(recomm.getUser().getUid(), + recomm.getMid(), jmsg.getUser().getUid()); + + String txt = "Recommended by @" + recomm.getUser().getName() + ":\n"; + txt += "@" + jmsg.getUser().getName() + ":" + jmsg.getTagsString() + "\n"; + String attachment = jmsg.getAttachmentURL(); + if (attachment != null) { + txt += attachment + "\n"; + } + txt += jmsg.getText() + "\n\n"; + txt += "#" + jmsg.getMid(); + if (jmsg.getReplies() > 0) { + if (jmsg.getReplies() % 10 == 1 && jmsg.getReplies() % 100 != 11) { + txt += " (" + jmsg.getReplies() + " reply)"; + } else { + txt += " (" + jmsg.getReplies() + " replies)"; + } + } + txt += " http://juick.com/" + jmsg.getMid(); + + Nickname nick = new Nickname("@" + jmsg.getUser().getName()); + + Message msg = new Message(); + msg.setFrom(xmpp.getJid()); + msg.setBody(txt); + msg.setType(Message.Type.CHAT); + msg.setThread("juick-" + jmsg.getMid()); + msg.addExtension(jmsg); + msg.addExtension(nick); + if (attachment != null) { + try { + OobX oob = new OobX(new URI(attachment)); + msg.addExtension(oob); + } catch (URISyntaxException e) { + logger.warn("uri exception", e); + } + } + + for (User user : users) { + for (String jid : xmpp.userService.getJIDsbyUID(user.getUid())) { + msg.setTo(Jid.of(jid)); + route(msg.getTo().getDomain(), msg); + } + } + } + + @Override + public void close() throws Exception { + if (router != null) { + router.close(); + } + } +} diff --git a/juick-xmpp/src/main/java/com/juick/components/XMPPServer.java b/juick-xmpp/src/main/java/com/juick/components/XMPPServer.java index ffb7e260..b5518e33 100644 --- a/juick-xmpp/src/main/java/com/juick/components/XMPPServer.java +++ b/juick-xmpp/src/main/java/com/juick/components/XMPPServer.java @@ -51,7 +51,7 @@ public class XMPPServer implements AutoCloseable { @Inject - private ConnectionRouter router; + private XMPPConnection router; @Inject public MessagesService messagesService; @Inject @@ -258,7 +258,7 @@ public class XMPPServer implements AutoCloseable { } } - public ConnectionRouter getRouter() { + public XMPPConnection getRouter() { return router; } diff --git a/juick-xmpp/src/main/java/com/juick/components/configuration/XmppAppConfiguration.java b/juick-xmpp/src/main/java/com/juick/components/configuration/XmppAppConfiguration.java index 9d6fc041..22b4cc41 100644 --- a/juick-xmpp/src/main/java/com/juick/components/configuration/XmppAppConfiguration.java +++ b/juick-xmpp/src/main/java/com/juick/components/configuration/XmppAppConfiguration.java @@ -6,7 +6,7 @@ package com.juick.components.configuration; import com.juick.components.XMPPServer; import com.juick.components.s2s.CleaningUp; -import com.juick.components.s2s.ConnectionRouter; +import com.juick.components.XMPPConnection; import com.juick.components.s2s.JuickBot; import com.juick.configuration.DataConfiguration; import org.apache.commons.lang3.BooleanUtils; @@ -48,9 +48,9 @@ public class XmppAppConfiguration { return new JuickBot(xmpp()); } @Bean - public ConnectionRouter router() { + public XMPPConnection router() { boolean disabled = BooleanUtils.toBoolean(env.getProperty("xmpp_disabled", "false")); - return disabled ? null : new ConnectionRouter(xmpp(), env.getProperty("componentname"), + return disabled ? null : new XMPPConnection(xmpp(), env.getProperty("componentname"), NumberUtils.toInt(env.getProperty("component_port"), 5347), env.getProperty("xmpp_password")); } diff --git a/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionRouter.java b/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionRouter.java deleted file mode 100644 index ef89671f..00000000 --- a/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionRouter.java +++ /dev/null @@ -1,235 +0,0 @@ -package com.juick.components.s2s; - -import com.juick.User; -import com.juick.components.XMPPServer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import rocks.xmpp.addr.Jid; -import rocks.xmpp.core.XmppException; -import rocks.xmpp.core.stanza.model.Message; -import rocks.xmpp.core.stanza.model.Stanza; -import rocks.xmpp.extensions.component.accept.ExternalComponent; -import rocks.xmpp.extensions.nick.model.Nickname; -import rocks.xmpp.extensions.oob.model.x.OobX; -import rocks.xmpp.util.XmppUtils; - -import javax.xml.bind.JAXBException; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamWriter; -import java.io.StringWriter; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.List; - -/** - * @author ugnich - */ -public class ConnectionRouter implements AutoCloseable { - - private static final Logger logger = LoggerFactory.getLogger(ConnectionRouter.class); - - private ExternalComponent router; - private XMPPServer xmpp; - - public ConnectionRouter(XMPPServer s2s, String componentName, int componentPort, String password) { - this.xmpp = s2s; - logger.info("stream router start"); - router = ExternalComponent.create(componentName, password, xmpp.getSession().getConfiguration(), "localhost", componentPort); - router.addInboundMessageListener(e -> { - Message message = e.getMessage(); - Jid jid = message.getTo(); - if (jid.getDomain().equals(Jid.of(componentName).getDomain())) { - com.juick.Message jmsg = message.getExtension(com.juick.Message.class); - if (jmsg != null) { - if (jid.getLocal().equals("recomm")) { - sendJuickRecommendation(jmsg); - } else { - if (jmsg.getRid() > 0) { - sendJuickComment(jmsg); - } else if (jmsg.getMid() > 0) { - sendJuickMessage(jmsg); - } - } - } - } else if (jid.getDomain().endsWith(xmpp.HOSTNAME) && (jid.getDomain().equals(xmpp.HOSTNAME) - || jid.getDomain().endsWith("." + xmpp.HOSTNAME))) { - if (logger.isInfoEnabled()) { - try { - logger.info("unhandled message: {}", stanzaToString(message)); - } catch (JAXBException | XMLStreamException ex) { - logger.error("JAXB exception", ex); - } - } - } else { - route(jid.getDomain(), message); - } - }); - try { - router.connect(); - } catch (XmppException e) { - logger.warn("xmpp exception", e); - } - } - - String stanzaToString(Stanza stanza) throws XMLStreamException, JAXBException { - StringWriter stanzaWriter = new StringWriter(); - XMLStreamWriter xmppStreamWriter = XmppUtils.createXmppStreamWriter( - router.getConfiguration().getXmlOutputFactory().createXMLStreamWriter(stanzaWriter)); - router.createMarshaller().marshal(stanza, xmppStreamWriter); - xmppStreamWriter.flush(); - xmppStreamWriter.close(); - return stanzaWriter.toString(); - } - - void route(String domain, Stanza stanza) { - try { - String xml = stanzaToString(stanza); - logger.info("stream router (out): {}", xml); - xmpp.sendOut(domain, xml); - } catch (XMLStreamException | JAXBException e) { - logger.error("JAXB exception", e); - } - - } - - void sendStanza(Stanza xml) { - router.send(xml); - } - - - - public void sendJuickMessage(com.juick.Message jmsg) { - List jids = new ArrayList<>(); - - if (jmsg.FriendsOnly) { - jids = xmpp.subscriptionService.getJIDSubscribedToUser(jmsg.getUser().getUid(), jmsg.FriendsOnly); - } else { - List users = xmpp.subscriptionService.getSubscribedUsers(jmsg.getUser().getUid(), jmsg.getMid()); - for (User user : users) { - for (String jid : xmpp.userService.getJIDsbyUID(user.getUid())) { - jids.add(jid); - } - } - } - - String txt = "@" + jmsg.getUser().getName() + ":" + jmsg.getTagsString() + "\n"; - String attachment = jmsg.getAttachmentURL(); - if (attachment != null) { - txt += attachment + "\n"; - } - txt += jmsg.getText() + "\n\n"; - txt += "#" + jmsg.getMid() + " http://juick.com/" + jmsg.getMid(); - - Nickname nick = new Nickname("@" + jmsg.getUser().getName()); - - Message msg = new Message(); - msg.setFrom(xmpp.getJid()); - msg.setBody(txt); - msg.setType(Message.Type.CHAT); - msg.setThread("juick-" + jmsg.getMid()); - msg.addExtension(jmsg); - msg.addExtension(nick); - if (attachment != null) { - try { - OobX oob = new OobX(new URI(attachment)); - msg.addExtension(oob); - } catch (URISyntaxException e) { - logger.warn("uri exception", e); - } - } - - for (String jid : jids) { - msg.setTo(Jid.of(jid)); - route(msg.getTo().getDomain(), msg); - } - } - - public void sendJuickComment(com.juick.Message jmsg) { - List users; - String replyQuote; - String replyTo; - - users = xmpp.subscriptionService.getUsersSubscribedToComments(jmsg.getMid(), jmsg.getUser().getUid()); - com.juick.Message replyMessage = jmsg.getReplyto() > 0 ? xmpp.messagesService.getReply(jmsg.getMid(), jmsg.getReplyto()) - : xmpp.messagesService.getMessage(jmsg.getMid()); - replyTo = replyMessage.getUser().getName(); - com.juick.Message fullReply = xmpp.messagesService.getReply(jmsg.getMid(), jmsg.getRid()); - replyQuote = fullReply.getReplyQuote(); - - String txt = "Reply by @" + jmsg.getUser().getName() + ":\n" + replyQuote + "\n@" + replyTo + " "; - String attachment = jmsg.getAttachmentURL(); - if (attachment != null) { - txt += attachment + "\n"; - } - txt += jmsg.getText() + "\n\n" + "#" + jmsg.getMid() + "/" + jmsg.getRid() + " http://juick.com/" + jmsg.getMid() + "#" + jmsg.getRid(); - - Message msg = new Message(); - msg.setFrom(xmpp.getJid()); - msg.setBody(txt); - msg.setType(Message.Type.CHAT); - msg.addExtension(jmsg); - for (User user : users) { - for (String jid : xmpp.userService.getJIDsbyUID(user.getUid())) { - msg.setTo(Jid.of(jid)); - route(msg.getTo().getDomain(), msg); - } - } - } - - public void sendJuickRecommendation(com.juick.Message recomm) { - List users; - com.juick.Message jmsg = xmpp.messagesService.getMessage(recomm.getMid()); - users = xmpp.subscriptionService.getUsersSubscribedToUserRecommendations(recomm.getUser().getUid(), - recomm.getMid(), jmsg.getUser().getUid()); - - String txt = "Recommended by @" + recomm.getUser().getName() + ":\n"; - txt += "@" + jmsg.getUser().getName() + ":" + jmsg.getTagsString() + "\n"; - String attachment = jmsg.getAttachmentURL(); - if (attachment != null) { - txt += attachment + "\n"; - } - txt += jmsg.getText() + "\n\n"; - txt += "#" + jmsg.getMid(); - if (jmsg.getReplies() > 0) { - if (jmsg.getReplies() % 10 == 1 && jmsg.getReplies() % 100 != 11) { - txt += " (" + jmsg.getReplies() + " reply)"; - } else { - txt += " (" + jmsg.getReplies() + " replies)"; - } - } - txt += " http://juick.com/" + jmsg.getMid(); - - Nickname nick = new Nickname("@" + jmsg.getUser().getName()); - - Message msg = new Message(); - msg.setFrom(xmpp.getJid()); - msg.setBody(txt); - msg.setType(Message.Type.CHAT); - msg.setThread("juick-" + jmsg.getMid()); - msg.addExtension(jmsg); - msg.addExtension(nick); - if (attachment != null) { - try { - OobX oob = new OobX(new URI(attachment)); - msg.addExtension(oob); - } catch (URISyntaxException e) { - logger.warn("uri exception", e); - } - } - - for (User user : users) { - for (String jid : xmpp.userService.getJIDsbyUID(user.getUid())) { - msg.setTo(Jid.of(jid)); - route(msg.getTo().getDomain(), msg); - } - } - } - - @Override - public void close() throws Exception { - if (router != null) { - router.close(); - } - } -} diff --git a/juick-xmpp/src/main/java/com/juick/xmpp/extensions/JuickMessage.java b/juick-xmpp/src/main/java/com/juick/xmpp/extensions/JuickMessage.java deleted file mode 100644 index ae7fc89c..00000000 --- a/juick-xmpp/src/main/java/com/juick/xmpp/extensions/JuickMessage.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * 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.util.DateFormattersHolder; -import com.juick.xmpp.StanzaChild; -import com.juick.xmpp.utils.XmlUtils; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - -import java.io.IOException; -import java.text.ParseException; - -/** - * @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"; - - public JuickMessage() { - } - - public JuickMessage(com.juick.Message msg) { - super(msg); - } - - @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; - } - String ts = parser.getAttributeValue(null, "ts"); - if (ts != null) { - jmsg.setDate(DateFormattersHolder.getMessageFormatterInstance().parse(ts)); - } - 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 builder = new StringBuilder(); - - builder.append("<").append(TagName).append(" xmlns=\"").append(XMLNS).append("\""); - - if (getMid() > 0) - builder.append(" mid=\"").append(getMid()).append("\""); - - if (getRid() > 0) - builder.append(" rid=\"").append(getRid()).append("\""); - - if (getReplyto() > 0) - builder.append(" replyto=\"").append(getReplyto()).append("\""); - - builder.append(" privacy=\"").append(getPrivacy()).append("\""); - - if (FriendsOnly) - builder.append(" friendsonly=\"1\""); - - if (ReadOnly) - builder.append(" readonly=\"1\""); - - if (getDate() != null) - builder.append(" ts=\"") - .append(DateFormattersHolder.getMessageFormatterInstance().format(getDate())) - .append("\""); - - if (getAttachmentType() != null) - builder.append(" attach=\"").append(getAttachmentType()).append("\""); - - builder.append(">"); - - if (getUser() != null) - builder.append(JuickUser.toString(getUser())); - - if (getText() != null) - builder.append("").append(XmlUtils.escape(getText())).append(""); - - for (com.juick.Tag tag : getTags()) - builder.append("").append(XmlUtils.escape(tag.getName())).append(""); - - builder.append(""); - - return builder.toString(); - } - - @Override - public boolean equals(Object obj) { - if (obj == this) - return true; - - 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 == this) - return 0; - - if (!(obj instanceof JuickMessage)) - throw new ClassCastException(); - - JuickMessage jmsg = (JuickMessage) obj; - int cmp = Integer.compare(jmsg.getMid(), getMid()); - if (cmp == 0) - cmp = Integer.compare(getRid(), jmsg.getRid()); - - return cmp; - } -} diff --git a/juick-xmpp/src/main/java/com/juick/xmpp/extensions/JuickUser.java b/juick-xmpp/src/main/java/com/juick/xmpp/extensions/JuickUser.java deleted file mode 100644 index 08e38c41..00000000 --- a/juick-xmpp/src/main/java/com/juick/xmpp/extensions/JuickUser.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * 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.xmpp.StanzaChild; -import com.juick.xmpp.utils.XmlUtils; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - -import java.io.IOException; - -/** - * @author Ugnich Anton - */ -public class JuickUser extends com.juick.User implements StanzaChild { - public final static String XMLNS = "http://juick.com/user"; - public final static String TagName = "user"; - - public JuickUser() { - } - - public JuickUser(com.juick.User user) { - super(user); - } - - @Override - public String getXMLNS() { - return XMLNS; - } - - @Override - public JuickUser parse(final XmlPullParser parser) throws XmlPullParserException, IOException { - JuickUser juser = new JuickUser(); - String strUID = parser.getAttributeValue(null, "uid"); - if (strUID != null) { - juser.setUid(Integer.parseInt(strUID)); - } - juser.setName(parser.getAttributeValue(null, "uname")); - XmlUtils.skip(parser); - return juser; - } - - public static String toString(com.juick.User user) { - StringBuilder builder = new StringBuilder(); - - builder.append("<").append(TagName).append(" xmlns='").append(XMLNS).append("'"); - - if (user.getUid() > 0) - builder.append(" uid='").append(user.getUid()).append("'"); - - if (user.getName() != null && user.getName().length() > 0) - builder.append(" uname='").append(XmlUtils.escape(user.getName())).append("'"); - - builder.append("/>"); - - return builder.toString(); - } - - @Override - public String toString() { - return toString(this); - } -} diff --git a/src/test/java/com/juick/tests/SerializationTests.java b/src/test/java/com/juick/tests/SerializationTests.java index 61b86c5f..022a1bc7 100644 --- a/src/test/java/com/juick/tests/SerializationTests.java +++ b/src/test/java/com/juick/tests/SerializationTests.java @@ -6,7 +6,6 @@ import com.juick.Message; import com.juick.Tag; import com.juick.User; import com.juick.json.MessageSerializer; -import com.juick.json.UserSerializer; import com.juick.xmpp.extensions.JuickMessage; import org.json.JSONObject; import org.junit.Test; @@ -14,7 +13,10 @@ import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; -import javax.xml.bind.*; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; diff --git a/src/test/java/com/juick/xmpp/extensions/JuickMessage.java b/src/test/java/com/juick/xmpp/extensions/JuickMessage.java new file mode 100644 index 00000000..ae7fc89c --- /dev/null +++ b/src/test/java/com/juick/xmpp/extensions/JuickMessage.java @@ -0,0 +1,173 @@ +/* + * 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.util.DateFormattersHolder; +import com.juick.xmpp.StanzaChild; +import com.juick.xmpp.utils.XmlUtils; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; +import java.text.ParseException; + +/** + * @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"; + + public JuickMessage() { + } + + public JuickMessage(com.juick.Message msg) { + super(msg); + } + + @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; + } + String ts = parser.getAttributeValue(null, "ts"); + if (ts != null) { + jmsg.setDate(DateFormattersHolder.getMessageFormatterInstance().parse(ts)); + } + 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 builder = new StringBuilder(); + + builder.append("<").append(TagName).append(" xmlns=\"").append(XMLNS).append("\""); + + if (getMid() > 0) + builder.append(" mid=\"").append(getMid()).append("\""); + + if (getRid() > 0) + builder.append(" rid=\"").append(getRid()).append("\""); + + if (getReplyto() > 0) + builder.append(" replyto=\"").append(getReplyto()).append("\""); + + builder.append(" privacy=\"").append(getPrivacy()).append("\""); + + if (FriendsOnly) + builder.append(" friendsonly=\"1\""); + + if (ReadOnly) + builder.append(" readonly=\"1\""); + + if (getDate() != null) + builder.append(" ts=\"") + .append(DateFormattersHolder.getMessageFormatterInstance().format(getDate())) + .append("\""); + + if (getAttachmentType() != null) + builder.append(" attach=\"").append(getAttachmentType()).append("\""); + + builder.append(">"); + + if (getUser() != null) + builder.append(JuickUser.toString(getUser())); + + if (getText() != null) + builder.append("").append(XmlUtils.escape(getText())).append(""); + + for (com.juick.Tag tag : getTags()) + builder.append("").append(XmlUtils.escape(tag.getName())).append(""); + + builder.append(""); + + return builder.toString(); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) + return true; + + 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 == this) + return 0; + + if (!(obj instanceof JuickMessage)) + throw new ClassCastException(); + + JuickMessage jmsg = (JuickMessage) obj; + int cmp = Integer.compare(jmsg.getMid(), getMid()); + if (cmp == 0) + cmp = Integer.compare(getRid(), jmsg.getRid()); + + return cmp; + } +} diff --git a/src/test/java/com/juick/xmpp/extensions/JuickUser.java b/src/test/java/com/juick/xmpp/extensions/JuickUser.java new file mode 100644 index 00000000..08e38c41 --- /dev/null +++ b/src/test/java/com/juick/xmpp/extensions/JuickUser.java @@ -0,0 +1,78 @@ +/* + * 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.xmpp.StanzaChild; +import com.juick.xmpp.utils.XmlUtils; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; + +/** + * @author Ugnich Anton + */ +public class JuickUser extends com.juick.User implements StanzaChild { + public final static String XMLNS = "http://juick.com/user"; + public final static String TagName = "user"; + + public JuickUser() { + } + + public JuickUser(com.juick.User user) { + super(user); + } + + @Override + public String getXMLNS() { + return XMLNS; + } + + @Override + public JuickUser parse(final XmlPullParser parser) throws XmlPullParserException, IOException { + JuickUser juser = new JuickUser(); + String strUID = parser.getAttributeValue(null, "uid"); + if (strUID != null) { + juser.setUid(Integer.parseInt(strUID)); + } + juser.setName(parser.getAttributeValue(null, "uname")); + XmlUtils.skip(parser); + return juser; + } + + public static String toString(com.juick.User user) { + StringBuilder builder = new StringBuilder(); + + builder.append("<").append(TagName).append(" xmlns='").append(XMLNS).append("'"); + + if (user.getUid() > 0) + builder.append(" uid='").append(user.getUid()).append("'"); + + if (user.getName() != null && user.getName().length() > 0) + builder.append(" uname='").append(XmlUtils.escape(user.getName())).append("'"); + + builder.append("/>"); + + return builder.toString(); + } + + @Override + public String toString() { + return toString(this); + } +} -- cgit v1.2.3