package net.sf.minuteProject.utils;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import net.sf.minuteProject.configuration.bean.Reference;
import net.sf.minuteProject.configuration.bean.enrichment.Field;
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.Table;
import net.sf.minuteProject.configuration.bean.model.data.impl.DDLUtils.ReferenceDDLUtils;
import net.sf.minuteProject.plugin.format.I18nUtils;
public class ReferenceUtils {
public static Logger log = Logger.getLogger(ReferenceUtils.class);
// public static String getLocalColumnClassName (Database database, Column column) {
// Column c = getColumnFromPackage(database, column);
// if (column==null) return "COLUMN should not be null!";
// return FormatUtils.getJavaName(c.getAlias());
// }
// public static String getLocalColumnVariableName (Database database, Column column) {
// Column c = getLocalColumnFromPackage(database, column);
// if (column==null) return "COLUMN should not be null!";
// return FormatUtils.getJavaNameVariable(c.getAlias());
// }
public static String getColumnClassNameForLinkTable(Database database, Column column) {
// Column c = getPrimaryColumnForLinkTable(database, column);
// if (c==null) return "COLUMN should not be null!";
return FormatUtils.getJavaName(column.getAlias());
}
public static String getColumnClassAliasUpperCaseForLinkTable(Database database, Column column) {
Column c = getPrimaryColumnForLinkTable(database, column);
if (c==null) return "COLUMN should not be null!";
return FormatUtils.upperCase(c.getAlias());
}
private static Column getPrimaryColumnForLinkTable(Database database, Column column) {
if (column==null) return null;
Table table = TableUtils.getEntityFromBusinessPackageRefresh(database, column.getTable().getName());
if (table!=null) {
return TableUtils.getPrimaryFirstColumn(table);
}
return null;
}
// public static boolean isMasterRelationship
// (Table table, net.sf.minuteProject.configuration.bean.model.data.Reference linkReference) {
//
//// Table m2m = linkReference.getLocalTable();
//// if (!m2m.isManyToMany()) return false;
// net.sf.minuteProject.configuration.bean.model.data.Reference ref =getFirstChildReference(linkReference.getLocalTableName(), linkReference.getLocalColumnName(), table);
// if (ref!=null && ref.isMasterRelationship())
// return true;
//// for (ForeignKey fk : m2m.getForeignKeys()) {
//// net.sf.minuteProject.configuration.bean.model.data.Reference ref = fk.getFirstReference();
//// if (!ref.equals(linkReference) && ref.isMasterRelationship())
//// return true;
//// }
// return false;
// }
public static String getChildrenListVariable(net.sf.minuteProject.configuration.bean.model.data.Reference reference) {
if (reference==null)
return "ERROR_REFERENCE_IS_NUL";
return FormatUtils.getJavaNameVariable(reference.getAlias());
}
public static String getChildrenListClass(net.sf.minuteProject.configuration.bean.model.data.Reference reference) {
if (reference==null)
return "ERROR_REFERENCE_IS_NUL";
return FormatUtils.getJavaName(reference.getAlias());
}
public static void setReferenceColumnAlias(Column column, String name, String newName) {
Database database = column.getTable().getDatabase();
Table table = TableUtils.getTable(database, column.getTable().getName());
if (table==null) {
log.error("> table : "+column.getTable().getName()+", column : "+column.getName()+" not found");
return;
}
for (net.sf.minuteProject.configuration.bean.model.data.Reference ref : table.getParents()) {
if (name.equals(ref.getLocalColumn().getName()))
ref.getLocalColumn().setAlias(newName);
}
for (net.sf.minuteProject.configuration.bean.model.data.Reference ref : table.getChildren()) {
if (name.equals(ref.getLocalColumn().getName()))
ref.getLocalColumn().setAlias(newName);
}
}
public static net.sf.minuteProject.configuration.bean.model.data.Reference getReference (Table table, String columnName) {
Column column = ColumnUtils.getColumn(table, columnName);
return getReference(column);
}
public static List<net.sf.minuteProject.configuration.bean.model.data.Reference> getAllOtherReferences(Table table, String masterRelationshipField) {
List<net.sf.minuteProject.configuration.bean.model.data.Reference> references = new ArrayList<net.sf.minuteProject.configuration.bean.model.data.Reference>();
for (net.sf.minuteProject.configuration.bean.model.data.Reference ref: table.getParents()) {
if (!ref.getForeignColumnName().equals(masterRelationshipField)) {
references.add(ref);
}
}
return references;
}
public static net.sf.minuteProject.configuration.bean.model.data.Reference getReference (Column column) {
if (column==null) return null;
Table table = column.getTable();
net.sf.minuteProject.configuration.bean.model.data.Reference[] reference = table.getParents();
for (int i = 0; i < reference.length; i++) {
if (reference[i].getLocalColumnName().equals(column.getName()))
return reference[i];
}
return null;
}
public Reference getReference(Table table, Column column) {
Reference reference = new Reference();
reference.setTableName(table.getName());
reference.setColumnName(column.getName());
reference.setTable(table);
reference.setColumn(column);
return reference;
}
public Reference getReference(Table table, Column column, String tableName, String columnName) {
Reference reference = new Reference();
reference.setTableName(tableName);
reference.setColumnName(columnName);
reference.setTable(table);
reference.setColumn(column);
return reference;
}
public static String getParentLink (String foreignTableName, String localColumnName) {
return FormatUtils.getJavaName(foreignTableName)+"_"+FormatUtils.getJavaName(localColumnName);
}
public static String getParentLinkUML (String foreignTableName, String localColumnName) {
return FormatUtils.getJavaName(foreignTableName)+"_"+FormatUtils.getJavaName(localColumnName);
}
public static net.sf.minuteProject.configuration.bean.model.data.Reference getReference(Field field, Database database) {
org.apache.ddlutils.model.Reference referenceDDLUtils = new org.apache.ddlutils.model.Reference();
// referenceDDLUtils.setForeignColumn(foreignColu)
net.sf.minuteProject.configuration.bean.model.data.Reference reference = new ReferenceDDLUtils(referenceDDLUtils);
String tableName = field.getEntity().getName();
String columnName = field.getName();
String foreignTableName = field.getLinkToTargetEntity();
// Database database = field.getEntity().getEnrichment().getBusinessModel().getModel().getDataModel().getDatabase();
// is it a view ?
Table table= TableUtils.getTable(database, tableName);
if (table==null)
table = TableUtils.getView(database, tableName);
Column column = ColumnUtils.getColumn(table, columnName);
// is it a view
Table foreignTable= TableUtils.getTable(database, foreignTableName);
if (foreignTable==null)
foreignTable = TableUtils.getView(database, foreignTableName);
String foreignColumnName = field.getLinkToTargetField();
if (foreignColumnName==null)
foreignColumnName = TableUtils.getPrimaryKey(foreignTable);
Column foreignColumn = ColumnUtils.getColumn(foreignTable, foreignColumnName);
if (table!=null && column != null && foreignTable!=null && foreignColumn!=null) {
reference.setLocalTable(table);
reference.setLocalColumn(column);
reference.getLocalColumn().setAlias(reference.getLocalColumn().getAlias());
reference.setForeignTable(foreignTable);
reference.setForeignColumn(foreignColumn);
reference.getForeignColumn().setAlias(reference.getForeignColumn().getAlias());
if (!StringUtils.isEmpty(field.getLinkReferenceAlias())) {
//id set
// reference.getForeignColumn().setAlias(field.getLinkReferenceAlias());
//
// reference.getLocalColumn().setAlias(field.getLinkReferenceAlias());
// reference.setAlias(field.getLinkReferenceAlias());
}
reference.setLocalColumnName(columnName);
reference.setLocalTableName(tableName);
reference.setForeignColumnName(foreignColumnName);
reference.setForeignTableName(foreignTableName);
return reference;
}
return null;
}
public static net.sf.minuteProject.configuration.bean.model.data.Reference getFirstChildReference
(String originTable, String originField, Table target) {
net.sf.minuteProject.configuration.bean.model.data.Reference [] refs = target.getChildren();
for (int i = 0; i < refs.length; i++) {
net.sf.minuteProject.configuration.bean.model.data.Reference ref = refs[i];
if (ref.getForeignTableName().equals(originTable) && ref.getForeignColumnName().equals(originField))
return ref;
}
return null;
}
public static net.sf.minuteProject.configuration.bean.model.data.Reference getReference (Table origin, Table target) {
net.sf.minuteProject.configuration.bean.model.data.Reference [] refs = origin.getParents();
for (int i = 0; i < refs.length; i++) {
net.sf.minuteProject.configuration.bean.model.data.Reference ref = refs[i];
if (ref.getForeignTable().equals(target))
return ref;
}
return null;
}
public static boolean isSimilarReference(
net.sf.minuteProject.configuration.bean.model.data.Reference reference,
net.sf.minuteProject.configuration.bean.model.data.Reference otherReference) {
if (reference!=null && otherReference!=null) {
return (reference.getForeignTableName().equals(otherReference.getForeignTableName()) &&
reference.getForeignColumnName().equals(otherReference.getForeignColumnName()) &&
reference.getLocalTableName().equals(otherReference.getLocalTableName()) &&
reference.getLocalColumnName().equals(otherReference.getLocalColumnName())
)
||
(reference.getForeignTableName().equals(otherReference.getLocalTableName()) &&
reference.getForeignColumnName().equals(otherReference.getLocalColumnName()) &&
reference.getForeignTableName().equals(otherReference.getLocalTableName()) &&
reference.getForeignColumnName().equals(otherReference.getLocalColumnName())
)
;
}
return false;
}
public static boolean isReferenceInPrimaryKey (net.sf.minuteProject.configuration.bean.model.data.Reference reference) {
for (Column column : reference.getLocalTable().getPrimaryKeyColumns()) {
if (column.getName().equals(reference.getLocalColumnName()))
return true;
}
return false;
}
public static boolean isUsingDefaultAlias(
net.sf.minuteProject.configuration.bean.model.data.Reference reference) {
return (reference.getAlias().equals(getDefaultAlias(reference)));
}
public static String getDefaultAlias(net.sf.minuteProject.configuration.bean.model.data.Reference ref) {
//TODO add for recursive m2m //+"_"+ref.getLocalColumn().getAlias();
return ref.getForeignTable().getAlias()+"_"+ref.getLocalTable().getAlias()+"_VIA_"+ref.getForeignColumn().getAlias();//+"_"+ref.getLocalColumn().getAlias();
}
public static String getColumnAlias(Table table, Column column) {
Column column2 = ColumnUtils.getColumn(table, column.getName());
if (column2!=null)
return column2.getAlias();
return "COLUMN_IS_NULL";
}
}