package com.idega.data.query;
import com.idega.data.IDOCompositePrimaryKeyException;
import com.idega.data.IDOEntity;
import com.idega.data.IDOEntityDefinition;
import com.idega.data.IDOEntityField;
import com.idega.data.IDOLookup;
import com.idega.data.IDOLookupException;
import com.idega.data.IDOPrimaryKeyDefinition;
import com.idega.data.query.output.Output;
import com.idega.data.query.output.Outputable;
import com.idega.data.query.output.ToStringer;
/**
* @author <a href="joe@truemesh.com">Joe Walnes</a>
*/
public class Table implements Outputable, Cloneable {
private String name;
private String alias=null;
private Outputable query = null;
private String primaryKeyColumnName;
private String[] primaryKeyColumnNames;
private boolean hasCompositePrimaryKey = false;
private IDOEntityDefinition _entityDefinition;
public Table(String name) {
this.name = name;
}
public Table(String name, String alias) {
this.name = name;
this.alias = alias;
}
public Table(Outputable query, String alias){
this.query = query;
this.name = "("+query+")";
this.alias = alias;
}
public Table(Class entityClass) {
this._entityDefinition = getEntityDefinition(entityClass);
if (this._entityDefinition != null) {
this.name = this._entityDefinition.getSQLTableName().toLowerCase();
IDOPrimaryKeyDefinition pk = this._entityDefinition.getPrimaryKeyDefinition();
this.hasCompositePrimaryKey = pk.isComposite();
if (!this.hasCompositePrimaryKey) {
try {
this.primaryKeyColumnName = pk.getField().getSQLFieldName();
}
catch (IDOCompositePrimaryKeyException icpke) {
icpke.printStackTrace();
}
}
else {
IDOEntityField[] fields = pk.getFields();
this.primaryKeyColumnNames = new String[fields.length];
for (int i = 0; i < fields.length; i++) {
IDOEntityField field = fields[i];
this.primaryKeyColumnNames[i] = field.getSQLFieldName();
}
}
}
else {
this.name = "null";
}
}
public Table(Class entityClass, String alias) {
this(entityClass);
this.alias = alias;
}
public Table(IDOEntity entity) {
this(entity.getEntityDefinition(), null);
}
public Table(IDOEntity entity, String alias) {
this(entity.getEntityDefinition(), alias);
}
private Table(IDOEntityDefinition entityDefinition, String alias) {
this._entityDefinition = entityDefinition;
if (this._entityDefinition != null) {
this.name = this._entityDefinition.getSQLTableName().toLowerCase();
}
else {
this.name = "null";
}
if (alias != null) {
this.alias = alias;
}
}
/**
* Name of table
*/
public String getName() {
return this.name;
}
public String getPrimaryKeyColumnName() throws IDOCompositePrimaryKeyException {
if (!this.hasCompositePrimaryKey) {
return this.primaryKeyColumnName;
}
else {
throw new IDOCompositePrimaryKeyException("IDOEntity has a composite primary key.");
}
}
public String[] getPrimaryKeyColumnNames() throws IDOCompositePrimaryKeyException {
if (this.hasCompositePrimaryKey) {
return this.primaryKeyColumnNames;
}
else {
throw new IDOCompositePrimaryKeyException("IDOEntity does not have a composite primary key.");
}
}
public boolean hasCompositePrimaryKey() {
return this.hasCompositePrimaryKey;
}
private IDOEntityDefinition getEntityDefinition(Class entityClass) {
try {
return IDOLookup.getEntityDefinitionForClass(entityClass);
}
catch (IDOLookupException ile) {
return null;
}
}
/**
* Whether this table has an alias assigned.
*/
private boolean hasAlias() {
return this.alias != null;
}
/**
* Short alias of table
*/
public String getAlias() {
return hasAlias() ? this.alias : this.name;
}
/**
* Get a column for a particular table.
*/
public Column getColumn(String columnName) {
return new Column(this, columnName);
}
public int hashCode() {
if(this.alias != null){
return (this.name+this.alias).hashCode();
}
return this.name.hashCode();
}
public boolean equals(Object o) {
if (o == null) {
return false;
}
if (!(o instanceof Table)) {
return false;
}
return getAlias().equals(((Table) o).getAlias());
}
public void write(Output out) {
out.print(getName());
if (hasAlias()) {
out.print(' ');
out.print(getAlias());
}
}
public String toString() {
return ToStringer.toString(this);
}
/**
* @return Returns the entityDefinition.
*/
public IDOEntityDefinition getEntityDefinition() {
return this._entityDefinition;
}
public boolean hasEntityDefinition() {
return getEntityDefinition() != null;
}
/**
* @param entityDefinition
* The entityDefinition to set.
*/
public void setEntityDefinition(IDOEntityDefinition entityDefinition) {
this._entityDefinition = entityDefinition;
}
public Object clone() {
Table obj = null;
try {
obj = (Table)super.clone();
}
catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return obj;
}
}