diff --git a/src/main/java/net/rubygrapefruit/platform/Native.java b/src/main/java/net/rubygrapefruit/platform/Native.java index 57d5b39..d47e6b0 100755 --- a/src/main/java/net/rubygrapefruit/platform/Native.java +++ b/src/main/java/net/rubygrapefruit/platform/Native.java @@ -59,40 +59,11 @@ public class Native { static T get(Class type) { init(null); Platform platform = Platform.current(); - if (platform.isPosix()) { - if (type.equals(PosixFile.class)) { - return type.cast(new DefaultPosixFile()); - } - if (type.equals(Process.class)) { - return type.cast(new DefaultProcess()); - } - if (type.equals(TerminalAccess.class)) { - return type.cast(new TerminfoTerminalAccess()); - } - if (type.equals(SystemInfo.class)) { - MutableSystemInfo systemInfo = new MutableSystemInfo(); - FunctionResult result = new FunctionResult(); - NativeLibraryFunctions.getSystemInfo(systemInfo, result); - if (result.isFailed()) { - throw new NativeException(String.format("Could not fetch system information: %s", - result.getMessage())); - } - System.out.println("=> CHARACTER ENCODING: " + systemInfo.characterEncoding); - return type.cast(systemInfo); - } - } else if (platform.isWindows()) { - if (type.equals(Process.class)) { - return type.cast(new DefaultProcess()); - } - if (type.equals(TerminalAccess.class)) { - return type.cast(new WindowsTerminalAccess()); - } - } - if (platform.isOsX()) { - if (type.equals(FileSystems.class)) { - return type.cast(new PosixFileSystems()); - } + T integration = platform.get(type); + if (integration != null) { + return integration; } + throw new UnsupportedOperationException(String.format("Cannot load unsupported native integration %s.", type.getName())); } diff --git a/src/main/java/net/rubygrapefruit/platform/internal/Platform.java b/src/main/java/net/rubygrapefruit/platform/internal/Platform.java index 3ec303e..7746bc9 100755 --- a/src/main/java/net/rubygrapefruit/platform/internal/Platform.java +++ b/src/main/java/net/rubygrapefruit/platform/internal/Platform.java @@ -1,5 +1,9 @@ package net.rubygrapefruit.platform.internal; +import net.rubygrapefruit.platform.*; +import net.rubygrapefruit.platform.Process; +import net.rubygrapefruit.platform.internal.jni.NativeLibraryFunctions; + public abstract class Platform { private static Platform platform; @@ -7,11 +11,12 @@ public abstract class Platform { synchronized (Platform.class) { if (platform == null) { String osName = System.getProperty("os.name").toLowerCase(); + String arch = System.getProperty("os.arch"); if (osName.contains("windows")) { platform = new Windows(); } else if (osName.contains("linux")) { platform = new Linux(); - } else if (osName.contains("os x")) { + } else if (osName.contains("os x") && (arch.equals("i386") || arch.equals("x86_64"))) { platform = new OsX(); } else if (osName.contains("sunos")) { platform = new Solaris(); @@ -27,16 +32,12 @@ public abstract class Platform { return true; } - public boolean isPosix() { - return false; - } - public boolean isWindows() { return false; } - public boolean isOsX() { - return false; + public T get(Class type) { + return null; } public abstract String getLibraryName(); @@ -51,12 +52,43 @@ public abstract class Platform { public String getLibraryName() { return "native-platform.dll"; } + + @Override + public T get(Class type) { + if (type.equals(net.rubygrapefruit.platform.Process.class)) { + return type.cast(new DefaultProcess()); + } + if (type.equals(TerminalAccess.class)) { + return type.cast(new WindowsTerminalAccess()); + } + return super.get(type); + } } private static abstract class Posix extends Platform { @Override - public boolean isPosix() { - return true; + public T get(Class type) { + if (type.equals(PosixFile.class)) { + return type.cast(new DefaultPosixFile()); + } + if (type.equals(Process.class)) { + return type.cast(new DefaultProcess()); + } + if (type.equals(TerminalAccess.class)) { + return type.cast(new TerminfoTerminalAccess()); + } + if (type.equals(SystemInfo.class)) { + MutableSystemInfo systemInfo = new MutableSystemInfo(); + FunctionResult result = new FunctionResult(); + NativeLibraryFunctions.getSystemInfo(systemInfo, result); + if (result.isFailed()) { + throw new NativeException(String.format("Could not fetch system information: %s", + result.getMessage())); + } + System.out.println("=> CHARACTER ENCODING: " + systemInfo.characterEncoding); + return type.cast(systemInfo); + } + return super.get(type); } } @@ -75,8 +107,11 @@ public abstract class Platform { private static class OsX extends Posix { @Override - public boolean isOsX() { - return true; + public T get(Class type) { + if (type.equals(FileSystems.class)) { + return type.cast(new PosixFileSystems()); + } + return super.get(type); } @Override