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.utils.ColumnUtils;
public abstract class PrimaryKeyConvention<T extends Table> extends ModelConvention {
public static final String APPLY_PK_ON_ENTITY_WITH_TWO_COLUMN_AS_FK = "apply-primary-key-on-entity-with-two-columns-only-and-foreign-key-otherwise-specified";
//
public static final String APPLY_DEFAULT_PK_OTHERWISE_FIRST_FIELD_IS_PK = "apply-default-primary-key-otherwise-first-one";
public String defaultPrimaryKeyNames;
public String getDefaultPrimaryKeyNames() {
return defaultPrimaryKeyNames;
}
public void setDefaultPrimaryKeyNames(String defaultPrimaryKeyNames) {
this.defaultPrimaryKeyNames = defaultPrimaryKeyNames;
}
public void setDefaultValue(String defaultValue) {
this.defaultPrimaryKeyNames = defaultValue;
}
public void applyDefaultPkConvention(BusinessModel model) {
if (model.getBusinessPackage()!=null) {
for (T t : getEntity(model)) {
if (t.getPrimaryKeyColumns().length==0)
applyDefaultPkConvention (t);
}
}
}
public void applyPkOnM2MConvention(BusinessModel model) {
if (model.getBusinessPackage()!=null) {
for (T t : getEntity(model)) {
applyPkOnM2MConvention (t);
}
}
}
private void applyPkOnM2MConvention(T t) {
if (t.getPrimaryKeyColumns().length==0
&& t.getColumns().length==2
&& ColumnUtils.isForeignKey(t.getColumns()[0])
&& ColumnUtils.isForeignKey(t.getColumns()[1])
)
t.setPrimaryKeys(t.getColumns());
}
protected void applyDefaultPkConvention(T t) {
t.setPrimaryKeys(getVirtualPrimaryKey(t));
}
protected Column[] getVirtualPrimaryKey(T t) {
List<Column> pks = getPksByDefaultPrimaryKeyNames(t);
if (pks==null || pks.isEmpty())
pks = getPksByFirstColumn(t);
return (Column[])pks.toArray(new Column[pks.size()]);
}
protected List<Column> getPksByFirstColumn(T t) {
List<Column> pks = new ArrayList<Column>();
Column column = t.getColumn(0);
if (column!=null)
pks.add(column);
return pks;
}
protected List<Column> getPksByDefaultPrimaryKeyNames(T t) {
List<Column> pks = new ArrayList<Column>();
String pk = getDefaultPrimaryKeyNames();
if (pk!=null) {
pk = StringUtils.remove(pk, " ");
for (String columnName : getDefaultPrimaryKeyNames().split(",")) {
Column column = ColumnUtils.getColumn(t, columnName);
if (column!=null)
pks.add(column);
}
}
return pks;
}
@Override
public void apply(BusinessModel model) {
if (APPLY_PK_ON_ENTITY_WITH_TWO_COLUMN_AS_FK.equals(type)) {
applyPkOnM2MConvention(model);
}
if (APPLY_DEFAULT_PK_OTHERWISE_FIRST_FIELD_IS_PK.equals(type)) {
applyDefaultPkConvention(model);
}
}
protected abstract List<T> getEntity(BusinessModel model);
}