/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.jdbc.data;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* ResultsMetadata
*
* @since 8.0
*/
public class ResultsMetadata {
public static final int NULLABLE_UNKNOWN = ResultSetMetaData.columnNullableUnknown;
public static final int NULLABLE = ResultSetMetaData.columnNullable;
public static final int NOT_NULLABLE = ResultSetMetaData.columnNoNulls;
public class ColumnMetadata {
private String name;
private String label;
private int type;
private String typeName;
private String className;
private int displaySize;
private int precision;
private int scale;
private String tableName;
private String schemaName;
private String catalogName;
private boolean autoIncrement;
private boolean caseSensitive;
private boolean currency;
private boolean definitelyWritable;
private int nullable;
private boolean readOnly;
private boolean searchable;
private boolean signed;
private boolean writable;
protected ColumnMetadata() {
}
/**
* @return
*/
public boolean isAutoIncrement() {
return autoIncrement;
}
/**
* @return
*/
public boolean isCaseSensitive() {
return caseSensitive;
}
/**
* @return
*/
public String getCatalogName() {
return catalogName;
}
/**
* @return
*/
public String getClassName() {
return className;
}
/**
* @return
*/
public boolean isCurrency() {
return currency;
}
/**
* @return
*/
public boolean isDefinitelyWritable() {
return definitelyWritable;
}
/**
* @return
*/
public int getDisplaySize() {
return displaySize;
}
/**
* @return
*/
public String getLabel() {
return label;
}
/**
* @return
*/
public String getName() {
return name;
}
/**
* @return
*/
public int getNullable() {
return nullable;
}
/**
* @return
*/
public int getPrecision() {
return precision;
}
/**
* @return
*/
public boolean isReadOnly() {
return readOnly;
}
/**
* @return
*/
public int getScale() {
return scale;
}
/**
* @return
*/
public String getSchemaName() {
return schemaName;
}
/**
* @return
*/
public boolean isSearchable() {
return searchable;
}
/**
* @return
*/
public boolean isSigned() {
return signed;
}
/**
* @return
*/
public String getTableName() {
return tableName;
}
/**
* @return
*/
public int getType() {
return type;
}
/**
* @return
*/
public String getTypeName() {
return typeName;
}
/**
* @return
*/
public boolean isWritable() {
return writable;
}
/**
* @param b
*/
protected void setAutoIncrement( boolean b ) {
autoIncrement = b;
}
/**
* @param b
*/
protected void setCaseSensitive( boolean b ) {
caseSensitive = b;
}
/**
* @param string
*/
protected void setCatalogName( String string ) {
catalogName = string;
}
/**
* @param string
*/
protected void setClassName( String string ) {
className = string;
}
/**
* @param b
*/
protected void setCurrency( boolean b ) {
currency = b;
}
/**
* @param b
*/
protected void setDefinitelyWritable( boolean b ) {
definitelyWritable = b;
}
/**
* @param i
*/
protected void setDisplaySize( int i ) {
displaySize = i;
}
/**
* @param string
*/
protected void setLabel( String string ) {
label = string;
}
/**
* @param string
*/
protected void setName( String string ) {
name = string;
}
/**
* @param i
*/
protected void setNullable( int i ) {
nullable = i;
}
/**
* @param i
*/
protected void setPrecision( int i ) {
precision = i;
}
/**
* @param b
*/
protected void setReadOnly( boolean b ) {
readOnly = b;
}
/**
* @param i
*/
protected void setScale( int i ) {
scale = i;
}
/**
* @param string
*/
protected void setSchemaName( String string ) {
schemaName = string;
}
/**
* @param b
*/
protected void setSearchable( boolean b ) {
searchable = b;
}
/**
* @param b
*/
protected void setSigned( boolean b ) {
signed = b;
}
/**
* @param string
*/
protected void setTableName( String string ) {
tableName = string;
}
/**
* @param i
*/
protected void setType( int i ) {
type = i;
}
/**
* @param string
*/
protected void setTypeName( String string ) {
typeName = string;
}
/**
* @param b
*/
protected void setWritable( boolean b ) {
writable = b;
}
}
private List columnMetadata;
/**
* Construct an instance of ResultsMetadata.
*/
protected ResultsMetadata() {
super();
this.columnMetadata = new ArrayList();
}
protected void set( final ResultSetMetaData rsMetadata ) throws SQLException {
final int numColumns = rsMetadata.getColumnCount();
for (int i = 1; i <= numColumns; ++i) {
final ColumnMetadata m = new ColumnMetadata();
m.setCatalogName(rsMetadata.getCatalogName(i));
m.setClassName(rsMetadata.getColumnClassName(i));
m.setDisplaySize(rsMetadata.getColumnDisplaySize(i));
m.setLabel(rsMetadata.getColumnLabel(i));
m.setName(rsMetadata.getColumnName(i));
m.setNullable(rsMetadata.isNullable(i));
m.setPrecision(rsMetadata.getPrecision(i));
m.setScale(rsMetadata.getScale(i));
m.setSchemaName(rsMetadata.getSchemaName(i));
m.setTableName(rsMetadata.getTableName(i));
m.setType(rsMetadata.getColumnType(i));
m.setAutoIncrement(rsMetadata.isAutoIncrement(i));
m.setCaseSensitive(rsMetadata.isCaseSensitive(i));
m.setCurrency(rsMetadata.isCurrency(i));
m.setDefinitelyWritable(rsMetadata.isDefinitelyWritable(i));
m.setReadOnly(rsMetadata.isReadOnly(i));
m.setSearchable(rsMetadata.isSearchable(i));
m.setSigned(rsMetadata.isSigned(i));
m.setWritable(rsMetadata.isWritable(i));
this.columnMetadata.add(m);
}
this.columnMetadata = Collections.unmodifiableList(this.columnMetadata);
}
protected void set( final String catalogName,
final String schemaName,
final String tableName,
final Object objectValue ) {
final int length = objectValue.toString().length();
final ColumnMetadata m = new ColumnMetadata();
m.setCatalogName(catalogName);
m.setClassName(objectValue.getClass().getName());
m.setDisplaySize(length);
m.setLabel(""); //$NON-NLS-1$
m.setName(m.getLabel());
m.setNullable(NOT_NULLABLE);
m.setPrecision(length);
m.setScale(0);
m.setSchemaName(schemaName);
m.setTableName(tableName);
m.setAutoIncrement(false);
m.setCaseSensitive(false);
m.setCurrency(false);
m.setDefinitelyWritable(false);
m.setReadOnly(true);
m.setSearchable(false);
m.setSigned(false);
m.setWritable(false);
if (objectValue instanceof Integer) {
m.setType(Types.INTEGER);
} else if (objectValue instanceof Long) {
m.setType(Types.NUMERIC);
} else if (objectValue instanceof Short) {
m.setType(Types.SMALLINT);
} else if (objectValue instanceof Double) {
m.setType(Types.DOUBLE);
} else if (objectValue instanceof Float) {
m.setType(Types.FLOAT);
} else if (objectValue instanceof Boolean) {
m.setType(Types.BIT);
} else if (objectValue instanceof String) {
m.setType(Types.VARCHAR);
} else {
m.setType(Types.VARCHAR);
}
this.columnMetadata.add(columnMetadata);
this.columnMetadata = Collections.unmodifiableList(this.columnMetadata);
}
public List getColumnMetadata() {
return this.columnMetadata;
}
public ColumnMetadata getColumnMetadata( int columnIndex ) {
return (ColumnMetadata)this.columnMetadata.get(columnIndex);
}
public static ResultsMetadata create( final ResultSetMetaData rsMetadata ) throws SQLException {
final ResultsMetadata metadata = new ResultsMetadata();
metadata.set(rsMetadata);
return metadata;
}
public static ResultsMetadata create( final String catalogName,
final String schemaName,
final String tableName,
final Object objectValue ) {
final ResultsMetadata metadata = new ResultsMetadata();
metadata.set(catalogName, schemaName, tableName, objectValue);
return metadata;
}
}