package org.commcare.xml; import java.io.IOException; import java.util.Date; import java.util.NoSuchElementException; import org.commcare.android.database.user.models.User; import org.commcare.android.util.SessionUnavailableException; import org.commcare.dalvik.application.CommCareApplication; import org.commcare.data.xml.TransactionParser; import org.commcare.xml.util.InvalidStructureException; import org.javarosa.core.model.utils.DateUtils; import org.javarosa.core.services.storage.IStorageUtilityIndexed; import org.javarosa.core.services.storage.StorageFullException; import org.kxml2.io.KXmlParser; import org.xmlpull.v1.XmlPullParserException; import android.content.Context; public class UserXmlParser extends TransactionParser<User> { IStorageUtilityIndexed storage; Context context; byte[] wrappedKey; public UserXmlParser(KXmlParser parser, Context context, byte[] wrappedKey) { super(parser, "registration", null); this.context = context; this.wrappedKey = wrappedKey; } public User parse() throws InvalidStructureException, IOException, XmlPullParserException, SessionUnavailableException { this.checkNode("registration"); //parse (with verification) the next tag this.nextTag("username"); String username = parser.nextText(); this.nextTag("password"); String passwordHash = parser.nextText(); this.nextTag("uuid"); String uuid = parser.nextText(); this.nextTag("date"); String dateModified = parser.nextText(); Date modified = DateUtils.parseDateTime(dateModified); User u = retrieve(uuid); if(u == null) { u = new User(username, passwordHash, uuid); u.setWrappedKey(wrappedKey); } else { if(passwordHash != null && !passwordHash.equals(u.getPassword())) { u.setPassword(passwordHash); u.setWrappedKey(wrappedKey); } } //Now look for optional components while(this.nextTagInBlock("registration")) { String tag = parser.getName().toLowerCase(); if(tag.equals("registering_phone_id")) { String phoneid = parser.nextText(); } else if(tag.equals("token")) { String token = parser.nextText(); } else if(tag.equals("user_data")) { while(this.nextTagInBlock("user_data")) { this.checkNode("data"); String key = this.parser.getAttributeValue(null, "key"); String value = this.parser.nextText(); u.setProperty(key, value); } //This should be the last block in the registration stuff... break; } else { throw new InvalidStructureException("Unrecognized tag in user registraiton data: " + tag,parser); } } commit(u); return u; } public void commit(User parsed) throws IOException, SessionUnavailableException { try { storage().write(parsed); } catch (StorageFullException e) { e.printStackTrace(); throw new IOException("Storage full while writing case!"); } } public User retrieve(String entityId) throws SessionUnavailableException { IStorageUtilityIndexed storage = storage(); try{ return (User)storage.getRecordForValue(User.META_UID, entityId); } catch(NoSuchElementException nsee) { return null; } } public IStorageUtilityIndexed storage() throws SessionUnavailableException{ if(storage == null) { storage = CommCareApplication._().getUserStorage(User.class); } return storage; } }