package net.sf.minuteProject.configuration.bean.model.data.impl.DDLUtils;
import java.util.ArrayList;
import java.util.List;
import net.sf.minuteProject.configuration.bean.AbstractConfiguration;
import net.sf.minuteProject.configuration.bean.Package;
import net.sf.minuteProject.configuration.bean.Template;
import net.sf.minuteProject.configuration.bean.model.data.Database;
import net.sf.minuteProject.configuration.bean.model.data.Function;
import net.sf.minuteProject.configuration.bean.model.data.FunctionColumn;
import net.sf.minuteProject.configuration.bean.model.data.Table;
import net.sf.minuteProject.configuration.bean.model.data.constant.Direction;
import net.sf.minuteProject.utils.ConvertUtils;
import org.apache.commons.lang.StringUtils;
public class FunctionDDLUtils extends AbstractConfiguration implements Function {
private List<FunctionColumn> functionColumns;
private List<FunctionColumn> inputColumns;
private List<FunctionColumn> outputColumns;
private List<Direction> directions;
private Table inputEntity, outputEntity;
private Package pack;
private Database database;
private FunctionColumn functionReturn;
private Boolean hasReturn = null;
private String catalog;
public void addColumn(FunctionColumn functionColumn) {
getFunctionColumnArray().add(functionColumn);
functionColumn.setFunction(this);
}
public String getCatalog() {
return catalog;
}
private void setDirection() {
if (functionColumns != null) {
inputColumns = new ArrayList<FunctionColumn>();
outputColumns = new ArrayList<FunctionColumn>();
for (FunctionColumn functionColumn : functionColumns) {
if (functionColumn.getDirection().equals(Direction.IN)
|| functionColumn.getDirection()
.equals(Direction.INOUT))
inputColumns.add(functionColumn);
if (functionColumn.getDirection().equals(Direction.OUT)
|| functionColumn.getDirection()
.equals(Direction.INOUT))
outputColumns.add(functionColumn);
}
}
}
public FunctionColumn[] getInputColumns() {
if (inputColumns == null) {
// inputColumns = new ArrayList<FunctionColumn>();
setDirection();
}
return (FunctionColumn[]) inputColumns
.toArray(new FunctionColumn[inputColumns.size()]);
}
public List<FunctionColumn> getColumns(Direction dir) {
if (Direction.IN.equals(dir) || Direction.INOUT.equals(dir)
|| Direction.NONE.equals(dir)) {
if (inputColumns == null) {
inputColumns = getFunctionColumn(functionColumns, dir);
}
return inputColumns;
}
if (dir.equals(Direction.OUT)) {
if (outputColumns == null) {
outputColumns = getFunctionColumn(functionColumns, dir);
}
return outputColumns;
}
if (dir.equals(Direction.ANY))
return getFunctionColumn();
return getFunctionColumn();
}
private List<FunctionColumn> getFunctionColumn() {
return getFunctionColumnArray();
}
private List<FunctionColumn> getFunctionColumn(
List<FunctionColumn> functionColumns, Direction dir) {
List<FunctionColumn> list = new ArrayList<FunctionColumn>();
if (functionColumns != null) {
for (FunctionColumn functionColumn : functionColumns) {
if (functionColumn.getDirection().equals(dir)
|| functionColumn.getDirection()
.equals(Direction.INOUT))
list.add(functionColumn);
}
}
return list;
}
public FunctionColumn[] getOutputColumns() {
if (outputColumns == null) {
// outputColumns = new ArrayList<FunctionColumn>();
setDirection();
}
return (FunctionColumn[]) outputColumns
.toArray(new FunctionColumn[outputColumns.size()]);
}
public void setCatalog(String catalog) {
this.catalog = catalog;
}
private List<FunctionColumn> getFunctionColumnArray() {
if (functionColumns == null) {
functionColumns = new ArrayList<FunctionColumn>();
}
return functionColumns;
}
public FunctionColumn[] getFunctionColumns() {
List<FunctionColumn> columns = getFunctionColumnArray();
return (FunctionColumn[]) columns.toArray(new FunctionColumn[columns
.size()]);
}
public FunctionColumn[] getColumns() {
// if (direction!=null && Direction.OUT.equals(direction))
// return getOutputColumns();
// return getInputColumns();
return getFunctionColumns();
}
// public String getTechnicalPackage(Template template)
// {
// return StringUtils.lowerCase(getCatalog());
// }
@Override
public List<Direction> getDirections() {
if (directions == null) {
directions = new ArrayList<Direction>();
boolean isInput = false;
boolean isOutput = false;
if (getInputColumns().length > 0)
isInput = true;
if (getOutputColumns().length > 0)
isOutput = true;
if (isInput && isOutput)
directions.add(Direction.INOUT);
if (isInput)
directions.add(Direction.IN);
if (isOutput)
directions.add(Direction.OUT);
}
return directions;
}
public Table getInputEntity() {
if (inputEntity == null)
inputEntity = getEntityDirection(Direction.IN);
return inputEntity;
}
public Table getOutputEntity() {
if (outputEntity == null)
outputEntity = getEntityDirection(Direction.OUT);
return outputEntity;
}
public Table getEntity(Direction dir) {
if (dir.equals(Direction.IN))
return getInputEntity();
if (dir.equals(Direction.OUT))
return getOutputEntity();
return getEntityDirection(dir);
}
private Table getEntityDirection(Direction dir) {
org.apache.ddlutils.model.Table table = new org.apache.ddlutils.model.Table();
table.setName(getName());
table.setCatalog(catalog);
table.setType(Table.TABLE);
addColumns(table, dir);
Table entity = new TableDDLUtils(table);
entity.setPackage(getPackage());
entity.setDatabase(database);
return entity;
}
private void addColumns(org.apache.ddlutils.model.Table table,
Direction direction) {
List<FunctionColumn> l = getColumns(direction);
for (FunctionColumn fc : l) {
table.addColumn(getColumn(fc));
}
}
private org.apache.ddlutils.model.Column getColumn(FunctionColumn fc) {
org.apache.ddlutils.model.Column column = new org.apache.ddlutils.model.Column();
column.setName(fc.getName());
column.setType(convertType(fc.getType()));
column.setScale(fc.getScale());
column.setSize(fc.getSize());
column.setPrecisionRadix(fc.getPrecisionRadix());
// column.setTypeCode(fc.getTypeCode());
return column;
}
private String convertType(String type) {
return ConvertUtils.getDDLUtilsTypeFromDBType(type);
}
public Package getPackage() {
return pack;
}
public void setPackage(Package pack) {
this.pack = pack;
}
public Database getDatabase() {
return database;
}
public void setDatabase(Database database) {
this.database = database;
}
@Override
public boolean hasReturn() {
if (hasReturn == null) {
// hasReturn = (getOutputEntity().getColumnCount() > 0) ? true :
hasReturn = false;
for (FunctionColumn column : getColumns()) {
if (column.isReturn() == true) {
hasReturn = true;
functionReturn = column;
// functionReturn.setFunction(this);
break;
}
}
}
return hasReturn;
}
@Override
public FunctionColumn getReturnFunctionColumn() {
if (hasReturn())
return getFunctionFirstColumn();
return null;
}
public FunctionColumn getFunctionFirstColumn() {
if (functionReturn == null)
for (FunctionColumn column : getColumns()) {
if (column.isReturn() == true) {
hasReturn = true;
functionReturn = column;
break;
}
}
return functionReturn;
}
public String getTechnicalPackage(Template template) {
net.sf.minuteProject.configuration.bean.Package p = getPackage();
if (p == null)
return "ERROR_PACKAGE_IS_NULL";
return p.getTechnicalPackage(template);
}
}