1 package org.kuali.common.jdbc; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.List; 6 import java.util.Properties; 7 8 import org.apache.commons.lang3.StringUtils; 9 import org.kuali.common.jdbc.context.DatabaseResetContext; 10 import org.kuali.common.util.CollectionUtils; 11 import org.kuali.common.util.LocationUtils; 12 import org.kuali.common.util.PropertyUtils; 13 import org.kuali.common.util.SimpleFormatter; 14 import org.slf4j.Logger; 15 import org.slf4j.LoggerFactory; 16 17 public class DefaultDatabaseService implements DatabaseService { 18 private static final Logger logger = LoggerFactory.getLogger(DefaultDatabaseService.class); 19 20 @Override 21 public void reset(DatabaseResetContext context) { 22 long start = System.currentTimeMillis(); 23 logger.info("---------------- Reset Database ----------------"); 24 logger.info("Vendor - {}", context.getDatabaseProcessContext().getVendor()); 25 logger.info("URL - {}", context.getDatabaseProcessContext().getUrl()); 26 logger.info("User - {}", context.getDatabaseProcessContext().getUsername()); 27 logger.debug("Password - {}", context.getDatabaseProcessContext().getPassword()); 28 logger.info("DBA URL - {}", context.getDatabaseProcessContext().getDbaUrl()); 29 logger.info("DBA User - {}", context.getDatabaseProcessContext().getDbaUsername()); 30 logger.debug("DBA Password - {}", context.getDatabaseProcessContext().getDbaPassword()); 31 JdbcMetaData metadata = context.getService().getJdbcMetaData(context.getDbaJdbcContext().getDataSource()); 32 logger.info("Product Name - {}", metadata.getDatabaseProductName()); 33 logger.info("Product Version - {}", metadata.getDatabaseProductVersion()); 34 logger.info("Driver - {}", context.getDatabaseProcessContext().getDriver()); 35 logger.info("Driver Name - {}", metadata.getDriverName()); 36 logger.info("Driver Version - {}", metadata.getDriverVersion()); 37 logger.info("SQL Encoding - {}", context.getEncoding()); 38 logger.info("------------------------------------------------"); 39 SqlMetaDataList metaData = new SqlMetaDataList(); 40 add(metaData, doDba(context)); 41 add(metaData, doSQL(context, "schema", context.getSchemaPropertyPrefix())); 42 context.getNormalJdbcContext().setShowProgressMin(5000); 43 add(metaData, doSQL(context, "data load", context.getDataPropertyPrefix())); 44 context.getNormalJdbcContext().setShowProgressMin(50); 45 add(metaData, doSQL(context, "constraints", context.getConstraintPropertyPrefix())); 46 metaData.setExecutionTime(System.currentTimeMillis() - start); 47 logExecution("reset database", metaData, context.getFormatter()); 48 } 49 50 protected void add(SqlMetaDataList one, SqlMetaDataList two) { 51 one.setCount(one.getCount() + two.getCount()); 52 one.addAll(two); 53 } 54 55 protected SqlMetaDataList doDba(DatabaseResetContext context) { 56 logger.info("Executing DBA SQL"); 57 SqlMetaDataList metadata = context.getService().executeSqlStrings(context.getDbaJdbcContext(), Collections.singletonList(context.getDbaSql())); 58 logExecution("dba", metadata, context.getFormatter()); 59 return metadata; 60 } 61 62 protected SqlMetaDataList doSQL(DatabaseResetContext context, String type, String prefix) { 63 List<String> locations = getLocations(context.getProperties(), prefix, context.getLocationListPattern()); 64 logger.info("Executing " + type + " SQL"); 65 SqlMetaDataList metadata = context.getService().executeSql(context.getNormalJdbcContext(), locations, context.getEncoding()); 66 logExecution(type, metadata, context.getFormatter()); 67 return metadata; 68 } 69 70 protected List<String> getLocations(Properties properties, String prefix, String locationListPattern) { 71 List<String> keys = PropertyUtils.getStartsWithKeys(properties, prefix); 72 List<String> locations = new ArrayList<String>(); 73 for (String key : keys) { 74 String value = properties.getProperty(key); 75 if (isLocationList(key, locationListPattern)) { 76 List<String> list = LocationUtils.getLocations(value); 77 locations.addAll(list); 78 } else { 79 locations.add(value); 80 } 81 } 82 return locations; 83 } 84 85 protected boolean isLocationList(String key, String pattern) { 86 return StringUtils.contains(key, pattern); 87 } 88 89 protected void logExecution(String executionType, SqlMetaDataList metadata, SimpleFormatter formatter) { 90 List<Object> args = new ArrayList<Object>(); 91 args.add(formatter.getCount(metadata.getCount())); 92 args.add(formatter.getCount(metadata.size())); 93 args.add(formatter.getTime(metadata.getExecutionTime())); 94 logger.info("Total " + executionType + " SQL statements: {} SQL sources: {} Total time: {}", CollectionUtils.toArray(args)); 95 } 96 97 }