Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,17 @@ You can also download all development versions from [Bintray](https://bintray.co
The latest CLI is always compatible with all database frameworks of the same minor version.
For example CLI-3.0.4 is compatible with database framework 3.0.0-3.0.4 but not with database framework 2.x and 3.1.x.

## Localization and NLS settings
utPLSQL-cli will use the environment variables (in that order) "NLS_LANG", "LC_ALL" or "LANG" to change the locale and therefore the NLS settings.
If neither environment variable is available, it will use the JVM default locale.

Example: to change the NLS-settings to English American, you can do the following:
```
export LC_ALL=en_US.utf-8
```

The charset-part of LC_ALL is ignored.

## Usage

`utplsql run <ConnectionURL> [-p=(ut_path|ut_paths)] [-f=format [-o=output_file] [-s] ...]`
Expand Down
9 changes: 6 additions & 3 deletions src/main/java/org/utplsql/cli/Cli.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,15 @@

public class Cli {

public static final int DEFAULT_ERROR_CODE = 1;
static final int DEFAULT_ERROR_CODE = 1;

public static final String HELP_CMD = "-h";
public static final String RUN_CMD = "run";
static final String HELP_CMD = "-h";
private static final String RUN_CMD = "run";

public static void main(String[] args) {

LocaleInitializer.initLocale();

JCommander jc = new JCommander();
// jc.addCommand(HELP_CMD, new HelpCommand());
RunCommand runCmd = new RunCommand();
Expand Down
64 changes: 64 additions & 0 deletions src/main/java/org/utplsql/cli/LocaleInitializer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package org.utplsql.cli;

import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/** This class makes sure the java locale is set according to the environment variables LC_ALL and LANG
* We experienced that, in some cases, the locale was not set as expected, therefore this class implements some clear
* rules:
* 1. If environment variable NLS_LANG is set, we try to parse its content and set locale according to its value if valid
* 2. If environment variable LC_ALL is set, we try to parse its content and set locale according to its value if valid
* 3. If environment variable LANG is set, we try to parse its content and set locale according to its value if valid
* 4. Otherwise we use default locale
*
* @author pesse
*/
class LocaleInitializer {

private static final Pattern REGEX_LOCALE = Pattern.compile("^([a-zA-Z]+)[_-]([a-zA-Z]+)"); // We only need the very first part and are pretty forgiving in parsing

/** Sets the default locale according to the rules described above
*
*/
static void initLocale() {

boolean localeChanged = setDefaultLocale(System.getenv("NLS_LANG"));

if ( !localeChanged )
localeChanged = setDefaultLocale(System.getenv("LC_ALL"));
if ( !localeChanged )
setDefaultLocale(System.getenv("LANG"));
}

/** Set the default locale from a given string like LC_ALL or LANG environment variable
*
* @param localeString Locale-string from LC_ALL or LANG, e.g "en_US.utf-8"
* @return true if successful, false if not
*/
private static boolean setDefaultLocale( String localeString ) {
if ( localeString == null || localeString.isEmpty() )
return false;

try {
Matcher m = REGEX_LOCALE.matcher(localeString);
if (m.find()) {
StringBuilder sb = new StringBuilder();
sb.append(m.group(1));
if (m.group(2) != null)
sb.append("-").append(m.group(2));

Locale l = new Locale.Builder().setLanguageTag(sb.toString()).build();
if ( l != null ) {
Locale.setDefault(l);
return true;
}
}
}
catch ( Exception e ) {
System.out.println("Could not get locale from " + localeString);
}

return false;
}
}