Updated Branches: refs/heads/sqoop2 ff8e0500a -> 0d4efda17
http://git-wip-us.apache.org/repos/asf/sqoop/blob/0d4efda1/client/src/main/java/org/apache/sqoop/client/utils/FormDisplayer.java ---------------------------------------------------------------------- diff --git a/client/src/main/java/org/apache/sqoop/client/utils/FormDisplayer.java b/client/src/main/java/org/apache/sqoop/client/utils/FormDisplayer.java deleted file mode 100644 index b044e22..0000000 --- a/client/src/main/java/org/apache/sqoop/client/utils/FormDisplayer.java +++ /dev/null @@ -1,249 +0,0 @@ -/** - * 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.client.utils; - -import org.apache.commons.lang.StringUtils; -import org.apache.sqoop.client.core.Constants; -import org.apache.sqoop.model.MAccountableEntity; -import org.apache.sqoop.model.MBooleanInput; -import org.apache.sqoop.model.MConnection; -import org.apache.sqoop.model.MEnumInput; -import org.apache.sqoop.model.MForm; -import org.apache.sqoop.model.MFramework; -import org.apache.sqoop.model.MInput; -import org.apache.sqoop.model.MInputType; -import org.apache.sqoop.model.MIntegerInput; -import org.apache.sqoop.model.MJob; -import org.apache.sqoop.model.MJobForms; -import org.apache.sqoop.model.MMapInput; -import org.apache.sqoop.model.MStringInput; -import org.apache.sqoop.validation.Status; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.ResourceBundle; - -import static org.apache.sqoop.client.shell.ShellEnvironment.*; - -/** - * Convenience static methods for displaying form related information - */ -public final class FormDisplayer { - - public static void displayFormMetadataDetails(MFramework framework, - ResourceBundle bundle) { - print(" %s: ", resourceString(Constants.RES_FORMDISPLAYER_SUPPORTED_JOBTYPE)); - println(framework.getAllJobsForms().keySet().toString()); - - displayFormsMetadata( - framework.getConnectionForms().getForms(), - resourceString(Constants.RES_FORMDISPLAYER_CONNECTION), - bundle); - - for (MJobForms jobForms : framework.getAllJobsForms().values()) { - print(" %s ", resourceString(Constants.RES_FORMDISPLAYER_FORM_JOBTYPE)); - print(jobForms.getType().name()); - println(":"); - - displayFormsMetadata(jobForms.getForms(), resourceString(Constants.RES_FORMDISPLAYER_JOB), bundle); - } - } - - public static void displayFormsMetadata(List<MForm> forms, - String type, - ResourceBundle bundle) { - Iterator<MForm> fiter = forms.iterator(); - int findx = 1; - while (fiter.hasNext()) { - print(" "); - print(type); - print(" %s ", resourceString(Constants.RES_FORMDISPLAYER_FORM)); - print(findx++); - println(":"); - - MForm form = fiter.next(); - print(" %s: ", resourceString(Constants.RES_FORMDISPLAYER_NAME)); - println(form.getName()); - - // Label - print(" %s: ", resourceString(Constants.RES_FORMDISPLAYER_LABEL)); - println(bundle.getString(form.getLabelKey())); - - // Help text - print(" %s: ", resourceString(Constants.RES_FORMDISPLAYER_HELP)); - println(bundle.getString(form.getHelpKey())); - - List<MInput<?>> inputs = form.getInputs(); - Iterator<MInput<?>> iiter = inputs.iterator(); - int iindx = 1; - while (iiter.hasNext()) { - print(" %s ", resourceString(Constants.RES_FORMDISPLAYER_INPUT)); - print(iindx++); - println(":"); - - MInput<?> input = iiter.next(); - print(" %s: ", resourceString(Constants.RES_FORMDISPLAYER_NAME)); - println(input.getName()); - print(" %s: ", resourceString(Constants.RES_FORMDISPLAYER_LABEL)); - println(bundle.getString(input.getLabelKey())); - print(" %s: ", resourceString(Constants.RES_FORMDISPLAYER_HELP)); - println(bundle.getString(input.getHelpKey())); - print(" %s: ", resourceString(Constants.RES_FORMDISPLAYER_TYPE)); - println(input.getType()); - print(" %s: ", resourceString(Constants.RES_FORMDISPLAYER_SENSITIVE)); - println(input.isSensitive()); - if (input.getType() == MInputType.STRING) { - print(" %s: ", resourceString(Constants.RES_FORMDISPLAYER_SIZE)); - println(((MStringInput)input).getMaxLength()); - } else if(input.getType() == MInputType.ENUM) { - print(" %s: ", resourceString(Constants.RES_FORMDISPLAYER_POSSIBLE_VALUES)); - println(StringUtils.join(((MEnumInput)input).getValues(), ",")); - } - } - } - } - - public static void displayForms(List<MForm> forms, ResourceBundle bundle) { - for(MForm form : forms) { - displayForm(form, bundle); - } - } - - /** - * Method prints the warning message of ACCEPTABLE status - * @param entity - connection or job instance - */ - public static void displayFormWarning(MAccountableEntity entity) { - List<MForm> formList = new ArrayList<MForm>(); - boolean showMessage = true; - if (entity instanceof MConnection) { - MConnection connection = (MConnection) entity; - formList.addAll(connection.getConnectorPart().getForms()); - formList.addAll(connection.getFrameworkPart().getForms()); - } else if(entity instanceof MJob) { - MJob job = (MJob) entity; - formList.addAll(job.getConnectorPart().getForms()); - formList.addAll(job.getFrameworkPart().getForms()); - } - for(MForm form : formList) { - if(form.getValidationStatus() == Status.ACCEPTABLE) { - if(showMessage) { - print("\n@|yellow %s|@\n", resourceString(Constants.RES_FORMDISPLAYER_FORM_WARNING)); - showMessage = false; - } - FormFiller.warningMessage(form.getValidationMessage()); - } - } - } - - private static void displayForm(MForm form, ResourceBundle bundle) { - print(" "); - println(bundle.getString(form.getLabelKey())); - - for (MInput<?> input : form.getInputs()) { - print(" "); - print(bundle.getString(input.getLabelKey())); - print(": "); - if(!input.isEmpty()) { - if (input.isSensitive()) { - print("(%s)", resourceString(Constants.RES_FORMDISPLAYER_INPUT_SENSITIVE)); - } else { - // Based on the input type, let's perform specific load - switch (input.getType()) { - case STRING: - displayInputString((MStringInput) input); - break; - case INTEGER: - displayInputInteger((MIntegerInput) input); - break; - case BOOLEAN: - displayInputBoolean((MBooleanInput) input); - break; - case MAP: - displayInputMap((MMapInput) input); - break; - case ENUM: - displayInputEnum((MEnumInput) input); - break; - default: - print("\n%s " + input.getType(), resourceString(Constants.RES_FORMDISPLAYER_UNSUPPORTED_DATATYPE)); - return; - } - } - } - println(""); - } - } - - /** - * Display content of String input. - * - * @param input String input - */ - private static void displayInputString(MStringInput input) { - print(input.getValue()); - } - - /** - * Display content of Integer input. - * - * @param input Integer input - */ - private static void displayInputInteger(MIntegerInput input) { - print(input.getValue()); - } - - /** - * Display content of Boolean input. - * - * @param input Boolean input - */ - private static void displayInputBoolean(MBooleanInput input) { - print(input.getValue()); - } - - /** - * Display content of Map input - * - * @param input Map input - */ - private static void displayInputMap(MMapInput input) { - for(Map.Entry<String, String> entry : input.getValue().entrySet()) { - println(); - print(" "); - print(entry.getKey()); - print(" = "); - print(entry.getValue()); - } - } - - /** - * Display content of Enum input - * - * @param input Enum input - */ - private static void displayInputEnum(MEnumInput input) { - print(input.getValue()); - } - - private FormDisplayer() { - // Do not instantiate - } -} http://git-wip-us.apache.org/repos/asf/sqoop/blob/0d4efda1/client/src/main/java/org/apache/sqoop/client/utils/FormFiller.java ---------------------------------------------------------------------- diff --git a/client/src/main/java/org/apache/sqoop/client/utils/FormFiller.java b/client/src/main/java/org/apache/sqoop/client/utils/FormFiller.java deleted file mode 100644 index 2fbf129..0000000 --- a/client/src/main/java/org/apache/sqoop/client/utils/FormFiller.java +++ /dev/null @@ -1,566 +0,0 @@ -/** - * 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.client.utils; - -import jline.ConsoleReader; -import org.apache.sqoop.model.MBooleanInput; -import org.apache.sqoop.model.MConnection; -import org.apache.sqoop.model.MEnumInput; -import org.apache.sqoop.model.MForm; -import org.apache.sqoop.model.MInput; -import org.apache.sqoop.model.MIntegerInput; -import org.apache.sqoop.model.MMapInput; -import org.apache.sqoop.model.MJob; -import org.apache.sqoop.model.MStringInput; -import org.apache.sqoop.model.MValidatedElement; - -import java.io.IOException; -import java.util.List; -import java.util.Map; -import java.util.HashMap; -import java.util.ResourceBundle; - -import static org.apache.sqoop.client.shell.ShellEnvironment.*; - -/** - * Convenient methods for retrieving user input. - */ -public final class FormFiller { - - /** - * Internal input that will be reused for loading names for connection and - * job objects. - */ - private static MStringInput nameInput = new MStringInput("object-name", false, (short)25); - - /** - * Fill job object based on user input. - * - * @param reader Associated console reader object - * @param job Job that user is suppose to fill in - * @param connectorBundle Connector resource bundle - * @param frameworkBundle Framework resource bundle - * @return True if we filled all inputs, false if user has stopped processing - * @throws IOException - */ - public static boolean fillJob(ConsoleReader reader, - MJob job, - ResourceBundle connectorBundle, - ResourceBundle frameworkBundle) - throws IOException { - - job.setName(getName(reader, job.getName())); - - // Fill in data from user - return fillForms(reader, - job.getConnectorPart().getForms(), - connectorBundle, - job.getFrameworkPart().getForms(), - frameworkBundle); - } - - /** - * Fill connection object based on user input. - * - * @param reader Associated console reader object - * @param connection Connection that user is suppose to fill in - * @param connectorBundle Connector resource bundle - * @param frameworkBundle Framework resouce bundle - * @return True if we filled all inputs, false if user has stopped processing - * @throws IOException - */ - public static boolean fillConnection(ConsoleReader reader, - MConnection connection, - ResourceBundle connectorBundle, - ResourceBundle frameworkBundle) - throws IOException { - - connection.setName(getName(reader, connection.getName())); - - // Fill in data from user - return fillForms(reader, - connection.getConnectorPart().getForms(), - connectorBundle, - connection.getFrameworkPart().getForms(), - frameworkBundle); - } - - public static boolean fillForms(ConsoleReader reader, - List<MForm> connectorForms, - ResourceBundle connectorBundle, - List<MForm> frameworkForms, - ResourceBundle frameworkBundle - ) throws IOException { - - - // Query connector forms - if(!fillForms(connectorForms, reader, connectorBundle)) { - return false; - } - - // Query framework forms - if(!fillForms(frameworkForms, reader, frameworkBundle)) { - return false; - } - - return true; - } - - public static boolean fillForms(List<MForm> forms, - ConsoleReader reader, - ResourceBundle bundle) - throws IOException { - for (MForm form : forms) { - if(!fillForm(form, reader, bundle)) { - return false; - } - } - - return true; - } - - public static boolean fillForm(MForm form, - ConsoleReader reader, - ResourceBundle bundle) throws IOException { - println(""); - println(bundle.getString(form.getLabelKey())); - - // Print out form validation - printValidationMessage(form); - println(""); - - for (MInput input : form.getInputs()) { - if(!fillInput(input, reader, bundle)) { - return false; - } - } - - return true; - } - - public static boolean fillInput(MInput input, - ConsoleReader reader, - ResourceBundle bundle) throws IOException { - // Print out validation - printValidationMessage(input); - - // Based on the input type, let's perform specific load - switch (input.getType()) { - case STRING: - return fillInputString((MStringInput) input, reader, bundle); - case INTEGER: - return fillInputInteger((MIntegerInput) input, reader, bundle); - case BOOLEAN: - return fillInputBoolean((MBooleanInput) input, reader, bundle); - case MAP: - return fillInputMap((MMapInput) input, reader, bundle); - case ENUM: - return fillInputEnum((MEnumInput) input, reader, bundle); - default: - println("Unsupported data type " + input.getType()); - return true; - } - } - - /** - * Load user input for enum type. - * - * Print out numbered list of all available options and let user choose one - * item from that. - * - * @param input Input that we should read or edit - * @param reader Associated console reader - * @param bundle Resource bundle - * @return True if user with to continue with loading addtional inputs - * @throws IOException - */ - private static boolean fillInputEnum(MEnumInput input, - ConsoleReader reader, - ResourceBundle bundle) - throws IOException { - // Prompt in enum case - println(bundle.getString(input.getLabelKey()) + ": "); - - // Indexes - int i = -1; - int lastChoice = -1; - - // Print out all values as a numbered list - for(String value : input.getValues()) { - i++; - - println(" " + i + " : " + value); - - // Only show last choice if not sensitive - if(!input.isEmpty() && value.equals(input.getValue()) && !input.isSensitive()) { - lastChoice = i; - } - } - - // Prompt - reader.printString("Choose: "); - - // Fill previously filled index when available - if(lastChoice != -1) { - reader.putString(Integer.toString(lastChoice)); - } - - reader.flushConsole(); - String userTyped; - if(input.isSensitive()) { - userTyped = reader.readLine('*'); - } else { - userTyped = reader.readLine(); - } - - if (userTyped == null) { - return false; - } else if (userTyped.isEmpty()) { - input.setEmpty(); - } else { - Integer index; - try { - index = Integer.valueOf(userTyped); - - if(index < 0 || index >= input.getValues().length) { - errorMessage("Invalid index"); - return fillInputEnum(input, reader, bundle); - } - - input.setValue(input.getValues()[index]); - } catch (NumberFormatException ex) { - errorMessage("Input is not valid integer number"); - return fillInputEnum(input, reader, bundle); - } - } - - return true; - } - - /** - * Load user input for map type. - * - * This implementation will load one map entry at the time. Current flows is - * as follows: if user did not enter anything (empty input) finish loading - * and return from function. If user specified input with equal sign (=), - * lets add new key value pair. Otherwise consider entire input as a key name - * and try to remove it from the map. - * - * Please note that following code do not supports equal sign in property - * name. It's however perfectly fine to have equal sign in value. - * - * @param input Input that we should read or edit - * @param reader Associated console reader - * @param bundle Resource bundle - * @return True if user wish to continue with loading additional inputs - * @throws IOException - */ - private static boolean fillInputMap(MMapInput input, - ConsoleReader reader, - ResourceBundle bundle) - throws IOException { - // Special prompt in Map case - println(bundle.getString(input.getLabelKey()) + ": "); - - // Internal loading map - Map<String, String> values = input.getValue(); - if(values == null) { - values = new HashMap<String, String>(); - } - - String userTyped; - - while(true) { - // Print all current items in each iteration - // However do not printout if this input contains sensitive information. - println("There are currently " + values.size() + " values in the map:"); - if (!input.isSensitive()) { - for(Map.Entry<String, String> entry : values.entrySet()) { - println(entry.getKey() + " = " + entry.getValue()); - } - } - - // Special prompt for Map entry - reader.printString("entry# "); - reader.flushConsole(); - - if(input.isSensitive()) { - userTyped = reader.readLine('*'); - } else { - userTyped = reader.readLine(); - } - - if(userTyped == null) { - // Finish loading and return back to Sqoop shell - return false; - } else if(userTyped.isEmpty()) { - // User has finished loading data to Map input, either set input empty - // if there are no entries or propagate entries to the input - if(values.size() == 0) { - input.setEmpty(); - } else { - input.setValue(values); - } - return true; - } else { - // User has specified regular input, let's check if it contains equals - // sign. Save new entry (or update existing one) if it does. Otherwise - // try to remove entry that user specified. - if(userTyped.contains("=")) { - String []keyValue = userTyped.split("=", 2); - values.put(handleUserInput(keyValue[0]), handleUserInput(keyValue[1])); - } else { - String key = handleUserInput(userTyped); - if(values.containsKey(key)) { - values.remove(key); - } else { - errorMessage("Don't know what to do with " + userTyped); - } - } - } - - } - } - - /** - * Handle special cases in user input. - * - * Preserve null and empty values, remove whitespace characters before and - * after loaded string and de-quote the string if it's quoted (to preserve - * spaces for example). - * - * @param input String loaded from user - * @return Unquoted transformed string - */ - private static String handleUserInput(String input) { - // Preserve null and empty values - if(input == null) { - return null; - } - if(input.isEmpty()) { - return input; - } - - // Removes empty characters at the begging and end of loaded string - input = input.trim(); - - int lastIndex = input.length() - 1; - char first = input.charAt(0); - char last = input.charAt(lastIndex); - - // Remove quoting if present - if(first == '\'' && last == '\'') { - input = input.substring(1, lastIndex); - } else if(first == '"' && last == '"') { - input = input.substring(1, lastIndex); - } - - // Return final string - return input; - } - - private static boolean fillInputInteger(MIntegerInput input, - ConsoleReader reader, - ResourceBundle bundle) - throws IOException { - generatePrompt(reader, bundle, input); - - // Fill already filled data when available - // However do not printout if this input contains sensitive information. - if(!input.isEmpty() && !input.isSensitive()) { - reader.putString(input.getValue().toString()); - } - - // Get the data - String userTyped; - if(input.isSensitive()) { - userTyped = reader.readLine('*'); - } else { - userTyped = reader.readLine(); - } - - if (userTyped == null) { - return false; - } else if (userTyped.isEmpty()) { - input.setEmpty(); - } else { - Integer value; - try { - value = Integer.valueOf(userTyped); - input.setValue(value); - } catch (NumberFormatException ex) { - errorMessage("Input is not valid integer number"); - return fillInputInteger(input, reader, bundle); - } - - input.setValue(Integer.valueOf(userTyped)); - } - - return true; - } - - /** - * Load string input from the user. - * - * @param input Input that we should load in - * @param reader Associated console reader - * @param bundle Resource bundle for this input - * @return - * @throws IOException - */ - public static boolean fillInputString(MStringInput input, - ConsoleReader reader, - ResourceBundle bundle) - throws IOException { - generatePrompt(reader, bundle, input); - - // Fill already filled data when available - // However do not printout if this input contains sensitive information. - if(!input.isEmpty() && !input.isSensitive()) { - reader.putString(input.getValue()); - } - - // Get the data - String userTyped; - if(input.isSensitive()) { - userTyped = reader.readLine('*'); - } else { - userTyped = reader.readLine(); - } - - if (userTyped == null) { - // Propagate end of loading process - return false; - } else if (userTyped.isEmpty()) { - // Empty input in case that nothing was given - input.setEmpty(); - } else { - // Set value that user has entered - input.setValue(userTyped); - - // Check that it did not exceeds maximal allowance for given input - if(userTyped.length() > input.getMaxLength()) { - errorMessage("Size of input exceeds allowance for this input" - + " field. Maximal allowed size is " + input.getMaxLength()); - return fillInputString(input, reader, bundle); - } - } - - return true; - } - - /** - * Load boolean input from the user. - * - * @param input Input that we should load in - * @param reader Associated console reader - * @param bundle Resource bundle for this input - * @return - * @throws IOException - */ - public static boolean fillInputBoolean(MBooleanInput input, - ConsoleReader reader, - ResourceBundle bundle) - throws IOException { - generatePrompt(reader, bundle, input); - - // Fill already filled data when available - // However do not printout if this input contains sensitive information. - if(!input.isEmpty() && !input.isSensitive()) { - reader.putString(input.getValue().toString()); - } - - // Get the data - String userTyped; - if(input.isSensitive()) { - userTyped = reader.readLine('*'); - } else { - userTyped = reader.readLine(); - } - - if (userTyped == null) { - // Propagate end of loading process - return false; - } else if (userTyped.isEmpty()) { - // Empty input in case that nothing was given - input.setEmpty(); - } else { - // Set value that user has entered - input.setValue(Boolean.valueOf(userTyped)); - } - - return true; - } - - public static void generatePrompt(ConsoleReader reader, - ResourceBundle bundle, - MInput input) - throws IOException { - reader.printString(bundle.getString(input.getLabelKey()) + ": "); - reader.flushConsole(); - } - - public static String getName(ConsoleReader reader, - String name) throws IOException { - if(name == null) { - nameInput.setEmpty(); - } else { - nameInput.setValue(name); - } - - fillInputString(nameInput, reader, getResourceBundle()); - - return nameInput.getValue(); - } - - /** - * Print validation message in cases that it's not in state "FINE" - * - * @param element Validated element - */ - public static void printValidationMessage(MValidatedElement element) { - switch (element.getValidationStatus()) { - case UNACCEPTABLE: - errorMessage(element.getValidationMessage()); - break; - case ACCEPTABLE: - warningMessage(element.getValidationMessage()); - break; - default: - // Simply ignore all other states for the moment - break; - } - } - - public static void errorMessage(String message) { - println("Error message: @|red " + message + " |@"); - } - - public static void warningMessage(String message) { - println("Warning message: @|yellow " + message + " |@"); - } - - public static void errorIntroduction() { - println(); - println("@|red There are issues with entered data, please revise your input:|@"); - } - - private FormFiller() { - // Do not instantiate - } -} http://git-wip-us.apache.org/repos/asf/sqoop/blob/0d4efda1/client/src/main/java/org/apache/sqoop/client/utils/SubmissionDisplayer.java ---------------------------------------------------------------------- diff --git a/client/src/main/java/org/apache/sqoop/client/utils/SubmissionDisplayer.java b/client/src/main/java/org/apache/sqoop/client/utils/SubmissionDisplayer.java deleted file mode 100644 index cbc956d..0000000 --- a/client/src/main/java/org/apache/sqoop/client/utils/SubmissionDisplayer.java +++ /dev/null @@ -1,148 +0,0 @@ -/** - * 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.client.utils; - -import org.apache.sqoop.client.core.Constants; -import org.apache.sqoop.model.MSubmission; -import org.apache.sqoop.submission.SubmissionStatus; -import org.apache.sqoop.submission.counter.Counter; -import org.apache.sqoop.submission.counter.CounterGroup; -import org.apache.sqoop.submission.counter.Counters; - -import java.text.SimpleDateFormat; - -import static org.apache.sqoop.client.shell.ShellEnvironment.*; - -/** - * Class used for displaying or printing the submission details - */ -public final class SubmissionDisplayer { - - private final static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); - - /** - * On job submission, displays the initial job info - * @param submission - */ - public static void displayHeader(MSubmission submission) { - println("@|bold "+ resourceString(Constants.RES_SUBMISSION_SUBMISSION_DETAIL) +"|@"); - - print(resourceString(Constants.RES_SUBMISSION_JOB_ID)+": "); - println(submission.getJobId()); - - print(resourceString(Constants.RES_SUBMISSION_SERVER_URL)+": "); - println(getServerUrl()); - - print(resourceString(Constants.RES_SUBMISSION_CREATION_DATE)+": "); - println(dateFormat.format(submission.getCreationDate())); - - String externalId = submission.getExternalId(); - if(externalId != null) { - print(resourceString(Constants.RES_SUBMISSION_EXTERNAL_ID)+": "); - println(externalId); - - String externalLink = submission.getExternalLink(); - if(externalLink != null) { - println("\t" + externalLink); - } - } - - if(isVerbose() && submission.getConnectorSchema() != null) { - print(resourceString(Constants.RES_CONNECTOR_SCHEMA)+": "); - println(submission.getConnectorSchema()); - } - - if(isVerbose() && submission.getHioSchema() != null) { - print(resourceString(Constants.RES_HIO_SCHEMA)+": "); - println(submission.getHioSchema()); - } - } - - /** - * Displays the progress of the executing job - * @param submission - */ - public static void displayProgress(MSubmission submission) { - StringBuilder sb = new StringBuilder(); - if(submission.getStatus().isRunning()) { - sb.append(dateFormat.format(submission.getLastUpdateDate())+": @|green "+submission.getStatus()+ " |@"); - double progress = submission.getProgress(); - sb.append(" - "); - if(progress == -1) { - sb.append(resourceString(Constants.RES_SUBMISSION_PROGRESS_NOT_AVAIL)); - } else { - sb.append(String.format("%.2f %%", progress * 100)); - } - } else { - sb.append(dateFormat.format(submission.getLastUpdateDate())+": "+submission.getStatus()); - } - - println(sb.toString()); - } - - /** - * On successfull or error, method is invoked - * @param submission - */ - public static void displayFooter(MSubmission submission) { - if (submission.getStatus().toString().equals(SubmissionStatus.SUCCEEDED.toString())) { - println(dateFormat.format(submission.getLastUpdateDate())+": @|green "+submission.getStatus()+ " |@"); - Counters counters = submission.getCounters(); - if (counters != null) { - println(resourceString(Constants.RES_SUBMISSION_COUNTERS) + ":"); - for (CounterGroup group : counters) { - print("\t"); - println(group.getName()); - for (Counter counter : group) { - print("\t\t"); - print(counter.getName()); - print(": "); - println(counter.getValue()); - } - } - println(resourceString(Constants.RES_SUBMISSION_EXECUTED_SUCCESS)); - } - } else { - if (submission.getStatus().isFailure()) { - println(dateFormat.format(submission.getLastUpdateDate())+": @|red "+submission.getStatus()+ " |@"); - } else { - println(dateFormat.format(submission.getLastUpdateDate())+": "+submission.getStatus()); - } - // Exception handling - if (submission.getExceptionInfo() != null) { - print("@|red Exception: |@"); - println(submission.getExceptionInfo()); - - if (isVerbose() && submission.getExceptionStackTrace() != null) { - print("@|bold Stack trace: |@"); - println(submission.getExceptionStackTrace()); - } - } - } - } - - public static void displaySubmission(MSubmission submission) { - if(submission.getStatus().isFailure() || submission.getStatus().equals(SubmissionStatus.SUCCEEDED)) { - SubmissionDisplayer.displayHeader(submission); - SubmissionDisplayer.displayFooter(submission); - } else { - SubmissionDisplayer.displayHeader(submission); - SubmissionDisplayer.displayProgress(submission); - } - } -} http://git-wip-us.apache.org/repos/asf/sqoop/blob/0d4efda1/client/src/main/java/org/apache/sqoop/client/utils/TableDisplayer.java ---------------------------------------------------------------------- diff --git a/client/src/main/java/org/apache/sqoop/client/utils/TableDisplayer.java b/client/src/main/java/org/apache/sqoop/client/utils/TableDisplayer.java deleted file mode 100644 index 487fa50..0000000 --- a/client/src/main/java/org/apache/sqoop/client/utils/TableDisplayer.java +++ /dev/null @@ -1,141 +0,0 @@ -/** - * 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.client.utils; - -import org.apache.commons.lang.StringUtils; - -import java.util.LinkedList; -import java.util.List; - -import static org.apache.sqoop.client.shell.ShellEnvironment.*; - -/** - * Display table based data - */ -public class TableDisplayer { - - /** - * Display given columns in nice table structure to given IO object. - * - * @param headers List of headers - * @param columns Array of columns - */ - public static void display(List<String> headers, List<String> ...columns) { - assert headers != null; - assert columns != null; - assert headers.size() == columns.length; - - // Count of columns - int columnCount = headers.size(); - - // List of all maximal widths of each column - List<Integer> widths = new LinkedList<Integer>(); - for(int i = 0; i < columnCount; i++) { - widths.add(getMaximalWidth(headers.get(i), columns[i])); - } - - // First line is border - drawLine(widths); - - // Print out header (text is centralised) - print("| "); - for(int i = 0 ; i < columnCount; i++) { - print(StringUtils.center(headers.get(i), widths.get(i), ' ')); - print((i == columnCount -1) ? " |" : " | "); - } - println(); - - // End up header by border - drawLine(widths); - - // Number of rows in the table - int rows = getMaximalRows(columns); - - // Print out each row - for(int row = 0 ; row < rows; row++) { - print("| "); - for(int i = 0 ; i < columnCount; i++) { - print(StringUtils.rightPad(columns[i].get(row), widths.get(i), ' ')); - print((i == columnCount -1) ? " |" : " | "); - } - println(); - } - - // End table by final border - drawLine(widths); - } - - /** - * Draw border line - * - * @param widths List of widths of each column - */ - private static void drawLine(List<Integer> widths) { - int last = widths.size() - 1; - print("+-"); - for(int i = 0; i < widths.size(); i++) { - print(StringUtils.repeat("-", widths.get(i))); - print((i == last) ? "-+" : "-+-"); - } - println(); - } - - /** - * Get maximal width for given column with it's associated header. - * - * @param header Associated header - * @param column All column values - * @return Maximal - */ - private static int getMaximalWidth(String header, List<String> column) { - assert header != null; - assert column != null; - - int max = header.length(); - - for(String value : column) { - if(value != null && value.length() > max) { - max = value.length(); - } - } - - return max; - } - - /** - * Get maximal number of rows available in the column list - * - * @param columns Array with all column values - * @return - */ - private static int getMaximalRows(List<String>... columns) { - int max = 0; - - for(List<String> column : columns) { - if(column.size() > max) { - max = column.size(); - } - } - - return max; - } - - private TableDisplayer() { - // Instantiation is prohibited - } -} http://git-wip-us.apache.org/repos/asf/sqoop/blob/0d4efda1/client/src/main/java/org/apache/sqoop/client/utils/ThrowableDisplayer.java ---------------------------------------------------------------------- diff --git a/client/src/main/java/org/apache/sqoop/client/utils/ThrowableDisplayer.java b/client/src/main/java/org/apache/sqoop/client/utils/ThrowableDisplayer.java deleted file mode 100644 index 8a34f34..0000000 --- a/client/src/main/java/org/apache/sqoop/client/utils/ThrowableDisplayer.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * 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.client.utils; - -import groovy.lang.MissingPropertyException; -import org.apache.sqoop.client.core.ClientError; -import org.apache.sqoop.common.SqoopException; - -import static org.apache.sqoop.client.shell.ShellEnvironment.*; - -/** - * Pretty printing of Throwable objects - */ -public class ThrowableDisplayer { - - /** - * Error hook installed to Groovy shell. - * - * Will display exception that appeared during executing command. In most - * cases we will simply delegate the call to printing throwable method, - * however in case that we've received ClientError.CLIENT_0006 (server - * exception), we will unwrap server issue and view only that as local - * context shouldn't make any difference. - * - * @param t Throwable to be displayed - */ - public static void errorHook(Throwable t) { - println("@|red Exception has occurred during processing command |@"); - - // If this is server exception from server - if(t instanceof SqoopException - && ((SqoopException)t).getErrorCode() == ClientError.CLIENT_0006) { - print("@|red Server has returned exception: |@"); - printThrowable(t.getCause(), isVerbose()); - } else if(t.getClass() == MissingPropertyException.class) { - print("@|red Unknown command: |@"); - println(t.getMessage()); - } else { - printThrowable(t, isVerbose()); - } - } - - /** - * Pretty print Throwable instance including stack trace and causes. - * - * @param t Throwable to display - */ - protected static void printThrowable(Throwable t, boolean verbose) { - print("@|red Exception: |@"); - print(t.getClass().getName()); - print(" @|red Message: |@"); - print(t.getMessage()); - println(); - - if(verbose) { - println("Stack trace:"); - for(StackTraceElement e : t.getStackTrace()) { - print("\t @|bold at |@ "); - print(e.getClassName()); - print(" (@|bold " + e.getFileName() + ":" + e.getLineNumber() + ") |@ "); - println(); - } - - Throwable cause = t.getCause(); - if(cause != null) { - print("Caused by: "); - printThrowable(cause, verbose); - } - } - } - - private ThrowableDisplayer() { - // Instantiation is prohibited - } -} http://git-wip-us.apache.org/repos/asf/sqoop/blob/0d4efda1/client/src/main/resources/client-resource.properties ---------------------------------------------------------------------- diff --git a/client/src/main/resources/client-resource.properties b/client/src/main/resources/client-resource.properties deleted file mode 100644 index 1a8f963..0000000 --- a/client/src/main/resources/client-resource.properties +++ /dev/null @@ -1,232 +0,0 @@ -# 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. - -# Client Resources in default language (english) - -############################ -# Security Form -# -object-name.label = Name -object-name.help = Non unique name of the entity to help you remember \ - it's purpose - - -############################# -# Messages -# -# Argument related -# -args.function.unknown = The specified function "{0}" is not recognized. -args.xid_missing = Required argument --xid is missing. -args.jid_missing = Required argument --jid is missing. -args.cid_missing = Required argument --cid is missing. -args.type_missing = Required argument --type is missing. -args.name_missing = Required argument --name is missing. -args.value_missing = Required argument --value is missing. - - -## Generic description of various ids, types etc -prompt.conn_id = Connection ID -prompt.connector_id = Connector ID -prompt.job_id = Job ID -prompt.job_type = Job type - -## Prompt messages for updating, filling metadata info - -prompt.update_conn_metadata = Please update connection metadata: -prompt.update_job_metadata = Please update job metadata: -prompt.fill_conn_metadata = Please fill following values to create new \ -connection object -prompt.fill_job_metadata = Please fill following values to create new \ -job object - -# -# Update command -update.conn = Updating connection with id {0} -update.job = Updating job with id {0} -update.usage = Usage: update {0} -update.conn_successful = Connection was successfully updated with status {0} -update.job_successful = Job was successfully updated with status {0} - -# -# Clone command -clone.usage = Usage: clone {0} -clone.conn.successful = Connection was successfully created with validation \ - status {0} and persistent id {1} -clone.job.successful = Job was successfully created with validation \ - status {0} and persistent id {1} -clone.cloning_conn = Cloning connection with id {0} -clone.cloning_job = Cloning job with id {0} - -# -# Create command -create.usage = Usage: create {0} -create.conn_successful = New connection was successfully created with \ - validation status {0} and persistent id {1} -create.job_successful = New job was successfully created with validation \ - status {0} and persistent id {1} -## Creating messages -create.creating_conn = Creating connection for connector with id {0} -create.creating_job = Creating job for connection with id {0} - -# -# Delete command -delete.usage = Usage: delete {0} - -# -# Enable command -enable.usage = Usage: enable {0} -enable.conn_successful = Connection {0} was successfully enabled -enable.job_successful = Job {0} was successfully enabled - -# -# Disable command -disable.usage = Usage: disable {0} -disable.conn_successful = Connection {0} was successfully disabled -disable.job_successful = Job {0} was successfully disabled - -# -# Help command -help.usage = [<command>] -help.description = Display this help message -help.cmd_usage = Usage: @|bold {0} |@ {1} -help.message = Display the list of commands or the help text for \ - @|bold command|@. -help.info = For information about @|green Sqoop|@, visit: \ - @|cyan http://sqoop.apache.org/|@ -help.avail_commands = Available commands: -help.cmd_description = @|bold {0} ({1}|@) {2} -help.specific_cmd_info = For help on a specific command type: \ - help @|bold command|@ - -unrecognized.cmd = Unrecognized command {0} - -# -# Set command -set.usage = Usage: set {0} -set.prompt_opt_name = Client option name -set.prompt_opt_value = New option value -set.verbose_changed = Verbose option was changed to {0} -set.poll_timeout_changed = Poll timeout option has been changed to {0} -set.unknown_opt_ignored = Unknown option {0}. Ignoring... -set.host_description = Host name to invoke server resources -set.port_description = Port number to invoke server resources -set.webapp_description = Web app to invoke server resources -set.url_description = Url to invoke server resources -set.server_usage = Usage: set server -set.server_successful = Server is set successfully -set.server_ignored = --host, --port or --webapp option is ignored, because --url option is given. - - -show.usage = Usage: show {0} - -show.prompt_display_all_conns = Display all connections -show.prompt_display_conn_xid = Display the connection with xid -show.conn_usage = Usage: show connection -show.prompt_conns_to_show = @|bold {0} connection(s) to show: |@ -show.prompt_conn_info = Connection with id {0} and name {1} (Enabled: {2}, Created {3}, Updated {4}) -show.prompt_conn_cid_info = Using Connector id {0} - -show.prompt_display_all_connectors = Display all connectors -show.prompt_display_connector_cid = Display the connector with cid -show.connector_usage = Usage: show connector -show.prompt_connectors_to_show = @|bold {0} connector(s) to show: |@ -show.prompt_connector_info = Connector with id {0}:\n Name: {1} \n \ -Class: {2}\n Version: {3} - -show.framework_usage = Usage: show framework -show.prompt_framework_opts = @|bold Framework specific options: |@\nPersistent id: {0} - -show.prompt_display_all_jobs = Display all jobs -show.prompt_display_job_jid = Display jobwith given jid -show.job_usage = Usage: show job -show.prompt_jobs_to_show = @|bold {0} job(s) to show: |@ -show.prompt_job_info = Job with id {0} and name {1} (Enabled: {2}, Created {3}, Updated {4}) -show.prompt_job_xid_cid_info = Using Connection id {0} and Connector id {1} - -show.prompt_display_all_submissions = Display all submissions -show.prompt_display_all_submissions_jid = Display all submissions given jid - -show.prompt_display_all_servers = Display all server information -show.prompt_display_server_host = Display server host name -show.prompt_display_server_port = Display server port number -show.prompt_display_server_webapp = Display server web app name -show.server_usage = Usage: show server -show.prompt_server_host = @|bold Server host:|@ {0} -show.prompt_server_port = @|bold Server port:|@ {0} -show.prompt_server_webapp = @|bold Server webapp:|@ {0} - -show.prompt_display_all_versions = Display all versions -show.prompt_display_version_server = Display server version -show.prompt_display_version_client = Display client version -show.prompt_display_version_protocol = Display protocol version -show.version_usage = Usage: show version -show.prompt_version_client_server = @|bold {0} version:|@\n Sqoop {1} \ -revision {2} \n Compiled by {3} on {4} -show.prompt_version_protocol = @|bold Protocol version:|@\n {0} - -sqoop.shell_banner = @|green Sqoop Shell:|@ Type '@|bold help|@' or '@|bold \\h|@' for help. -sqoop.prompt_shell_loadrc = Loading resource file {0} -sqoop.prompt_shell_loadedrc = Resource file loaded. - -start.usage = Usage: start {0} -start.prompt_synchronous = Wait for submission to finish - -stop.usage = Usage: stop {0} - -status.usage = Usage: status {0} - -# Various Table headers -table.header.id = Id -table.header.name = Name -table.header.version = Version -table.header.class = Class -table.header.type = Type -table.header.connector = Connector -table.header.jid = Job Id -table.header.eid = External Id -table.header.status = Status -table.header.date = Last Update Date -table.header.enabled = Enabled - -#Form displayer resources -formdisplayer.supported_job_types = Supported job types -formdisplayer.connection = Connection -formdisplayer.job = Job -formdisplayer.forms_jobtype = Forms for job type -formdisplayer.form = form -formdisplayer.name = Name -formdisplayer.label = Label -formdisplayer.help = Help -formdisplayer.input = Input -formdisplayer.type = Type -formdisplayer.sensitive = Sensitive -formdisplayer.size = Size -formdisplayer.possible_values = Possible values -formdisplayer.unsupported_datatype = Unsupported data type -formdisplayer.input_sensitive = This input is sensitive - -formdisplayer.warning_message = There were warnings while create or update, but saved successfully. - -submission.submission_detail = Submission details -submission.job_id = Job ID -submission.creation_date = Creation date -submission.external_id = External ID -submission.progress_not_available = Progress is not available -submission.counters = Counters -submission.executed_success = Job executed successfully -submission.server_url = Server URL -submission.connector_schema = Connector schema -submission.hio_schema = Input/Output schema http://git-wip-us.apache.org/repos/asf/sqoop/blob/0d4efda1/dist/pom.xml ---------------------------------------------------------------------- diff --git a/dist/pom.xml b/dist/pom.xml index dd67f85..9186a38 100644 --- a/dist/pom.xml +++ b/dist/pom.xml @@ -40,7 +40,7 @@ limitations under the License. </dependency> <dependency> <groupId>org.apache.sqoop</groupId> - <artifactId>sqoop-client</artifactId> + <artifactId>sqoop-shell</artifactId> </dependency> </dependencies> @@ -167,16 +167,16 @@ limitations under the License. <copy file="../server/target/sqoop.war" toDir="target/sqoop-${project.version}-bin-hadoop${hadoop.profile}/server/webapps"/> - <!-- Build client directory --> - <copy todir="target/sqoop-${project.version}-bin-hadoop${hadoop.profile}/client/lib"> - <fileset dir="../client/target/lib"> + <!-- Build shell client directory --> + <copy todir="target/sqoop-${project.version}-bin-hadoop${hadoop.profile}/shell/lib"> + <fileset dir="../shell/target/lib"> <include name="*.jar" /> <exclude name="junit-*.jar" /> <exclude name="mockito-*.jar" /> </fileset> </copy> - <copy file="../client/target/sqoop-client-${project.version}.jar" - toDir="target/sqoop-${project.version}-bin-hadoop${hadoop.profile}/client/lib"/> + <copy file="../shell/target/sqoop-shell-${project.version}.jar" + toDir="target/sqoop-${project.version}-bin-hadoop${hadoop.profile}/shell/lib"/> <!-- Build "bin" directory --> <copy todir="target/sqoop-${project.version}-bin-hadoop${hadoop.profile}/bin"> http://git-wip-us.apache.org/repos/asf/sqoop/blob/0d4efda1/dist/src/main/bin/sqoop.sh ---------------------------------------------------------------------- diff --git a/dist/src/main/bin/sqoop.sh b/dist/src/main/bin/sqoop.sh index 88adb04..e3ed5ef 100755 --- a/dist/src/main/bin/sqoop.sh +++ b/dist/src/main/bin/sqoop.sh @@ -51,7 +51,7 @@ cd ${BASEDIR} echo "Sqoop home directory: ${BASEDIR}" CATALINA_BIN=${CATALINA_BIN:-server/bin} -CLIENT_LIB=${CLIENT_LIB:-client/lib} +CLIENT_LIB=${CLIENT_LIB:-shell/lib} setup_catalina_opts() { # The Java System properties 'sqoop.http.port' and 'sqoop.admin.port' are @@ -107,7 +107,7 @@ case $COMMAND in if [ -n "${JAVA_HOME}" ] ; then EXEC_JAVA="${JAVA_HOME}/bin/java" fi - ${EXEC_JAVA} -classpath ${CLASSPATH} org.apache.sqoop.client.shell.SqoopShell $2 + ${EXEC_JAVA} -classpath ${CLASSPATH} org.apache.sqoop.shell.SqoopShell $2 ;; *) http://git-wip-us.apache.org/repos/asf/sqoop/blob/0d4efda1/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 5ea0633..513b6d0 100644 --- a/pom.xml +++ b/pom.xml @@ -247,6 +247,11 @@ limitations under the License. <artifactId>sqoop-client</artifactId> <version>${project.version}</version> </dependency> + <dependency> + <groupId>org.apache.sqoop</groupId> + <artifactId>sqoop-shell</artifactId> + <version>${project.version}</version> + </dependency> <dependency> <groupId>org.apache.sqoop</groupId> <artifactId>sqoop-common</artifactId> @@ -413,6 +418,7 @@ limitations under the License. <module>repository</module> <module>server</module> <module>client</module> + <module>shell</module> <module>docs</module> <module>connector</module> <module>execution</module>
