2018-09-18 15:36:38 +00:00
|
|
|
//
|
|
|
|
// DetectJava.swift
|
|
|
|
// JavaI2PWrapper
|
|
|
|
//
|
|
|
|
// Created by Mikal Villa on 24/03/2018.
|
|
|
|
// Copyright © 2018 I2P. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
import Foundation
|
|
|
|
|
2018-09-19 00:37:16 +00:00
|
|
|
@objc class DetectJava : NSObject {
|
2018-09-18 15:36:38 +00:00
|
|
|
|
2018-09-20 02:38:44 +00:00
|
|
|
static var hasJRE : Bool = false
|
|
|
|
static var userWantJRE : Bool = false
|
|
|
|
static var userAcceptOracleEULA : Bool = false
|
2018-09-18 15:36:38 +00:00
|
|
|
|
2018-09-19 00:37:16 +00:00
|
|
|
|
|
|
|
override init() {
|
|
|
|
super.init()
|
|
|
|
}
|
|
|
|
|
2018-09-18 15:36:38 +00:00
|
|
|
// Java checks
|
2018-09-19 00:37:16 +00:00
|
|
|
@objc var javaHome: String = ""{
|
2018-09-18 15:36:38 +00:00
|
|
|
|
|
|
|
//Called before the change
|
|
|
|
willSet(newValue){
|
|
|
|
print("DetectJava.javaHome will change from "+self.javaHome+" to "+newValue)
|
|
|
|
}
|
|
|
|
|
|
|
|
//Called after the change
|
|
|
|
didSet{
|
2018-09-20 02:38:44 +00:00
|
|
|
DetectJava.hasJRE = true
|
|
|
|
self.javaHome = self.javaHome.replace(target: "\n", withString: "").replace(target: "Internet Plug-Ins", withString: "Internet\\ Plug-Ins")
|
|
|
|
print("DetectJava.javaHome did change to "+self.javaHome)
|
2018-09-18 15:36:38 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
private var testedEnv : Bool = false
|
|
|
|
private var testedJH : Bool = false
|
|
|
|
private var testedDfl : Bool = false
|
|
|
|
|
2018-09-19 00:37:16 +00:00
|
|
|
@objc func isJavaFound() -> Bool {
|
2018-09-18 15:36:38 +00:00
|
|
|
if !(self.javaHome.isEmpty) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2018-09-19 00:37:16 +00:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* The order of the code blocks will decide the order, which will define the preffered.
|
|
|
|
*
|
|
|
|
**/
|
|
|
|
@objc func findIt() {
|
2018-09-20 02:38:44 +00:00
|
|
|
if (DetectJava.hasJRE) {
|
|
|
|
return
|
|
|
|
}
|
2018-09-18 15:36:38 +00:00
|
|
|
print("Start with checking environment variable")
|
|
|
|
self.checkJavaEnvironmentVariable()
|
|
|
|
if !(self.javaHome.isEmpty) {
|
|
|
|
RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome)
|
2018-09-20 02:38:44 +00:00
|
|
|
DetectJava.hasJRE = true
|
2018-09-18 15:36:38 +00:00
|
|
|
return
|
|
|
|
}
|
2018-09-19 00:37:16 +00:00
|
|
|
print("Checking with the java_home util")
|
|
|
|
self.runJavaHomeCmd()
|
2018-09-18 15:36:38 +00:00
|
|
|
if !(self.javaHome.isEmpty) {
|
|
|
|
RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome)
|
2018-09-20 02:38:44 +00:00
|
|
|
DetectJava.hasJRE = true
|
2018-09-18 15:36:38 +00:00
|
|
|
return
|
|
|
|
}
|
2018-09-19 00:37:16 +00:00
|
|
|
print("Checking default JRE install path")
|
|
|
|
self.checkDefaultJREPath()
|
2018-09-18 15:36:38 +00:00
|
|
|
if !(self.javaHome.isEmpty) {
|
|
|
|
RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome)
|
2018-09-20 02:38:44 +00:00
|
|
|
DetectJava.hasJRE = true
|
2018-09-18 15:36:38 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-09-19 00:37:16 +00:00
|
|
|
@objc func runJavaHomeCmd() {
|
2018-09-18 15:36:38 +00:00
|
|
|
let task = Process()
|
|
|
|
task.launchPath = "/usr/libexec/java_home"
|
|
|
|
task.arguments = []
|
|
|
|
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)
|
2018-09-19 00:37:16 +00:00
|
|
|
// Adding java binary here to be alike the rest
|
|
|
|
self.javaHome = stringVal + "/jre/bin/java"
|
2018-09-18 15:36:38 +00:00
|
|
|
}
|
|
|
|
// 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)
|
|
|
|
}
|
|
|
|
|
|
|
|
task.launch()
|
|
|
|
task.waitUntilExit()
|
|
|
|
self.testedJH = true
|
|
|
|
}
|
|
|
|
|
2018-09-19 00:37:16 +00:00
|
|
|
@objc func checkDefaultJREPath() {
|
2018-09-18 15:36:38 +00:00
|
|
|
let defaultJREPath = "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java"
|
|
|
|
if FileManager.default.fileExists(atPath: defaultJREPath) {
|
|
|
|
// Found it!!
|
|
|
|
self.javaHome = defaultJREPath
|
|
|
|
}
|
|
|
|
self.testedDfl = true
|
|
|
|
// No JRE here
|
|
|
|
}
|
|
|
|
|
2018-09-19 00:37:16 +00:00
|
|
|
@objc func getEnvironmentVar(_ name: String) -> String? {
|
2018-09-18 15:36:38 +00:00
|
|
|
guard let rawValue = getenv(name) else { return nil }
|
|
|
|
return String(utf8String: rawValue)
|
|
|
|
}
|
|
|
|
|
2018-09-19 00:37:16 +00:00
|
|
|
@objc func checkJavaEnvironmentVariable() {
|
2018-09-18 15:36:38 +00:00
|
|
|
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:")
|
|
|
|
print(javaHomeEnv)
|
|
|
|
self.javaHome = javaHomeEnv
|
|
|
|
}
|
|
|
|
self.testedEnv = true
|
|
|
|
print("JAVA HOME is not set")
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|