001package dk.netarkivet.harvester.tools;
002
003import java.io.File;
004import java.util.Date;
005
006import dk.netarkivet.common.CommonSettings;
007import dk.netarkivet.common.exceptions.UnknownID;
008import dk.netarkivet.common.utils.Settings;
009import dk.netarkivet.harvester.datamodel.DBSpecifics;
010import dk.netarkivet.harvester.datamodel.HarvestChannelDAO;
011import dk.netarkivet.harvester.datamodel.HarvestDBConnection;
012import dk.netarkivet.harvester.datamodel.HarvestDefinitionDAO;
013import dk.netarkivet.harvester.datamodel.JobDAO;
014import dk.netarkivet.harvester.datamodel.TemplateDAO;
015import dk.netarkivet.harvester.datamodel.DomainDAO;
016import dk.netarkivet.harvester.datamodel.ScheduleDAO;
017import dk.netarkivet.harvester.datamodel.extendedfield.ExtendedFieldDAO;
018import dk.netarkivet.harvester.datamodel.extendedfield.ExtendedFieldTypeDAO;
019import dk.netarkivet.harvester.datamodel.extendedfield.ExtendedFieldValueDAO;
020import dk.netarkivet.harvester.datamodel.GlobalCrawlerTrapListDAO;
021import dk.netarkivet.harvester.datamodel.RunningJobsInfoDAO;
022
023/** 
024 * Simple tool to let you verify that you can access the database correctly with 
025 * settings defined by -Ddk.netarkivet.settings.file=/fullOrrelative/path/to/settings.xml
026 * or the settings.
027 * Sample Derby settings:
028 
029  <common>...
030  <database>
031      <url/>
032      <class>dk.netarkivet.harvester.datamodel.DerbyServerSpecifics</class>
033      <baseUrl>jdbc:derby</baseUrl>
034      <machine>localhost</machine>
035      <port>48121</port>
036      <dir>harvestDatabase/fullhddb</dir>
037   </database>
038 * Sample Postgresql settings:
039  <common>... 
040  <database>
041        <url/>
042      <class>dk.netarkivet.harvester.datamodel.PostgreSQLSpecifics</class>
043      <baseUrl>jdbc:postgresql</baseUrl>
044      <machine>localhost</machine>
045      <dir>test_harvestdb</dir>
046      <port>5432</port>
047      <username>netarchivesuite</username>
048      <password>netarchivesuite</password>
049  </database> 
050 */
051public class HarvestDatabaseValidator {
052
053    public static final String SETTINGSFILEPATH = "dk.netarkivet.settings.file";
054
055    /**
056     * @param args The path to a settings.xml (optional). If no argument, uses the existing settings.(e.g. by explicit setting it
057     *  -Ddk.netarkivet.settings.file=/fullOrrelative/path/to/settings.xml )
058     */
059    public static void main(String[] args) {
060        System.out.println("Running program " + HarvestDatabaseValidator.class.getName() + " at " +  new Date());
061        if (args.length == 1) {
062            System.out.println("Using settingsfile given as argument: " + args[0]); 
063            System.setProperty(SETTINGSFILEPATH, args[0]);
064            File settingsfile = new File(args[0]);
065            if (!settingsfile.exists()) {
066                System.err.println("Aborting program. Settingsfile '" + settingsfile.getAbsolutePath() + "' does not exist or is not a file");
067                System.exit(1);
068            }
069        } else {
070            String settingsfilename = System.getProperty(SETTINGSFILEPATH);
071            if (settingsfilename == null) {
072                System.out.println("Program is using the default settings");
073            } else {
074                System.out.println("Using settingsfile '" + settingsfilename + "' defined by setting '" + SETTINGSFILEPATH + "'");
075            }
076        }
077        describeSettings();
078        boolean success = accessTest();
079        System.out.println("Database accessTest was " + (success? "":"not ") + "successful");
080
081    }
082    private static boolean accessTest() {
083        String driverClass = DBSpecifics.getInstance().getDriverClassName();
084        if (!Settings.verifyClass(driverClass)) {
085            return false;
086        }
087        String jdbcUrl = HarvestDBConnection.getDBUrl();
088        try {
089            HarvestDBConnection.get();
090        } catch (Throwable e) {
091            System.out.println("ERROR. Unable to connect to database with the JDBC-url '" + jdbcUrl + "'.");
092            System.err.println("The cause: "+ e.getMessage());
093            return false;
094        }
095        System.out.println("Connection to jdbcurl '" + jdbcUrl + "' was successful");
096        try {
097            HarvestChannelDAO.getInstance();
098            HarvestDefinitionDAO.getInstance();
099            JobDAO.getInstance();
100            TemplateDAO.getInstance();
101            ScheduleDAO.getInstance();
102            DomainDAO.getInstance();
103            RunningJobsInfoDAO.getInstance();
104            GlobalCrawlerTrapListDAO.getInstance();
105        } catch (Throwable e) {
106            System.err.println(e.getMessage());
107            return false;
108        }
109        try {
110            ExtendedFieldDAO.getInstance();
111            ExtendedFieldTypeDAO.getInstance();
112            ExtendedFieldValueDAO.getInstance();
113        } catch (Throwable e) {
114            System.err.println("WARNING: One of ExtendedField* DAO classes couldn't be instantiated:");
115        }
116
117        return true;
118    }
119
120    private static void describeSettings() {
121        System.out.println("The database settings including the default ones are:");
122        printSettings(CommonSettings.DB_SPECIFICS_CLASS);
123        printSettings(CommonSettings.DB_BASE_URL);
124        printSettings(CommonSettings.DB_DIR); // if postgresql = databasename
125        printSettings(CommonSettings.DB_MACHINE);
126        printSettings(CommonSettings.DB_IS_DERBY_IF_CONTAINS);
127        printSettings(CommonSettings.DB_CONN_VALID_CHECK_TIMEOUT);
128        printSettings(CommonSettings.DB_PASSWORD);
129        printSettings(CommonSettings.DB_USERNAME);
130        printSettings(CommonSettings.DB_PORT);
131        printSettings(CommonSettings.DB_POOL_MIN_SIZE);
132        printSettings(CommonSettings.DB_POOL_MAX_SIZE);
133        printSettings(CommonSettings.DB_POOL_MAX_CONNECTION_AGE);
134        printSettings(CommonSettings.DB_POOL_MAX_STM);
135        printSettings(CommonSettings.DB_POOL_MAX_STM_PER_CONN);
136        printSettings(CommonSettings.DB_POOL_ACQ_INC);
137        printSettings(CommonSettings.DB_POOL_IDLE_CONN_TEST_ON_CHECKIN);
138        printSettings(CommonSettings.DB_POOL_IDLE_CONN_TEST_PERIOD);
139        printSettings(CommonSettings.DB_POOL_IDLE_CONN_TEST_QUERY);
140    }
141
142    private static void printSettings(String key) {
143        String result = null;
144        try {
145            result = Settings.get(key);
146        } catch (UnknownID e) {
147            // Ignore
148        }
149        System.out.println("Setting '" + key + "': " + ((result == null || result.isEmpty())? "Undefined" : result));
150    }
151
152}