From 45be36a7b85249a50872e8db1d44a14ebd1724b6 Mon Sep 17 00:00:00 2001 From: zreed Date: Sat, 6 Dec 2014 13:55:50 -0500 Subject: [PATCH] Update JLine Later releases include the TerminalLineSettings patch. Also move call to AnsiConsole.systemInstall() to avoid patching AnsiWindowsTerminal. --- pom.xml | 2 +- src/main/java/jline/AnsiWindowsTerminal.java | 91 ------- .../jline/internal/TerminalLineSettings.java | 227 ------------------ .../java/org/bukkit/craftbukkit/Main.java | 5 +- 4 files changed, 5 insertions(+), 320 deletions(-) delete mode 100644 src/main/java/jline/AnsiWindowsTerminal.java delete mode 100644 src/main/java/jline/internal/TerminalLineSettings.java diff --git a/pom.xml b/pom.xml index e4aff848dc..49f802803d 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ jline jline - 2.6 + 2.12 jar compile diff --git a/src/main/java/jline/AnsiWindowsTerminal.java b/src/main/java/jline/AnsiWindowsTerminal.java deleted file mode 100644 index a6380364db..0000000000 --- a/src/main/java/jline/AnsiWindowsTerminal.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2009 the original author(s). - * - * Licensed 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. - * - * MODIFICATIONS: methods to deal with wrapping the output stream. - */ - -package jline; - -import org.fusesource.jansi.AnsiConsole; -import org.fusesource.jansi.AnsiOutputStream; -import org.fusesource.jansi.WindowsAnsiOutputStream; - -import java.io.ByteArrayOutputStream; -import java.io.OutputStream; - -/** - * ANSI-supported {@link WindowsTerminal}. - * - * @since 2.0 - */ -public class AnsiWindowsTerminal - extends WindowsTerminal -{ - private final boolean ansiSupported = detectAnsiSupport(); - - @Override - public OutputStream wrapOutIfNeeded(OutputStream out) { - return wrapOutputStream(out); - } - - /** - * Returns an ansi output stream handler. We return whatever was - * passed if we determine we cannot handle ansi based on Kernel32 calls. - * - * @return an @{link AltWindowAnsiOutputStream} instance or the passed - * stream. - */ - private static OutputStream wrapOutputStream(final OutputStream stream) { - String os = System.getProperty("os.name"); - if( os.startsWith("Windows") ) { - // On windows we know the console does not interpret ANSI codes.. - try { - return new WindowsAnsiOutputStream(stream); - } catch (Throwable ignore) { - // this happens when JNA is not in the path.. or - // this happens when the stdout is being redirected to a file. - } - // Use the ANSIOutputStream to strip out the ANSI escape sequences. - return new AnsiOutputStream(stream); - } - return stream; - } - - private static boolean detectAnsiSupport() { - AnsiConsole.systemInstall(); // CraftBukkit - install Windows JNI library - OutputStream out = AnsiConsole.wrapOutputStream(new ByteArrayOutputStream()); - try { - out.close(); - } - catch (Exception e) { - // ignore; - } - return out instanceof WindowsAnsiOutputStream; - } - - public AnsiWindowsTerminal() throws Exception { - super(); - } - - @Override - public boolean isAnsiSupported() { - return ansiSupported; - } - - @Override - public boolean hasWeirdWrap() { - return false; - } -} diff --git a/src/main/java/jline/internal/TerminalLineSettings.java b/src/main/java/jline/internal/TerminalLineSettings.java deleted file mode 100644 index b4b2409e7b..0000000000 --- a/src/main/java/jline/internal/TerminalLineSettings.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright (c) 2002-2007, Marc Prud'hommeaux. All rights reserved. - * - * This software is distributable under the BSD license. See the terms of the - * BSD license in the documentation provided with this software. - */ - -package jline.internal; - -import java.io.ByteArrayOutputStream; -import java.io.Closeable; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.text.MessageFormat; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Provides access to terminal line settings via stty. - * - * @author Marc Prud'hommeaux - * @author Dale Kemp - * @author Jason Dillon - * @author Jean-Baptiste Onofré - * @since 2.0 - */ -public final class TerminalLineSettings -{ - public static final String JLINE_STTY = "jline.stty"; - - public static final String DEFAULT_STTY = "stty"; - - public static final String JLINE_SH = "jline.sh"; - - public static final String DEFAULT_SH = "sh"; - - private String sttyCommand; - - private String shCommand; - - private String config; - - private long configLastFetched; - - public TerminalLineSettings() throws IOException, InterruptedException { - sttyCommand = Configuration.getString(JLINE_STTY, DEFAULT_STTY); - shCommand = Configuration.getString(JLINE_SH, DEFAULT_SH); - config = get("-a"); - configLastFetched = System.currentTimeMillis(); - - Log.debug("Config: ", config); - - // sanity check - if (config.length() == 0) { - throw new IOException(MessageFormat.format("Unrecognized stty code: {0}", config)); - } - } - - public String getConfig() { - return config; - } - - public void restore() throws IOException, InterruptedException { - set("sane"); - } - - public String get(final String args) throws IOException, InterruptedException { - return stty(args); - } - - public void set(final String args) throws IOException, InterruptedException { - stty(args); - } - - /** - *

- * Get the value of a stty property, including the management of a cache. - *

- * - * @param name the stty property. - * @return the stty property value. - */ - public int getProperty(String name) { - assert name != null; - // CraftBukkit start - long currentTime = System.currentTimeMillis(); - - try { - // tty properties are cached so we don't have to worry too much about getting term widht/height - if (config == null || currentTime - configLastFetched > 1000) { - config = get("-a"); - } - } catch (Exception e) { - Log.debug("Failed to query stty ", name, "\n", e); - } - - // always update the last fetched time and try to parse the output - if (currentTime - configLastFetched > 1000) { - configLastFetched = currentTime; - } - - return this.getProperty(name, config); - // CraftBukkit end - } - - /** - *

- * Parses a stty output (provided by stty -a) and return the value of a given property. - *

- * - * @param name property name. - * @param stty string resulting of stty -a execution. - * @return value of the given property. - */ - protected static int getProperty(String name, String stty) { - // try the first kind of regex - Pattern pattern = Pattern.compile(name + "\\s+=\\s+([^;]*)[;\\n\\r]"); - Matcher matcher = pattern.matcher(stty); - if (!matcher.find()) { - // try a second kind of regex - pattern = Pattern.compile(name + "\\s+([^;]*)[;\\n\\r]"); - matcher = pattern.matcher(stty); - if (!matcher.find()) { - // try a second try of regex - pattern = Pattern.compile("(\\S*)\\s+" + name); - matcher = pattern.matcher(stty); - if (!matcher.find()) { - return -1; - } - } - } - return parseControlChar(matcher.group(1)); - } - - private static int parseControlChar(String str) { - // under - if ("".equals(str)) { - return -1; - } - // octal - if (str.charAt(0) == '0') { - return Integer.parseInt(str, 8); - } - // decimal - if (str.charAt(0) >= '1' && str.charAt(0) <= '9') { - return Integer.parseInt(str, 10); - } - // control char - if (str.charAt(0) == '^') { - if (str.charAt(1) == '?') { - return 127; - } else { - return str.charAt(1) - 64; - } - } else if (str.charAt(0) == 'M' && str.charAt(1) == '-') { - if (str.charAt(2) == '^') { - if (str.charAt(3) == '?') { - return 127 + 128; - } else { - return str.charAt(3) - 64 + 128; - } - } else { - return str.charAt(2) + 128; - } - } else { - return str.charAt(0); - } - } - - private String stty(final String args) throws IOException, InterruptedException { - assert args != null; - return exec(String.format("%s %s < /dev/tty", sttyCommand, args)); - } - - private String exec(final String cmd) throws IOException, InterruptedException { - assert cmd != null; - return exec(shCommand, "-c", cmd); - } - - private String exec(final String... cmd) throws IOException, InterruptedException { - assert cmd != null; - - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - - Log.trace("Running: ", cmd); - - Process p = Runtime.getRuntime().exec(cmd); - - InputStream in = null; - InputStream err = null; - OutputStream out = null; - try { - int c; - in = p.getInputStream(); - while ((c = in.read()) != -1) { - bout.write(c); - } - err = p.getErrorStream(); - while ((c = err.read()) != -1) { - bout.write(c); - } - out = p.getOutputStream(); - p.waitFor(); - } - finally { - close(in, out, err); - } - - String result = bout.toString(); - - Log.trace("Result: ", result); - - return result; - } - - private static void close(final Closeable... closeables) { - for (Closeable c : closeables) { - try { - c.close(); - } - catch (Exception e) { - // Ignore - } - } - } -} \ No newline at end of file diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java index 8d127fbe2a..9ffd897795 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -10,6 +10,7 @@ import java.util.logging.Logger; import joptsimple.OptionParser; import joptsimple.OptionSet; import net.minecraft.server.MinecraftServer; +import org.fusesource.jansi.AnsiConsole; public class Main { public static boolean useJline = true; @@ -145,7 +146,9 @@ public class Main { useJline = false; } - if (!useJline) { + if (useJline) { + AnsiConsole.systemInstall(); + } else { // This ensures the terminal literal will always match the jline implementation System.setProperty(jline.TerminalFactory.JLINE_TERMINAL, jline.UnsupportedTerminal.class.getName()); }