package com.socrata.datasync.model;
import au.com.bytecode.opencsv.CSVReader;
import com.socrata.api.Soda2Consumer;
import com.socrata.datasync.DatasetUtils;
import com.socrata.datasync.config.userpreferences.UserPreferences;
import com.socrata.exceptions.LongRunningQueryException;
import com.socrata.exceptions.SodaError;
import com.socrata.model.importer.Column;
import com.socrata.model.importer.Dataset;
import java.io.StringReader;
import javax.print.URIException;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.io.IOException;
import java.io.StringReader;
import java.net.URISyntaxException;
import org.apache.http.HttpException;
import java.util.ArrayList;
import java.util.Vector;
/**
* Created by franklinwilliams on 8/4/14.
*/
public class DatasetModel extends AbstractTableModel {
private ArrayList<Column> columns;
int rowsToSample = 100;
Dataset datasetInfo;
String domain;
private Vector<Vector<Object>> data = new Vector<>();
public DatasetModel(UserPreferences prefs, String fourbyfour)
throws LongRunningQueryException, InterruptedException, HttpException, IOException, URISyntaxException {
this.domain = prefs.getDomain();
initializeDataset(prefs, fourbyfour);
}
//Used to pull the charset for this domain
public String getDomain() {
return domain;
}
private boolean initializeDataset(UserPreferences prefs, String fourbyfour)
throws LongRunningQueryException, InterruptedException, HttpException, IOException, URISyntaxException {
datasetInfo = DatasetUtils.getDatasetInfo(prefs, fourbyfour, Dataset.class);
columns = (ArrayList<Column>) datasetInfo.getColumns();
String csv = DatasetUtils.getDatasetSample(prefs, fourbyfour, rowsToSample);
CSVReader reader = new CSVReader(new StringReader(csv));
String[] lines = reader.readNext();
while (lines != null) {
insertData(lines);
lines = reader.readNext();
}
return true;
}
// Returns the number of columns of type location. Used in the
// view to determine whether or not we should suggest creating
// synthetic columns
public int getLocationCount() {
int locationCount = 0;
for (Column c : columns){
if (c.getDataTypeName().equals("location"))
locationCount++;
}
return locationCount;
}
public Dataset getDatasetInfo(){
return datasetInfo;
}
public Column getColumnByFieldName(String name) {
for (Column c : columns){
if (c.getFieldName().equalsIgnoreCase(name))
return c;
}
return null;
}
public Column getColumnByFriendlyName(String name) {
for (Column c : columns){
if (c.getName().equalsIgnoreCase(name))
return c;
}
return null;
}
@Override
public int getColumnCount() {
return columns.size();
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public Object getValueAt(int row, int col) {
return data.get(row).get(col);
}
public ArrayList<Column> getColumns() {
return columns;
}
public String getColumnName(int col) {
return columns.get(col).getFieldName();
}
public Class getColumnClass(int c) {
return getValueAt(0,c).getClass();
}
public void setValueAt(Object value, int row, int col) {
data.get(row).setElementAt(value, col);
fireTableCellUpdated(row,col);
}
public boolean isCellEditable(int row, int col) {
return false;
}
public void insertData(Object[] values) {
data.add(new Vector<Object>());
for (int i =0; i < values.length; i++) {
data.get(data.size() - 1).add(values[i]);
}
fireTableDataChanged();
}
}