| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: false | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-26 22:36:04 +08:00
										 |  |  | require "language/java" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-19 06:50:53 +02:00
										 |  |  | # A requirement on Java. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # @api private | 
					
						
							| 
									
										
										
										
											2015-06-15 09:56:04 +01:00
										 |  |  | class JavaRequirement < Requirement | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |   extend T::Sig | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-26 22:36:04 +08:00
										 |  |  |   fatal true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-02 16:29:49 -05:00
										 |  |  |   attr_reader :java_home, :version | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-18 09:55:44 +01:00
										 |  |  |   # A strict Java 8 requirement (1.8) should prompt the user to install | 
					
						
							| 
									
										
										
										
											2019-04-19 17:52:47 +02:00
										 |  |  |   # an OpenJDK 1.8 distribution. Versions newer than Java 8 are not | 
					
						
							| 
									
										
										
										
											2018-04-18 09:55:44 +01:00
										 |  |  |   # completely backwards compatible, and contain breaking changes such as | 
					
						
							|  |  |  |   # strong encapsulation of JDK-internal APIs and a modified version scheme | 
					
						
							|  |  |  |   # (*.0 not 1.*). | 
					
						
							| 
									
										
										
										
											2019-04-19 17:52:47 +02:00
										 |  |  |   def suggestion | 
					
						
							|  |  |  |     if fits_latest? | 
					
						
							|  |  |  |       JAVA_SUGGESTION_MAP.fetch(JAVA_SUGGESTION_MAP.keys.max) | 
					
						
							| 
									
										
										
										
											2018-04-18 09:55:44 +01:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2019-04-19 17:52:47 +02:00
										 |  |  |       JAVA_SUGGESTION_MAP.fetch("1.8") | 
					
						
							| 
									
										
										
										
											2018-04-18 09:55:44 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-17 15:32:44 +01:00
										 |  |  |   satisfy build_env: false do | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |     setup_java | 
					
						
							|  |  |  |     next false unless @java | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |     next true | 
					
						
							| 
									
										
										
										
											2015-02-26 22:36:04 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-30 18:58:30 +00:00
										 |  |  |   def initialize(tags = []) | 
					
						
							| 
									
										
										
										
											2019-10-13 19:26:39 +01:00
										 |  |  |     @version = tags.shift if tags.first&.match?(/^\d/) | 
					
						
							| 
									
										
										
										
											2018-10-19 16:38:41 +01:00
										 |  |  |     super(tags) | 
					
						
							| 
									
										
										
										
											2019-06-10 10:37:09 +08:00
										 |  |  |     @cask = suggestion.token | 
					
						
							| 
									
										
										
										
											2015-02-26 22:36:04 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |   sig { returns(String) } | 
					
						
							| 
									
										
										
										
											2015-02-26 22:36:04 +08:00
										 |  |  |   def message | 
					
						
							|  |  |  |     version_string = " #{@version}" if @version | 
					
						
							| 
									
										
										
										
											2020-11-01 12:26:18 -05:00
										 |  |  |     s = "Java#{version_string} is required for this software.\n" | 
					
						
							| 
									
										
										
										
											2019-04-19 17:52:47 +02:00
										 |  |  |     s += suggestion | 
					
						
							| 
									
										
										
										
											2015-02-26 22:36:04 +08:00
										 |  |  |     s | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |   sig { returns(String) } | 
					
						
							| 
									
										
										
										
											2015-02-26 22:36:04 +08:00
										 |  |  |   def inspect | 
					
						
							| 
									
										
										
										
											2020-11-01 12:22:56 -05:00
										 |  |  |     "#<#{self.class.name}: version=#{@version.inspect} #{tags.inspect}>" | 
					
						
							| 
									
										
										
										
											2015-02-26 22:36:04 +08:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-09-18 00:37:02 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def display_s | 
					
						
							|  |  |  |     if @version | 
					
						
							| 
									
										
										
										
											2020-03-13 21:15:06 +00:00
										 |  |  |       op = if exact_version? | 
					
						
							|  |  |  |         "=" | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2020-03-13 21:15:06 +00:00
										 |  |  |         ">=" | 
					
						
							| 
									
										
										
										
											2016-09-18 00:37:02 -04:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-11-01 12:02:13 -05:00
										 |  |  |       "#{name.capitalize} #{op} #{version_without_plus}" | 
					
						
							| 
									
										
										
										
											2016-09-18 00:37:02 -04:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2020-11-01 12:02:13 -05:00
										 |  |  |       name.capitalize | 
					
						
							| 
									
										
										
										
											2016-09-18 00:37:02 -04:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-19 17:52:47 +02:00
										 |  |  |   CaskSuggestion = Struct.new(:token, :title) do | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |     extend T::Sig | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sig { returns(String) } | 
					
						
							| 
									
										
										
										
											2019-04-19 17:52:47 +02:00
										 |  |  |     def to_str | 
					
						
							|  |  |  |       title_string = " #{title}" if title | 
					
						
							|  |  |  |       <<~EOS | 
					
						
							|  |  |  |         Install#{title_string} with Homebrew Cask: | 
					
						
							|  |  |  |           brew cask install #{token} | 
					
						
							|  |  |  |       EOS | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   JAVA_SUGGESTION_MAP = { | 
					
						
							|  |  |  |     "1.8"  => CaskSuggestion.new( | 
					
						
							|  |  |  |       "homebrew/cask-versions/adoptopenjdk8", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |       "AdoptOpenJDK 8", | 
					
						
							| 
									
										
										
										
											2019-04-19 17:52:47 +02:00
										 |  |  |     ), | 
					
						
							|  |  |  |     "12.0" => CaskSuggestion.new("adoptopenjdk", "AdoptOpenJDK"), | 
					
						
							| 
									
										
										
										
											2018-04-18 09:55:44 +01:00
										 |  |  |   }.freeze | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |   def version_without_plus | 
					
						
							|  |  |  |     if exact_version? | 
					
						
							|  |  |  |       @version | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2017-06-01 16:06:51 +02:00
										 |  |  |       @version[0, @version.length - 1] | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def exact_version? | 
					
						
							| 
									
										
										
										
											2020-07-07 13:12:37 +01:00
										 |  |  |     @version && @version.to_s[-1] != "+" | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-19 17:52:47 +02:00
										 |  |  |   def fits_latest? | 
					
						
							|  |  |  |     @version.nil? || | 
					
						
							|  |  |  |       @version.to_s.end_with?("+") || | 
					
						
							|  |  |  |       @version.to_f >= JAVA_SUGGESTION_MAP.keys.max.to_f | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |   def setup_java | 
					
						
							|  |  |  |     java = preferred_java | 
					
						
							|  |  |  |     return unless java | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |     @java = java | 
					
						
							|  |  |  |     @java_home = java.parent.parent | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def possible_javas | 
					
						
							|  |  |  |     javas = [] | 
					
						
							|  |  |  |     javas << Pathname.new(ENV["JAVA_HOME"])/"bin/java" if ENV["JAVA_HOME"] | 
					
						
							|  |  |  |     jdk = begin | 
					
						
							| 
									
										
										
										
											2019-07-07 10:08:56 -07:00
										 |  |  |       Formula["adoptopenjdk"] | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |     rescue FormulaUnavailableError | 
					
						
							|  |  |  |       nil | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-05-18 13:50:43 +01:00
										 |  |  |     javas << jdk.bin/"java" if jdk&.latest_version_installed? | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |     javas << which("java") | 
					
						
							|  |  |  |     javas | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def preferred_java | 
					
						
							| 
									
										
										
										
											2018-09-02 20:14:54 +01:00
										 |  |  |     possible_javas.find do |java| | 
					
						
							| 
									
										
										
										
											2017-09-24 19:24:46 +01:00
										 |  |  |       next false unless java&.executable? | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |       next true unless @version | 
					
						
							|  |  |  |       next true if satisfies_version(java) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def env_java_common | 
					
						
							| 
									
										
										
										
											2017-02-15 21:47:08 -08:00
										 |  |  |     return unless @java_home | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |     java_home = Pathname.new(@java_home) | 
					
						
							|  |  |  |     ENV["JAVA_HOME"] = java_home | 
					
						
							|  |  |  |     ENV.prepend_path "PATH", java_home/"bin" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def env_oracle_jdk | 
					
						
							| 
									
										
										
										
											2017-02-15 21:47:08 -08:00
										 |  |  |     return unless @java_home | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |     java_home = Pathname.new(@java_home) | 
					
						
							| 
									
										
										
										
											2017-02-15 21:47:08 -08:00
										 |  |  |     return unless (java_home/"include").exist? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |     ENV.append_to_cflags "-I#{java_home}/include" | 
					
						
							|  |  |  |     ENV.append_to_cflags "-I#{java_home}/include/#{oracle_java_os}" | 
					
						
							| 
									
										
										
										
											2017-02-15 21:47:08 -08:00
										 |  |  |     true | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def oracle_java_os | 
					
						
							|  |  |  |     nil | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def satisfies_version(java) | 
					
						
							| 
									
										
										
										
											2019-02-06 14:48:19 -08:00
										 |  |  |     java_version_s = system_command(java, args: ["-version"], print_stderr: false).stderr[/\d+(\.\d+)?/] | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |     return false unless java_version_s | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  |     java_version = Version.create(java_version_s) | 
					
						
							|  |  |  |     needed_version = Version.create(version_without_plus) | 
					
						
							|  |  |  |     if exact_version? | 
					
						
							|  |  |  |       java_version == needed_version | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       java_version >= needed_version | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2015-02-26 22:36:04 +08:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2016-12-04 18:43:46 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | require "extend/os/requirements/java_requirement" |