use of jgnash.engine.DataStoreType in project jgnash by ccavanaugh.
the class JpaNetworkServer method run.
private boolean run(final DataStoreType dataStoreType, final String fileName, final int port, final char[] password) {
boolean result = false;
final DistributedLockServer distributedLockServer = new DistributedLockServer(port + LOCK_SERVER_INCREMENT);
final boolean lockServerStarted = distributedLockServer.startServer(password);
final AttachmentTransferServer attachmentTransferServer = new AttachmentTransferServer(port + TRANSFER_SERVER_INCREMENT, AttachmentUtils.getAttachmentDirectory(Paths.get(fileName)));
final boolean attachmentServerStarted = attachmentTransferServer.startServer(password);
if (attachmentServerStarted && lockServerStarted) {
final Engine engine = createEngine(dataStoreType, fileName, port, password);
if (engine != null) {
// Start the message bus and pass the file name so it can be reported to the client
final MessageBusServer messageBusServer = new MessageBusServer(port + MESSAGE_SERVER_INCREMENT);
result = messageBusServer.startServer(dataStoreType, fileName, password);
if (result) {
// don't continue if the server is not started successfully
// Start the backup thread that ensures an XML backup is created at set intervals
final ScheduledExecutorService backupExecutor = Executors.newSingleThreadScheduledExecutor(new DefaultDaemonThreadFactory());
// run commit every backup period after startup
backupExecutor.scheduleWithFixedDelay(() -> {
if (dirty) {
exportXML(engine, fileName);
EngineFactory.removeOldCompressedXML(fileName, engine.getRetainedBackupLimit());
dirty = false;
}
}, BACKUP_PERIOD, BACKUP_PERIOD, TimeUnit.HOURS);
final LocalServerListener listener = event -> {
if (event.startsWith(STOP_SERVER_MESSAGE)) {
logger.info("Remote shutdown request was received");
stopServer();
}
dirty = true;
};
messageBusServer.addLocalListener(listener);
// wait here forever
try {
while (!stop) {
// check for condition, handle a spurious wake up
// wait forever for notify() from stopServer()
wait();
}
} catch (final InterruptedException ex) {
logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
}
messageBusServer.removeLocalListener(listener);
backupExecutor.shutdown();
exportXML(engine, fileName);
messageBusServer.stopServer();
EngineFactory.closeEngine(SERVER_ENGINE);
EngineFactory.removeOldCompressedXML(fileName, engine.getRetainedBackupLimit());
distributedLockManager.disconnectFromServer();
distributedAttachmentManager.disconnectFromServer();
distributedLockServer.stopServer();
attachmentTransferServer.stopServer();
em.close();
factory.close();
}
}
} else {
if (lockServerStarted) {
distributedLockServer.stopServer();
}
if (attachmentServerStarted) {
attachmentTransferServer.stopServer();
}
}
return result;
}
use of jgnash.engine.DataStoreType in project jgnash by ccavanaugh.
the class SqlUtils method changePassword.
public static boolean changePassword(final String fileName, final char[] password, final char[] newPassword) {
boolean result = false;
try {
if (!FileUtils.isFileLocked(fileName)) {
final DataStoreType dataStoreType = EngineFactory.getDataStoreByType(fileName);
Objects.requireNonNull(dataStoreType);
final Properties properties = JpaConfiguration.getLocalProperties(dataStoreType, fileName, password, false);
final String url = properties.getProperty(JpaConfiguration.JAVAX_PERSISTENCE_JDBC_URL);
try (final Connection connection = DriverManager.getConnection(url)) {
try (final PreparedStatement statement = connection.prepareStatement("SET PASSWORD ?")) {
statement.setString(1, new String(newPassword));
statement.execute();
result = true;
}
} catch (final SQLException e) {
logger.log(Level.SEVERE, e.getMessage(), e);
}
}
} catch (final IOException e) {
logger.log(Level.SEVERE, e.getMessage(), e);
}
return result;
}
use of jgnash.engine.DataStoreType in project jgnash by ccavanaugh.
the class SqlUtils method getFileVersion.
/**
* Opens the database in readonly mode and reads the version of the file format.
*
* @param fileName name of file to open
* @param password connection password
* @return file version
*/
public static float getFileVersion(final String fileName, final char[] password) {
float fileVersion = 0f;
try {
if (!FileUtils.isFileLocked(fileName)) {
final DataStoreType dataStoreType = EngineFactory.getDataStoreByType(fileName);
final Properties properties = JpaConfiguration.getLocalProperties(dataStoreType, fileName, password, true);
final String url = properties.getProperty(JpaConfiguration.JAVAX_PERSISTENCE_JDBC_URL);
try (final Connection connection = DriverManager.getConnection(url)) {
try (final Statement statement = connection.createStatement()) {
try (final ResultSet resultSet = statement.executeQuery("SELECT FILEFORMAT FROM CONFIG")) {
resultSet.next();
fileVersion = Float.valueOf(resultSet.getString("fileformat"));
}
}
// must issue a shutdown for correct file closure
try (final PreparedStatement statement = connection.prepareStatement("SHUTDOWN")) {
statement.execute();
}
} catch (final SQLException e) {
logger.log(Level.SEVERE, e.getMessage(), e);
}
} else {
logger.severe("File was locked");
}
} catch (final IOException e) {
logger.log(Level.SEVERE, e.getMessage(), e);
}
return fileVersion;
}
use of jgnash.engine.DataStoreType in project jgnash by ccavanaugh.
the class DatabasePathAction method configureFileChooser.
private static FileChooser configureFileChooser() {
final ResourceBundle resources = ResourceUtils.getBundle();
final Preferences pref = Preferences.userNodeForPackage(DatabasePathAction.class);
final FileChooser fileChooser = new FileChooser();
final File initialDirectory = new File(pref.get(LAST_DIR, System.getProperty("user.home")));
// Protect against an IllegalArgumentException
if (initialDirectory.isDirectory()) {
fileChooser.setInitialDirectory(initialDirectory);
}
final List<String> types = new ArrayList<>();
for (final DataStoreType dataStoreType : DataStoreType.values()) {
types.add("*" + dataStoreType.getDataStore().getFileExt());
}
fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter(resources.getString("Label.jGnashFiles"), types));
for (final DataStoreType dataStoreType : DataStoreType.values()) {
fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter(dataStoreType.toString(), "*" + dataStoreType.getDataStore().getFileExt()));
}
fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("All Files", "*.*"));
return fileChooser;
}
use of jgnash.engine.DataStoreType in project jgnash by ccavanaugh.
the class OpenAction method checkAndBackupOldVersion.
private static boolean checkAndBackupOldVersion(final String fileName, final char[] password) {
boolean result = false;
if (Files.exists(Paths.get(fileName))) {
final float version = EngineFactory.getFileVersion(Paths.get(fileName), password);
final DataStoreType type = EngineFactory.getDataStoreByType(fileName);
if (type == DataStoreType.HSQL_DATABASE && version < 2.25) {
final String errorMessage = ResourceUtils.getString("Message.Error.OldHsqlFile");
// pop an error dialog with the warning for immediate feedback
new Thread(() -> StaticUIMethods.displayError(errorMessage)).start();
} else if (version <= 0) {
final String errorMessage = ResourceUtils.getString("Message.Error.InvalidUserPass");
UIApplication.getLogger().warning(errorMessage);
// pop an error dialog with the warning for immediate feedback
new Thread(() -> StaticUIMethods.displayError(errorMessage)).start();
} else {
result = true;
// make a versioned backup first
if (version < Engine.CURRENT_VERSION) {
FileUtils.copyFile(Paths.get(fileName), Paths.get(fileName + "." + version));
// pop an information dialog about the backup file
new Thread(() -> {
final String message = ResourceUtils.getString("Message.Info.Upgrade", fileName + "." + version);
StaticUIMethods.displayMessage(message, ResourceUtils.getString("Title.Information"), JOptionPane.INFORMATION_MESSAGE);
}).start();
}
}
}
return result;
}
Aggregations