package org.activityinfo.ui.client.component.importDialog.data;
import com.google.common.base.Strings;
import org.activityinfo.core.shared.importing.source.SourceRow;
import java.util.List;
public class PastedRow implements SourceRow {
private String source;
private List<Integer> columnOffsets;
private int rowIndex;
public PastedRow(String source, List<Integer> columnOffsets, int rowIndex) {
super();
this.source = source;
this.columnOffsets = columnOffsets;
this.rowIndex = rowIndex;
}
@Override
public int getRowIndex() {
return rowIndex;
}
@Override
public String getColumnValue(int columnIndex) {
try {
int start = columnOffsets.get(columnIndex);
int end = columnOffsets.get(columnIndex + 1) - 1;
if(source.charAt(start) == RowParser.QUOTE_CHAR) {
return parseQuotedValue(start+1, end);
}
return source.substring(start, end);
} catch(IndexOutOfBoundsException e) {
return "";
}
}
@Override
public boolean isColumnValueMissing(int columnIndex) {
return Strings.isNullOrEmpty(getColumnValue(columnIndex));
}
private String parseQuotedValue(int start, int end) {
if(source.charAt(end-1) == '\r' || source.charAt(end-1) == '\n') {
end--;
}
if(source.charAt(end-1) == RowParser.QUOTE_CHAR) {
end--;
}
String quote = "" + RowParser.QUOTE_CHAR;
String escapedQuote = quote + quote;
return source.substring(start, end).replace(quote, escapedQuote);
}
public int getColumnCount() {
return columnOffsets.size()-1;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for(int i = 0; i!=getColumnCount();++i) {
if(sb.length() > 0) {
sb.append(", ");
}
sb.append(getColumnValue(i).replace("\n", "\\n"));
}
return sb.toString();
}
}