Extracted superclass for Terminals implementations, and fixed thread-safety.

This commit is contained in:
Adam Murdoch
2012-09-08 08:44:53 +10:00
parent 2be367e342
commit 1c3ab6a289
3 changed files with 36 additions and 35 deletions

View File

@@ -0,0 +1,28 @@
package net.rubygrapefruit.platform.internal;
import net.rubygrapefruit.platform.Terminal;
import net.rubygrapefruit.platform.Terminals;
public abstract class AbstractTerminals implements Terminals {
private static Output currentlyOpen;
private static AbstractTerminal current;
public Terminal getTerminal(Output output) {
synchronized (AbstractTerminals.class) {
if (currentlyOpen != null && currentlyOpen != output) {
throw new UnsupportedOperationException("Currently only one output can be used as a terminal.");
}
if (current == null) {
AbstractTerminal terminal = createTerminal(output);
terminal.init();
currentlyOpen = output;
current = terminal;
}
return current;
}
}
protected abstract AbstractTerminal createTerminal(Output output);
}

View File

@@ -1,27 +1,14 @@
package net.rubygrapefruit.platform.internal;
import net.rubygrapefruit.platform.Terminal;
import net.rubygrapefruit.platform.Terminals;
import net.rubygrapefruit.platform.internal.jni.PosixTerminalFunctions;
public class TerminfoTerminals implements Terminals {
private static Output currentlyOpen;
private static TerminfoTerminal current;
public class TerminfoTerminals extends AbstractTerminals {
public boolean isTerminal(Output output) {
return PosixTerminalFunctions.isatty(output.ordinal());
}
public Terminal getTerminal(Output output) {
if (currentlyOpen != null && currentlyOpen != output) {
throw new UnsupportedOperationException("Currently only one output can be used as a terminal.");
}
if (current == null) {
current = new TerminfoTerminal(output);
current.init();
}
currentlyOpen = output;
return current;
@Override
protected AbstractTerminal createTerminal(Output output) {
return new TerminfoTerminal(output);
}
}

View File

@@ -1,14 +1,9 @@
package net.rubygrapefruit.platform.internal;
import net.rubygrapefruit.platform.NativeException;
import net.rubygrapefruit.platform.Terminal;
import net.rubygrapefruit.platform.Terminals;
import net.rubygrapefruit.platform.internal.jni.WindowsConsoleFunctions;
public class WindowsTerminals implements Terminals {
private static Output currentlyOpen;
private static WindowsTerminal current;
public class WindowsTerminals extends AbstractTerminals {
public boolean isTerminal(Output output) {
FunctionResult result = new FunctionResult();
boolean console = WindowsConsoleFunctions.isConsole(output.ordinal(), result);
@@ -19,17 +14,8 @@ public class WindowsTerminals implements Terminals {
return console;
}
public Terminal getTerminal(Output output) {
if (currentlyOpen !=null && currentlyOpen != output) {
throw new UnsupportedOperationException("Currently only one output can be used as a terminal.");
}
if (current == null) {
current = new WindowsTerminal(output);
current.init();
}
currentlyOpen = output;
return current;
@Override
protected AbstractTerminal createTerminal(Output output) {
return new WindowsTerminal(output);
}
}