package com.hackerdude.apps.sqlide.dataaccess;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Observable;
import com.hackerdude.apps.sqlide.ProgramConfig;
import com.hackerdude.apps.sqlide.xml.HostConfigFactory;
import com.hackerdude.apps.sqlide.xml.hostconfig.SqlideHostConfig;
/**
*
* A Host configuration registry for SQL-IDE.
*
* Because it is a service in a standalone application, it is a singleton.
*
*/
public class HostConfigRegistry extends Observable {
protected SqlideHostConfig defaultDatabaseSpec;
protected ArrayList SqlideHostConfigList;
private static HostConfigRegistry instance = null;
static String defaultdbPropsFile; // Default DB properties file
private HostConfigRegistry() {
readSqlideHostConfigs();
}
public synchronized static HostConfigRegistry getInstance() {
if ( instance == null ) instance = new HostConfigRegistry();
return instance;
}
/**
* Get the default database specification.
* @return A DatabaseSpec object with the database specification that
* will be used for the default server.
*/
public SqlideHostConfig getDefaultHostConfig() { return(defaultDatabaseSpec); };
public void setDefaultDatabaseSpec(SqlideHostConfig config) { defaultDatabaseSpec = config; };
/**
* Get a database spec by number
* @param index The number of database spec we want to retrieve
* @return A reference to the DatabaseSpec object with order in index.
*/
public SqlideHostConfig getSqlideHostConfig( int index ) { return((SqlideHostConfig)SqlideHostConfigList.get(index)); }
public void removeSqlideHostConfig(SqlideHostConfig spec) {
SqlideHostConfigList.remove(spec);
}
public void addSqlideHostConfig(SqlideHostConfig spec) {
SqlideHostConfigList.add(spec);
setChanged();
notifyObservers(spec);
}
/**
* Get the Database Configuration Name.
* @param index The number of database configuration we want to retrieve.
* @return The "Polite Name" of the database configuration item
*/
public String getDbConfigName( int index ) {
return( ((SqlideHostConfig)SqlideHostConfigList.get(index)).getName());
}
/**
* Get the DB Configuration index for a specific name
* Not implemented Yet.
*/
public int getDbConfigIndex( String name ) { return(1); }; // TODO: Implement
/**
* Returns the number of database specs.
*/
public int getConnectionCount() { return SqlideHostConfigList.size(); }
/**
* Read all the database configurations for this user.
*
*/
public synchronized void readSqlideHostConfigs() {
File findFiles = new File(ProgramConfig.getUserProfilePath());
String[] dbPropFileNames = findFiles.list(new FileSuffixChecker(HostConfigFactory.PROP_DB_CONFIG_SUFFIX));
String fileName;
SqlideHostConfig dbSpec;
SqlideHostConfigList = new ArrayList();
for ( int i=0; i<dbPropFileNames.length; i++) {
fileName = ProgramConfig.getUserProfilePath()+dbPropFileNames[i];
try {
dbSpec = HostConfigFactory.createHostConfig(fileName);
// Just in case they renamed it from the outside.
dbSpec.setFileName(fileName);
SqlideHostConfigList.add( dbSpec );
if ( fileName.equals( defaultdbPropsFile ) ) {
defaultDatabaseSpec = dbSpec;
}
} catch ( IOException exc ) {
System.out.println("Error "+exc.toString()+" parsing "+fileName+"... Will not add to available configs list");
}
}
notifyObservers();
}
/**
* Save all the database specifications.
*/
public void saveSqlideHostConfigs() throws IOException {
for (int i=0; i<SqlideHostConfigList.size(); i++) {
SqlideHostConfig currentSpec = ((SqlideHostConfig)SqlideHostConfigList.get(i));
HostConfigFactory.saveSqlideHostConfig(currentSpec);
}
}
/*
* fileSuffixChecker a fileName filter that checks for a
* specific file suffix
*/
private class FileSuffixChecker implements FilenameFilter {
String matching;
public FileSuffixChecker( String suffix ) {
matching = suffix;
}
public boolean accept( File dir, String name) {
return( name.endsWith(matching) );
}
}
}