/**
* Licensed to JumpMind Inc under one or more contributor
* license agreements. See the NOTICE file distributed
* with this work for additional information regarding
* copyright ownership. JumpMind Inc licenses this file
* to you under the GNU General Public License, version 3.0 (GPLv3)
* (the "License"); you may not use this file except in compliance
* with the License.
*
* You should have received a copy of the GNU General Public License,
* version 3.0 (GPLv3) along with this library; if not, see
* <http://www.gnu.org/licenses/>.
*
* 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.jumpmind.symmetric.model;
import java.io.Serializable;
import java.util.Date;
import org.jumpmind.db.model.Table;
import org.jumpmind.symmetric.db.AbstractTriggerTemplate;
import org.jumpmind.symmetric.io.data.DataEventType;
/**
* Maps to the table sync audit table which tracks the history of sync trigger
* creation.
* <p/>
* This table also tracks the columns and the primary keys as of the create date
* so that if the table definition changes while we still have events to process
* (as may be the case when distributing events to remote locations), then we
* still have the history of what the columns and primary keys were at the time.
*/
public class TriggerHistory implements Serializable {
private static final long serialVersionUID = 1L;
private int triggerHistoryId;
private String triggerId;
private String sourceTableName;
private String sourceSchemaName;
private String sourceCatalogName;
private Date createTime;
private String columnNames;
private String[] parsedColumnNames;
private String pkColumnNames;
private String[] parsedPkColumnNames;
private String nameForInsertTrigger;
private String nameForUpdateTrigger;
private String nameForDeleteTrigger;
private String errorMessage;
private Date inactiveTime;
/**
* This is a hash based on the tablename, column names, and column data
* types. It is used to effectively version a table so we know when it
* changes.
*/
private int tableHash;
/**
* This is a hash based on the values in the trigger configuration table.
*/
private long triggerRowHash;
/**
* This is a hash of the trigger templates used for generating the trigger text.
*/
private long triggerTemplateHash;
private TriggerReBuildReason lastTriggerBuildReason;
public TriggerHistory() {
createTime = new Date();
}
public TriggerHistory(int triggerHistoryId) {
this();
this.triggerHistoryId = triggerHistoryId;
}
public TriggerHistory(String tableName, String pkColumnNames, String columnNames) {
this();
this.sourceTableName = tableName;
this.pkColumnNames = pkColumnNames;
this.columnNames = columnNames;
}
public TriggerHistory(Table table, Trigger trigger, AbstractTriggerTemplate triggerTemplate) {
this(table, trigger, triggerTemplate, null);
}
public TriggerHistory(Table table, Trigger trigger, AbstractTriggerTemplate triggerTemplate, TriggerReBuildReason reason) {
this();
this.lastTriggerBuildReason = reason;
this.sourceTableName = trigger.isSourceTableNameWildCarded() ? table.getName() : trigger
.getSourceTableName();
this.columnNames = Table.getCommaDeliminatedColumns(trigger.orderColumnsForTable(table));
this.sourceSchemaName = trigger.isSourceSchemaNameWildCarded() ? table.getSchema() :
trigger.getSourceSchemaName();
this.sourceCatalogName = trigger.isSourceCatalogNameWildCarded() ? table.getCatalog() :
trigger.getSourceCatalogName();
this.triggerId = trigger.getTriggerId();
this.pkColumnNames = Table.getCommaDeliminatedColumns(trigger.filterExcludedColumns(trigger
.getSyncKeysColumnsForTable(table)));
this.triggerRowHash = trigger.toHashedValue();
this.triggerTemplateHash = triggerTemplate.toHashedValue();
this.tableHash = table.calculateTableHashcode();
}
public TriggerHistory(Trigger trigger) {
this.sourceCatalogName = trigger.getSourceCatalogName();
this.sourceSchemaName = trigger.getSourceSchemaName();
this.sourceTableName = trigger.getSourceTableName();
this.triggerId = trigger.getTriggerId();
}
public String getTriggerNameForDmlType(DataEventType type) {
switch (type) {
case INSERT:
return getNameForInsertTrigger();
case UPDATE:
return getNameForUpdateTrigger();
case DELETE:
return getNameForDeleteTrigger();
default:
break;
}
throw new IllegalStateException();
}
public String[] getParsedColumnNames() {
if (parsedColumnNames == null && columnNames != null) {
parsedColumnNames = columnNames.split(",");
}
return parsedColumnNames;
}
public int indexOfColumnName(String columnName, boolean ignoreCase) {
String[] columnNames = getParsedColumnNames();
int i = 0;
for (String col : columnNames) {
if (ignoreCase && col.equalsIgnoreCase(columnName)) {
return i;
} else if (col.equals(columnName)) {
return i;
}
i++;
}
return -1;
}
public String[] getParsedPkColumnNames() {
if (parsedPkColumnNames == null && pkColumnNames != null) {
parsedPkColumnNames = pkColumnNames.split(",");
}
return parsedPkColumnNames;
}
public int getTableHash() {
return tableHash;
}
public void setTableHash(int tableHash) {
this.tableHash = tableHash;
}
public String getFullyQualifiedSourceTableName() {
return Table.getFullyQualifiedTableName(sourceCatalogName, sourceSchemaName, sourceTableName);
}
public String getSourceTableName() {
return sourceTableName;
}
public void setSourceTableName(String tableName) {
this.sourceTableName = tableName;
}
public String getColumnNames() {
return columnNames;
}
public void setColumnNames(String allColumnData) {
this.columnNames = allColumnData;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public TriggerReBuildReason getLastTriggerBuildReason() {
return lastTriggerBuildReason;
}
public void setLastTriggerBuildReason(TriggerReBuildReason lastTriggerBuildReason) {
this.lastTriggerBuildReason = lastTriggerBuildReason;
}
public String getPkColumnNames() {
return pkColumnNames;
}
public void setPkColumnNames(String pkColumnData) {
this.pkColumnNames = pkColumnData;
}
public int getTriggerHistoryId() {
return triggerHistoryId;
}
public void setTriggerHistoryId(int tableSyncAuditId) {
this.triggerHistoryId = tableSyncAuditId;
}
public String getNameForDeleteTrigger() {
return nameForDeleteTrigger;
}
public void setNameForDeleteTrigger(String nameForDeleteTrigger) {
this.nameForDeleteTrigger = nameForDeleteTrigger;
}
public String getNameForInsertTrigger() {
return nameForInsertTrigger;
}
public void setNameForInsertTrigger(String nameForInsertTrigger) {
this.nameForInsertTrigger = nameForInsertTrigger;
}
public String getNameForUpdateTrigger() {
return nameForUpdateTrigger;
}
public void setNameForUpdateTrigger(String nameForUpdateTrigger) {
this.nameForUpdateTrigger = nameForUpdateTrigger;
}
public String getSourceSchemaName() {
return sourceSchemaName;
}
public void setSourceSchemaName(String schemaName) {
this.sourceSchemaName = schemaName;
}
public String getTriggerId() {
return triggerId;
}
public void setTriggerId(String triggerId) {
this.triggerId = triggerId;
}
public Date getInactiveTime() {
return inactiveTime;
}
public void setInactiveTime(Date inactiveTime) {
this.inactiveTime = inactiveTime;
}
public String getSourceCatalogName() {
return sourceCatalogName;
}
public void setSourceCatalogName(String sourceCatalogName) {
this.sourceCatalogName = sourceCatalogName;
}
public long getTriggerRowHash() {
return triggerRowHash;
}
public void setTriggerRowHash(long triggerRowHash) {
this.triggerRowHash = triggerRowHash;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public String getErrorMessage() {
return errorMessage;
}
public int toVirtualTriggerHistId() {
final int prime = 31;
int result = 1;
result = prime * result + ((columnNames == null) ? 0 : columnNames.hashCode());
result = prime * result + ((sourceCatalogName == null) ? 0 : sourceCatalogName.hashCode());
result = prime * result + ((sourceSchemaName == null) ? 0 : sourceSchemaName.hashCode());
result = prime * result + ((sourceTableName == null) ? 0 : sourceTableName.hashCode());
return result;
}
public long getTriggerTemplateHash() {
return triggerTemplateHash;
}
public void setTriggerTemplateHash(long triggerTemplateHash) {
this.triggerTemplateHash = triggerTemplateHash;
}
}