001package co.codewizards.cloudstore.local.db;
002
003import static co.codewizards.cloudstore.core.util.StringUtil.*;
004import static java.util.Objects.*;
005
006import java.sql.Connection;
007import java.sql.DriverManager;
008import java.sql.SQLException;
009import java.util.Map;
010
011import org.slf4j.Logger;
012import org.slf4j.LoggerFactory;
013
014import co.codewizards.cloudstore.local.PersistencePropertiesEnum;
015import co.codewizards.cloudstore.local.PersistencePropertiesProvider;
016
017public class DerbyDatabaseAdapter extends AbstractDatabaseAdapter {
018        private static final Logger logger = LoggerFactory.getLogger(DerbyDatabaseAdapter.class);
019
020        private Map<String, String> persistenceProperties;
021
022        private String connectionURL;
023
024        private String connectionDriverName;
025
026        private String connectionUserName;
027
028        private String connectionPassword;
029
030        @Override
031        protected void createDatabase() throws Exception {
032                initProperties();
033                initDriverClass();
034
035                connectionURL = requireNonNull(connectionURL, "connectionURL").trim() + ";create=true";
036                Connection connection = createConnection();
037                connection.close();
038        }
039
040        private void initDriverClass() {
041                if (isEmpty(connectionDriverName))
042                        return;
043
044                try {
045                        Class.forName(connectionDriverName);
046                } catch (Throwable e) { // Might theoretically be a link error (i.e. a sub-class of Error instead of Exception) => catch Throwable
047                        logger.warn("initDriverClass" + e, e);
048                }
049        }
050
051        public Connection createConnection() throws SQLException {
052                if (isEmpty(connectionUserName) && isEmpty(connectionPassword))
053                        return DriverManager.getConnection(connectionURL);
054                else
055                        return DriverManager.getConnection(connectionURL, connectionUserName, connectionPassword);
056        }
057
058        private void initProperties() {
059                PersistencePropertiesProvider persistencePropertiesProvider = new PersistencePropertiesProvider(getRepositoryIdOrFail(), getLocalRootOrFail());
060                persistenceProperties = persistencePropertiesProvider.getPersistenceProperties();
061
062                connectionDriverName = persistenceProperties.get(PersistencePropertiesEnum.CONNECTION_DRIVER_NAME.key);
063                connectionURL = persistenceProperties.get(PersistencePropertiesEnum.CONNECTION_URL.key);
064                connectionUserName = persistenceProperties.get(PersistencePropertiesEnum.CONNECTION_USER_NAME.key);
065                connectionPassword = persistenceProperties.get(PersistencePropertiesEnum.CONNECTION_PASSWORD.key);
066        }
067}