source: launchers/macosx/I2PLauncher/routermgmt/DetectJava.swift @ 3c0a8cf

Last change on this file since 3c0a8cf was 3c0a8cf, checked in by meeh <meeh@…>, 23 months ago

Mac OSX Launcher: A lot of bugfixes, refactoring and cleanup.

  • Property mode set to 100644
File size: 5.2 KB
Line 
1//
2//  DetectJava.swift
3//  JavaI2PWrapper
4//
5//  Created by Mikal Villa on 24/03/2018.
6//  Copyright © 2018 I2P. All rights reserved.
7//
8
9import Foundation
10
11@objc class DetectJava : NSObject {
12 
13  static var hasJRE : Bool = false
14  static var userWantJRE : Bool = false
15  static var userAcceptOracleEULA : Bool = false
16 
17 
18  override init() {
19    super.init()
20  }
21 
22  // Java checks
23  @objc var javaHome: String = ""{
24   
25    //Called before the change
26    willSet(newValue){
27      print("DetectJava.javaHome will change from "+self.javaHome+" to "+newValue)
28    }
29   
30    //Called after the change
31    didSet{
32      DetectJava.hasJRE = true
33      self.javaHome = self.javaHome.replace(target: "\n", withString: "").replace(target: "Internet Plug-Ins", withString: "Internet\\ Plug-Ins")
34      print("DetectJava.javaHome did change to "+self.javaHome)
35    }
36  };
37  private var testedEnv : Bool = false
38  private var testedJH : Bool = false
39  private var testedDfl : Bool = false
40 
41  @objc func isJavaFound() -> Bool {
42    if !(self.javaHome.isEmpty) {
43      return true
44    }
45    return false
46  }
47 
48  /**
49   *
50   * The order of the code blocks will decide the order, which will define the preffered.
51   *
52   **/
53  @objc func findIt() {
54    if (DetectJava.hasJRE) {
55      return
56    }
57    print("Start with checking environment variable")
58    self.checkJavaEnvironmentVariable()
59    if !(self.javaHome.isEmpty) {
60      RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome)
61      DetectJava.hasJRE = true
62      return
63    }
64    print("Checking with the java_home util")
65    self.runJavaHomeCmd()
66    if !(self.javaHome.isEmpty) {
67      RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome)
68      DetectJava.hasJRE = true
69      return
70    }
71    print("Checking default JRE install path")
72    self.checkDefaultJREPath()
73    if !(self.javaHome.isEmpty) {
74      RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome)
75      DetectJava.hasJRE = true
76      return
77    }
78  }
79 
80  @objc func runJavaHomeCmd() {
81    let task = Process()
82    task.launchPath = "/usr/libexec/java_home"
83    task.arguments = []
84    let pipe = Pipe()
85    task.standardOutput = pipe
86    let outHandle = pipe.fileHandleForReading
87    outHandle.waitForDataInBackgroundAndNotify()
88   
89    var obs1 : NSObjectProtocol!
90    obs1 = NotificationCenter.default.addObserver(forName: NSNotification.Name.NSFileHandleDataAvailable,
91                                                  object: outHandle, queue: nil) {  notification -> Void in
92                                                    let data = outHandle.availableData
93                                                    if data.count > 0 {
94                                                      let str = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
95                                                      if (str != nil) {
96                                                        let stringVal = str! as String
97                                                        print("got output: "+stringVal)
98                                                        // Adding java binary here to be alike the rest
99                                                        self.javaHome = stringVal + "/jre/bin/java"
100                                                      }
101                                                      // TODO: Found something, check it out
102                                                      outHandle.waitForDataInBackgroundAndNotify()
103                                                    } else {
104                                                      print("EOF on stdout from process")
105                                                      NotificationCenter.default.removeObserver(obs1)
106                                                      // No JRE so far
107                                                    }
108    }
109   
110    var obs2 : NSObjectProtocol!
111    obs2 = NotificationCenter.default.addObserver(forName: Process.didTerminateNotification,
112                                                  object: task, queue: nil) { notification -> Void in
113                                                    print("terminated")
114                                                    NotificationCenter.default.removeObserver(obs2)
115    }
116   
117    task.launch()
118    task.waitUntilExit()
119    self.testedJH = true
120  }
121 
122  @objc func checkDefaultJREPath() {
123    let defaultJREPath = "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java"
124    if FileManager.default.fileExists(atPath: defaultJREPath) {
125      // Found it!!
126      self.javaHome = defaultJREPath
127    }
128    self.testedDfl = true
129    // No JRE here
130  }
131 
132  @objc func getEnvironmentVar(_ name: String) -> String? {
133    guard let rawValue = getenv(name) else { return nil }
134    return String(utf8String: rawValue)
135  }
136 
137  @objc func checkJavaEnvironmentVariable() {
138    let dic = ProcessInfo.processInfo.environment
139    //ProcessInfo.processInfo.environment["JAVA_HOME"]
140    if let javaHomeEnv = dic["JAVA_HOME"] {
141      // Maybe we got an JRE
142      print("Found JAVA_HOME with value:")
143      print(javaHomeEnv)
144      self.javaHome = javaHomeEnv
145    }
146    self.testedEnv = true
147    print("JAVA HOME is not set")
148  }
149 
150 
151}
Note: See TracBrowser for help on using the repository browser.