From d8d88d9abdba2f570eea45a5f396006f7bb86754 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Sat, 5 Jul 2014 14:19:31 +0200 Subject: [PATCH] Make XHTMLText use XmlStringBuidler also define all element and attribute names as constants. --- .../jivesoftware/smack/packet/Message.java | 6 +- .../smack/util/PacketParserUtils.java | 2 +- .../smackx/xhtmlim/XHTMLManager.java | 16 +- .../smackx/xhtmlim/XHTMLText.java | 338 ++++++++---------- .../smackx/xhtmlim/packet/XHTMLExtension.java | 22 +- .../provider/XHTMLExtensionProvider.java | 7 +- 6 files changed, 185 insertions(+), 206 deletions(-) diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/Message.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/Message.java index 70c214cb3..da829b9be 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/Message.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/Message.java @@ -47,6 +47,8 @@ import java.util.*; */ public class Message extends Packet { + public static final String BODY = "body"; + private Type type = Type.normal; private String thread = null; private String language; @@ -440,9 +442,9 @@ public class Message extends Packet { // Skip the default language if(body.equals(defaultBody)) continue; - buf.halfOpenElement("body").xmllangAttribute(body.getLanguage()).rightAngelBracket(); + buf.halfOpenElement(BODY).xmllangAttribute(body.getLanguage()).rightAngelBracket(); buf.escape(body.getMessage()); - buf.closeElement("body"); + buf.closeElement(BODY); } buf.optElement("thread", thread); // Append the error subpacket if the message type is an error. diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/PacketParserUtils.java b/smack-core/src/main/java/org/jivesoftware/smack/util/PacketParserUtils.java index 322a557bc..dcb35df4b 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/util/PacketParserUtils.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/util/PacketParserUtils.java @@ -185,7 +185,7 @@ public class PacketParserUtils { message.addSubject(xmlLang, subject); } } - else if (elementName.equals("body")) { + else if (elementName.equals(Message.BODY)) { String xmlLang = getLanguageAttribute(parser); if (xmlLang == null) { xmlLang = defaultLanguage; diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/XHTMLManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/XHTMLManager.java index 69db186c3..833c33637 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/XHTMLManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/XHTMLManager.java @@ -37,8 +37,6 @@ import java.util.List; * @author Gaston Dombiak */ public class XHTMLManager { - private final static String namespace = "http://jabber.org/protocol/xhtml-im"; - // Enable the XHTML support on every established connection // The ServiceDiscoveryManager class should have been already initialized static { @@ -57,7 +55,7 @@ public class XHTMLManager { * @return an Iterator for the bodies in the message or null if none. */ public static List getBodies(Message message) { - XHTMLExtension xhtmlExtension = (XHTMLExtension) message.getExtension("html", namespace); + XHTMLExtension xhtmlExtension = (XHTMLExtension) message.getExtension(XHTMLExtension.ELEMENT, XHTMLExtension.NAMESPACE); if (xhtmlExtension != null) return xhtmlExtension.getBodies(); else @@ -71,7 +69,7 @@ public class XHTMLManager { * @param body the string to add as an XHTML body to the message */ public static void addBody(Message message, String body) { - XHTMLExtension xhtmlExtension = (XHTMLExtension) message.getExtension("html", namespace); + XHTMLExtension xhtmlExtension = (XHTMLExtension) message.getExtension(XHTMLExtension.ELEMENT, XHTMLExtension.NAMESPACE); if (xhtmlExtension == null) { // Create an XHTMLExtension and add it to the message xhtmlExtension = new XHTMLExtension(); @@ -88,7 +86,7 @@ public class XHTMLManager { * @return a boolean indicating whether the message is an XHTML message */ public static boolean isXHTMLMessage(Message message) { - return message.getExtension("html", namespace) != null; + return message.getExtension(XHTMLExtension.ELEMENT, XHTMLExtension.NAMESPACE) != null; } /** @@ -105,10 +103,10 @@ public class XHTMLManager { return; if (enabled) { - ServiceDiscoveryManager.getInstanceFor(connection).addFeature(namespace); + ServiceDiscoveryManager.getInstanceFor(connection).addFeature(XHTMLExtension.NAMESPACE); } else { - ServiceDiscoveryManager.getInstanceFor(connection).removeFeature(namespace); + ServiceDiscoveryManager.getInstanceFor(connection).removeFeature(XHTMLExtension.NAMESPACE); } } @@ -119,7 +117,7 @@ public class XHTMLManager { * @return a boolean indicating if the XHTML support is enabled for the given connection */ public static boolean isServiceEnabled(XMPPConnection connection) { - return ServiceDiscoveryManager.getInstanceFor(connection).includesFeature(namespace); + return ServiceDiscoveryManager.getInstanceFor(connection).includesFeature(XHTMLExtension.NAMESPACE); } /** @@ -134,6 +132,6 @@ public class XHTMLManager { */ public static boolean isServiceEnabled(XMPPConnection connection, String userID) throws NoResponseException, XMPPErrorException, NotConnectedException { - return ServiceDiscoveryManager.getInstanceFor(connection).supportsFeature(userID, namespace); + return ServiceDiscoveryManager.getInstanceFor(connection).supportsFeature(userID, XHTMLExtension.NAMESPACE); } } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/XHTMLText.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/XHTMLText.java index c24fff601..a02345c36 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/XHTMLText.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/XHTMLText.java @@ -17,7 +17,8 @@ package org.jivesoftware.smackx.xhtmlim; -import org.jivesoftware.smack.util.StringUtils; +import org.jivesoftware.smack.packet.Message; +import org.jivesoftware.smack.util.XmlStringBuilder; /** * An XHTMLText represents formatted text. This class also helps to build valid @@ -27,9 +28,9 @@ import org.jivesoftware.smack.util.StringUtils; */ public class XHTMLText { - private static final String NAMESPACE = "http://www.w3.org/1999/xhtml"; + public static final String NAMESPACE = "http://www.w3.org/1999/xhtml"; - private StringBuilder text = new StringBuilder(30); + private final XmlStringBuilder text = new XmlStringBuilder(); /** * Creates a new XHTMLText with body tag params. @@ -41,58 +42,53 @@ public class XHTMLText { appendOpenBodyTag(style, lang); } + public static final String A = "a"; + public static final String HREF = "href"; + public static final String STYLE = "style"; + /** * Appends a tag that indicates that an anchor section begins. * * @param href indicates the URL being linked to * @param style the XHTML style of the anchor */ - public void appendOpenAnchorTag(String href, String style) { - StringBuilder sb = new StringBuilder(""); - text.append(sb.toString()); + public XHTMLText appendOpenAnchorTag(String href, String style) { + text.halfOpenElement(A); + text.optAttribute(HREF, href); + text.optAttribute(STYLE, style); + text.rightAngelBracket(); + return this; } /** * Appends a tag that indicates that an anchor section ends. * */ - public void appendCloseAnchorTag() { - text.append(""); + public XHTMLText appendCloseAnchorTag() { + text.closeElement(A); + return this; } + public static final String BLOCKQUOTE = "blockquote"; /** * Appends a tag that indicates that a blockquote section begins. * * @param style the XHTML style of the blockquote */ - public void appendOpenBlockQuoteTag(String style) { - StringBuilder sb = new StringBuilder(""); - text.append(sb.toString()); + public XHTMLText appendOpenBlockQuoteTag(String style) { + text.halfOpenElement(BLOCKQUOTE); + text.optAttribute(STYLE, style); + text.rightAngelBracket(); + return this; } /** * Appends a tag that indicates that a blockquote section ends. * */ - public void appendCloseBlockQuoteTag() { - text.append(""); + public XHTMLText appendCloseBlockQuoteTag() { + text.closeElement(BLOCKQUOTE); + return this; } /** @@ -101,114 +97,113 @@ public class XHTMLText { * @param style the XHTML style of the body * @param lang the language of the body */ - private void appendOpenBodyTag(String style, String lang) { - StringBuilder sb = new StringBuilder(""); - text.append(sb.toString()); + private XHTMLText appendOpenBodyTag(String style, String lang) { + text.halfOpenElement(Message.BODY); + text.xmlnsAttribute(NAMESPACE); + text.optElement(STYLE, style); + text.xmllangAttribute(lang); + text.rightAngelBracket(); + return this; } - /** - * Appends a tag that indicates that a body section ends. - * - */ - private String closeBodyTag() { - return ""; + public XHTMLText appendCloseBodyTag() { + text.closeElement(Message.BODY); + return this; } + public static final String BR = "br"; + public static final String CITE = "cite"; + public static final String CODE = "code"; + /** * Appends a tag that inserts a single carriage return. * */ - public void appendBrTag() { - text.append("
"); + public XHTMLText appendBrTag() { + text.closeElement(BR); + return this; } /** * Appends a tag that indicates a reference to work, such as a book, report or web site. * */ - public void appendOpenCiteTag() { - text.append(""); + public XHTMLText appendOpenCiteTag() { + text.openElement(CITE); + return this; } /** * Appends a tag that indicates text that is the code for a program. * */ - public void appendOpenCodeTag() { - text.append(""); + public XHTMLText appendOpenCodeTag() { + text.openElement(CODE); + return this; } /** * Appends a tag that indicates end of text that is the code for a program. * */ - public void appendCloseCodeTag() { - text.append(""); + public XHTMLText appendCloseCodeTag() { + text.closeElement(CODE); + return this; } + public static final String EM = "em"; + /** * Appends a tag that indicates emphasis. * */ - public void appendOpenEmTag() { - text.append(""); + public XHTMLText appendOpenEmTag() { + text.openElement(EM); + return this; } /** * Appends a tag that indicates end of emphasis. * */ - public void appendCloseEmTag() { - text.append(""); + public XHTMLText appendCloseEmTag() { + text.closeElement(EM); + return this; } + public static final String H = "h"; + /** * Appends a tag that indicates a header, a title of a section of the message. * - * @param level the level of the Header. It should be a value between 1 and 3 + * @param level the level of the Header. It must be a value between 1 and 3 * @param style the XHTML style of the blockquote */ - public void appendOpenHeaderTag(int level, String style) { + public XHTMLText appendOpenHeaderTag(int level, String style) { if (level > 3 || level < 1) { - return; + throw new IllegalArgumentException("Level must be between 1 and 3"); } - StringBuilder sb = new StringBuilder(""); - text.append(sb.toString()); + text.halfOpenElement(H + Integer.toString(level)); + text.optAttribute(STYLE, style); + text.rightAngelBracket(); + return this; } /** * Appends a tag that indicates that a header section ends. * - * @param level the level of the Header. It should be a value between 1 and 3 + * @param level the level of the Header. It must be a value between 1 and 3 */ - public void appendCloseHeaderTag(int level) { + public XHTMLText appendCloseHeaderTag(int level) { if (level > 3 || level < 1) { - return; + throw new IllegalArgumentException("Level must be between 1 and 3"); } - StringBuilder sb = new StringBuilder(""); - text.append(sb.toString()); + text.closeElement(H + Integer.toBinaryString(level)); + return this; } + public static final String IMG = "img"; + /** * Appends a tag that indicates an image. * @@ -218,51 +213,30 @@ public class XHTMLText { * @param src where to get the picture * @param width how wide is the picture */ - public void appendImageTag(String align, String alt, String height, String src, String width) { - StringBuilder sb = new StringBuilder(""); - text.append(sb.toString()); + public XHTMLText appendImageTag(String align, String alt, String height, String src, String width) { + text.halfOpenElement(IMG); + text.optAttribute("align", align); + text.optAttribute("alt", alt); + text.optAttribute("height", height); + text.optAttribute("src", src); + text.optAttribute("width", width); + text.rightAngelBracket(); + return this; } + public static final String LI = "li"; + public static final String OL = "ol"; + /** * Appends a tag that indicates the start of a new line item within a list. * * @param style the style of the line item */ - public void appendLineItemTag(String style) { - StringBuilder sb = new StringBuilder(""); - text.append(sb.toString()); + public XHTMLText appendLineItemTag(String style) { + text.halfOpenElement(LI); + text.optAttribute(STYLE, style); + text.rightAngelBracket(); + return this; } /** @@ -271,65 +245,59 @@ public class XHTMLText { * * @param style the style of the ordered list */ - public void appendOpenOrderedListTag(String style) { - StringBuilder sb = new StringBuilder(""); - text.append(sb.toString()); + public XHTMLText appendOpenOrderedListTag(String style) { + text.halfOpenElement(OL); + text.optAttribute(STYLE, style); + text.rightAngelBracket(); + return this; } /** * Appends a tag that indicates that an ordered list section ends. * */ - public void appendCloseOrderedListTag() { - text.append(""); + public XHTMLText appendCloseOrderedListTag() { + text.closeElement(OL); + return this; } + public static final String UL = "ul"; + /** * Appends a tag that creates an unordered list. The unordered part means that the items * in the list are not in any particular order. * * @param style the style of the unordered list */ - public void appendOpenUnorderedListTag(String style) { - StringBuilder sb = new StringBuilder(""); - text.append(sb.toString()); + public XHTMLText appendOpenUnorderedListTag(String style) { + text.halfOpenElement(UL); + text.optAttribute(STYLE, style); + text.rightAngelBracket(); + return this; } /** * Appends a tag that indicates that an unordered list section ends. * */ - public void appendCloseUnorderedListTag() { - text.append(""); + public XHTMLText appendCloseUnorderedListTag() { + text.closeElement(UL); + return this; } + public static final String P = "p"; + /** * Appends a tag that indicates the start of a new paragraph. This is usually rendered * with two carriage returns, producing a single blank line in between the two paragraphs. * * @param style the style of the paragraph */ - public void appendOpenParagraphTag(String style) { - StringBuilder sb = new StringBuilder(""); - text.append(sb.toString()); + public XHTMLText appendOpenParagraphTag(String style) { + text.halfOpenElement(P); + text.optAttribute(STYLE, style); + text.rightAngelBracket(); + return this; } /** @@ -337,72 +305,75 @@ public class XHTMLText { * with two carriage returns, producing a single blank line in between the two paragraphs. * */ - public void appendCloseParagraphTag() { - text.append("

"); + public XHTMLText appendCloseParagraphTag() { + text.closeElement(P); + return this; } + public static final String Q = "q"; + /** * Appends a tag that indicates that an inlined quote section begins. * * @param style the style of the inlined quote */ - public void appendOpenInlinedQuoteTag(String style) { - StringBuilder sb = new StringBuilder(""); - text.append(sb.toString()); + public XHTMLText appendOpenInlinedQuoteTag(String style) { + text.halfOpenElement(Q); + text.optAttribute(STYLE, style); + text.rightAngelBracket(); + return this; } /** * Appends a tag that indicates that an inlined quote section ends. * */ - public void appendCloseInlinedQuoteTag() { - text.append(""); + public XHTMLText appendCloseInlinedQuoteTag() { + text.closeElement(Q); + return this; } + public static final String SPAN = "span"; + /** * Appends a tag that allows to set the fonts for a span of text. * * @param style the style for a span of text */ - public void appendOpenSpanTag(String style) { - StringBuilder sb = new StringBuilder(""); - text.append(sb.toString()); + public XHTMLText appendOpenSpanTag(String style) { + text.halfOpenElement(SPAN); + text.optAttribute(STYLE, style); + text.rightAngelBracket(); + return this; } /** * Appends a tag that indicates that a span section ends. * */ - public void appendCloseSpanTag() { - text.append(""); + public XHTMLText appendCloseSpanTag() { + text.closeElement(SPAN); + return this; } + public static final String STRONG = "strong"; + /** * Appends a tag that indicates text which should be more forceful than surrounding text. * */ - public void appendOpenStrongTag() { - text.append(""); + public XHTMLText appendOpenStrongTag() { + text.openElement(STRONG); + return this; } /** * Appends a tag that indicates that a strong section ends. * */ - public void appendCloseStrongTag() { - text.append(""); + public XHTMLText appendCloseStrongTag() { + text.closeElement(STRONG); + return this; } /** @@ -410,8 +381,9 @@ public class XHTMLText { * * @param textToAppend the text to append */ - public void append(String textToAppend) { - text.append(StringUtils.escapeForXML(textToAppend)); + public XHTMLText append(String textToAppend) { + text.escape(textToAppend); + return this; } /** @@ -422,7 +394,11 @@ public class XHTMLText { * @return the text of the XHTMLText */ public String toString() { - return text.toString().concat(closeBodyTag()); + appendCloseBodyTag(); + return text.toString(); } + public XmlStringBuilder toXML() { + return text; + } } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/packet/XHTMLExtension.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/packet/XHTMLExtension.java index 30903dfda..cbe2fc7b6 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/packet/XHTMLExtension.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/packet/XHTMLExtension.java @@ -18,6 +18,7 @@ package org.jivesoftware.smackx.xhtmlim.packet; import org.jivesoftware.smack.packet.PacketExtension; +import org.jivesoftware.smack.util.XmlStringBuilder; import java.util.ArrayList; import java.util.Collections; @@ -38,6 +39,9 @@ import java.util.List; */ public class XHTMLExtension implements PacketExtension { + public static final String ELEMENT = "html"; + public static final String NAMESPACE = "http://jabber.org/protocol/xhtml-im"; + private List bodies = new ArrayList(); /** @@ -47,7 +51,7 @@ public class XHTMLExtension implements PacketExtension { * @return the XML element name of the packet extension. */ public String getElementName() { - return "html"; + return ELEMENT; } /** @@ -57,7 +61,7 @@ public class XHTMLExtension implements PacketExtension { * @return the XML namespace of the packet extension. */ public String getNamespace() { - return "http://jabber.org/protocol/xhtml-im"; + return NAMESPACE; } /** @@ -76,16 +80,16 @@ public class XHTMLExtension implements PacketExtension { * * */ - public String toXML() { - StringBuilder buf = new StringBuilder(); - buf.append("<").append(getElementName()).append(" xmlns=\"").append(getNamespace()).append( - "\">"); + @Override + public XmlStringBuilder toXML() { + XmlStringBuilder xml = new XmlStringBuilder(this); + xml.rightAngelBracket(); // Loop through all the bodies and append them to the string buffer for (String body : getBodies()) { - buf.append(body); + xml.append(body); } - buf.append(""); - return buf.toString(); + xml.closeElement(this); + return xml; } /** diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/provider/XHTMLExtensionProvider.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/provider/XHTMLExtensionProvider.java index 6b65b50b6..16e280374 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/provider/XHTMLExtensionProvider.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/provider/XHTMLExtensionProvider.java @@ -16,6 +16,7 @@ */ package org.jivesoftware.smackx.xhtmlim.provider; +import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.PacketExtension; import org.jivesoftware.smack.provider.PacketExtensionProvider; import org.jivesoftware.smack.util.StringUtils; @@ -31,8 +32,6 @@ import java.io.IOException; * @author Vyacheslav Blinov */ public class XHTMLExtensionProvider implements PacketExtensionProvider { - public static final String BODY_ELEMENT = "body"; - @Override public PacketExtension parseExtension(XmlPullParser parser) throws IOException, XmlPullParserException { XHTMLExtension xhtmlExtension = new XHTMLExtension(); @@ -47,7 +46,7 @@ public class XHTMLExtensionProvider implements PacketExtensionProvider { int eventType = parser.next(); if (eventType == XmlPullParser.START_TAG) { boolean appendNamespace = false; - if (BODY_ELEMENT.equals(parser.getName())) { + if (Message.BODY.equals(parser.getName())) { buffer = new StringBuilder(); tagDepth = parser.getDepth(); appendNamespace = true; @@ -67,7 +66,7 @@ public class XHTMLExtensionProvider implements PacketExtensionProvider { // handle self-closing tags by our own means appendEndTag(buffer, parser, tagStarted); tagStarted = false; - if (BODY_ELEMENT.equals(name) && parser.getDepth() <= tagDepth) { + if (Message.BODY.equals(name) && parser.getDepth() <= tagDepth) { xhtmlExtension.addBody(buffer.toString()); } }