package regexgolf2.services.services;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import regexgolf2.services.challengegenerator.ChallengeGeneratorService;
import regexgolf2.services.persistence.PersistenceException;
import regexgolf2.services.persistence.PersistenceService;
import regexgolf2.services.persistence.database.Database;
import regexgolf2.services.persistence.database.DatabaseInitializer;
import regexgolf2.services.persistence.mappers.Mappers;
import regexgolf2.services.settingsservice.SettingsService;
import com.google.java.contract.Ensures;
public class Services
{
private static final Logger _LOG = Logger.getLogger(Services.class.getName());
private SettingsService _settingsService;
private PersistenceService _persistenceService;
private ChallengeGeneratorService _generator;
public Services() throws InitializingException
{
load();
}
/**
* @throws InitializingException
* if some module could not be initialized
*/
private void load() throws InitializingException
{
try
{
if (!initSettingsService())
throw new InitializingException();
_LOG.info("SettingsService initialized");
if (!initPersistenceService(_settingsService.getSettings().getSQLiteDBPath()))
throw new InitializingException();
_LOG.info("PersistenceService initialized");
if (!initChallengeGeneratorService())
throw new InitializingException();
_LOG.info("ChallengeGenerator initialized");
} catch (InitializingException e)
{
throw e;
} catch (Exception ex)
{
_LOG.severe(ex.toString());
// TODO use error handler here
JOptionPane.showMessageDialog(null, "Unexpected fatal Error!\n\n" + ex.toString());
ex.printStackTrace();
throw new InitializingException();
}
}
private boolean initSettingsService()
{
_settingsService = new SettingsService(SettingsService.DEFAULT_FILE);
boolean settingsLoaded = _settingsService.tryLoad();
if (settingsLoaded)
return true;
boolean settingsCreated = _settingsService.tryCreateDefaultFile();
if (settingsCreated)
return true;
JOptionPane.showMessageDialog(null, "Could not find or create a settings.properties File!");
return false;
}
@Ensures("result == (_persistenceService != null)")
private boolean initPersistenceService(String dbPath)
{
File dbFile = new File(dbPath);
boolean dbIsNew = false;
if (!dbFile.exists())
try
{
dbFile.createNewFile();
dbIsNew = true;
} catch (IOException e)
{
JOptionPane.showMessageDialog(null,
"Could not find or create a Database File at:\n" + dbPath);
return false;
}
;
Database db = null;
try
{
db = new Database(dbFile);
} catch (ClassNotFoundException e)
{
JOptionPane.showMessageDialog(null, "Could not load the Database driver!");
return false;
} catch (SQLException e)
{
JOptionPane.showMessageDialog(null, "Could not connect to the Database!");
return false;
}
if (dbIsNew)
{
DatabaseInitializer dbInit = new DatabaseInitializer(db);
try
{
dbInit.createTablesIfNotExists();
dbInit.insertDefaultWords();
} catch (SQLException e)
{
JOptionPane.showMessageDialog(null, "Could not initialize the Database!");
return false;
}
}
try
{
_persistenceService = new PersistenceService(new Mappers(db));
} catch (PersistenceException e)
{
JOptionPane.showMessageDialog(null, "Could not load data from the Database!");
return false;
}
return true;
}
private boolean initChallengeGeneratorService()
{
_generator = new ChallengeGeneratorService(_persistenceService.getWordPool());
return true;
}
@Ensures("result != null")
public PersistenceService getPersistenceService()
{
return _persistenceService;
}
@Ensures("result != null")
public ChallengeGeneratorService getGeneratorService()
{
return _generator;
}
}