forked from PCL-Community/PCL.Neo
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathJavaManager.cs
More file actions
148 lines (136 loc) · 5.93 KB
/
JavaManager.cs
File metadata and controls
148 lines (136 loc) · 5.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
using PCL.Neo.Core.Utils;
namespace PCL.Neo.Core.Models.Minecraft.Java;
/// <summary>
/// 测试
/// </summary>
public sealed partial class JavaManager : IJavaManager
{
public const int JavaListCacheVersion = 0; // [INFO] Java 缓存版本号,大版本更新后应该增加
public bool IsInitialized { get; private set; } = false;
public List<JavaRuntime> JavaList { get; private set; } = [];
/// <summary>
/// 初始化 Java 列表,但除非没有 Java,否则不进行检查。
/// <remarks> TODO)) 更换为 Logger.cs 中的 logger </remarks>
/// </summary>
public async Task JavaListInit()
{
if (IsInitialized) return;
JavaList = [];
try
{
// TODO)) 如果本地缓存中已有 Java 列表则读取缓存
int readJavaListCacheVersion = 0; // TODO)) 此数字应该从缓存中读取
if (readJavaListCacheVersion < JavaListCacheVersion)
{
// TODO)) 设置本地版本号为 JavaListCacheVersion
Console.WriteLine("[Java] 要求 Java 列表缓存更新");
}
else
{
// TODO)) 从本地缓存中读取 Java 列表
}
if (JavaList.Count == 0)
{
Console.WriteLine("[Java] 初始化未找到可用的 Java,将自动触发搜索");
JavaList = (await SearchJava()).ToList();
Console.Write($"[Java] 搜索完成 ");
}
else
{
Console.WriteLine($"[Java] 缓存中有{JavaList.Count}个可用的 Java:");
}
IsInitialized = true;
TestOutput();
}
catch (Exception e)
{
Console.WriteLine("初始化 Java 失败");
IsInitialized = false;
throw;
}
}
public async Task<(JavaRuntime?, bool UpdateCurrent)> ManualAdd(string javaDir)
{
if (!IsInitialized) return (null, false);
if (JavaList.FirstOrDefault(runtime => runtime.DirectoryPath == javaDir) is { } existingRuntime)
{
Console.WriteLine("选择的 Java 在列表中已存在,将其标记为手动导入。");
existingRuntime.IsUserImport = true;
return (existingRuntime, true);
}
var entity = await JavaRuntime.CreateJavaEntityAsync(javaDir, true);
if (entity is { Compability: not JavaCompability.Error })
{
JavaList.Add(entity);
Console.WriteLine("已成功添加!");
return (entity, false);
}
Console.WriteLine("添加的 Java 文件无法运行!");
return (null, false);
}
public async Task Refresh()
{
if (!IsInitialized) return;
IsInitialized = false;
Console.WriteLine("[Java] 正在刷新 Java");
List<JavaRuntime> newEntities = [];
// 对于用户手动导入的 Java,保留并重新检查可用性
var oldManualEntities = JavaList.FindAll(entity => entity.IsUserImport);
JavaList.Clear();
var searchedEntities = (await SearchJava()).ToList();
newEntities.AddRange(searchedEntities);
foreach (var oldRuntime in oldManualEntities.Where(entity =>
searchedEntities.All(javaEntity => javaEntity.DirectoryPath != entity.DirectoryPath)))
if (await oldRuntime.RefreshInfo())
newEntities.Add(oldRuntime);
else
Console.WriteLine($"[Java] 用户导入的 Java 已不可用,已自动剔除:{oldRuntime.DirectoryPath}");
JavaList = newEntities;
Console.WriteLine($"[Java] 刷新 Java 完成,现在共有 {JavaList.Count} 个Java");
if (JavaList.Count == 0)
{
// TODO)) 提示用户未找到已安装的 java,是否自动下载合适版本,然后再下载
var neo2SysDir = Directory.CreateDirectory(
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"PCL.Neo", "Java")); // TODO)) 此处的路径等配置文件的模块写好了以后应该从配置文件中获取
var cts = new CancellationTokenSource();
var progress =
new Progress<(int, int)>(value =>
Console.WriteLine(
$"下载进度:已下载{value.Item1}/总文件数{value.Item2}")); // TODO)) 后续这个 progress 可以设置成在 UI 上显示
var fetchedJavaDir = await FetchJavaOnline(Const.Platform, neo2SysDir.FullName,
MojangJavaVersion.Α, progress, cts.Token);
if (fetchedJavaDir != null)
{
var runtime = await JavaRuntime.CreateJavaEntityAsync(fetchedJavaDir, true);
JavaList.Add(runtime!);
}
}
IsInitialized = true;
TestOutput();
}
private static async Task<IEnumerable<JavaRuntime>> SearchJava()
{
return Const.Os switch
{
Const.RunningOs.Windows => await Windows.SearchJavaAsync(),
Const.RunningOs.Linux or Const.RunningOs.MacOs => await Unix.SearchJavaAsync(Const.Os),
_ => throw new PlatformNotSupportedException()
};
}
public void TestOutput()
{
if (!IsInitialized) return;
Console.WriteLine("当前有 " + JavaList.Count + " 个 Java");
foreach (JavaRuntime? javaEntity in JavaList)
{
Console.WriteLine("--------------------");
Console.WriteLine("路径: " + javaEntity.DirectoryPath);
Console.WriteLine((string?)("是否兼容: " + javaEntity.Compability));
Console.WriteLine((string?)("架构:" + javaEntity.Architecture));
Console.WriteLine("发行商:" + javaEntity.Implementor);
Console.WriteLine("版本:" + javaEntity.Version);
Console.WriteLine("数字版本:" + javaEntity.SlugVersion);
}
}
}