/* Copyright 2014 Sorz * Licensed under the Apache License, Version 2.0 * * * This class is modified from * https://github.com/KTachibanaM/cloudemoji/blob/master/CloudEmoji/src/main/ * java/org/ktachibana/cloudemoji/helpers/RepoXmlParser.java * * Copyright 2014 KTachibanaM for the original file * Licensed under the Apache License, Version 2.0 */ package org.sorz.lab.smallcloudemoji.parsers; import android.util.Xml; import org.sorz.lab.smallcloudemoji.db.DaoSession; import org.sorz.lab.smallcloudemoji.exceptions.LoadingCancelException; import org.sorz.lab.smallcloudemoji.exceptions.PullParserException; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.io.Reader; public class RepositoryXmlLoader extends RepositoryLoader { private static final String ns = null; public RepositoryXmlLoader(DaoSession daoSession) { super(daoSession); } @Override protected void loadRepository(Reader reader) throws PullParserException, IOException, LoadingCancelException { final XmlPullParser parser = Xml.newPullParser(); try { parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); parser.setInput(reader); parser.nextTag(); loadRepository(parser); } catch (XmlPullParserException e) { throw new PullParserException(e); } finally { reader.close(); } } private void loadRepository(XmlPullParser parser) throws XmlPullParserException, IOException, LoadingCancelException { parser.require(XmlPullParser.START_TAG, ns, "emoji"); while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } String tagName = parser.getName(); if (tagName.equals("infoos")) { // Ignore infoos //noinspection StatementWithEmptyBody while (parser.next() != XmlPullParser.END_TAG || !parser.getName().equals("infoos")) ; } else if (tagName.equals("category")) { loadCategory(parser); } } } private void loadCategory(XmlPullParser parser) throws XmlPullParserException, IOException, LoadingCancelException { parser.require(XmlPullParser.START_TAG, ns, "category"); String categoryName = parser.getAttributeValue(null, "name"); beginCategory(categoryName); while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } if (parser.getName().equals("entry")) { loadEntry(parser); } } endCategory(); } private void loadEntry(XmlPullParser parser) throws XmlPullParserException, IOException, LoadingCancelException { parser.require(XmlPullParser.START_TAG, ns, "entry"); String emoticon = ""; String description = ""; while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } String name = parser.getName(); if (name.equals("string")) { emoticon = readString(parser); } else if (name.equals("note")) { description = readNote(parser); } } addEntry(emoticon, description); } private String readString(XmlPullParser parser) throws XmlPullParserException, IOException { parser.require(XmlPullParser.START_TAG, ns, "string"); String string = parser.nextText(); if (parser.getEventType() != XmlPullParser.END_TAG) { parser.nextTag(); } parser.require(XmlPullParser.END_TAG, ns, "string"); return string; } private String readNote(XmlPullParser parser) throws XmlPullParserException, IOException { parser.require(XmlPullParser.START_TAG, ns, "note"); String note = parser.nextText(); if (parser.getEventType() != XmlPullParser.END_TAG) { parser.nextTag(); } parser.require(XmlPullParser.END_TAG, ns, "note"); return note; } }