package net.sf.minuteProject.configuration.bean.enrichment.convention; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import net.sf.minuteProject.configuration.bean.BusinessModel; import net.sf.minuteProject.configuration.bean.model.data.Column; import net.sf.minuteProject.configuration.bean.model.data.Table; import net.sf.minuteProject.configuration.bean.model.data.View; import net.sf.minuteProject.utils.ColumnUtils; import net.sf.minuteProject.utils.parser.ParserUtils; @SuppressWarnings("serial") public class TableDefaultPrimaryKeyConvention extends ModelConvention { public static final String APPLY_DEFAULT_PK_OTHERWISE_FIRST_FIELD_IS_PK = "apply-default-primary-key-otherwise-first-one"; public static final String APPLY_DEFAULT_PK = "apply-default-primary-key"; public String defaultPrimaryKeyNames, excludePrimaryKeyNames, fieldPatternType="equals"; public boolean allowCompositePk=true; public String getDefaultPrimaryKeyNames() { return defaultPrimaryKeyNames; } public void setDefaultPrimaryKeyNames(String defaultPrimaryKeyNames) { this.defaultPrimaryKeyNames = defaultPrimaryKeyNames; } public String getExcludePrimaryKeyNames() { return excludePrimaryKeyNames; } public void setExcludePrimaryKeyNames(String excludePrimaryKeyNames) { this.excludePrimaryKeyNames = excludePrimaryKeyNames; } public boolean isAllowCompositePk() { return allowCompositePk; } public void setAllowCompositePk(boolean allowCompositePk) { this.allowCompositePk = allowCompositePk; } public String getFieldPatternType() { return fieldPatternType; } public void setFieldPatternType(String fieldPatternType) { this.fieldPatternType = fieldPatternType; } public void setDefaultValue(String defaultValue) { this.defaultPrimaryKeyNames = defaultValue; } @Override public void apply(BusinessModel model) { if (model.getBusinessPackage()!=null) { for (Table table : model.getBusinessPackage().getTables()) { if (table.getPrimaryKeyColumns().length==0) apply (table); } } } protected void apply(Table table) { Column[] virtualPrimaryKey = getVirtualPrimaryKey(table); if (virtualPrimaryKey.length>0) table.setPrimaryKeys(virtualPrimaryKey); } protected Column[] getVirtualPrimaryKey(Table table) { List<Column> pks = getPksByDefaultPrimaryKeyNames(table); if (pks==null || pks.isEmpty() && APPLY_DEFAULT_PK_OTHERWISE_FIRST_FIELD_IS_PK.equals(getType())) pks = getPksByFirstColumn(table); return (Column[])pks.toArray(new Column[pks.size()]); } protected List<Column> getPksByFirstColumn(Table table) { List<Column> pks = new ArrayList<Column>(); for (Column column : table.getColumns()) { if (!ParserUtils.isInList(column.getName(), getExcludePrimaryKeyNames())) { pks.add(column); return pks; } } return pks; } protected List<Column> getPksByDefaultPrimaryKeyNames(Table table) { List<Column> pks = new ArrayList<Column>(); if (defaultPrimaryKeyNames!=null && !defaultPrimaryKeyNames.isEmpty()) { for (String pattern: ParserUtils.getList(defaultPrimaryKeyNames)) { for (Column column : table.getColumns()) { String columnName=column.getName(); if (net.sf.minuteProject.utils.StringUtils.checkExpression(columnName, fieldPatternType, pattern) && !ParserUtils.isInList(columnName, getExcludePrimaryKeyNames())) { //pks.add(column); pks.add(ColumnUtils.getColumn(table, columnName)); if (!allowCompositePk) return pks; } } } } return pks; } }