Skip to content

Commit a4aad18

Browse files
authored
Add AndroidSdkInfo.DetectAndSetPreferredJavaSdkPathToLatest() (#35)
Context: https://paper.dropbox.com/doc/OpenJDK-and-You--AH1yWKdVXgno~uXYfmcUAZTwAg-NoECAe2XkBQeoxFfGL6ea Add `AndroidSdkInfo.DetectAndSetPreferredJavaSdkPathToLatest()`.
1 parent fae7e0a commit a4aad18

File tree

4 files changed

+83
-6
lines changed

4 files changed

+83
-6
lines changed

src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,5 +171,20 @@ public static void SetPreferredJavaSdkPath (string path, Action<TraceLevel, stri
171171
var sdk = CreateSdk (logger);
172172
sdk.SetPreferredJavaSdkPath (path);
173173
}
174+
175+
public static void DetectAndSetPreferredJavaSdkPathToLatest (Action<TraceLevel, string> logger = null)
176+
{
177+
if (OS.IsWindows)
178+
throw new NotImplementedException ("Windows is not supported at this time.");
179+
180+
logger = logger ?? DefaultConsoleLogger;
181+
182+
var latestJdk = JdkInfo.GetMacOSMicrosoftJdks (logger).FirstOrDefault ();
183+
if (latestJdk == null)
184+
throw new NotSupportedException ("No Microsoft OpenJDK could be found. Please re-run the Visual Studio installer or manually specify the JDK path in settings.");
185+
186+
var sdk = CreateSdk (logger);
187+
sdk.SetPreferredJavaSdkPath (latestJdk.HomePath);
188+
}
174189
}
175190
}

src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ static IEnumerable<string> GetConfiguredJdkPaths (Action<TraceLevel, string> log
236236
}
237237
}
238238

239-
static IEnumerable<JdkInfo> GetMacOSMicrosoftJdks (Action<TraceLevel, string> logger)
239+
internal static IEnumerable<JdkInfo> GetMacOSMicrosoftJdks (Action<TraceLevel, string> logger)
240240
{
241241
return GetMacOSMicrosoftJdkPaths ()
242242
.Select (p => TryGetJdkInfo (p, logger))
@@ -246,8 +246,12 @@ static IEnumerable<JdkInfo> GetMacOSMicrosoftJdks (Action<TraceLevel, string> lo
246246

247247
static IEnumerable<string> GetMacOSMicrosoftJdkPaths ()
248248
{
249-
var home = Environment.GetFolderPath (Environment.SpecialFolder.Personal);
250-
var jdks = Path.Combine (home, "Library", "Developer", "Xamarin", "jdk");
249+
var jdks = AppDomain.CurrentDomain.GetData ($"GetMacOSMicrosoftJdkPaths jdks override! {typeof (JdkInfo).AssemblyQualifiedName}")
250+
?.ToString ();
251+
if (jdks == null) {
252+
var home = Environment.GetFolderPath (Environment.SpecialFolder.Personal);
253+
jdks = Path.Combine (home, "Library", "Developer", "Xamarin", "jdk");
254+
}
251255
if (!Directory.Exists (jdks))
252256
return Enumerable.Empty <string> ();
253257

src/Xamarin.Android.Tools.AndroidSdk/Tests/AndroidSdkInfoTests.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Diagnostics;
44
using System.IO;
55
using System.Text;
6+
using System.Xml.Linq;
67

78
using NUnit.Framework;
89

@@ -160,5 +161,56 @@ protected void Exec (string exe, string args)
160161
proc.WaitForExit ();
161162
}
162163
}
164+
165+
[Test]
166+
public void DetectAndSetPreferredJavaSdkPathToLatest ()
167+
{
168+
Action<TraceLevel, string> logger = (level, message) => {
169+
Console.WriteLine ($"[{level}] {message}");
170+
};
171+
var jdks = Path.GetTempFileName ();
172+
File.Delete (jdks);
173+
Directory.CreateDirectory (jdks);
174+
AppDomain.CurrentDomain.SetData ($"GetMacOSMicrosoftJdkPaths jdks override! {typeof (JdkInfo).AssemblyQualifiedName}", jdks);
175+
176+
var backupConfig = UnixConfigPath + "." + Path.GetRandomFileName ();
177+
try {
178+
if (OS.IsWindows) {
179+
Assert.Throws<NotImplementedException>(() => AndroidSdkInfo.DetectAndSetPreferredJavaSdkPathToLatest (logger));
180+
return;
181+
}
182+
Assert.Throws<NotSupportedException>(() => AndroidSdkInfo.DetectAndSetPreferredJavaSdkPathToLatest (logger));
183+
var newJdkPath = Path.Combine (jdks, "microsoft_dist_openjdk_1.8.999");
184+
JdkInfoTests.CreateFauxJdk (newJdkPath, "1.8.999");
185+
186+
if (File.Exists (UnixConfigPath))
187+
File.Move (UnixConfigPath, backupConfig);
188+
189+
AndroidSdkInfo.DetectAndSetPreferredJavaSdkPathToLatest (logger);
190+
AssertJdkPath (newJdkPath);
191+
}
192+
finally {
193+
AppDomain.CurrentDomain.SetData ($"GetMacOSMicrosoftJdkPaths jdks override! {typeof (JdkInfo).AssemblyQualifiedName}", null);
194+
Directory.Delete (jdks, recursive: true);
195+
if (File.Exists (backupConfig))
196+
File.Move (backupConfig, UnixConfigPath);
197+
}
198+
}
199+
200+
static void AssertJdkPath (string expectedJdkPath)
201+
{
202+
var config_file = XDocument.Load (UnixConfigPath);
203+
var javaEl = config_file.Root.Element ("java-sdk");
204+
var actualJdkPath = (string) javaEl.Attribute ("path");
205+
206+
Assert.AreEqual (expectedJdkPath, actualJdkPath);
207+
}
208+
209+
static string UnixConfigPath {
210+
get {
211+
var p = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData);
212+
return Path.Combine (Path.Combine (p, "xbuild"), "monodroid-config.xml");
213+
}
214+
}
163215
}
164216
}

src/Xamarin.Android.Tools.AndroidSdk/Tests/JdkInfoTests.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,18 @@ public void CreateFauxJdk ()
3434
{
3535
var dir = Path.GetTempFileName();
3636
File.Delete (dir);
37+
38+
CreateFauxJdk (dir, "1.2.3.4");
39+
40+
FauxJdkDir = dir;
41+
}
42+
43+
internal static void CreateFauxJdk (string dir, string version)
44+
{
3745
Directory.CreateDirectory (dir);
3846

3947
using (var release = new StreamWriter (Path.Combine (dir, "release"))) {
40-
release.WriteLine ("JAVA_VERSION=\"1.2.3.4\"");
48+
release.WriteLine ($"JAVA_VERSION=\"{version}\"");
4149
}
4250

4351
var bin = Path.Combine (dir, "bin");
@@ -56,8 +64,6 @@ public void CreateFauxJdk ()
5664
CreateShellScript (Path.Combine (dir, "jli", "libjli.dylib"), "");
5765
CreateShellScript (Path.Combine (jre, "libjvm.so"), "");
5866
CreateShellScript (Path.Combine (jre, "jvm.dll"), "");
59-
60-
FauxJdkDir = dir;
6167
}
6268

6369
[OneTimeTearDown]

0 commit comments

Comments
 (0)