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}