package pt.keep.dbptk.gui;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
import pt.gov.dgarq.roda.common.convert.db.model.data.Row;
import pt.gov.dgarq.roda.common.convert.db.model.exception.InvalidDataException;
import pt.gov.dgarq.roda.common.convert.db.model.exception.ModuleException;
import pt.gov.dgarq.roda.common.convert.db.model.exception.UnknownTypeException;
import pt.gov.dgarq.roda.common.convert.db.model.structure.DatabaseStructure;
import pt.gov.dgarq.roda.common.convert.db.model.structure.TableStructure;
import pt.gov.dgarq.roda.common.convert.db.modules.DatabaseHandler;
public class DatabaseHandlerGUI implements DatabaseHandler, Observable {
private DatabaseHandler delegate;
private ArrayList<Observer> observers = new ArrayList<Observer>();
private HashMap<String,Integer> tableRows= new HashMap<String,Integer>();
private int rowCount = 0;
private int currentRow = 0;
private int tableNumber = 0;
private int totalRows = 0;
private long start;
public DatabaseHandlerGUI(DatabaseHandler delegate) {
super();
this.delegate = delegate;
}
@Override
public void finishDatabase() throws ModuleException {
finish("Finished database");
delegate.finishDatabase();
}
@Override
public void handleDataCloseTable(String arg0) throws ModuleException {
delegate.handleDataCloseTable(arg0);
rowCount = 0;
}
@Override
public void handleDataOpenTable(String arg0) throws ModuleException {
Integer totalTableRows = tableRows.get(arg0);
rowCount = 0;
this.tableNumber++;
updateTable(arg0,tableNumber,totalTableRows);
delegate.handleDataOpenTable(arg0);
}
@Override
public void handleDataRow(Row arg0) throws InvalidDataException,
ModuleException {
rowCount++;
currentRow++;
float elapsedTimeSec = (System.currentTimeMillis()-this.start)/1000F;
if(elapsedTimeSec > 1 || rowCount == 1 || currentRow == totalRows){
updateRowCount(rowCount,currentRow);
this.start = System.currentTimeMillis();
}
delegate.handleDataRow(arg0);
}
@Override
public void handleStructure(DatabaseStructure arg0) throws ModuleException, UnknownTypeException {
int totalTables = 0;
for(TableStructure table: arg0.getSchemas().get(0).getTables()){
tableRows.put(arg0.getSchemas().get(0).getFolder()+"."+table.getName(),table.getRows());
totalRows+=table.getRows();
totalTables++;
}
updateTotal(totalRows,totalTables);
delegate.handleStructure(arg0);
}
@Override
public void initDatabase() throws ModuleException {
this.start = System.currentTimeMillis();
delegate.initDatabase();
}
@Override
public void setIgnoredSchemas(Set<String> arg0) {
delegate.setIgnoredSchemas(arg0);
}
public void registerObserver(Observer observer){
observers.add(observer);
}
public void removeObserver(Observer observer){
observers.remove(observer);
}
public void updateTotal(int totalRows, int totalTables){
for (Observer ob : observers)
ob.updateTotalObs(totalRows,totalTables);
}
public void updateTable(String tableName, int tableNumber, int tableRows){
for (Observer ob : observers)
ob.updateTableObs(tableName,tableNumber,tableRows);
}
public void updateRowCount(int rowCount,int currentRow){
for (Observer ob : observers) {
ob.updateRowCountObs(rowCount,currentRow);
}
}
public void finish(String arg0){
for (Observer ob : observers) {
ob.finish(arg0);
}
}
}