public static boolean nextElementWithin(XmlPullParser parser, int outerDepth) throws IOException, XmlPullParserException { for (;;) { int type = parser.next(); if (type == XmlPullParser.END_DOCUMENT || (type == XmlPullParser.END_TAG && parser.getDepth() == outerDepth)) { return false; } if (type == XmlPullParser.START_TAG && parser.getDepth() == outerDepth + 1) { return true; } } }
public static void forwardToEndTagOfDepth(XmlPullParser parser, int depth) throws XmlPullParserException, IOException { int event = parser.getEventType(); while (!(event == XmlPullParser.END_TAG && parser.getDepth() == depth)) { event = parser.next(); } }
private static Fieldref parseFieldref(XmlPullParser parser) throws XmlPullParserException, IOException { final int initialDepth = parser.getDepth(); Fieldref fieldref = new Fieldref(parser.getAttributeValue("", "var")); outerloop: while (true) { int eventType = parser.next(); if (eventType == XmlPullParser.END_TAG && parser.getDepth() == initialDepth) { break outerloop; } } return fieldref; }
public static CharSequence parseElement(XmlPullParser parser, boolean fullNamespaces) throws XmlPullParserException, IOException { assert (parser.getEventType() == XmlPullParser.START_TAG); return parseContentDepth(parser, parser.getDepth(), fullNamespaces); }
@Nullable private TransitionManager createTransitionManagerFromXml(@NonNull XmlPullParser parser, @NonNull AttributeSet attrs, @NonNull ViewGroup sceneRoot) throws XmlPullParserException, IOException { // Make sure we are on a start tag. int type; int depth = parser.getDepth(); TransitionManager transitionManager = null; while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) { if (type != XmlPullParser.START_TAG) { continue; } String name = parser.getName(); if (name.equals("transitionManager")) { transitionManager = new TransitionManager(); } else if (name.equals("transition") && (transitionManager != null)) { loadTransition(attrs, sceneRoot, transitionManager); } else { throw new RuntimeException("Unknown scene name: " + parser.getName()); } } return transitionManager; }
private static HashMap<Jid, MUCLightAffiliation> iterateOccupants(XmlPullParser parser) throws Exception { HashMap<Jid, MUCLightAffiliation> occupants = new HashMap<>(); int depth = parser.getDepth(); outerloop: while (true) { int eventType = parser.next(); if (eventType == XmlPullParser.START_TAG) { if (parser.getName().equals("user")) { MUCLightAffiliation affiliation = MUCLightAffiliation .fromString(parser.getAttributeValue("", "affiliation")); occupants.put(JidCreate.from(parser.nextText()), affiliation); } } else if (eventType == XmlPullParser.END_TAG) { if (parser.getDepth() == depth) { break outerloop; } } } return occupants; }
@Override public RemoteDisablingExtension parse(XmlPullParser parser, int initialDepth) throws Exception { Jid userJid = null; String node = parser.getAttributeValue("", "node"); outerloop: while (true) { int eventType = parser.next(); if (eventType == XmlPullParser.START_TAG) { if (parser.getName().equals("affiliation")) { userJid = JidCreate.from(parser.getAttributeValue("", "jid")); String affiliation = parser.getAttributeValue("", "affiliation"); if (affiliation == null || !affiliation.equals("none")) { return null; } } } else if (eventType == XmlPullParser.END_TAG) { if (parser.getDepth() == initialDepth) { break outerloop; } } } return new RemoteDisablingExtension(node, userJid); }
@Override public BlockContactsIQ parse(XmlPullParser parser, int initialDepth) throws Exception { List<Jid> jids = new ArrayList<>(); outerloop: while (true) { int eventType = parser.next(); switch (eventType) { case XmlPullParser.START_TAG: if (parser.getName().equals("item")) { Jid jid = ParserUtils.getJidAttribute(parser); jids.add(jid); } break; case XmlPullParser.END_TAG: if (parser.getDepth() == initialDepth) { break outerloop; } break; } } return new BlockContactsIQ(jids); }
@Override public XHTMLExtension parse(XmlPullParser parser, int initialDepth) throws IOException, XmlPullParserException { XHTMLExtension xhtmlExtension = new XHTMLExtension(); while (true) { int eventType = parser.getEventType(); String name = parser.getName(); if (eventType == XmlPullParser.START_TAG) { if (name.equals(Message.BODY)) { xhtmlExtension.addBody(PacketParserUtils.parseElement(parser)); } } else if (eventType == XmlPullParser.END_TAG) { if (parser.getDepth() == initialDepth) { return xhtmlExtension; } } parser.next(); } } }
private static CharSequence parseContentDepthWithRoundtrip(XmlPullParser parser, int depth, boolean fullNamespaces) throws XmlPullParserException, IOException { StringBuilder sb = new StringBuilder(); int event = parser.getEventType(); outerloop: while (true) { // Only append the text if the parser is not on on an empty element' start tag. Empty elements are reported // twice, so in order to prevent duplication we only add their text when we are on their end tag. if (!(event == XmlPullParser.START_TAG && parser.isEmptyElementTag())) { CharSequence text = parser.getText(); if (event == XmlPullParser.TEXT) { text = StringUtils.escapeForXmlText(text); } sb.append(text); } if (event == XmlPullParser.END_TAG && parser.getDepth() <= depth) { break outerloop; } event = parser.next(); } return sb; }
@Override public MUCLightAffiliationsIQ parse(XmlPullParser parser, int initialDepth) throws Exception { String version = null; HashMap<Jid, MUCLightAffiliation> occupants = new HashMap<>(); outerloop: while (true) { int eventType = parser.next(); if (eventType == XmlPullParser.START_TAG) { if (parser.getName().equals("version")) { version = parser.nextText(); } if (parser.getName().equals("user")) { MUCLightAffiliation affiliation = MUCLightAffiliation .fromString(parser.getAttributeValue("", "affiliation")); occupants.put(JidCreate.from(parser.nextText()), affiliation); } } else if (eventType == XmlPullParser.END_TAG) { if (parser.getDepth() == initialDepth) { break outerloop; } } } return new MUCLightAffiliationsIQ(version, occupants); }
@Override public final PE parse(XmlPullParser parser, int initialDepth) throws Exception { final String namespace = parser.getNamespace(); final String name = parser.getName(); final int attributeCount = parser.getAttributeCount(); Map<String, String> attMap = new HashMap<>(attributeCount); for (int i = 0; i < attributeCount; i++) { attMap.put(parser.getAttributeName(i), parser.getAttributeValue(i)); } List<ExtensionElement> extensions = new ArrayList<>(); int event; do { event = parser.next(); if (event == XmlPullParser.START_TAG) PacketParserUtils.addExtensionElement(extensions, parser); } while (!(event == XmlPullParser.END_TAG && parser.getDepth() == initialDepth)); return createReturnExtension(name, namespace, attMap, extensions); }
public final E parse(XmlPullParser parser) throws Exception { // XPP3 calling convention assert: Parser should be at start tag ParserUtils.assertAtStartTag(parser); final int initialDepth = parser.getDepth(); E e = parse(parser, initialDepth); // XPP3 calling convention assert: Parser should be at end tag of the consumed/parsed element ParserUtils.forwardToEndTagOfDepth(parser, initialDepth); return e; }
@Override public PubSub parse(XmlPullParser parser, int initialDepth) throws Exception { String namespace = parser.getNamespace(); PubSubNamespace pubSubNamespace = PubSubNamespace.valueOfFromXmlns(namespace); PubSub pubsub = new PubSub(pubSubNamespace); outerloop: while (true) { int eventType = parser.next(); switch (eventType) { case XmlPullParser.START_TAG: PacketParserUtils.addExtensionElement(pubsub, parser); break; case XmlPullParser.END_TAG: if (parser.getDepth() == initialDepth) { break outerloop; } break; } } return pubsub; } }
@Test public void parsesWell() throws IOException, XmlPullParserException { XmlPullParser parser = PacketParserUtils.newXmppParser(); parser.setInput(getClass().getResourceAsStream(XHTML_EXTENSION_SAMPLE_RESOURCE_NAME), "UTF-8"); parser.next(); XHTMLExtensionProvider provider = new XHTMLExtensionProvider(); ExtensionElement extension = provider.parse(parser, parser.getDepth()); assertThat(extension, instanceOf(XHTMLExtension.class)); XHTMLExtension attachmentsInfo = (XHTMLExtension) extension; assertThat(sampleXhtml(), equalsCharSequence(attachmentsInfo.getBodies().get(0))); }
protected void parseAndProcessStanza(XmlPullParser parser) throws Exception { ParserUtils.assertAtStartTag(parser); int parserDepth = parser.getDepth(); Stanza stanza = null; try { stanza = PacketParserUtils.parseStanza(parser); } catch (Exception e) { CharSequence content = PacketParserUtils.parseContentDepth(parser, parserDepth); UnparseableStanza message = new UnparseableStanza(content, e); ParsingExceptionCallback callback = getParsingExceptionCallback(); if (callback != null) { callback.handleUnparsableStanza(message); } } ParserUtils.assertAtEndTag(parser); if (stanza != null) { processStanza(stanza); } }
@Test public void consumeUnparsedInput() throws Exception { final String MESSAGE_EXCEPTION_ELEMENT = "<" + ThrowException.ELEMENT + " xmlns='" + ThrowException.NAMESPACE + "'>" + "<nothingInHere>" + "</nothingInHere>" + "</" + ThrowException.ELEMENT + ">"; XmlPullParser parser = TestUtils.getMessageParser( "<message from='user@server.example' to='francisco@denmark.lit' id='foo'>" + MESSAGE_EXCEPTION_ELEMENT + EXTENSION2 + "</message>"); int parserDepth = parser.getDepth(); CharSequence content = null; try { PacketParserUtils.parseMessage(parser); } catch (Exception e) { content = PacketParserUtils.parseContentDepth(parser, parserDepth, false); } assertThat(MESSAGE_EXCEPTION_ELEMENT + EXTENSION2 + "</message>", equalsCharSequence(content)); }