diff --git a/launchers/macosx/I2PLauncher/routermgmt/DetectJava.swift b/launchers/macosx/I2PLauncher/routermgmt/DetectJava.swift index 43a60c6c5..051206c00 100644 --- a/launchers/macosx/I2PLauncher/routermgmt/DetectJava.swift +++ b/launchers/macosx/I2PLauncher/routermgmt/DetectJava.swift @@ -11,14 +11,37 @@ import Foundation @objc class DetectJava : NSObject { static var hasJRE : Bool = false + static var hasJDK : Bool = false static var userWantJRE : Bool = false static var userAcceptOracleEULA : Bool = false + private static var sharedDetectJava: DetectJava = { + let javaDetector = DetectJava() + + // Configuration + // ... + return javaDetector + }() - override init() { + // Initialization + + private override init() { super.init() } + // MARK: - Accessors + + + class func shared() -> DetectJava { + return sharedDetectJava + } + + @objc var javaBinary: String? { + didSet{ + print("DetectJava.javaBinary was set to "+self.javaBinary!) + } + } + // Java checks @objc var javaHome: String = ""{ @@ -30,7 +53,8 @@ import Foundation //Called after the change didSet{ DetectJava.hasJRE = true - self.javaHome = self.javaHome.replace(target: "\n", withString: "").replace(target: "Internet Plug-Ins", withString: "Internet\\ Plug-Ins") + // javaHome will have a trailing \n which we remove to not break the cli + self.javaBinary = (self.javaHome+"/bin/java").replace(target: "\n", withString: "") print("DetectJava.javaHome did change to "+self.javaHome) RouterManager.shared().eventManager.trigger(eventName: "java_found", information: self.javaHome) } @@ -58,61 +82,65 @@ import Foundation print("Start with checking environment variable") self.checkJavaEnvironmentVariable() if !(self.javaHome.isEmpty) { - RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome) DetectJava.hasJRE = true return } print("Checking with the java_home util") self.runJavaHomeCmd() if !(self.javaHome.isEmpty) { - RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome) DetectJava.hasJRE = true return } print("Checking default JRE install path") self.checkDefaultJREPath() if !(self.javaHome.isEmpty) { - RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome) DetectJava.hasJRE = true return } } + @objc func getJavaViaLibexecBin() -> Array { + return ["/usr/libexec/java_home", "-v", "1.7+", "--exec", "java"] + } + @objc func runJavaHomeCmd() { let task = Process() task.launchPath = "/usr/libexec/java_home" - task.arguments = [] + task.arguments = ["-v", "1.7+"] let pipe = Pipe() task.standardOutput = pipe let outHandle = pipe.fileHandleForReading outHandle.waitForDataInBackgroundAndNotify() var obs1 : NSObjectProtocol! - obs1 = NotificationCenter.default.addObserver(forName: NSNotification.Name.NSFileHandleDataAvailable, - object: outHandle, queue: nil) { notification -> Void in - let data = outHandle.availableData - if data.count > 0 { - let str = NSString(data: data, encoding: String.Encoding.utf8.rawValue) - if (str != nil) { - let stringVal = str! as String - print("got output: "+stringVal) - // Adding java binary here to be alike the rest - self.javaHome = stringVal + "/jre/bin/java" - } - // TODO: Found something, check it out - outHandle.waitForDataInBackgroundAndNotify() - } else { - print("EOF on stdout from process") - NotificationCenter.default.removeObserver(obs1) - // No JRE so far - } + obs1 = NotificationCenter.default.addObserver( + forName: NSNotification.Name.NSFileHandleDataAvailable, + object: outHandle, queue: nil) { + notification -> Void in + let data = outHandle.availableData + if data.count > 0 { + let str = NSString(data: data, encoding: String.Encoding.utf8.rawValue) + if (str != nil) { + let stringVal = str! as String + print("got output: "+stringVal) + self.javaHome = stringVal + } + // TODO: Found something, check it out + outHandle.waitForDataInBackgroundAndNotify() + } else { + print("EOF on stdout from process") + NotificationCenter.default.removeObserver(obs1) + // No JRE so far + } } var obs2 : NSObjectProtocol! - obs2 = NotificationCenter.default.addObserver(forName: Process.didTerminateNotification, - object: task, queue: nil) { notification -> Void in - print("terminated") - NotificationCenter.default.removeObserver(obs2) + obs2 = NotificationCenter.default.addObserver( + forName: Process.didTerminateNotification, + object: task, queue: nil) { + notification -> Void in + print("terminated") + NotificationCenter.default.removeObserver(obs2) } task.launch() @@ -120,9 +148,11 @@ import Foundation self.testedJH = true } + @objc func checkDefaultJREPath() { - let defaultJREPath = "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java" - if FileManager.default.fileExists(atPath: defaultJREPath) { + var isDir : ObjCBool = false; + let defaultJREPath = "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home" + if (FileManager.default.fileExists(atPath: defaultJREPath, isDirectory:&isDir) && isDir.boolValue) { // Found it!! self.javaHome = defaultJREPath } @@ -137,7 +167,6 @@ import Foundation @objc func checkJavaEnvironmentVariable() { let dic = ProcessInfo.processInfo.environment - //ProcessInfo.processInfo.environment["JAVA_HOME"] if let javaHomeEnv = dic["JAVA_HOME"] { // Maybe we got an JRE print("Found JAVA_HOME with value:")