/**
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Jasig licenses this file to you 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 org.jasig.portal.tools;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.jasig.portal.RDBMServices;
import org.jasig.portal.hibernate.DelegatingHibernateIntegrator.HibernateConfiguration;
import org.jasig.portal.hibernate.HibernateConfigurationAware;
import org.jasig.portal.jpa.BaseAggrEventsJpaDao;
import org.jasig.portal.jpa.BasePortalJpaDao;
import org.jasig.portal.jpa.BaseRawEventsJpaDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.Lazy;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcOperations;
import org.springframework.jdbc.support.JdbcUtils;
import org.springframework.stereotype.Component;
/**
* Title: DbTest Description: Displays database metadata information Company:
*
* @author John Fereira
* @version $Revision$
*/
@Component("dbTest")
@Lazy
@DependsOn( {
BasePortalJpaDao.PERSISTENCE_UNIT_NAME + "EntityManagerFactory",
BaseAggrEventsJpaDao.PERSISTENCE_UNIT_NAME + "EntityManagerFactory",
BaseRawEventsJpaDao.PERSISTENCE_UNIT_NAME + "EntityManagerFactory",
"jdbcOperations",
"rawEventsJdbcOperations",
"aggrEventsJdbcOperations",
"hibernateConfigurationAwareInjector"
} )
public class DbTestImpl implements HibernateConfigurationAware, DbTest {
protected final Logger logger = LoggerFactory.getLogger(getClass());
private final Map<String, HibernateConfiguration> hibernateConfigurations = new ConcurrentHashMap<String, HibernateConfiguration>();
private Map<String, JdbcOperations> jdbcOperations;
@Override
public boolean supports(String persistenceUnit) {
return true;
}
@Override
public void setConfiguration(String persistenceUnit, HibernateConfiguration hibernateConfiguration) {
this.hibernateConfigurations.put(persistenceUnit, hibernateConfiguration);
}
@Autowired
public void setJdbcOperations(Map<String, JdbcOperations> jdbcOperations) {
this.jdbcOperations = jdbcOperations;
}
@Override
public void printDbInfo() {
boolean fail = false;
logger.info("JDBC DataSources");
for (final Entry<String, JdbcOperations> jdbcEntry : this.jdbcOperations.entrySet()) {
final String jdbcName = jdbcEntry.getKey();
try {
logger.info("\t" + jdbcName);
final JdbcOperations jdbcOps = jdbcEntry.getValue();
jdbcOps.execute(new ConnectionCallback<Object>() {
@Override
public Object doInConnection(Connection con) throws SQLException, DataAccessException {
printInfo(con);
return null;
}
});
}
catch (Exception e) {
logger.error("\t" + jdbcName + ": parse info", e);
fail = true;
}
logger.info("");
}
logger.info("Hibernate Dialects");
for (final Entry<String, HibernateConfiguration> configEntry : this.hibernateConfigurations.entrySet()) {
final String persistenceUnit = configEntry.getKey();
try {
final HibernateConfiguration hibernateConfiguration = configEntry.getValue();
final SessionFactoryImplementor sessionFactory = hibernateConfiguration.getSessionFactory();
final Dialect dialect = sessionFactory.getDialect();
logger.info("\t" + persistenceUnit + ": " + dialect);
}
catch (Exception e) {
logger.error("\t" + persistenceUnit + ": Failed to resolve Dialect", e);
fail = true;
}
logger.info("");
}
if (fail) {
throw new RuntimeException("One or more of the portal data sources is not configured correctly or the target database is not available.");
}
}
private void printInfo(Connection conn) throws SQLException {
DatabaseMetaData dbMetaData = conn.getMetaData();
String dbName = dbMetaData.getDatabaseProductName();
String dbVersion = dbMetaData.getDatabaseProductVersion();
String driverName = dbMetaData.getDriverName();
String driverVersion = dbMetaData.getDriverVersion();
final int databaseMajorVersion = dbMetaData.getDatabaseMajorVersion();
final int databaseMinorVersion = dbMetaData.getDatabaseMinorVersion();
final int driverMajorVersion = dbMetaData.getDriverMajorVersion();
final int driverMinorVersion = dbMetaData.getDriverMinorVersion();
String driverClass = RDBMServices.getJdbcDriver();
String url = RDBMServices.getJdbcUrl();
String user = RDBMServices.getJdbcUser();
boolean supportsANSI92EntryLevelSQL = dbMetaData.supportsANSI92EntryLevelSQL();
boolean supportsANSI92FullSQL = dbMetaData.supportsANSI92FullSQL();
boolean supportsBatchUpdates = dbMetaData.supportsBatchUpdates();
boolean supportsColumnAliasing = dbMetaData.supportsColumnAliasing();
boolean supportsCoreSQLGrammar = dbMetaData.supportsCoreSQLGrammar();
boolean supportsExtendedSQLGrammar = dbMetaData.supportsExtendedSQLGrammar();
boolean supportsExpressionsInOrderBy = dbMetaData.supportsExpressionsInOrderBy();
boolean supportsOuterJoins = dbMetaData.supportsOuterJoins();
boolean supportsFullOuterJoins = dbMetaData.supportsFullOuterJoins();
boolean supportsLimitedOuterJoins = dbMetaData.supportsLimitedOuterJoins();
boolean supportsMultipleTransactions = dbMetaData.supportsMultipleTransactions();
boolean supportsOpenCursorsAcrossCommit = dbMetaData.supportsOpenCursorsAcrossCommit();
boolean supportsOpenCursorsAcrossRollback = dbMetaData.supportsOpenCursorsAcrossRollback();
boolean supportsOpenStatementsAcrossCommit = dbMetaData.supportsOpenStatementsAcrossCommit();
boolean supportsOpenStatementsAcrossRollback = dbMetaData.supportsOpenStatementsAcrossRollback();
boolean supportsOrderByUnrelated = dbMetaData.supportsOrderByUnrelated();
boolean supportsPositionedDelete = dbMetaData.supportsPositionedDelete();
boolean supportsSelectForUpdate = dbMetaData.supportsSelectForUpdate();
boolean supportsStoredProcedures = dbMetaData.supportsStoredProcedures();
boolean supportsTransactions = dbMetaData.supportsTransactions();
boolean supportsUnion = dbMetaData.supportsUnion();
boolean supportsUnionAll = dbMetaData.supportsUnionAll();
int getMaxColumnNameLength = dbMetaData.getMaxColumnNameLength();
int getMaxColumnsInIndex = dbMetaData.getMaxColumnsInIndex();
int getMaxColumnsInOrderBy = dbMetaData.getMaxColumnsInOrderBy();
int getMaxColumnsInSelect = dbMetaData.getMaxColumnsInSelect();
int getMaxColumnsInTable = dbMetaData.getMaxColumnsInTable();
int getMaxConnections = dbMetaData.getMaxConnections();
int getMaxCursorNameLength = dbMetaData.getMaxCursorNameLength();
int getMaxIndexLength = dbMetaData.getMaxIndexLength();
int getMaxRowSize = dbMetaData.getMaxRowSize();
int getMaxStatements = dbMetaData.getMaxStatements();
int getMaxTableNameLength = dbMetaData.getMaxTableNameLength();
int getMaxTablesInSelect = dbMetaData.getMaxTablesInSelect();
int getMaxUserNameLength = dbMetaData.getMaxUserNameLength();
String getSearchStringEscape = dbMetaData.getSearchStringEscape();
String getStringFunctions = dbMetaData.getStringFunctions();
String getSystemFunctions = dbMetaData.getSystemFunctions();
String getTimeDateFunctions = dbMetaData.getTimeDateFunctions();
logger.info("\t\tDatabase name: '" + dbName + "'");
logger.info("\t\tDatabase version: '" + dbVersion + "' (" + databaseMajorVersion + "." + databaseMinorVersion + ")");
logger.info("\t\tDriver name: '" + driverName + "'");
logger.info("\t\tDriver version: '" + driverVersion + "' (" + driverMajorVersion + "." + driverMinorVersion + ")");
logger.info("\t\tDriver class: '" + driverClass + "'");
logger.info("\t\tConnection URL: '" + url + "'");
logger.info("\t\tUser: '" + user + "'");
logger.info("");
logger.info("\t\tsupportsANSI92EntryLevelSQL: " + supportsANSI92EntryLevelSQL);
logger.info("\t\tsupportsANSI92FullSQL: " + supportsANSI92FullSQL);
logger.info("\t\tsupportsCoreSQLGrammar: " + supportsCoreSQLGrammar);
logger.info("\t\tsupportsExtendedSQLGrammar: " + supportsExtendedSQLGrammar);
logger.info("");
logger.info("\t\tsupportsTransactions: " + supportsTransactions);
logger.info("\t\tsupportsMultipleTransactions: " + supportsMultipleTransactions);
logger.info("\t\tsupportsOpenCursorsAcrossCommit: " + supportsOpenCursorsAcrossCommit);
logger.info("\t\tsupportsOpenCursorsAcrossRollback: " + supportsOpenCursorsAcrossRollback);
logger.info("\t\tsupportsOpenStatementsAcrossCommit: " + supportsOpenStatementsAcrossCommit);
logger.info("\t\tsupportsOpenStatementsAcrossRollback: " + supportsOpenStatementsAcrossRollback);
logger.info("");
logger.info("\t\tsupportsStoredProcedures: " + supportsStoredProcedures);
logger.info("\t\tsupportsOuterJoins: " + supportsOuterJoins);
logger.info("\t\tsupportsFullOuterJoins: " + supportsFullOuterJoins);
logger.info("\t\tsupportsLimitedOuterJoins: " + supportsLimitedOuterJoins);
logger.info("\t\tsupportsBatchUpdates: " + supportsBatchUpdates);
logger.info("\t\tsupportsColumnAliasing: " + supportsColumnAliasing);
logger.info("\t\tsupportsExpressionsInOrderBy: " + supportsExpressionsInOrderBy);
logger.info("\t\tsupportsOrderByUnrelated: " + supportsOrderByUnrelated);
logger.info("\t\tsupportsPositionedDelete: " + supportsPositionedDelete);
logger.info("\t\tsupportsSelectForUpdate: " + supportsSelectForUpdate);
logger.info("\t\tsupportsUnion: " + supportsUnion);
logger.info("\t\tsupportsUnionAll: " + supportsUnionAll);
logger.info("");
logger.info("\t\tmaxColumnNameLength: " + getMaxColumnNameLength);
logger.info("\t\tmaxColumnsInIndex: " + getMaxColumnsInIndex);
logger.info("\t\tmaxColumnsInOrderBy: " + getMaxColumnsInOrderBy);
logger.info("\t\tmaxColumnsInSelect: " + getMaxColumnsInSelect);
logger.info("\t\tmaxColumnsInTable: " + getMaxColumnsInTable);
logger.info("\t\tmaxConnections: " + getMaxConnections);
logger.info("\t\tmaxCursorNameLength: " + getMaxCursorNameLength);
logger.info("\t\tmaxIndexLength: " + getMaxIndexLength);
logger.info("\t\tmaxRowSize: " + getMaxRowSize);
logger.info("\t\tmaxStatements: " + getMaxStatements);
logger.info("\t\tmaxTableNameLength: " + getMaxTableNameLength);
logger.info("\t\tmaxTablesInSelect: " + getMaxTablesInSelect);
logger.info("\t\tmaxUserNameLength: " + getMaxUserNameLength);
logger.info("\t\tsearchStringEscape: " + getSearchStringEscape);
logger.info("\t\tstringFunctions: " + getStringFunctions);
logger.info("\t\tsystemFunctions: " + getSystemFunctions);
logger.info("\t\ttimeDateFunctions: " + getTimeDateFunctions);
logger.info("");
ResultSet getTableTypes = null;
ResultSet getTypeInfo = null;
try {
getTableTypes = dbMetaData.getTableTypes();
StringBuilder tabletypes = new StringBuilder();
while (getTableTypes.next()) {
tabletypes.append(getTableTypes.getString(1)).append(",");
}
tabletypes = tabletypes.deleteCharAt(tabletypes.length() - 1);
logger.info("\t\tTable Types: " + tabletypes);
getTypeInfo = dbMetaData.getTypeInfo();
StringBuilder typeinfo = new StringBuilder();
while (getTypeInfo.next()) {
typeinfo.append(getTypeInfo.getString(1)).append(",");
}
typeinfo = typeinfo.deleteCharAt(typeinfo.length() - 1);
logger.info("\t\tSQL Types: " + typeinfo);
} catch (SQLException ex) {
} finally {
JdbcUtils.closeResultSet(getTableTypes);
JdbcUtils.closeResultSet(getTypeInfo);
}
} // end printInfo
}