/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.hive.ql.processors;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.conf.HiveVariableSource;
import org.apache.hadoop.hive.conf.SystemVariables;
import org.apache.hadoop.hive.conf.VariableSubstitution;
import org.apache.hadoop.hive.ql.CommandNeedRetryException;
import org.apache.hadoop.hive.ql.metadata.Hive;
import org.apache.hadoop.hive.ql.security.authorization.plugin.HiveOperationType;
import org.apache.hadoop.hive.ql.session.SessionState;
public class ResetProcessor implements CommandProcessor {
@Override
public void init() {
}
private final static String DEFAULT_ARG = "-d";
@Override
public CommandProcessorResponse run(String command) throws CommandNeedRetryException {
return run(SessionState.get(), command);
}
@VisibleForTesting
CommandProcessorResponse run(SessionState ss, String command) throws CommandNeedRetryException {
CommandProcessorResponse authErrResp =
CommandUtil.authorizeCommand(ss, HiveOperationType.RESET, Arrays.asList(command));
if (authErrResp != null) {
// there was an authorization issue
return authErrResp;
}
command = command.trim();
if (StringUtils.isBlank(command)) {
resetOverridesOnly(ss);
return new CommandProcessorResponse(0);
}
String[] parts = command.split("\\s+");
boolean isDefault = false;
List<String> varnames = new ArrayList<>(parts.length);
for (String part : parts) {
if (part.isEmpty()) continue;
if (DEFAULT_ARG.equals(part)) {
isDefault = true;
} else {
varnames.add(part);
}
}
if (varnames.isEmpty()) {
return new CommandProcessorResponse(1, "No variable names specified", "42000");
}
String message = "";
for (String varname : varnames) {
if (isDefault) {
if (!message.isEmpty()) {
message += ", ";
}
message += varname;
resetToDefault(ss, varname);
} else {
resetOverrideOnly(ss, varname);
}
}
return new CommandProcessorResponse(0, isDefault
? Lists.newArrayList("Resetting " + message + " to default values") : null);
}
private static void resetOverridesOnly(SessionState ss) {
if (ss.getOverriddenConfigurations().isEmpty()) return;
HiveConf conf = new HiveConf();
for (String key : ss.getOverriddenConfigurations().keySet()) {
setSessionVariableFromConf(ss, key, conf);
}
ss.getOverriddenConfigurations().clear();
}
private static void resetOverrideOnly(SessionState ss, String varname) {
if (!ss.getOverriddenConfigurations().containsKey(varname)) return;
setSessionVariableFromConf(ss, varname, new HiveConf());
ss.getOverriddenConfigurations().remove(varname);
}
private static void setSessionVariableFromConf(SessionState ss, String varname, HiveConf conf) {
String value = conf.get(varname);
if (value != null) {
SetProcessor.setConf(ss, varname, varname, value, false);
}
}
private static CommandProcessorResponse resetToDefault(SessionState ss, String varname) {
varname = varname.trim();
try {
String nonErrorMessage = null;
if (varname.startsWith(SystemVariables.HIVECONF_PREFIX)){
String propName = varname.substring(SystemVariables.HIVECONF_PREFIX.length());
nonErrorMessage = SetProcessor.setConf(
varname, propName, getConfVar(propName).getDefaultValue(), false);
} else if (varname.startsWith(SystemVariables.METACONF_PREFIX)) {
String propName = varname.substring(SystemVariables.METACONF_PREFIX.length());
HiveConf.ConfVars confVars = getConfVar(propName);
Hive.get(ss.getConf()).setMetaConf(propName, new VariableSubstitution(new HiveVariableSource() {
@Override
public Map<String, String> getHiveVariable() {
return SessionState.get().getHiveVariables();
}
}).substitute(ss.getConf(), confVars.getDefaultValue()));
} else {
String defaultVal = getConfVar(varname).getDefaultValue();
nonErrorMessage = SetProcessor.setConf(varname, varname, defaultVal, true);
if (varname.equals(HiveConf.ConfVars.HIVE_SESSION_HISTORY_ENABLED.toString())) {
SessionState.get().updateHistory(Boolean.parseBoolean(defaultVal), ss);
}
}
return nonErrorMessage == null ? new CommandProcessorResponse(0)
: new CommandProcessorResponse(0, Lists.newArrayList(nonErrorMessage));
} catch (Exception e) {
return new CommandProcessorResponse(1, e.getMessage(), "42000",
e instanceof IllegalArgumentException ? null : e);
}
}
private static HiveConf.ConfVars getConfVar(String propName) {
HiveConf.ConfVars confVars = HiveConf.getConfVars(propName);
if (confVars == null) throw new IllegalArgumentException(propName + " not found");
return confVars;
}
}