package org.activityinfo.server.endpoint.rest;
import org.activityinfo.legacy.shared.command.GetActivityForm;
import org.activityinfo.legacy.shared.command.GetSchema;
import org.activityinfo.legacy.shared.model.*;
import org.activityinfo.server.command.DispatcherSync;
public class SchemaCsvWriter {
private final StringBuilder csv = new StringBuilder();
private final DispatcherSync dispatcher;
public SchemaCsvWriter(DispatcherSync dispatcher) {
this.dispatcher = dispatcher;
}
public void write(int databaseId) {
UserDatabaseDTO db = dispatcher.execute(new GetSchema()).getDatabaseById(databaseId);
writeHeaders();
for (ActivityDTO activity : db.getActivities()) {
writeActivity(dispatcher.execute(new GetActivityForm(activity.getId())));
}
}
private void writeActivity(ActivityFormDTO activity) {
ActivityFormDTO form = dispatcher.execute(new GetActivityForm(activity.getId()));
for (IndicatorDTO indicator : form.getIndicators()) {
writeElementLine(activity, indicator);
}
for (AttributeGroupDTO group : form.getAttributeGroups()) {
for (AttributeDTO attrib : group.getAttributes()) {
writeElementLine(activity, group, attrib);
}
}
}
private String aggregationToString(IndicatorDTO indicator) {
switch (indicator.getAggregation()) {
case IndicatorDTO.AGGREGATE_SITE_COUNT:
return "Count of Sites";
case IndicatorDTO.AGGREGATE_AVG:
return "Average";
case IndicatorDTO.AGGREGATE_SUM:
return "Sum";
}
return "-";
}
private void writeHeaders() {
writeLine("DatabaseId",
"DatabaseName",
"ActivityId",
"ActivityCategory",
"ActivityName",
"FormFieldType",
"AttributeGroup/IndicatorId",
"Category",
"Name",
"Description",
"Units",
"AttributeId",
"AttributeValue");
}
private void writeElementLine(ActivityFormDTO activity, IndicatorDTO indicator) {
writeLine(activity.getDatabaseId(),
activity.getDatabaseName(),
activity.getId(),
activity.getCategory(),
activity.getName(),
"Indicator",
indicator.getId(),
indicator.getCategory(),
indicator.getName(),
indicator.getDescription(),
indicator.getUnits(),
null,
null);
}
private void writeElementLine(ActivityFormDTO activity, AttributeGroupDTO attribGroup, AttributeDTO attrib) {
writeLine(activity.getDatabaseId(),
activity.getDatabaseName(),
activity.getId(),
activity.getCategory(),
activity.getName(),
"AttributeGroup",
attribGroup.getId(),
null,
attribGroup.getName(),
null,
null,
attrib.getId(),
attrib.getName());
}
private void writeLine(Object... columns) {
for (int i = 0; i != columns.length; ++i) {
if (i > 0) {
csv.append(",");
}
Object val = columns[i];
if (val != null) {
if (val instanceof String) {
String escaped = ((String) val).replace("\"", "\"\"");
csv.append("\"").append(escaped).append("\"");
} else {
csv.append(val.toString());
}
}
}
csv.append("\n");
}
public String toString() {
return csv.toString();
}
}