diff --git a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java index af9e198..a69a5c5 100644 --- a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java +++ b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java @@ -1328,6 +1328,10 @@ "Enables type checking for registered Hive configurations"), SEMANTIC_ANALYZER_HOOK("hive.semantic.analyzer.hook", "", ""), + SEMANTIC_ANALYZER_HOOK_CONTEXT("hive.semantic.analyzer.hook.context", + "org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContextImpl", + "hive senmantic analyzer hook context class name. The user defined context should implement \n" + + "interface org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext."), HIVE_AUTHORIZATION_ENABLED("hive.security.authorization.enabled", false, "enable or disable the Hive client authorization"), HIVE_AUTHORIZATION_MANAGER("hive.security.authorization.manager", diff --git a/ql/src/java/org/apache/hadoop/hive/ql/Driver.java b/ql/src/java/org/apache/hadoop/hive/ql/Driver.java index ffb6074..c1e6b8f 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/Driver.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/Driver.java @@ -405,7 +405,9 @@ public int compile(String command, boolean resetTaskIds) { // Do semantic analysis and plan generation if (saHooks != null) { - HiveSemanticAnalyzerHookContext hookCtx = new HiveSemanticAnalyzerHookContextImpl(); + HiveSemanticAnalyzerHookContext hookCtx = + getContext(HiveConf.ConfVars.SEMANTIC_ANALYZER_HOOK_CONTEXT, + HiveSemanticAnalyzerHookContext.class); hookCtx.setConf(conf); hookCtx.setUserName(userName); for (HiveSemanticAnalyzerHook hook : saHooks) { @@ -1210,6 +1212,24 @@ private boolean validateConfVariables() { } } + /** + * Returns the context specified in a configuration variable. + * + * @param ctxConfVar The configuration variable of the context class name. + * @param clazz The super type of the hooks. + * @return a context cast as the type specified in clazz + * @throws Exception + */ + private T getContext(ConfVars ctxConfVar, + Class clazz) throws Exception { + try { + return HookUtils.getContext(conf, ctxConfVar, clazz); + } catch (ClassNotFoundException e) { + console.printError(ctxConfVar.varname + " Class not found:" + e.getMessage()); + throw e; + } + } + public int execute() throws CommandNeedRetryException { PerfLogger perfLogger = PerfLogger.getPerfLogger(); perfLogger.PerfLogBegin(CLASS_NAME, PerfLogger.DRIVER_EXECUTE); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/hooks/HookUtils.java b/ql/src/java/org/apache/hadoop/hive/ql/hooks/HookUtils.java index 3f474f8..1a3900b 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/hooks/HookUtils.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/hooks/HookUtils.java @@ -24,6 +24,7 @@ import org.apache.hadoop.hive.common.JavaUtils; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.conf.HiveConf.ConfVars; +import org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext; public class HookUtils { /** @@ -64,4 +65,25 @@ return hooks; } + /** + * Returns the hookContext specified in a configuration variable. + * + * @param conf Configuration object + * @param ctxConfVar The configuration variable of the hookContext class name. + * @param clazz The super type of the context. + * @return A hookContext cast as the type specified in clazz. + * @throws ClassNotFoundException + * @throws IllegalAccessException + * @throws InstantiationException + */ + public static T getContext(HiveConf conf, + ConfVars ctxConfVar, Class clazz) + throws InstantiationException, IllegalAccessException, ClassNotFoundException { + String className = conf.getVar(ctxConfVar); + T context = (T) Class.forName(className.trim(), true, + JavaUtils.getClassLoader()).newInstance(); + + return context; + } + }