/* * Created on Jan 1, 2005 * */ package cn.org.rapid_framework.generator.provider.db.table.model; import java.util.List; import cn.org.rapid_framework.generator.provider.db.table.TableFactory; import cn.org.rapid_framework.generator.util.ListHashtable; import cn.org.rapid_framework.generator.util.StringHelper; /** * @author chris * */ public class ForeignKey { protected String relationShip = null; protected String firstRelation = null; protected String secondRelation = null; protected Table parentTable ; protected String tableName; protected ListHashtable columns ; protected ListHashtable parentColumns; public ForeignKey(Table aTable, String tblName) { super(); parentTable = aTable; tableName = tblName; columns = new ListHashtable(); parentColumns = new ListHashtable(); } /** * @return Returns the tableName. */ public String getTableName() { return tableName; } public String getParentTableName() { return parentTable.getSqlName(); } /** * @param col * @param seq */ public void addColumn(String col, String parentCol, Integer seq) { columns.put(seq, col); parentColumns.put(seq,parentCol); } public String getColumn(String parentCol) { // return the associated column given the parent column Object key = parentColumns.getKeyForValue(parentCol); String col = (String) columns.get(key); //System.out.println("get Column for" +parentCol); //System.out.println("key = "+key); //System.out.println("col="+col); //System.out.println("ParentColumns = "+parentColumns.toString()); return col; } public ListHashtable getColumns() { return columns; } /** * */ private void initRelationship() { firstRelation = ""; secondRelation = ""; Table foreignTable = null; try { foreignTable = (Table) TableFactory.getInstance().getTable(tableName); } catch (Exception e) { e.printStackTrace(); } List parentPrimaryKeys = parentTable.getPrimaryKeyColumns(); List foreignPrimaryKeys = foreignTable.getPrimaryKeyColumns(); if (hasAllPrimaryKeys(parentPrimaryKeys,parentColumns)) firstRelation = "one"; else firstRelation = "many"; if (hasAllPrimaryKeys(foreignPrimaryKeys,columns)) secondRelation = "one"; else secondRelation = "many"; relationShip = firstRelation + "-to-" + secondRelation; } private boolean hasAllPrimaryKeys(List pkeys, ListHashtable cols) { boolean hasAll = true; // if size is not equal then false int numKeys = pkeys.size(); if (numKeys != cols.size()) return false; for (int i=0;i<numKeys;i++) { Column col = (Column) pkeys.get(i); String colname = col.getColumnName(); if (!cols.contains(colname)) return false; } return hasAll; } public boolean isParentColumnsFromPrimaryKey() { boolean isFrom = true; List keys = parentTable.getPrimaryKeyColumns(); int numKeys = getParentColumns().size(); for (int i=0;i<numKeys;i++) { String pcol = (String) getParentColumns().getOrderedValue(i); if (!primaryKeyHasColumn(pcol)) { isFrom=false; break; } } return isFrom; } private boolean primaryKeyHasColumn(String aColumn) { boolean isFound = false; int numKeys = parentTable.getPrimaryKeyColumns().size(); for (int i=0;i<numKeys;i++) { Column sqlCol = (Column)parentTable.getPrimaryKeyColumns().get(i); String colname = sqlCol.getColumnName(); if (colname.equals(aColumn)) { isFound = true; break; } } return isFound; } public boolean getHasImportedKeyColumn(String aColumn) { boolean isFound = false; List cols = getColumns().getOrderedValues(); int numCols = cols.size(); for (int i=0;i<numCols;i++) { String col = (String) cols.get(i); if (col.equals(aColumn)) { isFound = true; break; } } return isFound; } /** * @return Returns the firstRelation. */ public String getFirstRelation() { if (firstRelation == null) initRelationship(); return firstRelation; } public Table getSqlTable() { Table table = null; try { table = (Table) TableFactory.getInstance().getTable(tableName); } catch (Exception e) { e.printStackTrace(); } return table; } /** * @return Returns the parentTable. */ public Table getParentTable() { return parentTable; } /** * @return Returns the relationShip. */ public String getRelationShip() { if (relationShip == null) initRelationship(); return relationShip; } /** * @return Returns the secondRelation. */ public String getSecondRelation() { if (secondRelation == null) initRelationship(); return secondRelation; } /** * @return Returns the parentColumns. */ public ListHashtable getParentColumns() { return parentColumns; } public boolean getHasImportedKeyParentColumn(String aColumn) { boolean isFound = false; List cols = getParentColumns().getOrderedValues(); int numCols = cols.size(); for (int i=0;i<numCols;i++) { String col = (String) cols.get(i); if (col.equals(aColumn)) { isFound = true; break; } } return isFound; } /** * 外键引用使用的值对象 * @author badqiu * */ public static class ReferenceKey { public String schemaName; public String tableName; public String columnSqlName; public ReferenceKey(String schemaName, String tableName,String columnSqlName) { this.schemaName = StringHelper.defaultIfEmpty(schemaName, null); this.tableName = tableName; this.columnSqlName = columnSqlName; } public String toString() { if(StringHelper.isBlank(schemaName)) { return tableName+"("+columnSqlName+")"; }else { return schemaName+"."+tableName+"("+columnSqlName+")"; } } public static String toString(ReferenceKey k) { if(k == null) return null; return k.toString(); } /** * 解析foreignKey字符串,格式: fk_table_name(fk_column) 或者 schema_name.fk_table_name(fk_column) * @param foreignKey * @return */ public static ReferenceKey fromString(String foreignKey) { if(StringHelper.isBlank(foreignKey)) { return null; } if(!foreignKey.trim().matches(".*\\w+\\(.*\\)")) { throw new IllegalArgumentException("Illegal foreignKey:["+foreignKey+"] ,example value: fk_table_name(fk_column) "); } String schemaName = foreignKey.substring(0,Math.max(foreignKey.lastIndexOf("."),0)); String tableSqlName = foreignKey.substring(Math.max(foreignKey.lastIndexOf(".")+1,0),foreignKey.indexOf("(")); String columnSqlName = foreignKey.substring(foreignKey.indexOf("(")+1,foreignKey.indexOf(")")); return new ReferenceKey(schemaName,tableSqlName,columnSqlName); } } }