package org.commcare.xml; import org.commcare.CommCareApplication; import org.commcare.android.database.global.models.AppAvailableToInstall; import org.commcare.data.xml.TransactionParser; import org.commcare.models.database.SqlStorage; import org.javarosa.xml.util.InvalidStructureException; import org.javarosa.xml.util.UnfullfilledRequirementsException; import org.kxml2.io.KXmlParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * Created by amstone326 on 2/3/17. */ public class AvailableAppsParser extends TransactionParser<List<AppAvailableToInstall>> { private static final String APPS_TAG = "apps"; private static final String APP_TAG = "app"; private static final String DOMAIN_TAG = "domain"; private static final String APP_NAME_TAG = "name"; private static final String PROFILE_REF_TAG = "profile"; private static final String MEDIA_PROFILE_REF_TAG = "media-profile"; public AvailableAppsParser(KXmlParser parser) { super(parser); } @Override public List<AppAvailableToInstall> parse() throws InvalidStructureException, IOException, XmlPullParserException, UnfullfilledRequirementsException { checkNode(APPS_TAG); List<AppAvailableToInstall> appsList = new ArrayList<>(); parser.next(); int eventType = parser.getEventType(); do { if (eventType == KXmlParser.START_TAG) { String tagName = parser.getName().toLowerCase(); if (APP_TAG.equals(tagName)) { String domain = parser.getAttributeValue(null, DOMAIN_TAG); String appName = parser.getAttributeValue(null, APP_NAME_TAG); String profileRef = parser.getAttributeValue(null, PROFILE_REF_TAG); String mediaProfileRef = parser.getAttributeValue(null, MEDIA_PROFILE_REF_TAG); appsList.add(new AppAvailableToInstall(domain, appName, profileRef, mediaProfileRef)); } } eventType = parser.next(); } while (eventType != KXmlParser.END_DOCUMENT); commit(appsList); return appsList; } @Override protected void commit(List<AppAvailableToInstall> parsed) throws IOException, InvalidStructureException { SqlStorage<AppAvailableToInstall> storage = CommCareApplication.instance().getGlobalStorage(AppAvailableToInstall.STORAGE_KEY, AppAvailableToInstall.class); for (AppAvailableToInstall availableApp : parsed) { storage.write(availableApp); } } }