blob: e3198397575f4c35b0f3950d4f02fb27851821c8 [file] [log] [blame]
/**
* 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.sqoop.shell;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import org.apache.sqoop.shell.core.Constants;
import org.apache.sqoop.shell.utils.ThrowableDisplayer;
import org.codehaus.groovy.runtime.MethodClosure;
import org.codehaus.groovy.tools.shell.Command;
import org.codehaus.groovy.tools.shell.CommandRegistry;
import org.codehaus.groovy.tools.shell.Groovysh;
import org.codehaus.groovy.tools.shell.IO.Verbosity;
import static org.apache.sqoop.shell.ShellEnvironment.*;
/**
* Main entry point to Sqoop client.
*
* Sqoop shell is implemented on top of Groovy shell.
*/
public final class SqoopShell {
/**
* Location of resource file that can contain few initial commands that will
* be loaded during each client execution.
*/
private static final String RC_FILE = ".sqoop2rc";
/**
* Banner message that is displayed in interactive mode after client start.
*/
/**
* Hash of commands that we want to have in history in all cases.
*/
public final static HashSet<String> commandsToKeep;
static {
commandsToKeep = new HashSet<String>();
commandsToKeep.add("exit");
commandsToKeep.add("history");
}
/**
* Main entry point to the client execution.
*
* @param args Command line arguments
* @throws Exception
*/
public static void main (String[] args) throws Exception {
System.setProperty("groovysh.prompt", Constants.SQOOP_PROMPT);
Groovysh shell = new Groovysh();
// Install our error hook (exception handling)
shell.setErrorHook(new MethodClosure(ThrowableDisplayer.class, "errorHook"));
CommandRegistry registry = shell.getRegistry();
@SuppressWarnings("unchecked")
Iterator<Command> iterator = registry.iterator();
while (iterator.hasNext()) {
Command command = iterator.next();
if (!commandsToKeep.contains(command.getName())) {
iterator.remove();
// remove from "names" set to avoid duplicate error.
registry.remove(command);
}
}
shell.register(new HelpCommand(shell));
shell.register(new SetCommand(shell));
shell.register(new ShowCommand(shell));
shell.register(new CreateCommand(shell));
shell.register(new DeleteCommand(shell));
shell.register(new UpdateCommand(shell));
shell.register(new CloneCommand(shell));
shell.register(new StartCommand(shell));
shell.register(new StopCommand(shell));
shell.register(new StatusCommand(shell));
shell.register(new EnableCommand(shell));
shell.register(new DisableCommand(shell));
shell.register(new GrantCommand(shell));
shell.register(new RevokeCommand(shell));
// Configure shared shell io object
setIo(shell.getIo());
// We're running in batch mode by default
setInteractive(false);
// Let's see if user do have resource file with initial commands that he
// would like to apply.
String homeDir = System.getProperty(Constants.PROP_HOMEDIR);
File rcFile = new File(homeDir, RC_FILE);
if(rcFile.exists()) {
printlnResource(Constants.RES_SQOOP_PROMPT_SHELL_LOADRC, RC_FILE);
interpretFileContent(rcFile, shell);
printlnResource(Constants.RES_SQOOP_PROMPT_SHELL_LOADEDRC);
}
if (args.length == 0) {
// Interactive mode:
getIo().setVerbosity(Verbosity.QUIET);
printlnResource(Constants.RES_SQOOP_SHELL_BANNER);
println();
// Switch to interactive mode
setInteractive(true);
shell.run(args);
} else {
// Batch mode (with a script file):
File script = new File(args[0]);
if (!script.isAbsolute()) {
String userDir = System.getProperty(Constants.PROP_CURDIR);
script = new File(userDir, args[0]);
}
interpretFileContent(script, shell);
}
}
/**
* Interpret file content in given shell.
*
* @param script Script file that should be interpreted
* @param shell Shell where the script should be interpreted
* @throws IOException
*/
private static void interpretFileContent(File script, Groovysh shell) throws IOException {
BufferedReader in = new BufferedReader(new FileReader(script));
String line;
// Iterate over all lines and executed them one by one
while ((line = in.readLine()) != null) {
// Skip comments and empty lines as we don't need to interpret those
if(line.isEmpty() || line.startsWith("#")) {
continue;
}
// Render shell and command to get user perception that it was run as usual
print(shell.renderPrompt());
println(line);
// Manually trigger command line parsing
Object result = shell.execute(line);
if (result == null) {
break;
}
}
}
private SqoopShell() {
// Instantiation of this class is prohibited
}
}