PrometheusDatabase.java
/*
* Prometheus: Application Framework
* Copyright 2012-2026. Tony Washer
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package io.github.tonywasher.joceanus.prometheus.database;
import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
import io.github.tonywasher.joceanus.metis.preference.MetisPreferenceKey;
import io.github.tonywasher.joceanus.metis.preference.MetisPreferenceManager;
import io.github.tonywasher.joceanus.prometheus.preference.PrometheusPreferenceManager;
import io.github.tonywasher.joceanus.prometheus.preference.PrometheusPreferenceSet;
import java.util.EnumSet;
import java.util.Set;
/**
* Preferences for a database.
*/
public interface PrometheusDatabase {
/**
* databasePreferenceKeys.
*/
enum PrometheusDatabasePreferenceKey implements MetisPreferenceKey {
/**
* Database Driver.
*/
DBDRIVER("DBDriver", PrometheusDBResource.DBPREF_DRIVER),
/**
* Database Server.
*/
DBSERVER("DBServer", PrometheusDBResource.DBPREF_SERVER),
/**
* Database Instance.
*/
DBINSTANCE("DBInstance", PrometheusDBResource.DBPREF_INSTANCE),
/**
* Database Port.
*/
DBPORT("DBPort", PrometheusDBResource.DBPREF_PORT),
/**
* Database Name.
*/
DBNAME("DBName", PrometheusDBResource.DBPREF_NAME),
/**
* Database Batch.
*/
DBBATCH("DBBatchSize", PrometheusDBResource.DBPREF_BATCH),
/**
* Database User.
*/
DBUSER("DBUser", PrometheusDBResource.DBPREF_USER),
/**
* Database Password.
*/
DBPASS("DBPass", PrometheusDBResource.DBPREF_PASS);
/**
* The name of the Preference.
*/
private final String theName;
/**
* The display string.
*/
private final String theDisplay;
/**
* Constructor.
*
* @param pName the name
* @param pDisplay the display string;
*/
PrometheusDatabasePreferenceKey(final String pName,
final PrometheusDBResource pDisplay) {
theName = pName;
theDisplay = pDisplay.getValue();
}
@Override
public String getName() {
return theName;
}
@Override
public String getDisplay() {
return theDisplay;
}
}
/**
* PrometheusDatabasePreferences.
*/
class PrometheusDatabasePreferences
extends PrometheusPreferenceSet {
/**
* Default Database batch size.
*/
private static final Integer DEFAULT_DBBATCH = 50;
/**
* Valid lengths.
*/
private static final Set<PrometheusJDBCDriver> VALID_DBS = EnumSet.of(PrometheusJDBCDriver.SQLSERVER, PrometheusJDBCDriver.POSTGRESQL,
PrometheusJDBCDriver.MYSQL, PrometheusJDBCDriver.MARIADB);
/**
* Constructor.
*
* @param pManager the preference manager
* @throws OceanusException on error
*/
public PrometheusDatabasePreferences(final MetisPreferenceManager pManager) throws OceanusException {
super((PrometheusPreferenceManager) pManager, PrometheusDBResource.DBPREF_PREFNAME);
}
@Override
protected void definePreferences() throws OceanusException {
defineEnumPreference(PrometheusDatabasePreferenceKey.DBDRIVER, PrometheusJDBCDriver.class);
defineStringPreference(PrometheusDatabasePreferenceKey.DBSERVER);
defineStringPreference(PrometheusDatabasePreferenceKey.DBINSTANCE);
defineIntegerPreference(PrometheusDatabasePreferenceKey.DBPORT);
defineStringPreference(PrometheusDatabasePreferenceKey.DBNAME);
defineIntegerPreference(PrometheusDatabasePreferenceKey.DBBATCH);
defineStringPreference(PrometheusDatabasePreferenceKey.DBUSER);
defineCharArrayPreference(PrometheusDatabasePreferenceKey.DBPASS);
}
@Override
public void autoCorrectPreferences() {
/* Make sure that the enum is specified */
final MetisEnumPreference<PrometheusJDBCDriver> myTypePref = getEnumPreference(PrometheusDatabasePreferenceKey.DBDRIVER, PrometheusJDBCDriver.class);
if (!myTypePref.isAvailable()) {
myTypePref.setValue(PrometheusJDBCDriver.POSTGRESQL);
}
myTypePref.setFilter(VALID_DBS::contains);
final PrometheusJDBCDriver myDriver = myTypePref.getValue();
/* Make sure that the hostName is specified */
MetisStringPreference myPref = getStringPreference(PrometheusDatabasePreferenceKey.DBSERVER);
if (!myPref.isAvailable()) {
myPref.setValue("localhost");
}
/* Make sure that the instance is specified (for SQLSERVER) */
myPref = getStringPreference(PrometheusDatabasePreferenceKey.DBINSTANCE);
myPref.setHidden(!PrometheusJDBCDriver.SQLSERVER.equals(myDriver));
if (myPref.isHidden()) {
myPref.setValue(null);
} else if (!myPref.isAvailable()) {
myPref.setValue(PrometheusJDBCDriver.INSTANCE_SQLEXPRESS);
}
/* Make sure that the port is specified (for MARIADB/MYSQL/POSTGRESQL) */
final MetisIntegerPreference myIntPref = getIntegerPreference(PrometheusDatabasePreferenceKey.DBPORT);
myIntPref.setHidden(!myDriver.usePort());
if (myIntPref.isHidden()) {
myIntPref.setValue(null);
} else if (!myIntPref.isAvailable()) {
myIntPref.setValue(myDriver.getDefaultPort());
}
/* Make sure that the database is specified */
myPref = getStringPreference(PrometheusDatabasePreferenceKey.DBNAME);
if (!myPref.isAvailable()) {
myPref.setValue("MoneyWise");
}
/* Make sure that the user is specified */
myPref = getStringPreference(PrometheusDatabasePreferenceKey.DBUSER);
if (!myPref.isAvailable()) {
myPref.setValue(System.getProperty("user.name"));
}
/* Make sure that the passWord is specified */
final PrometheusCharArrayPreference myPassPref = getCharArrayPreference(PrometheusDatabasePreferenceKey.DBPASS);
if (!myPassPref.isAvailable()) {
myPassPref.setValue("secret".toCharArray());
}
/* Make sure that the value is specified */
final MetisIntegerPreference myBatchPref = getIntegerPreference(PrometheusDatabasePreferenceKey.DBBATCH);
if (!myBatchPref.isAvailable()) {
myBatchPref.setValue(DEFAULT_DBBATCH);
}
/* Define the range */
myBatchPref.setRange(DEFAULT_DBBATCH, null);
if (!myBatchPref.validate()) {
myBatchPref.setValue(DEFAULT_DBBATCH);
}
}
}
}