Skip to content

Commit

Permalink
Provide system properties to be able to control the TerminalBuilder, f…
Browse files Browse the repository at this point in the history
…ixes #109
  • Loading branch information
gnodet committed Apr 6, 2017
1 parent cb941af commit ec945e1
Showing 1 changed file with 50 additions and 17 deletions.
67 changes: 50 additions & 17 deletions terminal/src/main/java/org/jline/terminal/TerminalBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,16 @@
*/
public final class TerminalBuilder {

//
// System properties
//

public static final String PROP_ENCODING = "org.jline.terminal.encoding";
public static final String PROP_TYPE = "org.jline.terminal.type";
public static final String PROP_JNA = "org.jline.terminal.jna";
public static final String PROP_JANSI = "org.jline.terminal.jansi";
public static final String PROP_DUMB = "org.jline.terminal.dumb";

/**
* Returns the default system terminal.
* Terminals should be closed properly using the {@link Terminal#close()}
Expand All @@ -59,7 +69,8 @@ public static TerminalBuilder builder() {
private String type;
private String encoding;
private Boolean system;
private boolean jna = true;
private Boolean jna;
private Boolean jansi;
private Boolean dumb;
private Attributes attributes;
private Size size;
Expand Down Expand Up @@ -90,6 +101,11 @@ public TerminalBuilder jna(boolean jna) {
return this;
}

public TerminalBuilder jansi(boolean jansi) {
this.jansi = jansi;
return this;
}

public TerminalBuilder dumb(boolean dumb) {
this.dumb = dumb;
return this;
Expand Down Expand Up @@ -160,22 +176,30 @@ private Terminal doBuild() throws IOException {
name = "JLine terminal";
}
String encoding = this.encoding;
if (encoding == null) {
encoding = System.getProperty(PROP_ENCODING);
}
if (encoding == null) {
encoding = Charset.defaultCharset().name();
}
String type = this.type;
if (type == null) {
type = System.getProperty("org.jline.terminal.type");
type = System.getProperty(PROP_TYPE);
}
if (type == null) {
type = System.getenv("TERM");
}
Boolean jna = this.jna;
if (jna == null) {
jna = getBoolean(PROP_JNA, true);
}
Boolean jansi = this.jansi;
if (jansi == null) {
jansi = getBoolean(PROP_JANSI, true);
}
Boolean dumb = this.dumb;
if (dumb == null) {
String str = System.getProperty("org.jline.terminal.dumb");
if (str != null) {
dumb = Boolean.parseBoolean(str);
}
dumb = getBoolean(PROP_DUMB, null);
}
if ((system != null && system) || (system == null && in == null && out == null)) {
if (attributes != null || size != null) {
Expand All @@ -196,23 +220,25 @@ private Terminal doBuild() throws IOException {
}
}
else if (OSUtils.IS_WINDOWS) {
if (useJna()) {
if (jna) {
try {
return load(JnaSupport.class).winSysTerminal(name, nativeSignals, signalHandler);
} catch (Throwable t) {
Log.debug("Error creating JNA based terminal: ", t.getMessage(), t);
exception.addSuppressed(t);
}
}
try {
return load(JansiSupport.class).winSysTerminal(name, nativeSignals, signalHandler);
} catch (Throwable t) {
Log.debug("Error creating JANSI based terminal: ", t.getMessage(), t);
exception.addSuppressed(t);
if (jansi) {
try {
return load(JansiSupport.class).winSysTerminal(name, nativeSignals, signalHandler);
} catch (Throwable t) {
Log.debug("Error creating JANSI based terminal: ", t.getMessage(), t);
exception.addSuppressed(t);
}
}
} else {
Pty pty = null;
if (useJna()) {
if (jna) {
try {
pty = load(JnaSupport.class).current();
} catch (Throwable t) {
Expand All @@ -221,7 +247,7 @@ else if (OSUtils.IS_WINDOWS) {
exception.addSuppressed(t);
}
}
if (pty == null) {
if (jansi && pty == null) {
try {
pty = load(JansiSupport.class).current();
} catch (Throwable t) {
Expand Down Expand Up @@ -258,7 +284,7 @@ else if (OSUtils.IS_WINDOWS) {
throw exception;
}
} else {
if (useJna()) {
if (jna) {
try {
Pty pty = load(JnaSupport.class).open(attributes, size);
return new PosixPtyTerminal(name, type, pty, in, out, encoding, signalHandler);
Expand All @@ -277,8 +303,15 @@ else if (OSUtils.IS_WINDOWS) {
}
}

private boolean useJna() {
return jna;
private static Boolean getBoolean(String name, Boolean def) {
try {
String str = System.getProperty(name);
if (str != null) {
return Boolean.parseBoolean(str);
}
} catch (IllegalArgumentException | NullPointerException e) {
}
return def;
}

private <S> S load(Class<S> clazz) {
Expand Down

0 comments on commit ec945e1

Please # to comment.