/** * Copyright 2006-2016 the original author or authors. * * 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.mybatis.generator.config; import static org.mybatis.generator.internal.util.EqualsUtil.areEqual; import static org.mybatis.generator.internal.util.HashCodeUtil.hash; import static org.mybatis.generator.internal.util.HashCodeUtil.SEED; import static org.mybatis.generator.internal.util.messages.Messages.getString; import static org.mybatis.generator.internal.util.StringUtility.composeFullyQualifiedTableName; import static org.mybatis.generator.internal.util.StringUtility.isTrue; import static org.mybatis.generator.internal.util.StringUtility.stringHasValue; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.mybatis.generator.api.dom.xml.Attribute; import org.mybatis.generator.api.dom.xml.XmlElement; /** * The Class TableConfiguration. * * @author Jeff Butler */ public class TableConfiguration extends PropertyHolder { /** The insert statement enabled. */ private boolean insertStatementEnabled; /** The select by primary key statement enabled. */ private boolean selectByPrimaryKeyStatementEnabled; /** The select by example statement enabled. */ private boolean selectByExampleStatementEnabled; /** The update by primary key statement enabled. */ private boolean updateByPrimaryKeyStatementEnabled; /** The delete by primary key statement enabled. */ private boolean deleteByPrimaryKeyStatementEnabled; /** The delete by example statement enabled. */ private boolean deleteByExampleStatementEnabled; /** The count by example statement enabled. */ private boolean countByExampleStatementEnabled; /** The update by example statement enabled. */ private boolean updateByExampleStatementEnabled; /** The column overrides. */ private List<ColumnOverride> columnOverrides; /** The ignored columns. */ private Map<IgnoredColumn, Boolean> ignoredColumns; /** The generated key. */ private GeneratedKey generatedKey; /** The select by primary key query id. */ private String selectByPrimaryKeyQueryId; /** The select by example query id. */ private String selectByExampleQueryId; /** The catalog. */ private String catalog; /** The schema. */ private String schema; /** The table name. */ private String tableName; /** The domain object name. */ private String domainObjectName; /** The alias. */ private String alias; /** The model type. */ private ModelType modelType; /** The wildcard escaping enabled. */ private boolean wildcardEscapingEnabled; /** The configured model type. */ private String configuredModelType; /** The delimit identifiers. */ private boolean delimitIdentifiers; /** The column renaming rule. */ private ColumnRenamingRule columnRenamingRule; /** The is all column delimiting enabled. */ private boolean isAllColumnDelimitingEnabled; private String mapperName; private String sqlProviderName; private List<IgnoredColumnPattern> ignoredColumnPatterns = new ArrayList<IgnoredColumnPattern>(); /** * Instantiates a new table configuration. * * @param context * the context */ public TableConfiguration(Context context) { super(); this.modelType = context.getDefaultModelType(); columnOverrides = new ArrayList<ColumnOverride>(); ignoredColumns = new HashMap<IgnoredColumn, Boolean>(); insertStatementEnabled = true; selectByPrimaryKeyStatementEnabled = true; selectByExampleStatementEnabled = true; updateByPrimaryKeyStatementEnabled = true; deleteByPrimaryKeyStatementEnabled = true; deleteByExampleStatementEnabled = true; countByExampleStatementEnabled = true; updateByExampleStatementEnabled = true; } /** * Checks if is delete by primary key statement enabled. * * @return true, if is delete by primary key statement enabled */ public boolean isDeleteByPrimaryKeyStatementEnabled() { return deleteByPrimaryKeyStatementEnabled; } /** * Sets the delete by primary key statement enabled. * * @param deleteByPrimaryKeyStatementEnabled * the new delete by primary key statement enabled */ public void setDeleteByPrimaryKeyStatementEnabled( boolean deleteByPrimaryKeyStatementEnabled) { this.deleteByPrimaryKeyStatementEnabled = deleteByPrimaryKeyStatementEnabled; } /** * Checks if is insert statement enabled. * * @return true, if is insert statement enabled */ public boolean isInsertStatementEnabled() { return insertStatementEnabled; } /** * Sets the insert statement enabled. * * @param insertStatementEnabled * the new insert statement enabled */ public void setInsertStatementEnabled(boolean insertStatementEnabled) { this.insertStatementEnabled = insertStatementEnabled; } /** * Checks if is select by primary key statement enabled. * * @return true, if is select by primary key statement enabled */ public boolean isSelectByPrimaryKeyStatementEnabled() { return selectByPrimaryKeyStatementEnabled; } /** * Sets the select by primary key statement enabled. * * @param selectByPrimaryKeyStatementEnabled * the new select by primary key statement enabled */ public void setSelectByPrimaryKeyStatementEnabled( boolean selectByPrimaryKeyStatementEnabled) { this.selectByPrimaryKeyStatementEnabled = selectByPrimaryKeyStatementEnabled; } /** * Checks if is update by primary key statement enabled. * * @return true, if is update by primary key statement enabled */ public boolean isUpdateByPrimaryKeyStatementEnabled() { return updateByPrimaryKeyStatementEnabled; } /** * Sets the update by primary key statement enabled. * * @param updateByPrimaryKeyStatementEnabled * the new update by primary key statement enabled */ public void setUpdateByPrimaryKeyStatementEnabled( boolean updateByPrimaryKeyStatementEnabled) { this.updateByPrimaryKeyStatementEnabled = updateByPrimaryKeyStatementEnabled; } /** * Checks if is column ignored. * * @param columnName * the column name * @return true, if is column ignored */ public boolean isColumnIgnored(String columnName) { for (Map.Entry<IgnoredColumn, Boolean> entry : ignoredColumns .entrySet()) { if (entry.getKey().matches(columnName)) { entry.setValue(Boolean.TRUE); return true; } } for (IgnoredColumnPattern ignoredColumnPattern : ignoredColumnPatterns) { if (ignoredColumnPattern.matches(columnName)) { return true; } } return false; } /** * Adds the ignored column. * * @param ignoredColumn * the ignored column */ public void addIgnoredColumn(IgnoredColumn ignoredColumn) { ignoredColumns.put(ignoredColumn, Boolean.FALSE); } public void addIgnoredColumnPattern(IgnoredColumnPattern ignoredColumnPattern) { ignoredColumnPatterns.add(ignoredColumnPattern); } /** * Adds the column override. * * @param columnOverride * the column override */ public void addColumnOverride(ColumnOverride columnOverride) { columnOverrides.add(columnOverride); } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof TableConfiguration)) { return false; } TableConfiguration other = (TableConfiguration) obj; return areEqual(this.catalog, other.catalog) && areEqual(this.schema, other.schema) && areEqual(this.tableName, other.tableName); } /* (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { int result = SEED; result = hash(result, catalog); result = hash(result, schema); result = hash(result, tableName); return result; } /** * Checks if is select by example statement enabled. * * @return true, if is select by example statement enabled */ public boolean isSelectByExampleStatementEnabled() { return selectByExampleStatementEnabled; } /** * Sets the select by example statement enabled. * * @param selectByExampleStatementEnabled * the new select by example statement enabled */ public void setSelectByExampleStatementEnabled( boolean selectByExampleStatementEnabled) { this.selectByExampleStatementEnabled = selectByExampleStatementEnabled; } /** * May return null if the column has not been overridden. * * @param columnName * the column name * @return the column override (if any) related to this column */ public ColumnOverride getColumnOverride(String columnName) { for (ColumnOverride co : columnOverrides) { if (co.isColumnNameDelimited()) { if (columnName.equals(co.getColumnName())) { return co; } } else { if (columnName.equalsIgnoreCase(co.getColumnName())) { return co; } } } return null; } /** * Gets the generated key. * * @return the generated key */ public GeneratedKey getGeneratedKey() { return generatedKey; } /** * Gets the select by example query id. * * @return the select by example query id */ public String getSelectByExampleQueryId() { return selectByExampleQueryId; } /** * Sets the select by example query id. * * @param selectByExampleQueryId * the new select by example query id */ public void setSelectByExampleQueryId(String selectByExampleQueryId) { this.selectByExampleQueryId = selectByExampleQueryId; } /** * Gets the select by primary key query id. * * @return the select by primary key query id */ public String getSelectByPrimaryKeyQueryId() { return selectByPrimaryKeyQueryId; } /** * Sets the select by primary key query id. * * @param selectByPrimaryKeyQueryId * the new select by primary key query id */ public void setSelectByPrimaryKeyQueryId(String selectByPrimaryKeyQueryId) { this.selectByPrimaryKeyQueryId = selectByPrimaryKeyQueryId; } /** * Checks if is delete by example statement enabled. * * @return true, if is delete by example statement enabled */ public boolean isDeleteByExampleStatementEnabled() { return deleteByExampleStatementEnabled; } /** * Sets the delete by example statement enabled. * * @param deleteByExampleStatementEnabled * the new delete by example statement enabled */ public void setDeleteByExampleStatementEnabled( boolean deleteByExampleStatementEnabled) { this.deleteByExampleStatementEnabled = deleteByExampleStatementEnabled; } /** * Are any statements enabled. * * @return true, if successful */ public boolean areAnyStatementsEnabled() { return selectByExampleStatementEnabled || selectByPrimaryKeyStatementEnabled || insertStatementEnabled || updateByPrimaryKeyStatementEnabled || deleteByExampleStatementEnabled || deleteByPrimaryKeyStatementEnabled || countByExampleStatementEnabled || updateByExampleStatementEnabled; } /** * Sets the generated key. * * @param generatedKey * the new generated key */ public void setGeneratedKey(GeneratedKey generatedKey) { this.generatedKey = generatedKey; } /** * Gets the alias. * * @return the alias */ public String getAlias() { return alias; } /** * Sets the alias. * * @param alias * the new alias */ public void setAlias(String alias) { this.alias = alias; } /** * Gets the catalog. * * @return the catalog */ public String getCatalog() { return catalog; } /** * Sets the catalog. * * @param catalog * the new catalog */ public void setCatalog(String catalog) { this.catalog = catalog; } /** * Gets the domain object name. * * @return the domain object name */ public String getDomainObjectName() { return domainObjectName; } /** * Sets the domain object name. * * @param domainObjectName * the new domain object name */ public void setDomainObjectName(String domainObjectName) { this.domainObjectName = domainObjectName; } /** * Gets the schema. * * @return the schema */ public String getSchema() { return schema; } /** * Sets the schema. * * @param schema * the new schema */ public void setSchema(String schema) { this.schema = schema; } /** * Gets the table name. * * @return the table name */ public String getTableName() { return tableName; } /** * Sets the table name. * * @param tableName * the new table name */ public void setTableName(String tableName) { this.tableName = tableName; } /** * Gets the column overrides. * * @return the column overrides */ public List<ColumnOverride> getColumnOverrides() { return columnOverrides; } /** * This method returns a List of Strings. The values are the columns * that were specified to be ignored in the table, but do not exist in the * table. * * @return a List of Strings - the columns that were improperly configured * as ignored columns */ public List<String> getIgnoredColumnsInError() { List<String> answer = new ArrayList<String>(); for (Map.Entry<IgnoredColumn, Boolean> entry : ignoredColumns .entrySet()) { if (Boolean.FALSE.equals(entry.getValue())) { answer.add(entry.getKey().getColumnName()); } } return answer; } /** * Gets the model type. * * @return the model type */ public ModelType getModelType() { return modelType; } /** * Sets the configured model type. * * @param configuredModelType * the new configured model type */ public void setConfiguredModelType(String configuredModelType) { this.configuredModelType = configuredModelType; this.modelType = ModelType.getModelType(configuredModelType); } /** * Checks if is wildcard escaping enabled. * * @return true, if is wildcard escaping enabled */ public boolean isWildcardEscapingEnabled() { return wildcardEscapingEnabled; } /** * Sets the wildcard escaping enabled. * * @param wildcardEscapingEnabled * the new wildcard escaping enabled */ public void setWildcardEscapingEnabled(boolean wildcardEscapingEnabled) { this.wildcardEscapingEnabled = wildcardEscapingEnabled; } /** * To xml element. * * @return the xml element */ public XmlElement toXmlElement() { XmlElement xmlElement = new XmlElement("table"); //$NON-NLS-1$ xmlElement.addAttribute(new Attribute("tableName", tableName)); //$NON-NLS-1$ if (stringHasValue(catalog)) { xmlElement.addAttribute(new Attribute("catalog", catalog)); //$NON-NLS-1$ } if (stringHasValue(schema)) { xmlElement.addAttribute(new Attribute("schema", schema)); //$NON-NLS-1$ } if (stringHasValue(alias)) { xmlElement.addAttribute(new Attribute("alias", alias)); //$NON-NLS-1$ } if (stringHasValue(domainObjectName)) { xmlElement.addAttribute(new Attribute( "domainObjectName", domainObjectName)); //$NON-NLS-1$ } if (!insertStatementEnabled) { xmlElement.addAttribute(new Attribute("enableInsert", "false")); //$NON-NLS-1$ //$NON-NLS-2$ } if (!selectByPrimaryKeyStatementEnabled) { xmlElement.addAttribute(new Attribute( "enableSelectByPrimaryKey", "false")); //$NON-NLS-1$ //$NON-NLS-2$ } if (!selectByExampleStatementEnabled) { xmlElement.addAttribute(new Attribute( "enableSelectByExample", "false")); //$NON-NLS-1$ //$NON-NLS-2$ } if (!updateByPrimaryKeyStatementEnabled) { xmlElement.addAttribute(new Attribute( "enableUpdateByPrimaryKey", "false")); //$NON-NLS-1$ //$NON-NLS-2$ } if (!deleteByPrimaryKeyStatementEnabled) { xmlElement.addAttribute(new Attribute( "enableDeleteByPrimaryKey", "false")); //$NON-NLS-1$ //$NON-NLS-2$ } if (!deleteByExampleStatementEnabled) { xmlElement.addAttribute(new Attribute( "enableDeleteByExample", "false")); //$NON-NLS-1$ //$NON-NLS-2$ } if (!countByExampleStatementEnabled) { xmlElement.addAttribute(new Attribute( "enableCountByExample", "false")); //$NON-NLS-1$ //$NON-NLS-2$ } if (!updateByExampleStatementEnabled) { xmlElement.addAttribute(new Attribute( "enableUpdateByExample", "false")); //$NON-NLS-1$ //$NON-NLS-2$ } if (stringHasValue(selectByPrimaryKeyQueryId)) { xmlElement.addAttribute(new Attribute( "selectByPrimaryKeyQueryId", selectByPrimaryKeyQueryId)); //$NON-NLS-1$ } if (stringHasValue(selectByExampleQueryId)) { xmlElement.addAttribute(new Attribute( "selectByExampleQueryId", selectByExampleQueryId)); //$NON-NLS-1$ } if (configuredModelType != null) { xmlElement.addAttribute(new Attribute( "modelType", configuredModelType)); //$NON-NLS-1$ } if (wildcardEscapingEnabled) { xmlElement.addAttribute(new Attribute("escapeWildcards", "true")); //$NON-NLS-1$ //$NON-NLS-2$ } if (isAllColumnDelimitingEnabled) { xmlElement.addAttribute(new Attribute("delimitAllColumns", "true")); //$NON-NLS-1$ //$NON-NLS-2$ } if (delimitIdentifiers) { xmlElement .addAttribute(new Attribute("delimitIdentifiers", "true")); //$NON-NLS-1$ //$NON-NLS-2$ } if (stringHasValue(mapperName)) { xmlElement.addAttribute(new Attribute( "mapperName", mapperName)); //$NON-NLS-1$ } if (stringHasValue(sqlProviderName)) { xmlElement.addAttribute(new Attribute( "sqlProviderName", sqlProviderName)); //$NON-NLS-1$ } addPropertyXmlElements(xmlElement); if (generatedKey != null) { xmlElement.addElement(generatedKey.toXmlElement()); } if (columnRenamingRule != null) { xmlElement.addElement(columnRenamingRule.toXmlElement()); } if (ignoredColumns.size() > 0) { for (IgnoredColumn ignoredColumn : ignoredColumns.keySet()) { xmlElement.addElement(ignoredColumn.toXmlElement()); } } for (IgnoredColumnPattern ignoredColumnPattern : ignoredColumnPatterns) { xmlElement.addElement(ignoredColumnPattern.toXmlElement()); } if (columnOverrides.size() > 0) { for (ColumnOverride columnOverride : columnOverrides) { xmlElement.addElement(columnOverride.toXmlElement()); } } return xmlElement; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return composeFullyQualifiedTableName(catalog, schema, tableName, '.'); } /** * Checks if is delimit identifiers. * * @return true, if is delimit identifiers */ public boolean isDelimitIdentifiers() { return delimitIdentifiers; } /** * Sets the delimit identifiers. * * @param delimitIdentifiers * the new delimit identifiers */ public void setDelimitIdentifiers(boolean delimitIdentifiers) { this.delimitIdentifiers = delimitIdentifiers; } /** * Checks if is count by example statement enabled. * * @return true, if is count by example statement enabled */ public boolean isCountByExampleStatementEnabled() { return countByExampleStatementEnabled; } /** * Sets the count by example statement enabled. * * @param countByExampleStatementEnabled * the new count by example statement enabled */ public void setCountByExampleStatementEnabled( boolean countByExampleStatementEnabled) { this.countByExampleStatementEnabled = countByExampleStatementEnabled; } /** * Checks if is update by example statement enabled. * * @return true, if is update by example statement enabled */ public boolean isUpdateByExampleStatementEnabled() { return updateByExampleStatementEnabled; } /** * Sets the update by example statement enabled. * * @param updateByExampleStatementEnabled * the new update by example statement enabled */ public void setUpdateByExampleStatementEnabled( boolean updateByExampleStatementEnabled) { this.updateByExampleStatementEnabled = updateByExampleStatementEnabled; } /** * Validate. * * @param errors * the errors * @param listPosition * the list position */ public void validate(List<String> errors, int listPosition) { if (!stringHasValue(tableName)) { errors.add(getString( "ValidationError.6", Integer.toString(listPosition))); //$NON-NLS-1$ } String fqTableName = composeFullyQualifiedTableName( catalog, schema, tableName, '.'); if (generatedKey != null) { generatedKey.validate(errors, fqTableName); } // when using column indexes, either both or neither query ids // should be set if (isTrue(getProperty(PropertyRegistry.TABLE_USE_COLUMN_INDEXES)) && selectByExampleStatementEnabled && selectByPrimaryKeyStatementEnabled) { boolean queryId1Set = stringHasValue(selectByExampleQueryId); boolean queryId2Set = stringHasValue(selectByPrimaryKeyQueryId); if (queryId1Set != queryId2Set) { errors.add(getString("ValidationError.13", //$NON-NLS-1$ fqTableName)); } } if (columnRenamingRule != null) { columnRenamingRule.validate(errors, fqTableName); } for (ColumnOverride columnOverride : columnOverrides) { columnOverride.validate(errors, fqTableName); } for (IgnoredColumn ignoredColumn : ignoredColumns.keySet()) { ignoredColumn.validate(errors, fqTableName); } for (IgnoredColumnPattern ignoredColumnPattern : ignoredColumnPatterns) { ignoredColumnPattern.validate(errors, fqTableName); } } /** * Gets the column renaming rule. * * @return the column renaming rule */ public ColumnRenamingRule getColumnRenamingRule() { return columnRenamingRule; } /** * Sets the column renaming rule. * * @param columnRenamingRule * the new column renaming rule */ public void setColumnRenamingRule(ColumnRenamingRule columnRenamingRule) { this.columnRenamingRule = columnRenamingRule; } /** * Checks if is all column delimiting enabled. * * @return true, if is all column delimiting enabled */ public boolean isAllColumnDelimitingEnabled() { return isAllColumnDelimitingEnabled; } /** * Sets the all column delimiting enabled. * * @param isAllColumnDelimitingEnabled * the new all column delimiting enabled */ public void setAllColumnDelimitingEnabled( boolean isAllColumnDelimitingEnabled) { this.isAllColumnDelimitingEnabled = isAllColumnDelimitingEnabled; } public String getMapperName() { return mapperName; } public void setMapperName(String mapperName) { this.mapperName = mapperName; } public String getSqlProviderName() { return sqlProviderName; } public void setSqlProviderName(String sqlProviderName) { this.sqlProviderName = sqlProviderName; } }