/* 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 org.activiti.engine.impl.persistence.entity; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Logger; import org.activiti.engine.ActivitiException; import org.activiti.engine.impl.TablePageQueryImpl; import org.activiti.engine.impl.persistence.AbstractManager; import org.activiti.engine.management.TableMetaData; import org.activiti.engine.management.TablePage; import org.apache.ibatis.session.RowBounds; /** * @author Tom Baeyens */ public class TableDataManager extends AbstractManager { private static Logger log = Logger.getLogger(TableDataManager.class.getName()); public Map<String, Long> getTableCount() { Map<String, Long> tableCount = new HashMap<String, Long>(); try { for (String tableName: getTablesPresentInDatabase()) { tableCount.put(tableName, getTableCount(tableName)); } log.fine("Number of rows per activiti table: "+tableCount); } catch (Exception e) { throw new ActivitiException("couldn't get table counts", e); } return tableCount; } public List<String> getTablesPresentInDatabase() { List<String> tableNames = new ArrayList<String>(); Connection connection = null; try { connection = getDbSqlSession().getSqlSession().getConnection(); DatabaseMetaData databaseMetaData = connection.getMetaData(); ResultSet tables = null; try { log.fine("retrieving activiti tables from jdbc metadata"); String databaseTablePrefix = getDbSqlSession().getDbSqlSessionFactory().getDatabaseTablePrefix(); String tableNameFilter = databaseTablePrefix+"ACT_%"; if ("postgres".equals(getDbSqlSession().getDbSqlSessionFactory().getDatabaseType())) { tableNameFilter = databaseTablePrefix+"act_%"; } tables = databaseMetaData.getTables(null, null, tableNameFilter, getDbSqlSession().JDBC_METADATA_TABLE_TYPES); while (tables.next()) { String tableName = tables.getString("TABLE_NAME"); tableName = tableName.toUpperCase(); tableNames.add(tableName); log.fine(" retrieved activiti table name "+tableName); } } finally { tables.close(); } } catch (Exception e) { throw new ActivitiException("couldn't get activiti table names using metadata: "+e.getMessage(), e); } return tableNames; } protected long getTableCount(String tableName) { log.fine("selecting table count for "+tableName); Long count = (Long) getDbSqlSession().selectOne("selectTableCount", Collections.singletonMap("tableName", tableName)); return count; } @SuppressWarnings("unchecked") public TablePage getTablePage(TablePageQueryImpl tablePageQuery, int firstResult, int maxResults) { TablePage tablePage = new TablePage(); List<Map<String, Object>> tableData = (List<Map<String, Object>>) getDbSqlSession() .getSqlSession() .selectList("selectTableData", tablePageQuery, new RowBounds(firstResult, maxResults)); tablePage.setTableName(tablePageQuery.getTableName()); tablePage.setTotal(getTableCount(tablePageQuery.getTableName())); tablePage.setRows(tableData); tablePage.setFirstResult(firstResult); return tablePage; } public TableMetaData getTableMetaData(String tableName) { TableMetaData result = new TableMetaData(); try { result.setTableName(tableName); DatabaseMetaData metaData = getDbSqlSession() .getSqlSession() .getConnection() .getMetaData(); if ("postgres".equals(getDbSqlSession().getDbSqlSessionFactory().getDatabaseType())) { tableName = tableName.toLowerCase(); } ResultSet resultSet = metaData.getColumns(null, null, tableName, null); while(resultSet.next()) { String name = resultSet.getString("COLUMN_NAME").toUpperCase(); String type = resultSet.getString("TYPE_NAME").toUpperCase(); result.addColumnMetaData(name, type); } } catch (SQLException e) { throw new ActivitiException("Could not retrieve database metadata: " + e.getMessage()); } if(result.getColumnNames().size() == 0) { // According to API, when a table doesn't exist, null should be returned result = null; } return result; } }