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 return valueString.equals("true") || valueString.equals("0"); 142 } 143 144 public static boolean getBooleanAttribute(XmlPullParser parser, String name, 145 boolean defaultValue) { 146 Boolean bool = getBooleanAttribute(parser, name); 147 if (bool == null) { 148 return defaultValue; 149 } 150 else { 151 return bool; 152 } 153 } 154 155 public static int getIntegerAttributeOrThrow(XmlPullParser parser, String name, String throwMessage) throws SmackException { 156 Integer res = getIntegerAttribute(parser, name); 157 if (res == null) { 158 throw new SmackException(throwMessage); 159 } 160 return res; 161 } 162 163 public static Integer getIntegerAttribute(XmlPullParser parser, String name) { 164 String valueString = parser.getAttributeValue("", name); 165 if (valueString == null) 166 return null; 167 return Integer.valueOf(valueString); 168 } 169 170 public static int getIntegerAttribute(XmlPullParser parser, String name, int defaultValue) { 171 Integer integer = getIntegerAttribute(parser, name); 172 if (integer == null) { 173 return defaultValue; 174 } 175 else { 176 return integer; 177 } 178 } 179 180 public static int getIntegerFromNextText(XmlPullParser parser) throws XmlPullParserException, IOException { 181 String intString = parser.nextText(); 182 return Integer.valueOf(intString); 183 } 184 185 public static Long getLongAttribute(XmlPullParser parser, String name) { 186 String valueString = parser.getAttributeValue("", name); 187 if (valueString == null) 188 return null; 189 return Long.valueOf(valueString); 190 } 191 192 public static long getLongAttribute(XmlPullParser parser, String name, long defaultValue) { 193 Long l = getLongAttribute(parser, name); 194 if (l == null) { 195 return defaultValue; 196 } 197 else { 198 return l; 199 } 200 } 201 202 public static double getDoubleFromNextText(XmlPullParser parser) throws XmlPullParserException, IOException { 203 String doubleString = parser.nextText(); 204 return Double.valueOf(doubleString); 205 } 206 207 public static Double getDoubleAttribute(XmlPullParser parser, String name) { 208 String valueString = parser.getAttributeValue("", name); 209 if (valueString == null) 210 return null; 211 return Double.valueOf(valueString); 212 } 213 214 public static double getDoubleAttribute(XmlPullParser parser, String name, long defaultValue) { 215 Double d = getDoubleAttribute(parser, name); 216 if (d == null) { 217 return defaultValue; 218 } 219 else { 220 return d; 221 } 222 } 223 224 public static Date getDateFromNextText(XmlPullParser parser) throws XmlPullParserException, IOException, ParseException { 225 String dateString = parser.nextText(); 226 return XmppDateTime.parseDate(dateString); 227 } 228 229 public static URI getUriFromNextText(XmlPullParser parser) throws XmlPullParserException, IOException, URISyntaxException { 230 String uriString = parser.nextText(); 231 return new URI(uriString); 232 } 233 234 public static String getRequiredAttribute(XmlPullParser parser, String name) throws IOException { 235 String value = parser.getAttributeValue("", name); 236 if (StringUtils.isNullOrEmpty(value)) { 237 throw new IOException("Attribute " + name + " is null or empty (" + value + ')'); 238 } 239 return value; 240 } 241 242 public static String getRequiredNextText(XmlPullParser parser) throws XmlPullParserException, IOException { 243 String text = parser.nextText(); 244 if (StringUtils.isNullOrEmpty(text)) { 245 throw new IOException("Next text is null or empty (" + text + ')'); 246 } 247 return text; 248 } 249 250 public static String getXmlLang(XmlPullParser parser) { 251 return parser.getAttributeValue("http://www.w3.org/XML/1998/namespace", "lang"); 252 } 253}