/*
*
* SchemaCrawler
* http://sourceforge.net/projects/schemacrawler
* Copyright (c) 2000-2010, Sualeh Fatehi.
*
* This library is free software; you can redistribute it and/or modify it under the terms
* of the GNU Lesser General Public License as published by the Free Software Foundation;
* either version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*
*/
package schemacrawler.build;
import schemacrawler.schema.ColumnDataType;
import schemacrawler.schema.Schema;
import schemacrawler.schema.SearchableType;
import sf.util.Utility;
/**
* Represents a column type. Provides the java.sql.Types type, the
* java.sql.Types type name, and the database specific data type name.
*
* @author Sualeh Fatehi
*/
final class ColumnDataTypeMetadata
extends BaseDatabaseObjectMetadata
implements ColumnDataType
{
public static final class ColumnDataTypeBuilder
extends BaseDatabaseObjectBuilder
{
private static final long serialVersionUID = 3688503281676530744L;
// Fields related to the java.sql.Types type
private int javaSqlType;
private String javaSqlTypeName;
private String javaSqlTypeMappedClassName;
// Other fields
private boolean userDefined;
private long precision;
private String literalPrefix;
private String literalSuffix;
private String createParameters;
private boolean nullable;
private boolean caseSensitive;
private SearchableType searchable;
private boolean unsigned;
private boolean fixedPrecisionScale;
private boolean autoIncrementable;
private String localizedTypeName;
private int minimumScale;
private int maximumScale;
private int numPrecisionRadix; // usually 2 or 10
private ColumnDataType baseType;
public ColumnDataTypeBuilder(final Schema schema, final String name)
{
super(schema, name);
// Default values
searchable = SearchableType.unknown;
setTypeFromJavaSqlType(JavaSqlType.UNKNOWN);
createParameters = "";
}
public ColumnDataTypeMetadata build()
{
return new ColumnDataTypeMetadata(this);
}
public ColumnDataType getBaseType()
{
return baseType;
}
public String getCreateParameters()
{
return createParameters;
}
public String getLiteralPrefix()
{
return literalPrefix;
}
public String getLiteralSuffix()
{
return literalSuffix;
}
public String getLocalTypeName()
{
return localizedTypeName;
}
public int getMaximumScale()
{
return maximumScale;
}
public int getMinimumScale()
{
return minimumScale;
}
public int getNumPrecisionRadix()
{
return numPrecisionRadix;
}
public long getPrecision()
{
return precision;
}
public SearchableType getSearchable()
{
return searchable;
}
public int getType()
{
return javaSqlType;
}
public String getTypeClassName()
{
return javaSqlTypeMappedClassName;
}
public String getTypeName()
{
return javaSqlTypeName;
}
public boolean isAutoIncrementable()
{
return autoIncrementable;
}
public boolean isCaseSensitive()
{
return caseSensitive;
}
public boolean isFixedPrecisionScale()
{
return fixedPrecisionScale;
}
public boolean isNullable()
{
return nullable;
}
public boolean isUnsigned()
{
return unsigned;
}
public boolean isUserDefined()
{
return userDefined;
}
public void setAutoIncrementable(final boolean autoIncrementable)
{
this.autoIncrementable = autoIncrementable;
}
public void setBaseType(final ColumnDataType baseType)
{
this.baseType = baseType;
}
public void setCaseSensitive(final boolean caseSensitive)
{
this.caseSensitive = caseSensitive;
}
public void setCreateParameters(final String createParams)
{
createParameters = createParams;
}
public void setFixedPrecisionScale(final boolean fixedPrecisionScale)
{
this.fixedPrecisionScale = fixedPrecisionScale;
}
public void setLiteralPrefix(final String literalPrefix)
{
this.literalPrefix = literalPrefix;
}
public void setLiteralSuffix(final String literalSuffix)
{
this.literalSuffix = literalSuffix;
}
public void setLocalTypeName(final String localTypeName)
{
localizedTypeName = localTypeName;
}
public void setMaximumScale(final int maximumScale)
{
this.maximumScale = maximumScale;
}
public void setMinimumScale(final int minimumScale)
{
this.minimumScale = minimumScale;
}
public void setNullable(final boolean nullable)
{
this.nullable = nullable;
}
public void setNumPrecisionRadix(final int numPrecisionRadix)
{
this.numPrecisionRadix = numPrecisionRadix;
}
public void setPrecision(final long precision)
{
this.precision = precision;
}
public void setSearchable(final SearchableType searchable)
{
this.searchable = searchable;
}
public void setType(final int type, final String typeClassName)
{
setTypeFromJavaSqlType(JavaSqlTypesUtility.lookupSqlDataType(type));
if (javaSqlTypeMappedClassName == null && !Utility.isBlank(typeClassName))
{
javaSqlTypeMappedClassName = typeClassName;
}
}
public void setUnsigned(final boolean unsignedAttribute)
{
unsigned = unsignedAttribute;
}
public void setUserDefined(final boolean userDefined)
{
this.userDefined = userDefined;
}
private void setTypeFromJavaSqlType(final JavaSqlType javaSqlType)
{
if (javaSqlType != null)
{
this.javaSqlType = javaSqlType.getJavaSqlType();
javaSqlTypeName = javaSqlType.getJavaSqlTypeName();
javaSqlTypeMappedClassName = javaSqlType
.getJavaSqlTypeMappedClassName();
}
}
}
private static final long serialVersionUID = 3688503281676530744L;
// Fields related to the java.sql.Types type
private final int javaSqlType;
private final String javaSqlTypeName;
private final String javaSqlTypeMappedClassName;
// Other fields
private final boolean userDefined;
private final long precision;
private final String literalPrefix;
private final String literalSuffix;
private final String createParameters;
private final boolean nullable;
private final boolean caseSensitive;
private final SearchableType searchable;
private final boolean unsigned;
private final boolean fixedPrecisionScale;
private final boolean autoIncrementable;
private final String localizedTypeName;
private final int minimumScale;
private final int maximumScale;
private final int numPrecisionRadix; // usually 2 or 10
private final ColumnDataType baseType;
private ColumnDataTypeMetadata(final ColumnDataTypeBuilder builder)
{
super(builder);
// Fields related to the java.sql.Types type
javaSqlType = builder.javaSqlType;
javaSqlTypeName = builder.javaSqlTypeName;
javaSqlTypeMappedClassName = builder.javaSqlTypeMappedClassName;
// Other fields
userDefined = builder.userDefined;
precision = builder.precision;
literalPrefix = builder.literalPrefix;
literalSuffix = builder.literalSuffix;
createParameters = builder.createParameters;
nullable = builder.nullable;
caseSensitive = builder.caseSensitive;
searchable = builder.searchable;
unsigned = builder.unsigned;
fixedPrecisionScale = builder.fixedPrecisionScale;
autoIncrementable = builder.autoIncrementable;
localizedTypeName = builder.localizedTypeName;
minimumScale = builder.minimumScale;
maximumScale = builder.maximumScale;
numPrecisionRadix = builder.numPrecisionRadix;
baseType = builder.baseType;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#getBaseType()
*/
public ColumnDataType getBaseType()
{
return baseType;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#getCreateParameters()
*/
public String getCreateParameters()
{
return createParameters;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#getDatabaseSpecificTypeName()
*/
public String getDatabaseSpecificTypeName()
{
return getName();
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#getLiteralPrefix()
*/
public String getLiteralPrefix()
{
return literalPrefix;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#getLiteralSuffix()
*/
public String getLiteralSuffix()
{
return literalSuffix;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#getLocalTypeName()
*/
public String getLocalTypeName()
{
return localizedTypeName;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#getMaximumScale()
*/
public int getMaximumScale()
{
return maximumScale;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#getMinimumScale()
*/
public int getMinimumScale()
{
return minimumScale;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#getNumPrecisionRadix()
*/
public int getNumPrecisionRadix()
{
return numPrecisionRadix;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#getPrecision()
*/
public long getPrecision()
{
return precision;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#getSearchable()
*/
public SearchableType getSearchable()
{
return searchable;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#getType()
*/
public int getType()
{
return javaSqlType;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#getTypeClassName()
*/
public String getTypeClassName()
{
return javaSqlTypeMappedClassName;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#getTypeName()
*/
public String getTypeName()
{
return javaSqlTypeName;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#isAutoIncrementable()
*/
public boolean isAutoIncrementable()
{
return autoIncrementable;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#isCaseSensitive()
*/
public boolean isCaseSensitive()
{
return caseSensitive;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#isFixedPrecisionScale()
*/
public boolean isFixedPrecisionScale()
{
return fixedPrecisionScale;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#isNullable()
*/
public boolean isNullable()
{
return nullable;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#isUnsigned()
*/
public boolean isUnsigned()
{
return unsigned;
}
/**
* {@inheritDoc}
*
* @see schemacrawler.schema.ColumnDataType#isUserDefined()
*/
public boolean isUserDefined()
{
return userDefined;
}
}