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}