package net.sf.minuteProject.utils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import net.sf.minuteProject.configuration.bean.BusinessModel;
import net.sf.minuteProject.configuration.bean.FunctionModel;
import net.sf.minuteProject.configuration.bean.GenerationCondition;
import net.sf.minuteProject.configuration.bean.GeneratorBean;
import net.sf.minuteProject.configuration.bean.Model;
import net.sf.minuteProject.configuration.bean.Package;
import net.sf.minuteProject.configuration.bean.Reference;
import net.sf.minuteProject.configuration.bean.Template;
import net.sf.minuteProject.configuration.bean.condition.FunctionGenerationCondition;
import net.sf.minuteProject.configuration.bean.model.data.Column;
import net.sf.minuteProject.configuration.bean.model.data.Database;
import net.sf.minuteProject.configuration.bean.model.data.ForeignKey;
import net.sf.minuteProject.configuration.bean.model.data.Function;
import net.sf.minuteProject.configuration.bean.model.data.Table;
import net.sf.minuteProject.configuration.bean.presentation.EntityBlock;
import net.sf.minuteProject.configuration.bean.presentation.EntityBlocks;
import net.sf.minuteProject.configuration.bean.presentation.Presentation;
import net.sf.minuteProject.configuration.bean.presentation.PresentationBlock;
import net.sf.minuteProject.configuration.bean.view.Service;
import net.sf.minuteProject.configuration.bean.view.View;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
public class ModelUtils {
private static Logger logger = Logger.getLogger(ModelUtils.class);
public static boolean isToGenerate(BusinessModel businessModel, Table table) {
if (businessModel.getGenerationCondition()!=null)
return isToGenerate(businessModel.getGenerationCondition(), table);//.areConditionsTrue(table.getName());
return true;
}
public static boolean isToGenerate(FunctionModel functionModel, Function function) {
FunctionGenerationCondition functionGC = functionModel.getFunctionGenerationCondition();
if (functionGC!=null) {
return isToGenerate (functionGC, function);
}
return true;
}
private static boolean isToGenerate(FunctionGenerationCondition functionGC, Function function) {
return functionGC.areConditionsTrue(function.getName());
}
public static boolean isToGenerate(GenerationCondition generationCondition, Table table) {
if (table.TABLE.equals(table.getType()) && generationCondition.isExcludeTables())
return false;
if (table.VIEW.equals(table.getType()) && generationCondition.isExcludeViews())
return false;
return generationCondition.areConditionsTrue(table.getName());
}
public static boolean isSchemaNeeded(Model model) {
if (model.getDataModel().hasSchema()) {
String schemaName = model.getDataModel().getSchema();
String username = model.getDataModel().getBasicDataSource().getUsername();
if (schemaName!=null && username!=null) {
schemaName = StringUtils.lowerCase(schemaName);
username = StringUtils.lowerCase(username);
if (schemaName.equals(username))
return false;
else
return true;
}
}
return false;
}
// public static boolean isToGenerate(BusinessModel businessModel, net.sf.minuteProject.configuration.bean.model.data.impl.DDLUtils.TableDDLUtils table) {
// if (businessModel.getGenerationCondition()!=null)
// return businessModel.getGenerationCondition().areConditionsTrue(table.getName());
// return true;
// }
public static String getPackage(Model model, Template template, Table table) {
return getPackage (table, template);
}
public static String getPackage(Model model, Template template, Package pack) {
StringBuffer sb = new StringBuffer(getTechnicalPackage(model, template));
sb.append("."+pack.getName());
return sb.toString();
}
public static String getPackage(Model model, Template template) {
//StringBuffer sb = new StringBuffer(getTechnicalPackage(model, template));
return getTechnicalPackage(model, template);//sb.toString();
}
public static String getPackage(GeneratorBean bean, Template template) {
return bean.getTechnicalPackage(template);
}
public static String getTechnicalPackage(Model model, Template template) {
StringBuffer sb = new StringBuffer(getPackageRoot(template));
sb.append("."+model.getName());
if (template.getTechnicalPackage()!=null && !template.getTechnicalPackage().equals(""))
sb.append("."+template.getTechnicalPackage());
return sb.toString();
}
public static String getPackageRoot (Template template) {
return (template.getPackageRoot()!=null)?template.getPackageRoot():"defaultroot";
}
public static String getTechnicalPackage(View view, Template template) {
StringBuffer sb = new StringBuffer(template.getPackageRoot());
sb.append("."+view.getProjectname());
sb.append("."+template.getTechnicalPackage());
sb.append("."+view.getName());
return sb.toString();
}
public static String getTechnicalPackage(Service service, Template template) {
StringBuffer sb = new StringBuffer(getTechnicalPackage(service.getView(), template));
sb.append("."+service.getName());
return sb.toString();
}
//TODO getPackage and technicalPackage must be in the configuration bean interface
public static String getTechnicalPackage(net.sf.minuteProject.configuration.bean.view.Function function, Template template) {
StringBuffer sb = new StringBuffer(getTechnicalPackage(function.getService(), template));
sb.append("."+function.getName());
return sb.toString();
}
public static String getPackageDir(Model model, Template template, Table table) {
return FormatUtils.getDirFromPackage(getPackage(model, template, table));
}
public static String getPackageDir(Model model, Template template, Package pack) {
return FormatUtils.getDirFromPackage(getPackage(model, template, pack));
}
public static String getTechnicalPackageDir(Model model, Template template) {
return FormatUtils.getDirFromPackage(getTechnicalPackage(model, template));
}
public static List<Reference> getParents (Database database, Table table) {
//return getParents(table);
// Duplicated code
List<Reference> list = new ArrayList<Reference>();
net.sf.minuteProject.configuration.bean.model.data.Reference ref;
Reference reference;
ForeignKey [] foreignKeys = table.getForeignKeys();
//logger.info("table = "+table.getName()+", count FK = "+foreignKeys.length);
for (int i = 0; i < foreignKeys.length; i++) {
ref = foreignKeys[i].getFirstReference();
String tablename = foreignKeys[i].getForeignTableName();
Table table2 = TableUtils.getTable(database,tablename);
String columnName = null;
if (ref!=null)
columnName = ref.getForeignColumnName();
Column column2 = ColumnUtils.getColumn (table2, columnName);
//reference = new Reference(table2, ColumnUtils.getColumn(table2, ref.getLocalColumnName()), tablename, ref.getLocalColumnName());
reference = new Reference(table2, column2, tablename, columnName);
reference.setLocalColumn(ref.getLocalColumn());
//logger.info("table = "+tablename+", columnName = "+columnName);
addReference(list, reference);
}
return list;
}
private static void addReference (List list, Reference referenceToAdd) {
// for (Iterator iter = list.iterator(); iter.hasNext();) {
// Reference reference = (Reference)iter.next();
// if (reference.equals(referenceToAdd))
// return;
// }
list.add(referenceToAdd);
}
public static List getChildren (Database database, Table table) {
List list = new ArrayList();
String columnRef;
net.sf.minuteProject.configuration.bean.model.data.Reference ref;
Reference reference;
//Table [] tables = database.getTables();
//replaced with entities to find enriched FK in the views
Table [] tables = database.getEntities();
for (int i = 0; i < tables.length; i++) {
ForeignKey [] fk = tables[i].getForeignKeys();
for (int j = 0; j < fk.length; j++) {
String tableName = fk[j].getForeignTableName();
if (tableName!=null && fk[j].isBidirectional()) {
if (tableName.equals(table.getName())) {
columnRef = new String();
ref = fk[j].getReference(0);
columnRef = ref.getLocalColumnName();
// if (columnRef==null)
// logger.info("- no localcolumnName for tab");
Column column2 = ColumnUtils.getColumn (tables[i], ref.getLocalColumnName());
reference = new Reference(tables[i], column2, tables[i].getName(), ref.getLocalColumnName());
reference.setLocalColumnName(ref.getLocalColumnName());
reference.setForeignColumnName(ref.getForeignColumnName());
addReference(list, reference);
}
}
}
}
return list;
}
public static boolean hasParentReferenceSymbols(Model model, Table table) {
if (getParentReferenceSymbols(model,table)!=null)
return true;
return false;
}
public static boolean hasParentReferenceSymbols(EntityBlock entityBlock) {
if (entityBlock!=null)
return true;
return false;
}
public static EntityBlock getParentReferenceSymbols(Model model, Table table) {
Presentation presentation = model.getConfiguration().getPresentation();
for (Iterator iter = presentation.getPresentationBlocks().iterator(); iter.hasNext();) {
for (Iterator iter2 = ((PresentationBlock)iter.next()).getEntityBlockss().iterator(); iter2.hasNext();)
for (Iterator iter3 = ((EntityBlocks)iter2.next()).getEntityBlocks().iterator(); iter3.hasNext();) {
EntityBlock entityBlock = (EntityBlock)iter3.next();
if (entityBlock.getType()!= null && entityBlock.getName()!= null
&& entityBlock.getType().equals("entity-block-parent-reference")
&& entityBlock.getEntity().equals(table.getName()))
return entityBlock;
}
}
return null;
}
public static String getModelRootPackage (Model model) {
return model.getPackageRoot()+"."+model.getName();
}
}