Search in sources :

Example 6 with DataStoreType

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;
}
Also used : Engine(jgnash.engine.Engine) Persistence(javax.persistence.Persistence) EngineFactory(jgnash.engine.EngineFactory) AttachmentTransferServer(jgnash.engine.attachment.AttachmentTransferServer) LocalServerListener(jgnash.engine.message.LocalServerListener) ArrayList(java.util.ArrayList) Level(java.util.logging.Level) SQLException(java.sql.SQLException) DefaultDaemonThreadFactory(jgnash.util.DefaultDaemonThreadFactory) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) MessageBusServer(jgnash.engine.message.MessageBusServer) Path(java.nio.file.Path) Properties(java.util.Properties) AttachmentUtils(jgnash.engine.AttachmentUtils) DistributedAttachmentManager(jgnash.engine.attachment.DistributedAttachmentManager) Files(java.nio.file.Files) FileMagic(jgnash.util.FileMagic) IOException(java.io.IOException) EntityManager(javax.persistence.EntityManager) DistributedLockManager(jgnash.engine.concurrent.DistributedLockManager) Logger(java.util.logging.Logger) Executors(java.util.concurrent.Executors) StoredObject(jgnash.engine.StoredObject) TimeUnit(java.util.concurrent.TimeUnit) List(java.util.List) Paths(java.nio.file.Paths) EntityManagerFactory(javax.persistence.EntityManagerFactory) FileUtils(jgnash.util.FileUtils) DistributedLockServer(jgnash.engine.concurrent.DistributedLockServer) DataStoreType(jgnash.engine.DataStoreType) MessageBusServer(jgnash.engine.message.MessageBusServer) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) LocalServerListener(jgnash.engine.message.LocalServerListener) DistributedLockServer(jgnash.engine.concurrent.DistributedLockServer) DefaultDaemonThreadFactory(jgnash.util.DefaultDaemonThreadFactory) AttachmentTransferServer(jgnash.engine.attachment.AttachmentTransferServer) Engine(jgnash.engine.Engine)

Example 7 with DataStoreType

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;
}
Also used : SQLException(java.sql.SQLException) Connection(java.sql.Connection) PreparedStatement(java.sql.PreparedStatement) IOException(java.io.IOException) Properties(java.util.Properties) DataStoreType(jgnash.engine.DataStoreType)

Example 8 with DataStoreType

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;
}
Also used : SQLException(java.sql.SQLException) PreparedStatement(java.sql.PreparedStatement) Statement(java.sql.Statement) Connection(java.sql.Connection) ResultSet(java.sql.ResultSet) PreparedStatement(java.sql.PreparedStatement) IOException(java.io.IOException) Properties(java.util.Properties) DataStoreType(jgnash.engine.DataStoreType)

Example 9 with DataStoreType

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;
}
Also used : FileChooser(javafx.stage.FileChooser) ArrayList(java.util.ArrayList) ResourceBundle(java.util.ResourceBundle) Preferences(java.util.prefs.Preferences) File(java.io.File) DataStoreType(jgnash.engine.DataStoreType)

Example 10 with DataStoreType

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;
}
Also used : DataStoreType(jgnash.engine.DataStoreType)

Aggregations

DataStoreType (jgnash.engine.DataStoreType)12 IOException (java.io.IOException)6 SQLException (java.sql.SQLException)5 Properties (java.util.Properties)5 Connection (java.sql.Connection)4 PreparedStatement (java.sql.PreparedStatement)4 ResultSet (java.sql.ResultSet)3 ResourceBundle (java.util.ResourceBundle)3 DatabaseMetaData (java.sql.DatabaseMetaData)2 ArrayList (java.util.ArrayList)2 List (java.util.List)2 ExecutionException (java.util.concurrent.ExecutionException)2 Preferences (java.util.prefs.Preferences)2 SwingWorker (javax.swing.SwingWorker)2 File (java.io.File)1 Files (java.nio.file.Files)1 Path (java.nio.file.Path)1 Paths (java.nio.file.Paths)1 Statement (java.sql.Statement)1 Set (java.util.Set)1