source: launchers/macosx/I2PLauncher/routermgmt/DetectJava.swift @ 281c5f57

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

Bugfixes, improvements, more error handling and stability to the osx launcher.

  • Property mode set to 100644
File size: 4.9 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  var hasJRE : Bool = false
14  var userWantJRE : Bool = false
15  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      hasJRE = true
33      print("DetectJava.javaHome did change from "+oldValue+" to "+self.javaHome)
34    }
35  };
36  private var testedEnv : Bool = false
37  private var testedJH : Bool = false
38  private var testedDfl : Bool = false
39 
40  @objc func isJavaFound() -> Bool {
41    if !(self.javaHome.isEmpty) {
42      return true
43    }
44    return false
45  }
46 
47  /**
48   *
49   * The order of the code blocks will decide the order, which will define the preffered.
50   *
51   **/
52  @objc func findIt() {
53    print("Start with checking environment variable")
54    self.checkJavaEnvironmentVariable()
55    if !(self.javaHome.isEmpty) {
56      RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome)
57      hasJRE = true
58      return
59    }
60    print("Checking with the java_home util")
61    self.runJavaHomeCmd()
62    if !(self.javaHome.isEmpty) {
63      RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome)
64      hasJRE = true
65      return
66    }
67    print("Checking default JRE install path")
68    self.checkDefaultJREPath()
69    if !(self.javaHome.isEmpty) {
70      RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome)
71      hasJRE = true
72      return
73    }
74  }
75 
76  @objc func runJavaHomeCmd() {
77    let task = Process()
78    task.launchPath = "/usr/libexec/java_home"
79    task.arguments = []
80    let pipe = Pipe()
81    task.standardOutput = pipe
82    let outHandle = pipe.fileHandleForReading
83    outHandle.waitForDataInBackgroundAndNotify()
84   
85    var obs1 : NSObjectProtocol!
86    obs1 = NotificationCenter.default.addObserver(forName: NSNotification.Name.NSFileHandleDataAvailable,
87                                                  object: outHandle, queue: nil) {  notification -> Void in
88                                                    let data = outHandle.availableData
89                                                    if data.count > 0 {
90                                                      let str = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
91                                                      if (str != nil) {
92                                                        let stringVal = str! as String
93                                                        print("got output: "+stringVal)
94                                                        // Adding java binary here to be alike the rest
95                                                        self.javaHome = stringVal + "/jre/bin/java"
96                                                      }
97                                                      // TODO: Found something, check it out
98                                                      outHandle.waitForDataInBackgroundAndNotify()
99                                                    } else {
100                                                      print("EOF on stdout from process")
101                                                      NotificationCenter.default.removeObserver(obs1)
102                                                      // No JRE so far
103                                                    }
104    }
105   
106    var obs2 : NSObjectProtocol!
107    obs2 = NotificationCenter.default.addObserver(forName: Process.didTerminateNotification,
108                                                  object: task, queue: nil) { notification -> Void in
109                                                    print("terminated")
110                                                    NotificationCenter.default.removeObserver(obs2)
111    }
112   
113    task.launch()
114    task.waitUntilExit()
115    self.testedJH = true
116  }
117 
118  @objc func checkDefaultJREPath() {
119    let defaultJREPath = "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java"
120    if FileManager.default.fileExists(atPath: defaultJREPath) {
121      // Found it!!
122      self.javaHome = defaultJREPath
123    }
124    self.testedDfl = true
125    // No JRE here
126  }
127 
128  @objc func getEnvironmentVar(_ name: String) -> String? {
129    guard let rawValue = getenv(name) else { return nil }
130    return String(utf8String: rawValue)
131  }
132 
133  @objc func checkJavaEnvironmentVariable() {
134    let dic = ProcessInfo.processInfo.environment
135    //ProcessInfo.processInfo.environment["JAVA_HOME"]
136    if let javaHomeEnv = dic["JAVA_HOME"] {
137      // Maybe we got an JRE
138      print("Found JAVA_HOME with value:")
139      print(javaHomeEnv)
140      self.javaHome = javaHomeEnv
141    }
142    self.testedEnv = true
143    print("JAVA HOME is not set")
144  }
145 
146 
147}
Note: See TracBrowser for help on using the repository browser.