diff --git a/org.talend.commons.runtime/src/messages.properties b/org.talend.commons.runtime/src/messages.properties index 3b09e5bbf2..c987fa7d76 100644 --- a/org.talend.commons.runtime/src/messages.properties +++ b/org.talend.commons.runtime/src/messages.properties @@ -8,6 +8,8 @@ DB2ForZosResultSet.unknowCloumn=Invalid argument\: unknown column name SybaseResultSet.outofRange=\ is out of range. SybaseResultSet.parameterIndex=Invalid argument\: parameter index SybaseResultSet.unknowCloumn=Invalid argument\: unknown column name +AbstractFakeResultSet.unknowCloumn=Invalid argument\: {0} is unknown column name +AbstractFakeResultSet.parameterIndexOutOfRange=Invalid argument\: parameter index {0} is out of range EntryLocation.returnTableName={tableName={0}, columnName={1}} ExceptionHandler.Parameter.BeNull=ex param cannot be null ExtensionImplementationProviders.ExtensionPointError=Extension point must authoriez a single instance diff --git a/org.talend.commons.runtime/src/org/talend/commons/utils/database/AbstractFakeDatabaseMetaData.java b/org.talend.commons.runtime/src/org/talend/commons/utils/database/AbstractFakeDatabaseMetaData.java new file mode 100644 index 0000000000..c7f75592f4 --- /dev/null +++ b/org.talend.commons.runtime/src/org/talend/commons/utils/database/AbstractFakeDatabaseMetaData.java @@ -0,0 +1,54 @@ +// ============================================================================ +// +// Copyright (C) 2006-2012 Talend Inc. - www.talend.com +// +// This source code is available under agreement available at +// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt +// +// You should have received a copy of the agreement +// along with this program; if not, write to Talend SA +// 9 rue Pages 92150 Suresnes, France +// +// ============================================================================ +package org.talend.commons.utils.database; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.talend.fakejdbc.FakeDatabaseMetaData; + +/** + * DOC ggu class global comment. Detailled comment
+ * + * $Id: talend.epf 55206 2011-02-15 17:32:14Z mhirt $ + * + */ +public abstract class AbstractFakeDatabaseMetaData extends FakeDatabaseMetaData { + + protected static final String[] TABLE_META = { "ID", "TABLE_SCHEM", "TABLE_NAME", "TABLE_TYPE", "REMARKS" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + + protected static final String[] COLUMN_META = { "TABLE_NAME", "COLUMN_NAME", "TYPE_NAME", "COLUMN_SIZE", "DECIMAL_DIGITS", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + "NUM_PREC_RADIX", "IS_NULLABLE", "REMARKS", "COLUMN_DEF" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + private Connection connection; + + /** + * + * DOC ggu AbstractFakeDatabaseMetaData constructor comment. + * + * @param connection + */ + public AbstractFakeDatabaseMetaData(Connection connection) { + this.connection = connection; + } + + /* + * (non-Javadoc) + * + * @see org.talend.commons.utils.database.FakeDatabaseMetaData#getConnection() + */ + @Override + public Connection getConnection() throws SQLException { + return connection; + } +} diff --git a/org.talend.commons.runtime/src/org/talend/commons/utils/database/AbstractFakeResultSet.java b/org.talend.commons.runtime/src/org/talend/commons/utils/database/AbstractFakeResultSet.java new file mode 100644 index 0000000000..bc3fa29cea --- /dev/null +++ b/org.talend.commons.runtime/src/org/talend/commons/utils/database/AbstractFakeResultSet.java @@ -0,0 +1,137 @@ +// ============================================================================ +// +// Copyright (C) 2006-2012 Talend Inc. - www.talend.com +// +// This source code is available under agreement available at +// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt +// +// You should have received a copy of the agreement +// along with this program; if not, write to Talend SA +// 9 rue Pages 92150 Suresnes, France +// +// ============================================================================ +package org.talend.commons.utils.database; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import org.talend.commons.i18n.internal.Messages; +import org.talend.commons.utils.TalendDBUtils; +import org.talend.fakejdbc.FakeResultSet; + +/** + * DOC ggu class global comment. Detailled comment
+ * + * $Id: talend.epf 55206 2011-02-15 17:32:14Z mhirt $ + * + */ +public abstract class AbstractFakeResultSet extends FakeResultSet { + + private String[] tableMeta = new String[0]; + + private List data = new ArrayList();; + + int index = -1; + + public AbstractFakeResultSet() { + super(); + } + + public void setMetadata(String[] tableMeta) { + this.tableMeta = tableMeta; + + } + + public void setData(List data) { + this.data = data; + } + + /* + * (non-Javadoc) + * + * @see org.talend.commons.utils.database.FakeResultSet#next() + */ + @Override + public boolean next() throws SQLException { + if (data == null || data.size() == 0 || index >= data.size() - 1) { + return false; + } + index++; + return true; + } + + protected int indexOf(String string, String[] search) { + for (int i = 0; i < search.length; i++) { + if (search[i].equals(string)) { + return i; + } + } + return -1; + } + + /* + * (non-Javadoc) + * + * @see org.talend.commons.utils.database.FakeResultSet#getString(java.lang.String) + */ + @Override + public String getString(String columnLabel) throws SQLException { + int columnIndex = indexOf(columnLabel, tableMeta); + + if (columnIndex == -1) { + throw new SQLException(Messages.getString("AbstractFakeResultSet.unknowCloumn", columnLabel)); //$NON-NLS-1$ + } + + return getString(columnIndex + 1); + } + + /* + * (non-Javadoc) + * + * @see org.talend.commons.utils.database.FakeResultSet#getInt(java.lang.String) + */ + @Override + public int getInt(String columnLabel) throws SQLException { + String str = getString(columnLabel); + if (columnLabel.equals("TYPE_NAME")) { + int index = TalendDBUtils.convertToJDBCType(str); + return index; + } else if (columnLabel.equals("IS_NULLABLE")) { + if (str.equals("N")) { + return 1; + } else { + return 0; + } + } else { + return Integer.parseInt(str); + } + } + + /* + * (non-Javadoc) + * + * @see org.talend.commons.utils.database.FakeResultSet#getBoolean(java.lang.String) + */ + @Override + public boolean getBoolean(String columnLabel) throws SQLException { + String str = getString(columnLabel); + return Boolean.parseBoolean(str); + } + + /* + * (non-Javadoc) + * + * @see org.talend.commons.utils.database.FakeResultSet#getString(int) + */ + @Override + public String getString(int columnIndex) throws SQLException { + String[] row = data.get(index); + columnIndex--; + + if (columnIndex < 0 || columnIndex > row.length) { + throw new SQLException(Messages.getString("AbstractFakeResultSet.parameterIndexOutOfRange", columnIndex)); //$NON-NLS-1$ + } + return row[columnIndex]; + } +} diff --git a/org.talend.commons.runtime/src/org/talend/commons/utils/database/EmbeddedHiveResultSet.java b/org.talend.commons.runtime/src/org/talend/commons/utils/database/EmbeddedHiveResultSet.java new file mode 100644 index 0000000000..d711745e2a --- /dev/null +++ b/org.talend.commons.runtime/src/org/talend/commons/utils/database/EmbeddedHiveResultSet.java @@ -0,0 +1,66 @@ +// ============================================================================ +// +// Copyright (C) 2006-2012 Talend Inc. - www.talend.com +// +// This source code is available under agreement available at +// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt +// +// You should have received a copy of the agreement +// along with this program; if not, write to Talend SA +// 9 rue Pages 92150 Suresnes, France +// +// ============================================================================ +package org.talend.commons.utils.database; + +import java.sql.SQLException; +import java.sql.Types; + +/** + * DOC ggu class global comment. Detailled comment
+ * + * $Id: talend.epf 55206 2011-02-15 17:32:14Z mhirt $ + * + */ +public class EmbeddedHiveResultSet extends AbstractFakeResultSet { + + /** + * DOC ggu EmbeddedHiveResultSet constructor comment. + */ + public EmbeddedHiveResultSet() { + super(); + } + + /* + * (non-Javadoc) + * + * @see org.talend.commons.utils.database.AbstractFakeResultSet#getInt(java.lang.String) + */ + @Override + public int getInt(String columnLabel) throws SQLException { + if ("DATA_TYPE".equals(columnLabel)) { + String sqlType = getString("TYPE_NAME"); + if (sqlType.trim().equalsIgnoreCase("TINYINT") || sqlType.trim().equalsIgnoreCase("SMALLINT")) { //$NON-NLS-1$ + return Types.SMALLINT; + } else if (sqlType.trim().equalsIgnoreCase("INT")) { //$NON-NLS-1$ + return Types.INTEGER; + } else if (sqlType.trim().equalsIgnoreCase("BIGINT")) { //$NON-NLS-1$ + return Types.BIGINT; + } else if (sqlType.trim().equalsIgnoreCase("BOOLEAN")) { //$NON-NLS-1$ + return Types.BOOLEAN; + } else if (sqlType.trim().equalsIgnoreCase("FLOAT")) { //$NON-NLS-1$ + return Types.FLOAT; + } else if (sqlType.trim().equalsIgnoreCase("DOUBLE")) { //$NON-NLS-1$ + return Types.DOUBLE; + } else if (sqlType.trim().equalsIgnoreCase("STRING")) { //$NON-NLS-1$ + return Types.VARCHAR; + } else if (sqlType.trim().equalsIgnoreCase("BINARY")) { //$NON-NLS-1$ + return Types.BINARY; + } else if (sqlType.trim().equalsIgnoreCase("TIMESTAMP")) { //$NON-NLS-1$ + return Types.TIMESTAMP; + } + } + // TODO Auto-generated method stub + return super.getInt(columnLabel); + } + +} diff --git a/org.talend.commons.runtime/src/org/talend/commons/utils/database/HiveDatabaseMetaData.java b/org.talend.commons.runtime/src/org/talend/commons/utils/database/HiveDatabaseMetaData.java new file mode 100644 index 0000000000..9b000e36dc --- /dev/null +++ b/org.talend.commons.runtime/src/org/talend/commons/utils/database/HiveDatabaseMetaData.java @@ -0,0 +1,42 @@ +// ============================================================================ +// +// Copyright (C) 2006-2012 Talend Inc. - www.talend.com +// +// This source code is available under agreement available at +// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt +// +// You should have received a copy of the agreement +// along with this program; if not, write to Talend SA +// 9 rue Pages 92150 Suresnes, France +// +// ============================================================================ +package org.talend.commons.utils.database; + +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.talend.fakejdbc.FakeDatabaseMetaData; + +/** + * + * Created by Marvin Wang on Nov 29, 2012. + */ +public class HiveDatabaseMetaData extends FakeDatabaseMetaData { + + private Connection connection; + + private DatabaseMetaData metaData; + + public HiveDatabaseMetaData(Connection connection) throws SQLException { + this.connection = connection; + metaData = connection.getMetaData(); + } + + @Override + public ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException { + return this.metaData.getTables(catalog, schemaPattern, tableNamePattern, types); + } + +} diff --git a/org.talend.core.runtime/src/main/java/org/talend/core/database/conn/HiveConfKeysForTalend.java b/org.talend.core.runtime/src/main/java/org/talend/core/database/conn/HiveConfKeysForTalend.java index 5cd4d93568..38ed566b07 100644 --- a/org.talend.core.runtime/src/main/java/org/talend/core/database/conn/HiveConfKeysForTalend.java +++ b/org.talend.core.runtime/src/main/java/org/talend/core/database/conn/HiveConfKeysForTalend.java @@ -40,7 +40,10 @@ public enum HiveConfKeysForTalend { HIVE_CONF_KEY_HIVE_METASTORE_URI("hive.metastore.uris"), //$NON-NLS-1$ - HIVE_CONF_KEY_HIVE_METASTORE_EXECUTE_SETUGI("hive.metastore.execute.setugi"); //$NON-NLS-1$ + HIVE_CONF_KEY_HIVE_METASTORE_EXECUTE_SETUGI("hive.metastore.execute.setugi"), //$NON-NLS-1$ + + HIVE_CONF_KEY_TALEND_HIVE_MODE("talend.hive.mode"), //$NON-NLS-1$ + ; private String key; diff --git a/org.talend.metadata.managment.ui/src/main/java/org/talend/repository/ui/utils/ManagerConnection.java b/org.talend.metadata.managment.ui/src/main/java/org/talend/repository/ui/utils/ManagerConnection.java index 108b57b5fa..97a722755a 100644 --- a/org.talend.metadata.managment.ui/src/main/java/org/talend/repository/ui/utils/ManagerConnection.java +++ b/org.talend.metadata.managment.ui/src/main/java/org/talend/repository/ui/utils/ManagerConnection.java @@ -168,6 +168,7 @@ public class ManagerConnection { } catch (Exception e) { isValide = false; messageException = e.getMessage(); + ExceptionHandler.process(e); } return isValide; } @@ -182,6 +183,9 @@ public class ManagerConnection { private List fetchJarRequiredByMetastoreDB(IMetadataConnection metadataConn) { String jars = (String) metadataConn.getParameter(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_DRIVER_JAR); List requiredJars = new ArrayList(); + if (jars == null) { + return requiredJars; + } if (jars.contains(";")) { //$NON-NLS-1$ String[] splittedPath = jars.split(";"); //$NON-NLS-1$ for (String jarName : splittedPath) { diff --git a/org.talend.metadata.managment/src/main/java/org/talend/core/model/metadata/DBConnectionFillerImpl.java b/org.talend.metadata.managment/src/main/java/org/talend/core/model/metadata/DBConnectionFillerImpl.java index 98698ae5eb..3459d54e2e 100644 --- a/org.talend.metadata.managment/src/main/java/org/talend/core/model/metadata/DBConnectionFillerImpl.java +++ b/org.talend.metadata.managment/src/main/java/org/talend/core/model/metadata/DBConnectionFillerImpl.java @@ -48,6 +48,7 @@ import org.talend.core.model.metadata.builder.database.ExtractMetaDataFromDataBa import org.talend.core.model.metadata.builder.database.ExtractMetaDataFromDataBase.ETableTypes; import org.talend.core.model.metadata.builder.database.ExtractMetaDataUtils; import org.talend.core.model.metadata.builder.database.TableInfoParameters; +import org.talend.core.model.metadata.builder.database.hive.EmbeddedHiveDataBaseMetadata; import org.talend.core.model.metadata.builder.util.DatabaseConstant; import org.talend.core.model.metadata.builder.util.MetadataConnectionUtils; import org.talend.core.repository.model.ProxyRepositoryFactory; @@ -1342,7 +1343,8 @@ public class DBConnectionFillerImpl extends MetadataFillerImpl { // Null able int nullable = 0; - if (dbJDBCMetadata instanceof DB2ForZosDataBaseMetadata || dbJDBCMetadata instanceof TeradataDataBaseMetadata) { + if (dbJDBCMetadata instanceof DB2ForZosDataBaseMetadata || dbJDBCMetadata instanceof TeradataDataBaseMetadata + || dbJDBCMetadata instanceof EmbeddedHiveDataBaseMetadata) { String isNullable = columns.getString("IS_NULLABLE");//$NON-NLS-1$ if (!isNullable.equals("Y")) { //$NON-NLS-1$ nullable = 1; diff --git a/org.talend.metadata.managment/src/main/java/org/talend/core/model/metadata/builder/database/ExtractMetaDataUtils.java b/org.talend.metadata.managment/src/main/java/org/talend/core/model/metadata/builder/database/ExtractMetaDataUtils.java index ecfc0dd0c6..bffe996c4b 100644 --- a/org.talend.metadata.managment/src/main/java/org/talend/core/model/metadata/builder/database/ExtractMetaDataUtils.java +++ b/org.talend.metadata.managment/src/main/java/org/talend/core/model/metadata/builder/database/ExtractMetaDataUtils.java @@ -53,6 +53,7 @@ import org.talend.core.IManagementService; import org.talend.core.IService; import org.talend.core.database.EDatabase4DriverClassName; import org.talend.core.database.EDatabaseTypeName; +import org.talend.core.database.conn.HiveConfKeysForTalend; import org.talend.core.database.conn.template.EDatabaseConnTemplate; import org.talend.core.database.conn.version.EDatabaseVersion4Drivers; import org.talend.core.model.general.Project; @@ -61,6 +62,7 @@ import org.talend.core.model.metadata.MetadataConnection; import org.talend.core.model.metadata.builder.ConvertionHelper; import org.talend.core.model.metadata.builder.connection.DatabaseConnection; import org.talend.core.model.metadata.builder.connection.MetadataColumn; +import org.talend.core.model.metadata.builder.database.hive.EmbeddedHiveDataBaseMetadata; import org.talend.core.model.metadata.builder.util.MetadataConnectionUtils; import org.talend.core.model.metadata.types.JavaTypesManager; import org.talend.core.prefs.ITalendCorePrefConstants; @@ -172,6 +174,10 @@ public class ExtractMetaDataUtils { DatabaseMetaData dbMetaData = null; if (conn != null) { try { + // FIXME, maybe, it's not good way, need check later. + final boolean isHiveEmbedded = Boolean.parseBoolean(System + .getProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_TALEND_HIVE_MODE.getKey())); + // MOD sizhaoliu 2012-5-21 TDQ-4884 if (MSSQL_CONN_CLASS.equals(conn.getClass().getName())) { dbMetaData = createJtdsDatabaseMetaData(conn); @@ -187,6 +193,8 @@ public class ExtractMetaDataUtils { } else if (EDatabaseTypeName.SYBASEASE.getDisplayName().equals(dbType) || SYBASE_DATABASE_PRODUCT_NAME.equals(dbType)) { dbMetaData = createSybaseFakeDatabaseMetaData(conn); + } else if (EDatabaseTypeName.HIVE.getDisplayName().equals(dbType) && isHiveEmbedded) { + dbMetaData = new EmbeddedHiveDataBaseMetadata(conn); } else { dbMetaData = conn.getMetaData(); } @@ -202,12 +210,17 @@ public class ExtractMetaDataUtils { } public static boolean needFakeDatabaseMetaData(String dbType, boolean isSqlMode) { + // FIXME, maybe, it's not good way, need check later. + final boolean isHiveEmbedded = Boolean.parseBoolean(System + .getProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_TALEND_HIVE_MODE.getKey())); if (EDatabaseTypeName.IBMDB2ZOS.getXmlName().equals(dbType)) { return true; } else if (EDatabaseTypeName.TERADATA.getXmlName().equals(dbType) && isSqlMode) { return true; } else if (EDatabaseTypeName.SAS.getXmlName().equals(dbType)) { return true; + } else if (EDatabaseTypeName.HIVE.getDisplayName().equals(dbType) && isHiveEmbedded) { + return true; } return false; } diff --git a/org.talend.metadata.managment/src/main/java/org/talend/core/model/metadata/builder/database/JavaSqlFactory.java b/org.talend.metadata.managment/src/main/java/org/talend/core/model/metadata/builder/database/JavaSqlFactory.java index b5ccc51aca..7dffd8773e 100644 --- a/org.talend.metadata.managment/src/main/java/org/talend/core/model/metadata/builder/database/JavaSqlFactory.java +++ b/org.talend.metadata.managment/src/main/java/org/talend/core/model/metadata/builder/database/JavaSqlFactory.java @@ -29,6 +29,7 @@ import org.talend.core.model.metadata.builder.connection.MDMConnection; import org.talend.core.model.metadata.builder.database.dburl.SupportDBUrlStore; import org.talend.core.model.metadata.builder.database.dburl.SupportDBUrlType; import org.talend.core.model.metadata.builder.util.MetadataConnectionUtils; +import org.talend.core.model.metadata.connection.hive.HiveConnVersionInfo; import org.talend.core.runtime.CoreRuntimePlugin; import org.talend.cwm.helper.ConnectionHelper; import org.talend.cwm.helper.SwitchHelpers; @@ -353,8 +354,8 @@ public final class JavaSqlFactory { } /** - * Just for hive pre-setup, some configurations are required to set up to the properties of system. Added by Marvin - * Wang on Nov 22, 2012.(Just a reminder: TDQ-6462) + * Just for hive pre-setup, some configurations are required to set up to the properties of system. It is just for + * Hive embedded mode.Added by Marvin Wang on Nov 22, 2012.(Just a reminder: TDQ-6462) * * @param conn */ @@ -363,11 +364,11 @@ public final class JavaSqlFactory { DatabaseConnection dbConn = (DatabaseConnection) conn; // TODO with thrift way, we must enable the two parameters below whereas in JDBC way, we don't need it. // If metastore is local or not. - // System.setProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_HIVE_METASTORE_LOCAL.getKey(), "false"); //$NON-NLS-1$ + System.setProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_HIVE_METASTORE_LOCAL.getKey(), "false"); //$NON-NLS-1$ // metastore uris - // String thriftURL = "thrift://" + dbConn.getServerName() + ":" + dbConn.getPort(); //$NON-NLS-1$//$NON-NLS-2$ - // System.setProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_HIVE_METASTORE_URI.getKey(), thriftURL); + String thriftURL = "thrift://" + dbConn.getServerName() + ":" + dbConn.getPort(); //$NON-NLS-1$//$NON-NLS-2$ + System.setProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_HIVE_METASTORE_URI.getKey(), thriftURL); System.setProperty("hive.metastore.warehouse.dir", "/user/hive/warehouse"); //$NON-NLS-1$ //$NON-NLS-2$ // ugi System.setProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_HIVE_METASTORE_EXECUTE_SETUGI.getKey(), "true"); //$NON-NLS-1$ @@ -380,19 +381,27 @@ public final class JavaSqlFactory { System.setProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_MAPRED_JOB_TRACKER.getKey(), dbConn.getParameters().get(ConnParameterKeys.CONN_PARA_KEY_JOB_TRACKER_URL)); + // hive mode for talend + String hiveMode = dbConn.getParameters().get(ConnParameterKeys.CONN_PARA_KEY_HIVE_MODE); + if (HiveConnVersionInfo.MODE_EMBEDDED.getKey().equals(hiveMode)) { + System.setProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_TALEND_HIVE_MODE.getKey(), "true"); //$NON-NLS-1$ + } else { + System.setProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_TALEND_HIVE_MODE.getKey(), "false"); //$NON-NLS-1$ + } // For metastore infos. // url - System.setProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_JDO_CONNECTION_URL.getKey(), - dbConn.getParameters().get(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_URL)); - // user name - System.setProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_JDO_CONNECTION_USERNAME.getKey(), - dbConn.getParameters().get(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_USERNAME)); - // password - System.setProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_JDO_CONNECTION_PASSWORD.getKey(), - dbConn.getParameters().get(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_PASSWORD)); - // driver name - System.setProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_JDO_CONNECTION_DRIVERNAME.getKey(), dbConn.getParameters() - .get(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_DRIVER_NAME)); + // System.setProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_JDO_CONNECTION_URL.getKey(), + // dbConn.getParameters().get(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_URL)); + // // user name + // System.setProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_JDO_CONNECTION_USERNAME.getKey(), + // dbConn.getParameters().get(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_USERNAME)); + // // password + // System.setProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_JDO_CONNECTION_PASSWORD.getKey(), + // dbConn.getParameters().get(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_PASSWORD)); + // // driver name + // System.setProperty(HiveConfKeysForTalend.HIVE_CONF_KEY_JDO_CONNECTION_DRIVERNAME.getKey(), + // dbConn.getParameters() + // .get(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_DRIVER_NAME)); } } diff --git a/org.talend.metadata.managment/src/main/java/org/talend/core/model/metadata/builder/database/hive/EmbeddedHiveDataBaseMetadata.java b/org.talend.metadata.managment/src/main/java/org/talend/core/model/metadata/builder/database/hive/EmbeddedHiveDataBaseMetadata.java new file mode 100644 index 0000000000..0e71f493b5 --- /dev/null +++ b/org.talend.metadata.managment/src/main/java/org/talend/core/model/metadata/builder/database/hive/EmbeddedHiveDataBaseMetadata.java @@ -0,0 +1,258 @@ +// ============================================================================ +// +// Copyright (C) 2006-2012 Talend Inc. - www.talend.com +// +// This source code is available under agreement available at +// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt +// +// You should have received a copy of the agreement +// along with this program; if not, write to Talend SA +// 9 rue Pages 92150 Suresnes, France +// +// ============================================================================ +package org.talend.core.model.metadata.builder.database.hive; + +import java.lang.reflect.Method; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import org.talend.commons.utils.database.AbstractFakeDatabaseMetaData; +import org.talend.commons.utils.database.EmbeddedHiveResultSet; +import org.talend.core.database.EDatabaseTypeName; +import org.talend.core.model.metadata.builder.database.HotClassLoader; +import org.talend.core.model.metadata.builder.database.JDBCDriverLoader; +import org.talend.utils.sql.metadata.constants.GetTable; +import org.talend.utils.sql.metadata.constants.MetaDataConstants; + +/** + * DOC ggu class global comment. Detailled comment
+ * + * $Id: talend.epf 55206 2011-02-15 17:32:14Z mhirt $ + * + */ +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class EmbeddedHiveDataBaseMetadata extends AbstractFakeDatabaseMetaData { + + private static final String TABLE_TYPE = "TABLE"; + + private static final String HIVE_SCHEMA_DEFAULT = "default"; + + private Object hiveObject; + + /** + * DOC ggu HiveDataBaseMetadata constructor comment. + */ + public EmbeddedHiveDataBaseMetadata(Connection connection) { + super(connection); + + } + + private void init() throws SQLException { + // System.setProperty("hive.metastore.uris", "thrift://192.168.30.128:9083"); + // System.setProperty("hive.metastore.local", "false"); + if (hiveObject == null) { + JDBCDriverLoader loader = new JDBCDriverLoader(); + HotClassLoader classLoader = loader.getHotClassLoaderFromCache(EDatabaseTypeName.HIVE.getXmlName(), "EMBEDDED"); + + try { + Class calss = Class.forName("org.apache.hadoop.hive.ql.metadata.Hive", true, classLoader); //$NON-NLS-1$ + Method closeCurrentMethod = calss.getDeclaredMethod("closeCurrent"); //$NON-NLS-1$ + closeCurrentMethod.invoke(null); + + Method hiveGetMethod = calss.getDeclaredMethod("get"); //$NON-NLS-1$ + + hiveObject = hiveGetMethod.invoke(null); + } catch (Exception e) { + throw new SQLException(e); + } + } + } + + /* + * (non-Javadoc) + * + * @see org.talend.commons.utils.database.FakeDatabaseMetaData#getSchemas() + */ + @Override + public ResultSet getSchemas() throws SQLException { + return new EmbeddedHiveResultSet(); + } + + @Override + public String getDatabaseProductName() throws SQLException { + // TODO Auto-generated method stub + return EDatabaseTypeName.HIVE.getDisplayName(); + } + + /* + * (non-Javadoc) + * + * @see org.talend.fakejdbc.FakeDatabaseMetaData#getCatalogs() + */ + @Override + public ResultSet getCatalogs() throws SQLException { + EmbeddedHiveResultSet resultSet = new EmbeddedHiveResultSet(); + resultSet.setMetadata(new String[] { MetaDataConstants.TABLE_CAT.name() }); + List list = new ArrayList(); + list.add(new String[] { HIVE_SCHEMA_DEFAULT }); + resultSet.setData(list); + return resultSet; + } + + /* + * (non-Javadoc) + * + * @see org.talend.commons.utils.database.FakeDatabaseMetaData#getPrimaryKeys(java.lang.String, java.lang.String, + * java.lang.String) + */ + @Override + public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException { + return new EmbeddedHiveResultSet(); + } + + /* + * (non-Javadoc) + * + * @see org.talend.commons.utils.database.FakeDatabaseMetaData#getTableTypes() + */ + @Override + public ResultSet getTableTypes() throws SQLException { + + List list = new ArrayList(); + list.add(new String[] { TABLE_TYPE }); + + EmbeddedHiveResultSet tableResultSet = new EmbeddedHiveResultSet(); + tableResultSet.setMetadata(new String[] { GetTable.TABLE_TYPE.name() }); + tableResultSet.setData(list); + + return tableResultSet; + } + + /* + * (non-Javadoc) + * + * @see org.talend.commons.utils.database.FakeDatabaseMetaData#getExportedKeys(java.lang.String, java.lang.String, + * java.lang.String) + */ + @Override + public ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException { + return new EmbeddedHiveResultSet(); + } + + @Override + public boolean supportsSchemasInDataManipulation() throws SQLException { + return false; // FIXME, need check + } + + @Override + public boolean supportsSchemasInTableDefinitions() throws SQLException { + return false; // FIXME, need check + } + + @Override + public boolean supportsSchemasInIndexDefinitions() throws SQLException { + return false; // FIXME, need check + } + + /* + * (non-Javadoc) + * + * @see org.talend.commons.utils.database.FakeDatabaseMetaData#getTables(java.lang.String, java.lang.String, + * java.lang.String, java.lang.String[]) + */ + @Override + public ResultSet getTables(String catalog, String schema, String tableNamePattern, String[] types) throws SQLException { + init(); + + EmbeddedHiveResultSet tableResultSet = new EmbeddedHiveResultSet(); + tableResultSet.setMetadata(TABLE_META); + List list = new ArrayList(); + tableResultSet.setData(list); + + if (hiveObject != null) { // got the hive object + try { + Class hiveClass = hiveObject.getClass(); + Method getAllTablesMethod = hiveClass.getDeclaredMethod("getAllTables");//$NON-NLS-1$ + Object tables = getAllTablesMethod.invoke(hiveObject); + if (tables instanceof List) { + List tableList = (List) tables; + for (String tableName : tableList) { + String[] array = new String[] { "", HIVE_SCHEMA_DEFAULT, tableName, TABLE_TYPE, "" }; + list.add(array); + } + } + } catch (Exception e) { + throw new SQLException(e); + } + + } + return tableResultSet; + } + + /* + * (non-Javadoc) + * + * @see org.talend.commons.utils.database.FakeDatabaseMetaData#getColumns(java.lang.String, java.lang.String, + * java.lang.String, java.lang.String) + */ + + @Override + public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) + throws SQLException { + init(); + + EmbeddedHiveResultSet tableResultSet = new EmbeddedHiveResultSet(); + tableResultSet.setMetadata(COLUMN_META); + List list = new ArrayList(); + tableResultSet.setData(list); + + if (hiveObject != null) { // got the hive object + try { + Class hiveClass = hiveObject.getClass(); + Method getTableMethod = hiveClass.getDeclaredMethod("getTable", String.class);//$NON-NLS-1$ + Object table = getTableMethod.invoke(hiveObject, tableNamePattern); + + if (table != null) { + Class tableClass = table.getClass(); + Method getAllColsMethod = tableClass.getDeclaredMethod("getAllCols");//$NON-NLS-1$ + Object cols = getAllColsMethod.invoke(table); + if (cols instanceof List) { + List colsList = (List) cols; + for (Object colObj : colsList) { + Class fieldSchemaClass = colObj.getClass(); + + // col name + Method getNameMethod = fieldSchemaClass.getDeclaredMethod("getName"); + Object nameObj = getNameMethod.invoke(colObj); + final String colName = nameObj != null ? nameObj.toString() : ""; + + // col type + Method getTypeMethod = fieldSchemaClass.getDeclaredMethod("getType"); + Object typeObj = getTypeMethod.invoke(colObj); + final String coltype = typeObj != null ? typeObj.toString() : ""; + + // col comment + Method getCommentMethod = fieldSchemaClass.getDeclaredMethod("getComment"); + Object commentObj = getCommentMethod.invoke(colObj); + final String colComment = commentObj != null ? commentObj.toString() : ""; + + final int colSize = -1; // FIXME, need check. + final int colPrecision = 0; // FIXME, need check. + final int colRedix = 0; // FIXME, need check. + String[] array = new String[] { tableNamePattern, colName, coltype, String.valueOf(colSize), + String.valueOf(colPrecision), String.valueOf(colRedix), "NO", colComment, "" }; + list.add(array); + } + } + } + + } catch (Exception e) { + throw new SQLException(e); + } + } + return tableResultSet; + } +}