diff --git a/src/main/java/net/rubygrapefruit/platform/Main.java b/src/main/java/net/rubygrapefruit/platform/Main.java index 2a99612..714f080 100644 --- a/src/main/java/net/rubygrapefruit/platform/Main.java +++ b/src/main/java/net/rubygrapefruit/platform/Main.java @@ -5,10 +5,10 @@ public class Main { System.out.println(); System.out.println("* OS: " + System.getProperty("os.name") + ' ' + System.getProperty("os.version") + ' ' + System.getProperty("os.arch")); - Process process = Platform.get(Process.class); + Process process = Native.get(Process.class); System.out.println("* PID: " + process.getPid()); - TerminalAccess terminalAccess = Platform.get(TerminalAccess.class); + TerminalAccess terminalAccess = Native.get(TerminalAccess.class); boolean stdoutIsTerminal = terminalAccess.isTerminal(TerminalAccess.Output.Stdout); boolean stderrIsTerminal = terminalAccess.isTerminal(TerminalAccess.Output.Stderr); System.out.println("* stdout: " + (stdoutIsTerminal ? "terminal" : "not a terminal")); @@ -34,7 +34,8 @@ public class Main { terminal.normal(); System.out.println(); } - System.out.println(); } + + System.out.println(); } } diff --git a/src/main/java/net/rubygrapefruit/platform/Platform.java b/src/main/java/net/rubygrapefruit/platform/Native.java similarity index 91% rename from src/main/java/net/rubygrapefruit/platform/Platform.java rename to src/main/java/net/rubygrapefruit/platform/Native.java index 2ee6ed0..c5d343c 100644 --- a/src/main/java/net/rubygrapefruit/platform/Platform.java +++ b/src/main/java/net/rubygrapefruit/platform/Native.java @@ -9,26 +9,28 @@ import java.io.PrintStream; /** * Provides access to the native integrations. Use {@link #get(Class)} to load a particular integration. */ -public class Platform { +public class Native { private static final Object lock = new Object(); private static boolean loaded; static T get(Class type) { synchronized (lock) { if (!loaded) { - System.setProperty("java.library.path", new File("build/binaries").getAbsolutePath()); + Platform platform = Platform.current(); + if (!platform.isSupported()) { + throw new NativeException(String.format("The current platform is not supported.")); + } try { - File libFile = new File("build/binaries/libnative-platform.dylib"); - if (!libFile.isFile()) { - libFile = new File("build/binaries/libnative-platform.so"); - } + File libFile = new File("build/binaries/" + platform.getLibraryName()); System.load(libFile.getCanonicalPath()); } catch (IOException e) { throw new RuntimeException(e); } int nativeVersion = NativeLibraryFunctions.getVersion(); if (nativeVersion != NativeLibraryFunctions.VERSION) { - throw new NativeException(String.format("Unexpected native library version loaded. Expected %s, was %s.", nativeVersion, NativeLibraryFunctions.VERSION)); + throw new NativeException(String.format( + "Unexpected native library version loaded. Expected %s, was %s.", nativeVersion, + NativeLibraryFunctions.VERSION)); } loaded = true; } diff --git a/src/main/java/net/rubygrapefruit/platform/internal/Platform.java b/src/main/java/net/rubygrapefruit/platform/internal/Platform.java new file mode 100644 index 0000000..82b1f04 --- /dev/null +++ b/src/main/java/net/rubygrapefruit/platform/internal/Platform.java @@ -0,0 +1,61 @@ +package net.rubygrapefruit.platform.internal; + +public abstract class Platform { + private static Platform platform; + + public static Platform current() { + synchronized (Platform.class) { + if (platform == null) { + String osName = System.getProperty("os.name").toLowerCase(); + if (osName.contains("windows")) { + platform = new Windows(); + } else if (osName.contains("linux")) { + platform = new Linux(); + } else if (osName.contains("os x")) { + platform = new OsX(); + } else { + platform = new Unsupported(); + } + } + return platform; + } + } + + public boolean isSupported() { + return true; + } + + public abstract String getLibraryName(); + + private static class Windows extends Platform { + @Override + public String getLibraryName() { + return "native-platform.dll"; + } + } + + private static class Linux extends Platform { + @Override + public String getLibraryName() { + return "libnative-platform.so"; + } + } + + private static class OsX extends Platform { + @Override + public String getLibraryName() { + return "libnative-platform.dylib"; + } + } + + private static class Unsupported extends Platform { + @Override + public boolean isSupported() { + return false; + } + + public String getLibraryName() { + throw new UnsupportedOperationException(); + } + } +} diff --git a/src/test/groovy/net/rubygrapefruit/platform/PosixFileTest.groovy b/src/test/groovy/net/rubygrapefruit/platform/PosixFileTest.groovy index 810a277..17c71eb 100644 --- a/src/test/groovy/net/rubygrapefruit/platform/PosixFileTest.groovy +++ b/src/test/groovy/net/rubygrapefruit/platform/PosixFileTest.groovy @@ -6,7 +6,7 @@ import org.junit.rules.TemporaryFolder class PosixFileTest extends Specification { @Rule TemporaryFolder tmpDir - final PosixFile file = Platform.get(PosixFile.class) + final PosixFile file = Native.get(PosixFile.class) def "can set mode on a file"() { def testFile = tmpDir.newFile("test.txt") diff --git a/src/test/groovy/net/rubygrapefruit/platform/ProcessTest.groovy b/src/test/groovy/net/rubygrapefruit/platform/ProcessTest.groovy index 089e0a2..c3d51c8 100644 --- a/src/test/groovy/net/rubygrapefruit/platform/ProcessTest.groovy +++ b/src/test/groovy/net/rubygrapefruit/platform/ProcessTest.groovy @@ -6,7 +6,7 @@ import spock.lang.Specification class ProcessTest extends Specification { @Rule TemporaryFolder tmpDir - final Process process = Platform.get(Process.class) + final Process process = Native.get(Process.class) def "can get PID"() { expect: diff --git a/src/test/groovy/net/rubygrapefruit/platform/TerminalTest.groovy b/src/test/groovy/net/rubygrapefruit/platform/TerminalTest.groovy index 922fbab..d0b5c6e 100644 --- a/src/test/groovy/net/rubygrapefruit/platform/TerminalTest.groovy +++ b/src/test/groovy/net/rubygrapefruit/platform/TerminalTest.groovy @@ -6,7 +6,7 @@ import spock.lang.Specification class TerminalTest extends Specification { @Rule TemporaryFolder tmpDir - final TerminalAccess terminal = Platform.get(TerminalAccess.class) + final TerminalAccess terminal = Native.get(TerminalAccess.class) def "can check if attached to terminal"() { expect: