/*
* 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.metadata.impl;
import java.sql.DatabaseMetaData;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.designer.jdbc.JdbcException;
import org.teiid.designer.jdbc.JdbcPlugin;
import org.teiid.designer.jdbc.data.MetadataRequest;
import org.teiid.designer.jdbc.data.Request;
import org.teiid.designer.jdbc.metadata.JdbcCatalog;
import org.teiid.designer.jdbc.metadata.JdbcDatabase;
import org.teiid.designer.jdbc.metadata.JdbcNode;
import org.teiid.designer.jdbc.metadata.JdbcSchema;
import org.teiid.designer.jdbc.metadata.JdbcTable;
import org.teiid.designer.jdbc.metadata.JdbcTableType;
/**
* JdbcTableImpl
*
* @since 8.0
*/
public class JdbcTableImpl extends JdbcNodeImpl implements JdbcTable {
private String remarks;
/**
* Construct an instance of JdbcTableImpl.
*/
public JdbcTableImpl( final JdbcTableType parent,
final String name ) {
super(TABLE, name, parent);
CoreArgCheck.isNotNull(parent);
}
/* (non-Javadoc)
* @See org.teiid.designer.jdbc.metadata.impl.JdbcNodeImpl#computeChildren()
*/
@Override
protected JdbcNode[] computeChildren() {
// There are no children
return null;
}
/* (non-Javadoc)
* @See org.teiid.designer.jdbc.metadata.impl.JdbcNodeImpl#getTypeName()
*/
@Override
public String getTypeName() {
// Return the table type for this table
return getParent().getName();
}
/**
* This method is overridden to specify that JdbcTable instances never have children.
*
* @see org.teiid.designer.jdbc.metadata.JdbcNode#allowsChildren()
*/
@Override
public boolean allowsChildren() {
return false;
}
/**
* Return the default selection mode when the selection mode can't be determined any other way. For example, this method is
* called when the parent selection mode is {@link JdbcNode#PARTIALLY_SELECTED}. This method returns {@link JdbcNode#SELECTED}
* by default, since tables should be included for import whenever there is a question.
*
* @return the default selection mode
*/
@Override
protected int getDefaultSelectionMode() {
return SELECTED;
}
/* (non-Javadoc)
* @See org.teiid.designer.jdbc.metadata.JdbcNode#getFullyQualifiedName()
*/
@Override
public String getFullyQualifiedName() {
final StringBuffer sb = new StringBuffer();
final String prefix = this.getParent().getFullyQualifiedName();
if (prefix.length() != 0) {
sb.append(prefix);
sb.append(getQualifedNameDelimiter());
}
final String unqualName = getUnqualifiedName();
sb.append(unqualName);
return sb.toString(); // empty string
}
/* (non-Javadoc)
* @See org.teiid.designer.jdbc.metadata.JdbcNode#getQualifedNameDelimiter()
*/
@Override
protected String getQualifedNameDelimiter() {
// Informix DB doesn't use a single NIS delimiter. The Catalog delimiter is ":" while the table delimiter is a "."
// We're checking specifically for INFORMIX and overriding for table only
try {
String productName = this.getJdbcDatabase().getDatabaseInfo().getProductName();
if( productName.toUpperCase().indexOf(INFORMIX) > -1) {
return DEFAULT_QUALIFIED_NAME_DELIMITER;
}
} catch (JdbcException e) {
JdbcPlugin.Util.log(e); // not expected, but log just in case
}
return super.getQualifedNameDelimiter();
}
/* (non-Javadoc)
* @See org.teiid.designer.jdbc.metadata.JdbcNode#getPathInSource()
*/
@Override
public IPath getPathInSource() {
return getPathInSource(true, true);
}
/* (non-Javadoc)
* @See org.teiid.designer.jdbc.metadata.JdbcNode#getPathInSource(boolean, boolean)
*/
@Override
public IPath getPathInSource( final boolean includeCatalog,
final boolean includeSchema ) {
// Go up until we get to the schema, catalog or database that contains this object ...
JdbcNode parent = getParent();
while (true) {
// Stop only if the node type is to be included in the path
if ((parent instanceof JdbcSchema && includeSchema) || (parent instanceof JdbcCatalog && includeCatalog)
|| (parent instanceof JdbcDatabase)) {
break;
}
parent = parent.getParent();
}
// If parent instanceof JdbcDatabase, then the path is just the path with this name ...
if (parent instanceof JdbcDatabase) {
return new Path(getName());
}
// Otherwise, just append the name of this node to that of the parent.
return parent.getPathInSource().append(getName());
}
/* (non-Javadoc)
* @See org.teiid.designer.jdbc.metadata.JdbcNode#getParentDatabaseObject(boolean, boolean)
*/
@Override
public JdbcNode getParentDatabaseObject( final boolean includeCatalog,
final boolean includeSchema ) {
JdbcNode parent = getParent();
while (parent != null) {
// Stop only if the node type is to be included in the path
if ((parent instanceof JdbcSchema && includeSchema) || (parent instanceof JdbcCatalog && includeCatalog)
|| (parent instanceof JdbcDatabase)) {
break;
}
parent = parent.getParent();
}
// If parent instanceof JdbcDatabase, then the path is just the path with this name ...
if (parent != null && parent.isDatabaseObject()) {
return parent;
}
return null;
}
/**
* @return
*/
@Override
public String getRemarks() {
return remarks;
}
/**
* @param string
*/
public void setRemarks( String string ) {
remarks = string;
}
/* (non-Javadoc)
* @See org.teiid.designer.jdbc.metadata.JdbcNode#getJdbcDatabase()
*/
@Override
public JdbcDatabase getJdbcDatabase() {
return getParent().getJdbcDatabase();
}
/* (non-Javadoc)
* @See org.teiid.designer.jdbc.metadata.JdbcNode#refresh()
*/
@Override
public void refresh() {
super.refresh();
// Remove any cached information ...
}
@Override
protected Request[] createRequests() {
DatabaseMetaData metadata = null;
try {
metadata = this.getJdbcDatabase().getDatabaseMetaData();
} catch (JdbcException e) {
JdbcPlugin.Util.log(e);
}
final DatabaseMetaData finalMetadata = metadata;
final String catalogNamePattern = JdbcNodeImpl.getCatalogPattern(this);
final String schemaNamePattern = JdbcNodeImpl.getSchemaPattern(this);
final String tableNamePattern = this.getName();
final String columnNamePattern = WILDCARD_PATTERN;
final Request[] requests = new Request[7]; // 6 requests!
// 1. Create the "Columns" request
requests[0] = new GetColumnsRequest(finalMetadata, catalogNamePattern, schemaNamePattern, tableNamePattern,
columnNamePattern);
// 2. Create the "Indexes" request
final boolean uniqueOnly = getJdbcDatabase().getIncludes().getUniqueIndexesOnly();
final boolean approxAllowed = getJdbcDatabase().getIncludes().getApproximateIndexes();
requests[1] = new GetIndexesRequest(finalMetadata, catalogNamePattern, schemaNamePattern, tableNamePattern, uniqueOnly,
approxAllowed);
// 3. Create the "Primary Key" request
requests[2] = new GetPrimaryKeyRequest(finalMetadata, catalogNamePattern, schemaNamePattern, tableNamePattern);
// 4. Create the "Imported Foreign Key" request
requests[3] = new GetImportedForeignKeysRequest(finalMetadata, catalogNamePattern, schemaNamePattern, tableNamePattern);
// 5. Create the "Exported Foreign Key" request
requests[4] = new GetExportedForeignKeysRequest(finalMetadata, catalogNamePattern, schemaNamePattern, tableNamePattern);
// 6. Create the "Description" request
requests[5] = new GetDescriptionRequest(this, "getRemarks"); //$NON-NLS-1$
// Disable what is not to be loaded ...
if (!this.getJdbcDatabase().getIncludes().includeIndexes()) {
requests[1] = new DisabledRequest((MetadataRequest)requests[1]);
}
if (!this.getJdbcDatabase().getIncludes().includeForeignKeys()) {
requests[3] = new DisabledRequest((MetadataRequest)requests[3]);
requests[4] = new DisabledRequest((MetadataRequest)requests[4]);
}
// 7. Create the "Imported Foreign Key" request
requests[6] = new GetAccessForeignKeysRequest(this.getJdbcDatabase().getConnection(), catalogNamePattern,
schemaNamePattern, tableNamePattern);
// ?? 6. Create the "Preview" request?
// ?? 7. Create the "Preview" request?
return requests;
}
}