Skip to content

Commit

Permalink
fix #69
Browse files Browse the repository at this point in the history
Signed-off-by: Sebastian Hoß <mail@shoss.de>
  • Loading branch information
sebhoss committed May 6, 2017
1 parent 9e3f51d commit 822c778
Show file tree
Hide file tree
Showing 9 changed files with 139 additions and 25 deletions.
9 changes: 5 additions & 4 deletions .classpath
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,15 @@
<attribute name="ignore_optional_problems" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="bazel-bin/yosql-micro-benchmarks/_javac/yosql-jmh-benchmark/yosql-jmh-benchmark_sourcegenfiles">
<classpathentry kind="src" path="yosql-example/src/main/java"/>
<classpathentry kind="src" path="yosql-example/src/main/yosql"/>
<classpathentry kind="src" path="bazel-genfiles/yosql-example">
<attributes>
<attribute name="ignore_optional_problems" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="yosql-example/src/main/java"/>
<classpathentry kind="src" path="yosql-example/src/main/yosql"/>
<classpathentry kind="src" path="bazel-genfiles/yosql-example">
<classpathentry kind="src" path="yosql-cli/src/main/resources"/>
<classpathentry kind="src" path="bazel-bin/yosql-micro-benchmarks/_javac/yosql-micro-benchmarks/yosql-micro-benchmarks_sourcegenfiles">
<attributes>
<attribute name="ignore_optional_problems" value="true"/>
</attributes>
Expand Down
7 changes: 7 additions & 0 deletions yosql-cli/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ filegroup(
name = "yosql-cli-raw-sources",
srcs = glob(["src/main/java/**/*.java"]),
)
filegroup(
name = "cli-events",
srcs = ["src/main/resources/cli-events_en.properties"],
)

java_binary(
name = "yosql-cli",
Expand All @@ -12,4 +16,7 @@ java_binary(
"//yosql-core",
"//external:jopt_simple",
],
resources = [
":cli-events",
],
)
10 changes: 10 additions & 0 deletions yosql-cli/src/main/java/de/xn__ho_hia/yosql/cli/CliEvents.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package de.xn__ho_hia.yosql.cli;

import ch.qos.cal10n.BaseName;

@BaseName("cli-events")
enum CliEvents {

PROBLEM_DURING_OPTION_PARSING;

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,19 @@
import java.util.ArrayList;
import java.util.List;

import org.slf4j.LoggerFactory;

import ch.qos.cal10n.IMessageConveyor;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import dagger.Module;
import dagger.Provides;
import de.xn__ho_hia.yosql.model.ExecutionConfiguration;
import de.xn__ho_hia.yosql.model.ExecutionErrors;
import de.xn__ho_hia.yosql.model.LoggingAPI;
import de.xn__ho_hia.yosql.model.ResultRowConverter;
import joptsimple.BuiltinHelpFormatter;
import joptsimple.OptionException;
import joptsimple.OptionParser;
import joptsimple.OptionSet;
import joptsimple.OptionSpec;
Expand Down Expand Up @@ -53,7 +59,9 @@ ExecutionConfiguration provideExecutionConfiguration(
final ValueConverter<ResultRowConverter> converterConverter,
final IMessageConveyor messages) {
final OptionParser parser = new OptionParser();
parser.allowsUnrecognizedOptions();
parser.formatHelpWith(new BuiltinHelpFormatter(250, 10));
final String helpCommandName = messages.getMessage(HELP);
parser.accepts(helpCommandName).forHelp();
final Path currentDirectory = Paths.get(messages.getMessage(CURRENT_DIRECTORY));
final OptionSpec<Path> inputBaseDirectory = parser
.accepts(messages.getMessage(INPUT_BASE_DIRECTORY))
Expand Down Expand Up @@ -280,8 +288,17 @@ ExecutionConfiguration provideExecutionConfiguration(
.withValuesSeparatedBy(",")
.withValuesConvertedBy(converterConverter)
.describedAs(messages.getMessage(RESULT_ROW_CONVERTERS_DESCRIPTION));
final OptionSpec<String> logLevel = parser
.accepts("logLevel")
.withRequiredArg()
.ofType(String.class)
.defaultsTo("INFO")
.describedAs("The logging level to use");

final OptionSet options = parser.parse(arguments);
final OptionSet options = parseOptions(parser, helpCommandName);

final Logger root = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
root.setLevel(Level.valueOf(options.valueOf(logLevel).toUpperCase()));
final List<ResultRowConverter> resultConverters = new ArrayList<>();
final ResultRowConverter toResultRow = new ResultRowConverter();
toResultRow.setAlias(options.valueOf(defaultRowConverter));
Expand Down Expand Up @@ -336,4 +353,16 @@ ExecutionConfiguration provideExecutionConfiguration(
.build();
}

private OptionSet parseOptions(final OptionParser parser, final String helpCommandName) {
try {
final OptionSet optionSet = parser.parse(arguments);
if (optionSet.has(helpCommandName)) {
throw new OptionParsingException(parser);
}
return optionSet;
} catch (final OptionException exception) {
throw new OptionParsingException(parser, exception);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package de.xn__ho_hia.yosql.cli;

import joptsimple.OptionException;
import joptsimple.OptionParser;

class OptionParsingException extends RuntimeException {

private static final long serialVersionUID = 1L;

private final OptionParser parser;

private final OptionException exception;

public OptionParsingException(final OptionParser parser, final OptionException exception) {
super(exception);
this.parser = parser;
this.exception = exception;
}

public OptionParsingException(final OptionParser parser) {
this(parser, null);
}

public OptionParser getParser() {
return parser;
}

public boolean couldNotParseOptions() {
return exception != null;
}

@Override
public synchronized OptionException getCause() {
return exception;
}

}
61 changes: 42 additions & 19 deletions yosql-cli/src/main/java/de/xn__ho_hia/yosql/cli/YoSqlCLI.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,17 @@
*/
package de.xn__ho_hia.yosql.cli;

import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.cal10n.IMessageConveyor;
import ch.qos.cal10n.MessageConveyor;
import joptsimple.OptionException;
import joptsimple.OptionParser;
import joptsimple.OptionSet;
import joptsimple.OptionSpec;

/**
Expand All @@ -26,34 +31,52 @@ public class YoSqlCLI {
* In case anything goes wrong
*/
public static void main(final String... arguments) throws Exception {
setLogLevel(arguments);

try {
DaggerYoSqlCLIComponent.builder()
.jOptConfigurationModule(new JOptConfigurationModule(arguments))
.build()
.yosql()
.generateFiles();
} catch (final OptionParsingException exception) {
if (exception.couldNotParseOptions()) {
handleParsingException(exception);
}
exception.getParser().printHelpOn(System.err);
} catch (final Throwable throwable) {
throwable.printStackTrace();
System.exit(1);
}
}

@SuppressWarnings("nls")
private static void setLogLevel(final String... arguments) {
final OptionParser parser = new OptionParser();
parser.allowsUnrecognizedOptions();
final OptionSpec<String> logLevel = parser
.accepts("logLevel")
.withRequiredArg()
.ofType(String.class)
.defaultsTo("INFO")
.describedAs("The logging level to use");
private static void handleParsingException(final OptionParsingException exception) {
final OptionException cause = exception.getCause();
final Collection<String> failedOptions = cause.options();
final OptionParser parser = exception.getParser();
final Map<String, OptionSpec<?>> recognizedOptions = parser.recognizedOptions();
final Collection<String> similarOptions = findSimilarOptions(failedOptions, recognizedOptions);
final IMessageConveyor messages = new MessageConveyor(Locale.ENGLISH);
System.err.println(messages.getMessage(CliEvents.PROBLEM_DURING_OPTION_PARSING, failedOptions, similarOptions));
}

final Logger root = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
final OptionSet options = parser.parse(arguments);
root.setLevel(Level.valueOf(options.valueOf(logLevel).toUpperCase()));
private static Collection<String> findSimilarOptions(
final Collection<String> failedOptions,
final Map<String, OptionSpec<?>> recognizedOptions) {
final List<String> similars = new ArrayList<>(failedOptions.size());
final String[] array = recognizedOptions.keySet().stream()
.filter(string -> !string.contains("arguments")) //$NON-NLS-1$
.toArray(n -> new String[n]);
Arrays.sort(array);
for (final String option : failedOptions) {
final int index = Math.abs(Arrays.binarySearch(array, option)) - 1;
similars.add(array[index]);
if (index > 0) {
similars.add(array[index - 1]);
}
if (index < array.length) {
similars.add(array[index + 1]);
}
}
return similars;
}

}
1 change: 1 addition & 0 deletions yosql-cli/src/main/resources/cli-events_en.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
PROBLEM_DURING_OPTION_PARSING=Error while parsing one of the specified options!\n\n\t{0}\n\nMaybe you meant {1}? If not, here are all possible values we currently allow:\n
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ public enum ConfigurationOptions {
*/
OUTPUT_BASE_DIRECTORY_DESCRIPTION,

/**
* The help command.
*/
HELP,

/**
* The current directory.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ INPUT_BASE_DIRECTORY=inputBaseDirectory
INPUT_BASE_DIRECTORY_DESCRIPTION=The input directory for .sql files
OUTPUT_BASE_DIRECTORY=outputBaseDirectory
OUTPUT_BASE_DIRECTORY_DESCRIPTION=The output directory for all generated files
HELP=help
CURRENT_DIRECTORY=.
BASE_PACKAGE_NAME=basePackageName
BASE_PACKAGE_NAME_DESCRIPTION=The base package name for the generated code.
Expand Down

0 comments on commit 822c778

Please sign in to comment.