package org.commcare.logging; 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 xpath error logs to xml * * @author Phillip Mates (pmates@dimagi.com). */ public class XPathErrorSerializer extends StreamLogSerializer implements DeviceReportElement { private final SqlStorage<XPathErrorEntry> errorLogStorage; private XmlSerializer serializer; /** * Report format version for ability to dispatch different parser on server */ private static final int ERROR_FORMAT_VERSION = 1; public XPathErrorSerializer(final SqlStorage<XPathErrorEntry> logStorage) { errorLogStorage = logStorage; this.setPurger(new AndroidLogPurger<>(errorLogStorage)); } @Override public void writeToDeviceReport(XmlSerializer serializer) throws IOException { this.serializer = serializer; serializer.startTag(DeviceReportWriter.XMLNS, "user_error_subreport"); serializer.attribute(null, "version", ERROR_FORMAT_VERSION + ""); try { for (XPathErrorEntry entry : errorLogStorage) { serializeLog(entry.getID(), entry); } } finally { serializer.endTag(DeviceReportWriter.XMLNS, "user_error_subreport"); } } @Override protected void serializeLog(LogEntry entry) throws IOException { final XPathErrorEntry errorEntry = (XPathErrorEntry)entry; String dateString = DateUtils.formatDateTime(errorEntry.getTime(), DateUtils.FORMAT_ISO8601); serializer.startTag(DeviceReportWriter.XMLNS, "user_error"); try { serializer.attribute(null, "date", dateString); AndroidLogSerializer.writeText("type", errorEntry.getType(), serializer); AndroidLogSerializer.writeText("msg", errorEntry.getMessage(), serializer); AndroidLogSerializer.writeText("user_id", errorEntry.getUserId(), serializer); AndroidLogSerializer.writeText("session", errorEntry.getSessionPath(), serializer); AndroidLogSerializer.writeText("app_build", errorEntry.getAppVersion() + "", serializer); AndroidLogSerializer.writeText("app_id", errorEntry.getAppId(), serializer); AndroidLogSerializer.writeText("expr", errorEntry.getExpression(), serializer); } catch (Exception e) { e.printStackTrace(); } finally { serializer.endTag(DeviceReportWriter.XMLNS, "user_error"); } } }