package org.commcare.android.javarosa;
import java.io.IOException;
import java.util.Hashtable;
import org.commcare.android.database.SqlStorage;
import org.javarosa.core.log.LogEntry;
import org.javarosa.core.log.StreamLogSerializer;
import org.javarosa.core.model.utils.DateUtils;
import org.javarosa.core.services.Logger;
import org.javarosa.core.services.storage.EntityFilter;
import org.javarosa.core.util.SortedIntSet;
import org.xmlpull.v1.XmlSerializer;
/**
* @author ctsims
*
*/
public class AndroidLogSerializer extends StreamLogSerializer implements DeviceReportElement {
SqlStorage<AndroidLogEntry> storage;
LogEntry entry;
XmlSerializer serializer;
public AndroidLogSerializer(LogEntry entry) {
this.entry = entry;
}
public AndroidLogSerializer(SqlStorage<AndroidLogEntry> logStorage) throws IOException {
super();
this.storage = logStorage;
this.setPurger(new Purger() {
/*
* (non-Javadoc)
* @see org.javarosa.core.log.StreamLogSerializer.Purger#purge(org.javarosa.core.util.SortedIntSet)
*/
@Override
public void purge(final SortedIntSet IDs) {
storage.removeAll(new EntityFilter<LogEntry> () {
public int preFilter (int id, Hashtable<String, Object> metaData) {
return IDs.contains(id) ? PREFILTER_INCLUDE : PREFILTER_EXCLUDE;
}
public boolean matches(LogEntry e) {
throw new RuntimeException("can't happen");
}
});
}
});
}
/*
* (non-Javadoc)
* @see org.javarosa.core.log.StreamLogSerializer#serializeLog(org.javarosa.core.log.LogEntry)
*/
@Override
protected void serializeLog(LogEntry entry) throws IOException {
String dateString = DateUtils.formatDateTime(entry.getTime(), DateUtils.FORMAT_ISO8601);
serializer.startTag(DeviceReportWriter.XMLNS,"log");
try {
serializer.attribute(null,"date", dateString);
writeText("type", entry.getType());
writeText("msg", entry.getMessage());
} catch(Exception e) {
e.printStackTrace();
} finally {
serializer.endTag(DeviceReportWriter.XMLNS,"log");
}
}
private void writeText(String element, String text) throws IllegalArgumentException, IllegalStateException, IOException {
serializer.startTag(DeviceReportWriter.XMLNS,element);
try {
serializer.text(text);
} catch(Exception e) {
e.printStackTrace();
} finally {
serializer.endTag(DeviceReportWriter.XMLNS,element);
}
}
/*
* (non-Javadoc)
* @see org.commcare.android.javarosa.DeviceReportElement#writeToDeviceReport(org.xmlpull.v1.XmlSerializer)
*/
@Override
public void writeToDeviceReport(XmlSerializer serializer) throws IOException {
//TODO: Stop doing what the special case here is for
this.serializer = serializer;
serializer.startTag(DeviceReportWriter.XMLNS, "log_subreport");
try {
if(storage != null) {
if(Logger._() != null) {
Logger._().serializeLogs(this);
}
} else {
serializeLog(entry);
}
} finally {
serializer.endTag(DeviceReportWriter.XMLNS, "log_subreport");
}
}
}