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}