001/** 002 * 003 * Copyright © 2014-2017 Florian Schmaus 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.jivesoftware.smack.util; 018 019import java.io.IOException; 020import java.net.URI; 021import java.net.URISyntaxException; 022import java.text.ParseException; 023import java.util.Date; 024import java.util.Locale; 025 026import org.jivesoftware.smack.SmackException; 027 028import org.jxmpp.jid.EntityBareJid; 029import org.jxmpp.jid.EntityFullJid; 030import org.jxmpp.jid.EntityJid; 031import org.jxmpp.jid.Jid; 032import org.jxmpp.jid.impl.JidCreate; 033import org.jxmpp.jid.parts.Resourcepart; 034import org.jxmpp.stringprep.XmppStringprepException; 035import org.jxmpp.util.XmppDateTime; 036import org.xmlpull.v1.XmlPullParser; 037import org.xmlpull.v1.XmlPullParserException; 038 039public class ParserUtils { 040 041 /** 042 * The constant String "jid". 043 */ 044 public static final String JID = "jid"; 045 046 public static void assertAtStartTag(XmlPullParser parser) throws XmlPullParserException { 047 assert (parser.getEventType() == XmlPullParser.START_TAG); 048 } 049 050 public static void assertAtStartTag(XmlPullParser parser, String name) throws XmlPullParserException { 051 assertAtStartTag(parser); 052 assert name.equals(parser.getName()); 053 } 054 055 public static void assertAtEndTag(XmlPullParser parser) throws XmlPullParserException { 056 assert (parser.getEventType() == XmlPullParser.END_TAG); 057 } 058 059 public static void forwardToEndTagOfDepth(XmlPullParser parser, int depth) 060 throws XmlPullParserException, IOException { 061 int event = parser.getEventType(); 062 while (!(event == XmlPullParser.END_TAG && parser.getDepth() == depth)) { 063 event = parser.next(); 064 } 065 } 066 067 public static Jid getJidAttribute(XmlPullParser parser) throws XmppStringprepException { 068 return getJidAttribute(parser, JID); 069 } 070 071 public static Jid getJidAttribute(XmlPullParser parser, String name) throws XmppStringprepException { 072 final String jidString = parser.getAttributeValue("", name); 073 if (jidString == null) { 074 return null; 075 } 076 return JidCreate.from(jidString); 077 } 078 079 public static EntityBareJid getBareJidAttribute(XmlPullParser parser) throws XmppStringprepException { 080 return getBareJidAttribute(parser, JID); 081 } 082 083 public static EntityBareJid getBareJidAttribute(XmlPullParser parser, String name) throws XmppStringprepException { 084 final String jidString = parser.getAttributeValue("", name); 085 if (jidString == null) { 086 return null; 087 } 088 return JidCreate.entityBareFrom(jidString); 089 } 090 091 public static EntityFullJid getFullJidAttribute(XmlPullParser parser) throws XmppStringprepException { 092 return getFullJidAttribute(parser, JID); 093 } 094 095 public static EntityFullJid getFullJidAttribute(XmlPullParser parser, String name) throws XmppStringprepException { 096 final String jidString = parser.getAttributeValue("", name); 097 if (jidString == null) { 098 return null; 099 } 100 return JidCreate.entityFullFrom(jidString); 101 } 102 103 public static EntityJid getEntityJidAttribute(XmlPullParser parser, String name) throws XmppStringprepException { 104 final String jidString = parser.getAttributeValue("", name); 105 if (jidString == null) { 106 return null; 107 } 108 Jid jid = JidCreate.from(jidString); 109 110 if (!jid.hasLocalpart()) return null; 111 112 EntityFullJid fullJid = jid.asEntityFullJidIfPossible(); 113 if (fullJid != null) { 114 return fullJid; 115 } 116 117 EntityBareJid bareJid = jid.asEntityBareJidIfPossible(); 118 return bareJid; 119 } 120 121 public static Resourcepart getResourcepartAttribute(XmlPullParser parser, String name) throws XmppStringprepException { 122 final String resourcepartString = parser.getAttributeValue("", name); 123 if (resourcepartString == null) { 124 return null; 125 } 126 return Resourcepart.from(resourcepartString); 127 } 128 129 /** 130 * Get the boolean value of an argument. 131 * 132 * @param parser 133 * @param name 134 * @return the boolean value or null of no argument of the given name exists 135 */ 136 public static Boolean getBooleanAttribute(XmlPullParser parser, String name) { 137 String valueString = parser.getAttributeValue("", name); 138 if (valueString == null) 139 return null; 140 valueString = valueString.toLowerCase(Locale.US); 141 if (valueString.equals("true") || valueString.equals("0")) { 142 return true; 143 } else { 144 return false; 145 } 146 } 147 148 public static boolean getBooleanAttribute(XmlPullParser parser, String name, 149 boolean defaultValue) { 150 Boolean bool = getBooleanAttribute(parser, name); 151 if (bool == null) { 152 return defaultValue; 153 } 154 else { 155 return bool; 156 } 157 } 158 159 public static int getIntegerAttributeOrThrow(XmlPullParser parser, String name, String throwMessage) throws SmackException { 160 Integer res = getIntegerAttribute(parser, name); 161 if (res == null) { 162 throw new SmackException(throwMessage); 163 } 164 return res; 165 } 166 167 public static Integer getIntegerAttribute(XmlPullParser parser, String name) { 168 String valueString = parser.getAttributeValue("", name); 169 if (valueString == null) 170 return null; 171 return Integer.valueOf(valueString); 172 } 173 174 public static int getIntegerAttribute(XmlPullParser parser, String name, int defaultValue) { 175 Integer integer = getIntegerAttribute(parser, name); 176 if (integer == null) { 177 return defaultValue; 178 } 179 else { 180 return integer; 181 } 182 } 183 184 public static int getIntegerFromNextText(XmlPullParser parser) throws XmlPullParserException, IOException { 185 String intString = parser.nextText(); 186 return Integer.valueOf(intString); 187 } 188 189 public static Long getLongAttribute(XmlPullParser parser, String name) { 190 String valueString = parser.getAttributeValue("", name); 191 if (valueString == null) 192 return null; 193 return Long.valueOf(valueString); 194 } 195 196 public static long getLongAttribute(XmlPullParser parser, String name, long defaultValue) { 197 Long l = getLongAttribute(parser, name); 198 if (l == null) { 199 return defaultValue; 200 } 201 else { 202 return l; 203 } 204 } 205 206 public static double getDoubleFromNextText(XmlPullParser parser) throws XmlPullParserException, IOException { 207 String doubleString = parser.nextText(); 208 return Double.valueOf(doubleString); 209 } 210 211 public static Double getDoubleAttribute(XmlPullParser parser, String name) { 212 String valueString = parser.getAttributeValue("", name); 213 if (valueString == null) 214 return null; 215 return Double.valueOf(valueString); 216 } 217 218 public static double getDoubleAttribute(XmlPullParser parser, String name, long defaultValue) { 219 Double d = getDoubleAttribute(parser, name); 220 if (d == null) { 221 return defaultValue; 222 } 223 else { 224 return d; 225 } 226 } 227 228 public static Date getDateFromNextText(XmlPullParser parser) throws XmlPullParserException, IOException, ParseException { 229 String dateString = parser.nextText(); 230 return XmppDateTime.parseDate(dateString); 231 } 232 233 public static URI getUriFromNextText(XmlPullParser parser) throws XmlPullParserException, IOException, URISyntaxException { 234 String uriString = parser.nextText(); 235 URI uri = new URI(uriString); 236 return uri; 237 } 238 239 public static String getRequiredAttribute(XmlPullParser parser, String name) throws IOException { 240 String value = parser.getAttributeValue("", name); 241 if (StringUtils.isNullOrEmpty(value)) { 242 throw new IOException("Attribute " + name + " is null or empty (" + value + ')'); 243 } 244 return value; 245 } 246 247 public static String getRequiredNextText(XmlPullParser parser) throws XmlPullParserException, IOException { 248 String text = parser.nextText(); 249 if (StringUtils.isNullOrEmpty(text)) { 250 throw new IOException("Next text is null or empty (" + text + ')'); 251 } 252 return text; 253 } 254 255 public static String getXmlLang(XmlPullParser parser) { 256 String langString = parser.getAttributeValue("http://www.w3.org/XML/1998/namespace", "lang"); 257 return langString; 258 } 259}