package oisoft.togetherx.scripts.SQL.impl;
import java.util.Enumeration;
import COM.objectspace.jgl.HashMap;
import oisoft.togetherx.scriptapi.UML.UMLClass;
import oisoft.togetherx.scriptapi.UML.UMLAttribute;
import oisoft.togetherx.scripts.SQL.*;
class TableImpl implements SQLTable{
private SQLModelImpl myModel;
private UMLClass myClass;
private String myName;
private HashMap myColumns = new HashMap();
private HashMap myForeignColumns = new HashMap();
TableImpl(UMLClass clazz, SQLModelImpl model){
myClass = clazz;
myModel = model;
}
public SQLModel getModel(){
return myModel;
}
public String getCatalog(){
return null;
}
public String getSchema(){
return null;
}
public String getName(){
if( myName == null ){
myName = myModel.createTableName(myClass.toShortString());
}
return myName;
}
/**
@todo create tag for table type
@see java.sql.DatabaseMetaData#getTables
*/
public String getType(){
return "TABLE";
}
/**
@todo Use doc from model for remarks
*/
public String getRemarks(){
return "";
}
public Enumeration getColumns(){
return getColumns(true);
}
public Enumeration getColumns(boolean showForeign){
return new ColumnEnumeration(this,myModel,showForeign);
}
/**
@todo Implement it!
*/
public Enumeration getConstraints(){
return new TableConstraintEnumeration(this);
}
public Enumeration getPrimaryKeyColumns(){
return getPrimaryKeyColumns(true);
}
public Enumeration getPrimaryKeyColumns(boolean showForeign){
return new ColumnEnumeration(this,myModel,showForeign,true);
//return new FilterEnumeration(getColumns(showForeign),new PrimaryKeyColumnFilter());
}
UMLClass getUMLClass(){
return myClass;
}
SQLColumn getColumn(UMLAttribute attribute){
return getColumn(attribute,false);
}
private SQLColumn getColumn(UMLAttribute attribute, boolean forcePrimaryKey){
SQLColumn result = (SQLColumn)myColumns.get(attribute);
if( result == null ){
boolean nullable = !attribute.hasProperty(tagNamePrimaryKey());
result = new ColumnImpl(attribute,nullable,forcePrimaryKey,this);
myColumns.put(attribute,result);
}
return result;
}
SQLColumn getForeignKeyColumn(ColumnImpl column, boolean forcePrimaryKey){
//return getColumn(column.getAttribute(),forcePrimaryKey);
SQLColumn result = (SQLColumn)myForeignColumns.get(column);
if( result == null ){
boolean nullable = !column.getAttribute().hasProperty(tagNamePrimaryKey());
result = new ColumnImpl(column.getAttribute(),nullable,forcePrimaryKey,this,true);
myForeignColumns.put(column,result);
}
return result;
}
String createColumnName(ColumnImpl column){
String fullName = null;
if( column.isForeignKey() ){
fullName = prefixForeignKey()+column.getAttribute().getName();
}
else{
fullName = column.getAttribute().getName();
}
String result = myModel.getNameConstraints().shorten(fullName,
myModel.getNameConstraints().getMaxColumnNameLength());
return myModel.dereserve(result);
}
String prefixForeignKey(){
return "FK_";
}
String getPrimaryKeyName(){
String fullName = "PK_"+getName();
String result = myModel.getNameConstraints().shorten(fullName,
myModel.getNameConstraints().getMaxColumnNameLength());
return myModel.getUniqueName(result,myModel.getNameConstraints().getMaxColumnNameLength());
}
String getForeignKeyName(SQLForeignKey fk){
String fullName = "CONSTRAINT_FK_"+fk.getReferencedTable().getName();
String result = myModel.getNameConstraints().shorten(fullName,
myModel.getNameConstraints().getMaxColumnNameLength());
return myModel.getUniqueName(result,myModel.getNameConstraints().getMaxColumnNameLength());
}
SQLDiagramTags getTags(){
return myModel.getTags();
}
private String tagNamePrimaryKey(){
return getTags().attributePrimaryKey();
}
}
|