package net.sf.minuteProject.configuration.bean.model.data.impl.DDLUtils;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import net.sf.minuteProject.configuration.bean.model.data.Column;
import net.sf.minuteProject.configuration.bean.model.data.Component;
import net.sf.minuteProject.configuration.bean.model.data.ForeignKey;
import net.sf.minuteProject.configuration.bean.model.data.Reference;
import net.sf.minuteProject.configuration.bean.model.data.View;
import net.sf.minuteProject.utils.ForeignKeyUtils;
public class ViewDDLUtils extends TableDDLUtils implements View{
private Logger log = Logger.getLogger(this.getClass());
private ArrayList<Column> realPrimaryKeys;
private ArrayList<Column> virtualPrimaryKeys;
private ArrayList<Column> noVirtualPrimaryKeyColumns;
private ArrayList<Reference> parents;
private ArrayList<Component> components;
public ViewDDLUtils (org.apache.ddlutils.model.Table table) {
super(table);
}
public Column[] getRealPrimaryKeys() {
if (realPrimaryKeys==null)
realPrimaryKeys = new ArrayList<Column>();
return (Column[])realPrimaryKeys.toArray();
}
public Column[] getVirtualPrimaryKeys() {
if (virtualPrimaryKeys==null)
virtualPrimaryKeys = new ArrayList<Column>();
return (Column[])virtualPrimaryKeys.toArray(new Column[virtualPrimaryKeys.size()]);
}
public void setVirtualPrimaryKeys(Column[] virtualPks) {
for (Column column : virtualPks) {
addVirtualPrimaryKey(column);
}
}
public void setRealPrimaryKeys(Column[] realPrimaryKeys) {
for (Column column : realPrimaryKeys) {
addRealPrimaryKey(column);
}
}
public void addRealPrimaryKey(Column realPrimaryKey) {
if (realPrimaryKeys==null)
realPrimaryKeys = new ArrayList<Column>();
realPrimaryKeys.add(realPrimaryKey);
}
public void addVirtualPrimaryKey(Column virtualPrimaryKey) {
if (virtualPrimaryKeys==null)
virtualPrimaryKeys = new ArrayList<Column>();
virtualPrimaryKeys.add(virtualPrimaryKey);
for (org.apache.ddlutils.model.Column column : table.getColumns()) {
if (column.getName().equals(virtualPrimaryKey.getName()))
column.setPrimaryKey(true);
}
}
public boolean hasPrimaryKey () {
return !virtualPrimaryKeys.isEmpty();
}
public Column[] getPrimaryKeyColumns() {
return getVirtualPrimaryKeys();
}
public Column [] getAttributes () {
return getNoVirtualPrimaryKeyColumns();
}
private Column [] getNoVirtualPrimaryKeyColumns() {
if (noVirtualPrimaryKeyColumns==null || !isCacheEnabled) {
noVirtualPrimaryKeyColumns = new ArrayList<Column>();
boolean present;
for (Column column : super.getAttributes()) {
present=false;
for (Column column2 : getVirtualPrimaryKeys()) {
if (column2.getName().equals(column.getName())) {
present=true;
break;
}
}
if (!present) {
for (Reference parent: getParents()) {
if (parent.getLocalColumnName().equals(column.getName())) {
present=true;
break;
}
}
}
if (!present)
noVirtualPrimaryKeyColumns.add(column);
}
}
return (Column[])noVirtualPrimaryKeyColumns.toArray(new Column[noVirtualPrimaryKeyColumns.size()]);
}
public Column [] getNoPrimaryKeyNoForeignKeyColumns() {
return getAttributes();
}
public Component[] getComponents() {
// if nothing => the view itself is a component
if (components==null) {
components = new ArrayList<Component>();
}
return (Component[])components.toArray(new Component[components.size()]);
}
public void setComponents(List<Component> components) {
this.components = new ArrayList<Component>(components);
}
public void setForeignKey(ForeignKey foreignKey) {
getForeignKeyList().add(foreignKey);
}
public Reference [] getParents() {
// return super.getParents();
return getParentsWithLocalForeignKey();
}
protected Reference [] getParentsWithLocalForeignKey() {
if (parents == null) {
parents = new ArrayList<Reference>();
for (int i = 0; i < getForeignKeys().length; i++) {
ForeignKey foreignKey = getForeignKeys()[i];
// Reference reference = foreignKey.getFirstReference();
// //reverse reference view: reference comes from enrichment
// Reference ref = new ReferenceDDLUtils (new org.apache.ddlutils.model.Reference());
// ref.setForeignColumn(reference.getLocalColumn());
// ref.setForeignColumnName(reference.getLocalColumnName());
// ref.setForeignTable(reference.getLocalTable());
// ref.setForeignTableName(reference.getLocalTableName());
// ref.setLocalColumn(reference.getForeignColumn());
// ref.setLocalColumnName(reference.getForeignColumnName());
// ref.setLocalTable(reference.getForeignTable());
// ref.setLocalTableName(reference.getForeignTableName());
Reference ref = ReferenceDDLUtils.clone(foreignKey.getFirstReference());
// ref.setForeignColumn(reference.getForeignColumn());
// ref.setForeignColumnName(reference.getForeignColumnName());
// ref.setForeignTable(reference.getForeignTable());
// ref.setForeignTableName(reference.getForeignTableName());
// ref.setLocalColumn(reference.getLocalColumn());
// ref.setLocalColumnName(reference.getLocalColumnName());
// ref.setLocalTable(reference.getLocalTable());
// ref.setLocalTableName(reference.getLocalTableName());
// addReference(parents, reference);
// log.info("reference "+reference);
// log.info("ref "+ref);
////${localColumnVariable} ${linkedTableVariable} ${linkedColumnVariable}
// log.info("localColumnVariable = "+reference.getLocalColumnName());
// log.info("linkedTableVariable = "+reference.getLocalTableName());
// log.info("linkedColumnVariable = "+reference.getForeignColumnName());
addReference(parents, ref);
}
}
// log.info("object "+getName()+"- parents : "+parents);
return (Reference[])parents.toArray(new Reference[parents.size()]);
}
}