package liquibase.database.structure.type;
import liquibase.database.Database;
import liquibase.database.typeconversion.TypeConverterFactory;
import liquibase.exception.UnexpectedLiquibaseException;
import liquibase.util.StringUtils;
/**
* Object representing a data type, instead of a plain string. It will be returned by
* the getXXXType in the Database interface.
*
* @author dsmith
*/
public abstract class DataType {
private String dataTypeName;
private int minParameters;
private int maxParameters;
// Unit of data-type precision (i.e. BYTE, CHAR for Oracle)
private String unit;
private String firstParameter;
private String secondParameter;
private String additionalInformation;
protected DataType(String dataTypeName, int minParameters, int maxParameters) {
this.dataTypeName = dataTypeName;
this.minParameters = minParameters;
this.maxParameters = maxParameters;
}
public String getDataTypeName() {
return dataTypeName;
}
public void setDataTypeName(String dataTypeName) {
this.dataTypeName = dataTypeName;
}
public int getMinParameters() {
return minParameters;
}
public int getMaxParameters() {
return maxParameters;
}
public String getFirstParameter() {
return firstParameter;
}
public void setFirstParameter(String firstParameter) {
if (maxParameters < 1) {
throw new UnexpectedLiquibaseException("Type "+getClass()+" doesn't support precision but precision was specified");
}
this.firstParameter = firstParameter;
}
public String getSecondParameter() {
return secondParameter;
}
public void setSecondParameter(String secondParameter) {
if (maxParameters <2 ) {
throw new UnexpectedLiquibaseException("Type "+getClass()+" doesn't support second parameters but one was specified");
}
this.secondParameter = secondParameter;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
public String getAdditionalInformation() {
return additionalInformation;
}
public void setAdditionalInformation(String additionalInformation) {
this.additionalInformation = additionalInformation;
}
public String convertObjectToString(Object value, Database database) {
if (value == null) {
return null;
} else if (value.toString().equals("CURRENT_TIMESTAMP()")) {
return database.getCurrentDateTimeFunction();
} else if (value.equals(Boolean.TRUE)) {
return TypeConverterFactory.getInstance().findTypeConverter(database).getBooleanType().getTrueBooleanValue();
} else if (value.equals(Boolean.FALSE)) {
return TypeConverterFactory.getInstance().findTypeConverter(database).getBooleanType().getFalseBooleanValue();
}
return value.toString();
}
@Override
public String toString() {
String returnString = getDataTypeName();
if (getFirstParameter() != null) {
returnString += "("+getFirstParameter();
if (getSecondParameter() != null) {
returnString+=","+getSecondParameter();
}
if (getUnit() != null) {
returnString+=" " + getUnit();
}
returnString+= ")";
}
returnString += " "+ StringUtils.trimToEmpty(additionalInformation);
return returnString.trim();
}
@Override
public boolean equals(final Object o) {
return o instanceof DataType && toString().equals(o.toString());
}
@Override
public int hashCode() {
return toString().hashCode();
}
// @Override
// public String toString() {
// return this.getClass().getName() + "[" + getDataTypeName() + ", " + getSupportsPrecision() + "]";
// }
public boolean getSupportsPrecision() {
return false;
}
}