package org.commcare.android.logging; import org.commcare.logging.AndroidLogPurger; import org.commcare.logging.AndroidLogSerializer; import org.commcare.logging.DeviceReportElement; import org.commcare.logging.DeviceReportWriter; import org.commcare.models.database.SqlStorage; import org.javarosa.core.log.LogEntry; import org.javarosa.core.log.StreamLogSerializer; import org.javarosa.core.model.utils.DateUtils; import org.xmlpull.v1.XmlSerializer; import java.io.IOException; /** * Convert force close error logs to xml. * * @author Aliza Stone */ public class ForceCloseLogSerializer extends StreamLogSerializer implements DeviceReportElement { private ForceCloseLogEntry singleEntry; private SqlStorage<ForceCloseLogEntry> logStorage; private XmlSerializer serializer; public ForceCloseLogSerializer(ForceCloseLogEntry entry) { this.singleEntry = entry; } public ForceCloseLogSerializer(final SqlStorage<ForceCloseLogEntry> logStorage) { this.logStorage = logStorage; this.setPurger(new AndroidLogPurger<>(logStorage)); } @Override public void writeToDeviceReport(XmlSerializer serializer) throws IOException { this.serializer = serializer; serializer.startTag(DeviceReportWriter.XMLNS, "force_close_subreport"); try { if (singleEntry != null) { serializeLog(singleEntry.getID(), singleEntry); } else { for (ForceCloseLogEntry entry : logStorage) { serializeLog(entry.getID(), entry); } } } finally { serializer.endTag(DeviceReportWriter.XMLNS, "force_close_subreport"); } } @Override protected void serializeLog(LogEntry entry) throws IOException { final ForceCloseLogEntry forceCloseEntry = (ForceCloseLogEntry)entry; String dateString = DateUtils.formatDateTime(forceCloseEntry.getTime(), DateUtils.FORMAT_ISO8601); serializer.startTag(DeviceReportWriter.XMLNS, "force_close"); try { serializer.attribute(null, "date", dateString); AndroidLogSerializer.writeText("type", forceCloseEntry.getType(), serializer); AndroidLogSerializer.writeText("msg", forceCloseEntry.getMessage(), serializer); AndroidLogSerializer.writeText("app_build", forceCloseEntry.getAppBuildNumber() + "", serializer); AndroidLogSerializer.writeText("android_version", forceCloseEntry.getAndroidVersion(), serializer); AndroidLogSerializer.writeText("device_model", forceCloseEntry.getDeviceModel(), serializer); AndroidLogSerializer.writeText("session_readable", forceCloseEntry.getReadableSession(), serializer); AndroidLogSerializer.writeText("session_serialized", forceCloseEntry.getSerializedSessionString(), serializer); AndroidLogSerializer.writeText("app_id", forceCloseEntry.getAppId(), serializer); AndroidLogSerializer.writeText("user_id", forceCloseEntry.getUserId(), serializer); } catch (Exception e) { e.printStackTrace(); } finally { serializer.endTag(DeviceReportWriter.XMLNS, "force_close"); } } }