List of usage examples for org.apache.commons.lang3.exception ContextedRuntimeException ContextedRuntimeException
public ContextedRuntimeException()
From source file:net.certifi.audittablegen.ChangeSourceFactory.java
List<DBChangeUnit> getDBChangeList(TableDef baseTableDef) { List<DBChangeUnit> tableChangeUnits = new ArrayList(); List<DBChangeUnit> renameColumnChangeUnits = new ArrayList(); List<DBChangeUnit> alterTableChangeUnits = new ArrayList(); DBChangeUnit workUnit;/* www . j a va2 s .c o m*/ String baseTableName = baseTableDef.getName(); String newColumnName; if (baseTableDef == null) { logger.error("Invalid input. null TableDef"); return tableChangeUnits; } if (baseTableDef.getColumns().isEmpty()) { ContextedRuntimeException e = new ContextedRuntimeException(); e.setContextValue("tableName", baseTableDef.getName()); logger.error("Invalid Input. TableDef has no columns.", e); return tableChangeUnits; } String auditTableName = tablePrefix + baseTableName + tablePostfix; String auditActionColumn = columnPrefix + "action" + columnPostfix; String auditTimeStampColumn = columnPrefix + "ts" + columnPostfix; String auditUserColumn = columnPrefix + "userId" + columnPostfix; String sessionUserColumn = columnPrefix + "sessionUser" + columnPostfix; TableDef auditTableDef = null; if (auditTablesMap.containsKey(auditTableName)) { auditTableDef = auditTablesMap.get(auditTableName); } if (isTableExcluded(baseTableName)) { //drop all audit triggers tableChangeUnits.add(new DBChangeUnit(DBChangeType.begin)); workUnit = new DBChangeUnit(DBChangeType.dropTriggers); workUnit.setTableName(baseTableName); tableChangeUnits.add(workUnit); tableChangeUnits.add(new DBChangeUnit(DBChangeType.end)); //done. We don't want to alter any exising audit table return tableChangeUnits; } //create or alter audit table if (null == auditTableDef) { //create table tableChangeUnits.add(new DBChangeUnit(DBChangeType.begin)); workUnit = new DBChangeUnit(DBChangeType.createTable); workUnit.tableName = auditTableName; tableChangeUnits.add(workUnit); //create id column workUnit = new DBChangeUnit(DBChangeType.addColumn); workUnit.setColumnName(auditTableName + "Id"); workUnit.setTableName(auditTableName); workUnit.setTypeName(auditIdTypeName); workUnit.setIdentity(Boolean.TRUE); tableChangeUnits.add(workUnit); //create all columns on the base table for (ColumnDef baseColumn : baseTableDef.getColumns()) { workUnit = new DBChangeUnit(DBChangeType.addColumn); workUnit.setColumnName(baseColumn.getName()); workUnit.setTableName(auditTableName); workUnit.setTypeName(baseColumn.getTypeName()); workUnit.setSize(baseColumn.getSize()); workUnit.setDecimalSize(baseColumn.getDecimalSize()); tableChangeUnits.add(workUnit); } //create the audit tracking columns //action workUnit = new DBChangeUnit(DBChangeType.addColumn); workUnit.setColumnName(auditActionColumn); workUnit.setTableName(auditTableName); workUnit.setTypeName(auditActionTypeName); //insert, update, or delete workUnit.setSize(6); workUnit.setDecimalSize(0); tableChangeUnits.add(workUnit); //user workUnit = new DBChangeUnit(DBChangeType.addColumn); workUnit.setColumnName(auditUserColumn); workUnit.setTableName(auditTableName); workUnit.setTypeName(auditUserTypeName); workUnit.setSize(configSource.getMaxUserNameLength()); workUnit.setDecimalSize(0); tableChangeUnits.add(workUnit); //timestamp workUnit = new DBChangeUnit(DBChangeType.addColumn); workUnit.setColumnName(auditTimeStampColumn); workUnit.setTableName(auditTableName); workUnit.setTypeName(auditTimeStampTypeName); workUnit.setSize(0); workUnit.setDecimalSize(0); tableChangeUnits.add(workUnit); //sessionUser if (!sessionUserSQL.isEmpty()) { workUnit = new DBChangeUnit(DBChangeType.addColumn); workUnit.setColumnName(sessionUserColumn); workUnit.setTableName(auditTableName); workUnit.setTypeName(sessionUserTypeName); workUnit.setSize(sessionUserDataSize); workUnit.setDecimalSize(0); tableChangeUnits.add(workUnit); } //end of table tableChangeUnits.add(new DBChangeUnit(DBChangeType.end)); } else { //alter table //there might not be any changes, so store up any changes in //a temporary list, and evaluate. alterTableChangeUnits.add(new DBChangeUnit(DBChangeType.begin)); workUnit = new DBChangeUnit(DBChangeType.alterTable); workUnit.setTableName(auditTableName); alterTableChangeUnits.add(workUnit); //to make this a little easier, get a map for the column list Map<String, ColumnDef> auditColumnMap = new CaseInsensitiveMap(); for (ColumnDef auditColumn : auditTableDef.getColumns()) { auditColumnMap.put(auditColumn.getName(), auditColumn); } //make sure the audit columns and the id exist //create the audit tracking columns //action if (!auditColumnMap.containsKey(auditActionColumn)) { logger.warn("Existing audit table {} does not contain column {}. Creating", auditTableName, auditActionColumn); workUnit = new DBChangeUnit(DBChangeType.addColumn); workUnit.setColumnName(auditActionColumn); workUnit.setTableName(auditTableName); workUnit.setTypeName(auditActionTypeName); //insert, update, or delete workUnit.setSize(6); workUnit.setDecimalSize(0); alterTableChangeUnits.add(workUnit); } //user if (!auditColumnMap.containsKey(auditUserColumn)) { logger.warn("Existing audit table {} does not contain column {}. Creating", auditTableName, auditUserColumn); workUnit = new DBChangeUnit(DBChangeType.addColumn); workUnit.setColumnName(auditUserColumn); workUnit.setTableName(auditTableName); workUnit.setTypeName(auditUserTypeName); workUnit.setSize(configSource.getMaxUserNameLength()); workUnit.setDecimalSize(0); alterTableChangeUnits.add(workUnit); } //timestamp if (!auditColumnMap.containsKey(auditTimeStampColumn)) { logger.warn("Existing audit table {} does not contain column {}. Creating", auditTableName, auditTimeStampColumn); workUnit = new DBChangeUnit(DBChangeType.addColumn); workUnit.setColumnName(auditTimeStampColumn); workUnit.setTableName(auditTableName); workUnit.setTypeName(auditTimeStampTypeName); workUnit.setSize(0); workUnit.setDecimalSize(0); alterTableChangeUnits.add(workUnit); } //seesionuser if (!sessionUserSQL.isEmpty()) { if (!auditColumnMap.containsKey(sessionUserColumn)) { logger.warn("Existing audit table {} does not contain column {}. Creating", auditTableName, sessionUserColumn); workUnit = new DBChangeUnit(DBChangeType.addColumn); workUnit.setColumnName(sessionUserColumn); workUnit.setTableName(auditTableName); workUnit.setTypeName(sessionUserTypeName); workUnit.setSize(sessionUserDataSize); workUnit.setDecimalSize(0); alterTableChangeUnits.add(workUnit); } } //add or alter columns for (ColumnDef baseColumn : baseTableDef.getColumns()) { if (auditColumnMap.containsKey(baseColumn.name)) { //existing column ColumnDef auditColumn = auditColumnMap.get(baseColumn.name); if (auditColumn.getTypeName().equalsIgnoreCase(baseColumn.getTypeName()) && auditColumn.getSize() >= baseColumn.getSize() && auditColumn.getDecimalSize() >= baseColumn.getDecimalSize()) { //nothing to do } else if (auditColumn.getTypeName().equalsIgnoreCase(baseColumn.getTypeName()) && (auditColumn.getSize() < baseColumn.getSize() || auditColumn.getDecimalSize() < baseColumn.getDecimalSize())) { //type is the same, but size increased workUnit = new DBChangeUnit(DBChangeType.alterColumnSize); workUnit.setTableName(auditTableName); workUnit.setColumnName(baseColumn.getName()); workUnit.setTypeName(baseColumn.getTypeName()); workUnit.setSize(baseColumn.getSize()); workUnit.setDecimalSize(baseColumn.getDecimalSize()); alterTableChangeUnits.add(workUnit); } else { //type changes or size shrunk. Rename existing column //and create new column in its place. This requires //the column rename to be done as a sepereate command //from the other column changes. (At least it does on //postgres. int i = 1; do { newColumnName = String.format("%s_prev%d", auditColumn.getName(), i); i++; } while (auditColumnMap.containsKey(newColumnName)); //rename the old version of the audit column renameColumnChangeUnits.add((new DBChangeUnit(DBChangeType.begin))); workUnit = new DBChangeUnit(DBChangeType.alterTable); workUnit.setTableName(auditTableName); renameColumnChangeUnits.add(workUnit); workUnit = new DBChangeUnit(DBChangeType.alterColumnName); workUnit.setTableName(auditTableName); workUnit.setColumnName(auditColumn.getName()); workUnit.setNewColumnName(newColumnName); workUnit.setTypeName(auditColumn.getTypeName()); workUnit.setSize(auditColumn.getSize()); workUnit.setDecimalSize(auditColumn.getDecimalSize()); renameColumnChangeUnits.add(workUnit); renameColumnChangeUnits.add((new DBChangeUnit(DBChangeType.end))); //now add the new version of the column workUnit = new DBChangeUnit(DBChangeType.addColumn); workUnit.setTableName(auditTableName); workUnit.setColumnName(baseColumn.getName()); workUnit.setTypeName(baseColumn.getTypeName()); workUnit.setSize(baseColumn.getSize()); workUnit.setDecimalSize(baseColumn.getDecimalSize()); alterTableChangeUnits.add(workUnit); } } else { //new column workUnit = new DBChangeUnit(DBChangeType.addColumn); workUnit.setTableName(auditTableName); workUnit.setColumnName(baseColumn.getName()); workUnit.setTypeName(baseColumn.getTypeName()); workUnit.setSize(baseColumn.getSize()); workUnit.setDecimalSize(baseColumn.getDecimalSize()); alterTableChangeUnits.add(workUnit); } } //end of table alterTableChangeUnits.add(new DBChangeUnit(DBChangeType.end)); //add the workUnits to the return value if (!renameColumnChangeUnits.isEmpty()) { tableChangeUnits.addAll(renameColumnChangeUnits); } if (alterTableChangeUnits.size() > 3) { tableChangeUnits.addAll(alterTableChangeUnits); } } //begin trigger changes tableChangeUnits.add(new DBChangeUnit(DBChangeType.begin)); workUnit = new DBChangeUnit(DBChangeType.createTriggers); workUnit.setTableName(baseTableName); workUnit.setAuditTableName(auditTableName); tableChangeUnits.add(workUnit); //insert trigger workUnit = new DBChangeUnit(DBChangeType.fireOnInsert); workUnit.setTableName(baseTableName); workUnit.setAuditTableName(auditTableName); workUnit.setFiresTrigger(hasTriggerType(baseTableName, ConfigAttributeTypes.auditinsert)); tableChangeUnits.add(workUnit); //update trigger workUnit = new DBChangeUnit(DBChangeType.fireOnUpdate); workUnit.setTableName(baseTableName); workUnit.setAuditTableName(auditTableName); workUnit.setFiresTrigger(hasTriggerType(baseTableName, ConfigAttributeTypes.auditupdate)); tableChangeUnits.add(workUnit); //delete trigger workUnit = new DBChangeUnit(DBChangeType.fireOnDelete); workUnit.setTableName(baseTableName); workUnit.setAuditTableName(auditTableName); workUnit.setFiresTrigger(hasTriggerType(baseTableName, ConfigAttributeTypes.auditdelete)); tableChangeUnits.add(workUnit); //now add the columns that will be included in the trigger //and set whether or not they will cause it to fire (default is true) for (ColumnDef baseColumnDef : baseTableDef.getColumns()) { workUnit = new DBChangeUnit(DBChangeType.addTriggerColumn); workUnit.setTableName(baseTableName); workUnit.setAuditTableName(auditTableName); workUnit.setColumnName(baseColumnDef.getName()); if (isColumnExcluded(baseTableDef.getName(), baseColumnDef.getName())) { workUnit.setFiresTrigger(Boolean.FALSE); } tableChangeUnits.add(workUnit); } //add the audit tracking columns //action workUnit = new DBChangeUnit(DBChangeType.addTriggerAction); workUnit.setColumnName(auditActionColumn); workUnit.setTableName(baseTableName); workUnit.setAuditTableName(auditTableName); tableChangeUnits.add(workUnit); //user workUnit = new DBChangeUnit(DBChangeType.addTriggerUser); workUnit.setColumnName(auditUserColumn); workUnit.setTableName(baseTableName); workUnit.setAuditTableName(auditTableName); tableChangeUnits.add(workUnit); //timestamp workUnit = new DBChangeUnit(DBChangeType.addTriggerTimeStamp); workUnit.setColumnName(auditTimeStampColumn); workUnit.setTableName(baseTableName); workUnit.setAuditTableName(auditTableName); tableChangeUnits.add(workUnit); //sessionuser if (!sessionUserSQL.isEmpty()) { workUnit = new DBChangeUnit(DBChangeType.addTriggerSessionUser); workUnit.setColumnName(sessionUserColumn); workUnit.setTableName(baseTableName); workUnit.setAuditTableName(auditTableName); tableChangeUnits.add(workUnit); } //end trigger changes tableChangeUnits.add(new DBChangeUnit(DBChangeType.end)); return tableChangeUnits; }