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}