/**
* 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.io.data.transform;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.jumpmind.db.model.Table;
import org.jumpmind.symmetric.io.data.transform.TransformColumn.IncludeOnType;
public class TransformTable implements Cloneable {
protected String transformId;
protected String sourceCatalogName;
protected String sourceSchemaName;
protected String sourceTableName;
protected String targetCatalogName;
protected String targetSchemaName;
protected String targetTableName;
protected TransformPoint transformPoint;
protected List<TransformColumn> transformColumns;
protected List<TransformColumn> primaryKeyColumns;
protected DeleteAction deleteAction = DeleteAction.DEL_ROW;
protected ColumnPolicy columnPolicy = ColumnPolicy.IMPLIED;
protected boolean updateFirst = false;
protected int transformOrder = 0;
protected Date createTime;
protected Date lastUpdateTime;
protected String lastUpdateBy;
public TransformTable(String sourceTableName, String targetTableName,
TransformPoint transformPoint, TransformColumn... columns) {
this.sourceTableName = sourceTableName;
this.targetTableName = targetTableName;
this.transformPoint = transformPoint;
this.transformColumns = new ArrayList<TransformColumn>();
this.primaryKeyColumns = new ArrayList<TransformColumn>();
if (columns != null) {
for (TransformColumn transformColumn : columns) {
if (transformColumn.isPk()) {
primaryKeyColumns.add(transformColumn);
}
transformColumns.add(transformColumn);
}
}
}
public TransformTable() {
}
public String getFullyQualifiedSourceTableName() {
return Table.getFullyQualifiedTableName(sourceCatalogName, sourceSchemaName,
sourceTableName);
}
public String getFullyQualifiedTargetTableName() {
return Table.getFullyQualifiedTableName(targetCatalogName, targetSchemaName,
targetTableName);
}
public String getTransformId() {
return transformId;
}
public void setTransformId(String transformId) {
this.transformId = transformId;
}
public String getSourceCatalogName() {
return sourceCatalogName;
}
public void setSourceCatalogName(String sourceCatalogName) {
this.sourceCatalogName = sourceCatalogName;
}
public String getSourceSchemaName() {
return sourceSchemaName;
}
public void setSourceSchemaName(String sourceSchemaName) {
this.sourceSchemaName = sourceSchemaName;
}
public String getSourceTableName() {
return sourceTableName;
}
public void setSourceTableName(String sourceTableName) {
this.sourceTableName = sourceTableName;
}
public String getTargetCatalogName() {
return targetCatalogName;
}
public void setTargetCatalogName(String targetCatalogName) {
this.targetCatalogName = targetCatalogName;
}
public String getTargetSchemaName() {
return targetSchemaName;
}
public void setTargetSchemaName(String targetSchemaName) {
this.targetSchemaName = targetSchemaName;
}
public String getTargetTableName() {
return targetTableName;
}
public void setTargetTableName(String targetTableName) {
this.targetTableName = targetTableName;
}
public void setTransformPoint(TransformPoint transformPoint) {
this.transformPoint = transformPoint;
}
public TransformPoint getTransformPoint() {
return transformPoint;
}
public void setTransformColumns(List<TransformColumn> transformColumns) {
this.transformColumns = transformColumns;
this.primaryKeyColumns = new ArrayList<TransformColumn>();
if (transformColumns != null) {
for (TransformColumn transformColumn : transformColumns) {
if (transformColumn.isPk()) {
this.primaryKeyColumns.add(transformColumn);
}
}
}
}
public List<TransformColumn> getTransformColumns() {
return transformColumns;
}
public List<TransformColumn> getPrimaryKeyColumns() {
return primaryKeyColumns;
}
public List<TransformColumn> getTransformColumnFor(String columnName) {
List<TransformColumn> columns = new ArrayList<TransformColumn>(2);
for (TransformColumn column : transformColumns) {
if (StringUtils.equalsIgnoreCase(column.getSourceColumnName(), columnName)) {
columns.add(column);
}
}
return columns;
}
public TransformColumn getTransformColumn(String targetColumn, IncludeOnType includeOn) {
if (transformColumns != null) {
for (TransformColumn column : transformColumns) {
if (StringUtils.equalsIgnoreCase(targetColumn, column.getTargetColumnName()) &&
includeOn == column.getIncludeOn()) {
return column;
}
}
}
return null;
}
public void addTransformColumn(TransformColumn column) {
if (transformColumns == null) {
transformColumns = new ArrayList<TransformColumn>();
}
if (primaryKeyColumns == null) {
primaryKeyColumns = new ArrayList<TransformColumn>();
}
transformColumns.add(column);
if (column.isPk()) {
primaryKeyColumns.add(column);
}
}
public void setDeleteAction(DeleteAction deleteAction) {
this.deleteAction = deleteAction;
}
public DeleteAction getDeleteAction() {
return deleteAction;
}
public void setTransformOrder(int transformOrder) {
this.transformOrder = transformOrder;
}
public int getTransformOrder() {
return transformOrder;
}
public void setUpdateFirst(boolean updateFirst) {
this.updateFirst = updateFirst;
}
public boolean isUpdateFirst() {
return updateFirst;
}
public ColumnPolicy getColumnPolicy() {
return columnPolicy;
}
public void setColumnPolicy(ColumnPolicy columnPolicy) {
this.columnPolicy = columnPolicy;
}
@Override
public int hashCode() {
if (transformId != null) {
return transformId.hashCode();
} else {
return super.hashCode();
}
}
@Override
public boolean equals(Object obj) {
if (transformId != null) {
if (obj instanceof TransformTable) {
return transformId.equals(((TransformTable) obj).transformId);
} else {
return false;
}
} else {
return super.equals(obj);
}
}
@Override
public String toString() {
if (transformId != null) {
return transformId;
} else {
return super.toString();
}
}
public TransformTable enhanceWithImpliedColumns(String[] keyNames, String[] columnNames) {
TransformTable copiedVersion;
try {
copiedVersion = (TransformTable) this.clone();
if (transformColumns != null) {
copiedVersion.transformColumns = new ArrayList<TransformColumn>(transformColumns);
} else {
copiedVersion.transformColumns = new ArrayList<TransformColumn>();
}
if (primaryKeyColumns != null) {
copiedVersion.primaryKeyColumns = new ArrayList<TransformColumn>(primaryKeyColumns);
} else {
copiedVersion.primaryKeyColumns = new ArrayList<TransformColumn>();
}
if (columnPolicy == ColumnPolicy.IMPLIED) {
for (String column : keyNames) {
boolean hasInsert = false;
boolean hasUpdate = false;
boolean hasDelete = false;
if (primaryKeyColumns != null) {
for (TransformColumn xCol : transformColumns) {
if ((StringUtils.isNotBlank(xCol.getSourceColumnName()) && StringUtils.equalsIgnoreCase(xCol.getSourceColumnName(),column)) ||
StringUtils.isNotBlank(xCol.getTargetColumnName()) && StringUtils.equalsIgnoreCase(xCol.getTargetColumnName(),column)) {
if (xCol.includeOn == IncludeOnType.ALL) {
hasInsert = hasUpdate = hasDelete = true;
break;
} else if (xCol.includeOn == IncludeOnType.INSERT) {
hasInsert = true;
} else if (xCol.includeOn == IncludeOnType.UPDATE) {
hasUpdate = true;
} else if (xCol.includeOn == IncludeOnType.DELETE) {
hasDelete = true;
}
}
}
}
if (!hasInsert && !hasUpdate && !hasDelete) {
TransformColumn newCol = createImplicitTransformColumn(column, IncludeOnType.ALL, true);
copiedVersion.primaryKeyColumns.add(newCol);
copiedVersion.transformColumns.add(newCol);
} else {
if (!hasInsert) {
TransformColumn newCol = createImplicitTransformColumn(column, IncludeOnType.INSERT, true);
copiedVersion.primaryKeyColumns.add(newCol);
copiedVersion.transformColumns.add(newCol);
}
if (!hasUpdate) {
TransformColumn newCol = createImplicitTransformColumn(column, IncludeOnType.UPDATE, true);
copiedVersion.primaryKeyColumns.add(newCol);
copiedVersion.transformColumns.add(newCol);
}
if (!hasDelete) {
TransformColumn newCol = createImplicitTransformColumn(column, IncludeOnType.DELETE, true);
copiedVersion.primaryKeyColumns.add(newCol);
copiedVersion.transformColumns.add(newCol);
}
}
}
for (String column : columnNames) {
boolean hasInsert = false;
boolean hasUpdate = false;
boolean hasDelete = false;
for (TransformColumn xCol : copiedVersion.transformColumns) {
if ((StringUtils.isNotBlank(xCol.getSourceColumnName()) && StringUtils.equalsIgnoreCase(xCol.getSourceColumnName(),column)) ||
(StringUtils.isNotBlank(xCol.getTargetColumnName()) && StringUtils.equalsIgnoreCase(xCol.getTargetColumnName(),column))) {
if (xCol.includeOn == IncludeOnType.ALL) {
hasInsert = hasUpdate = hasDelete = true;
break;
} else if (xCol.includeOn == IncludeOnType.INSERT) {
hasInsert = true;
} else if (xCol.includeOn == IncludeOnType.UPDATE) {
hasUpdate = true;
} else if (xCol.includeOn == IncludeOnType.DELETE) {
hasDelete = true;
}
}
}
if (!hasInsert && !hasUpdate && !hasDelete) {
TransformColumn newCol = createImplicitTransformColumn(column, IncludeOnType.ALL, false);
copiedVersion.transformColumns.add(newCol);
} else {
if (!hasInsert) {
TransformColumn newCol = createImplicitTransformColumn(column, IncludeOnType.INSERT, false);
copiedVersion.transformColumns.add(newCol);
}
if (!hasUpdate) {
TransformColumn newCol = createImplicitTransformColumn(column, IncludeOnType.UPDATE, false);
copiedVersion.transformColumns.add(newCol);
}
if (!hasDelete) {
TransformColumn newCol = createImplicitTransformColumn(column, IncludeOnType.DELETE, false);
copiedVersion.transformColumns.add(newCol);
}
}
}
}
return copiedVersion;
} catch (CloneNotSupportedException e) {
throw new IllegalStateException(e);
}
}
private TransformColumn createImplicitTransformColumn(String column, IncludeOnType includeOnType, boolean pk) {
TransformColumn newCol = new TransformColumn();
newCol.setTransformId(transformId);
newCol.setPk(pk);
newCol.setIncludeOn(includeOnType);
newCol.setTransformType(CopyColumnTransform.NAME);
newCol.setSourceColumnName(column);
newCol.setTargetColumnName(column);
return newCol;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getLastUpdateBy() {
return lastUpdateBy;
}
public void setLastUpdateBy(String lastUpdateBy) {
this.lastUpdateBy = lastUpdateBy;
}
public Date getLastUpdateTime() {
return lastUpdateTime;
}
public void setLastUpdateTime(Date lastUpdateTime) {
this.lastUpdateTime = lastUpdateTime;
}
}