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; 027import org.jxmpp.jid.EntityBareJid; 028import org.jxmpp.jid.EntityFullJid; 029import org.jxmpp.jid.EntityJid; 030import org.jxmpp.jid.Jid; 031import org.jxmpp.jid.impl.JidCreate; 032import org.jxmpp.jid.parts.Resourcepart; 033import org.jxmpp.stringprep.XmppStringprepException; 034import org.jxmpp.util.XmppDateTime; 035import org.xmlpull.v1.XmlPullParser; 036import org.xmlpull.v1.XmlPullParserException; 037 038public class ParserUtils { 039 040 /** 041 * The constant String "jid". 042 */ 043 public static final String JID = "jid"; 044 045 public static void assertAtStartTag(XmlPullParser parser) throws XmlPullParserException { 046 assert(parser.getEventType() == XmlPullParser.START_TAG); 047 } 048 049 public static void assertAtStartTag(XmlPullParser parser, String name) throws XmlPullParserException { 050 assertAtStartTag(parser); 051 assert name.equals(parser.getName()); 052 } 053 054 public static void assertAtEndTag(XmlPullParser parser) throws XmlPullParserException { 055 assert(parser.getEventType() == XmlPullParser.END_TAG); 056 } 057 058 public static void forwardToEndTagOfDepth(XmlPullParser parser, int depth) 059 throws XmlPullParserException, IOException { 060 int event = parser.getEventType(); 061 while (!(event == XmlPullParser.END_TAG && parser.getDepth() == depth)) { 062 event = parser.next(); 063 } 064 } 065 066 public static Jid getJidAttribute(XmlPullParser parser) throws XmppStringprepException { 067 return getJidAttribute(parser, JID); 068 } 069 070 public static Jid getJidAttribute(XmlPullParser parser, String name) throws XmppStringprepException { 071 final String jidString = parser.getAttributeValue("", name); 072 if (jidString == null) { 073 return null; 074 } 075 return JidCreate.from(jidString); 076 } 077 078 public static EntityBareJid getBareJidAttribute(XmlPullParser parser) throws XmppStringprepException { 079 return getBareJidAttribute(parser, JID); 080 } 081 082 public static EntityBareJid getBareJidAttribute(XmlPullParser parser, String name) throws XmppStringprepException { 083 final String jidString = parser.getAttributeValue("", name); 084 if (jidString == null) { 085 return null; 086 } 087 return JidCreate.entityBareFrom(jidString); 088 } 089 090 public static EntityFullJid getFullJidAttribute(XmlPullParser parser) throws XmppStringprepException { 091 return getFullJidAttribute(parser, JID); 092 } 093 094 public static EntityFullJid getFullJidAttribute(XmlPullParser parser, String name) throws XmppStringprepException { 095 final String jidString = parser.getAttributeValue("", name); 096 if (jidString == null) { 097 return null; 098 } 099 return JidCreate.entityFullFrom(jidString); 100 } 101 102 public static EntityJid getEntityJidAttribute(XmlPullParser parser, String name) throws XmppStringprepException { 103 final String jidString = parser.getAttributeValue("", name); 104 if (jidString == null) { 105 return null; 106 } 107 Jid jid = JidCreate.from(jidString); 108 109 if (!jid.hasLocalpart()) return null; 110 111 EntityFullJid fullJid = jid.asEntityFullJidIfPossible(); 112 if (fullJid != null) { 113 return fullJid; 114 } 115 116 EntityBareJid bareJid = jid.asEntityBareJidIfPossible(); 117 return bareJid; 118 } 119 120 public static Resourcepart getResourcepartAttribute(XmlPullParser parser, String name) throws XmppStringprepException { 121 final String resourcepartString = parser.getAttributeValue("", name); 122 if (resourcepartString == null) { 123 return null; 124 } 125 return Resourcepart.from(resourcepartString); 126 } 127 128 /** 129 * Get the boolean value of an argument. 130 * 131 * @param parser 132 * @param name 133 * @return the boolean value or null of no argument of the given name exists 134 */ 135 public static Boolean getBooleanAttribute(XmlPullParser parser, String name) { 136 String valueString = parser.getAttributeValue("", name); 137 if (valueString == null) 138 return null; 139 valueString = valueString.toLowerCase(Locale.US); 140 if (valueString.equals("true") || valueString.equals("0")) { 141 return true; 142 } else { 143 return false; 144 } 145 } 146 147 public static boolean getBooleanAttribute(XmlPullParser parser, String name, 148 boolean defaultValue) { 149 Boolean bool = getBooleanAttribute(parser, name); 150 if (bool == null) { 151 return defaultValue; 152 } 153 else { 154 return bool; 155 } 156 } 157 158 public static int getIntegerAttributeOrThrow(XmlPullParser parser, String name, String throwMessage) throws SmackException { 159 Integer res = getIntegerAttribute(parser, name); 160 if (res == null) { 161 throw new SmackException(throwMessage); 162 } 163 return res; 164 } 165 166 public static Integer getIntegerAttribute(XmlPullParser parser, String name) { 167 String valueString = parser.getAttributeValue("", name); 168 if (valueString == null) 169 return null; 170 return Integer.valueOf(valueString); 171 } 172 173 public static int getIntegerAttribute(XmlPullParser parser, String name, int defaultValue) { 174 Integer integer = getIntegerAttribute(parser, name); 175 if (integer == null) { 176 return defaultValue; 177 } 178 else { 179 return integer; 180 } 181 } 182 183 public static int getIntegerFromNextText(XmlPullParser parser) throws XmlPullParserException, IOException { 184 String intString = parser.nextText(); 185 return Integer.valueOf(intString); 186 } 187 188 public static Long getLongAttribute(XmlPullParser parser, String name) { 189 String valueString = parser.getAttributeValue("", name); 190 if (valueString == null) 191 return null; 192 return Long.valueOf(valueString); 193 } 194 195 public static long getLongAttribute(XmlPullParser parser, String name, long defaultValue) { 196 Long l = getLongAttribute(parser, name); 197 if (l == null) { 198 return defaultValue; 199 } 200 else { 201 return l; 202 } 203 } 204 205 public static double getDoubleFromNextText(XmlPullParser parser) throws XmlPullParserException, IOException { 206 String doubleString = parser.nextText(); 207 return Double.valueOf(doubleString); 208 } 209 210 public static Double getDoubleAttribute(XmlPullParser parser, String name) { 211 String valueString = parser.getAttributeValue("", name); 212 if (valueString == null) 213 return null; 214 return Double.valueOf(valueString); 215 } 216 217 public static double getDoubleAttribute(XmlPullParser parser, String name, long defaultValue) { 218 Double d = getDoubleAttribute(parser, name); 219 if (d == null) { 220 return defaultValue; 221 } 222 else { 223 return d; 224 } 225 } 226 227 public static Date getDateFromNextText(XmlPullParser parser) throws XmlPullParserException, IOException, ParseException { 228 String dateString = parser.nextText(); 229 return XmppDateTime.parseDate(dateString); 230 } 231 232 public static URI getUriFromNextText(XmlPullParser parser) throws XmlPullParserException, IOException, URISyntaxException { 233 String uriString = parser.nextText(); 234 URI uri = new URI(uriString); 235 return uri; 236 } 237 238 public static String getRequiredAttribute(XmlPullParser parser, String name) throws IOException { 239 String value = parser.getAttributeValue("", name); 240 if (StringUtils.isNullOrEmpty(value)) { 241 throw new IOException("Attribute " + name + " is null or empty (" + value + ')'); 242 } 243 return value; 244 } 245 246 public static String getRequiredNextText(XmlPullParser parser) throws XmlPullParserException, IOException { 247 String text = parser.nextText(); 248 if (StringUtils.isNullOrEmpty(text)) { 249 throw new IOException("Next text is null or empty (" + text + ')'); 250 } 251 return text; 252 } 253}