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;
}