mirror of
https://github.com/GravitLauncher/Launcher
synced 2024-12-23 00:51:01 +03:00
[FEATURE] Новые состояния модулей
This commit is contained in:
parent
f6e2df3e1c
commit
856fe8797d
5 changed files with 39 additions and 22 deletions
|
@ -33,9 +33,22 @@ public LauncherModuleInfo getModuleInfo() {
|
||||||
*/
|
*/
|
||||||
public enum InitStatus
|
public enum InitStatus
|
||||||
{
|
{
|
||||||
CREATED,
|
CREATED(false),
|
||||||
INIT,
|
PRE_INIT_WAIT(true),
|
||||||
FINISH
|
PRE_INIT(false),
|
||||||
|
INIT_WAIT(true),
|
||||||
|
INIT(false),
|
||||||
|
FINISH(true);
|
||||||
|
|
||||||
|
InitStatus(boolean b) {
|
||||||
|
isAvailable = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAvailable() {
|
||||||
|
return isAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final boolean isAvailable;
|
||||||
}
|
}
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface EventHandler<T extends Event>
|
public interface EventHandler<T extends Event>
|
||||||
|
@ -76,6 +89,7 @@ public void setContext(LauncherModulesContext context)
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.modulesManager = context.getModulesManager();
|
this.modulesManager = context.getModulesManager();
|
||||||
this.modulesConfigManager = context.getModulesConfigManager();
|
this.modulesConfigManager = context.getModulesConfigManager();
|
||||||
|
this.setInitStatus(InitStatus.PRE_INIT_WAIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -89,9 +103,17 @@ public void setContext(LauncherModulesContext context)
|
||||||
* Use API Launcher, LaunchServer, ServerWrapper
|
* Use API Launcher, LaunchServer, ServerWrapper
|
||||||
* Change the names of any modules
|
* Change the names of any modules
|
||||||
*/
|
*/
|
||||||
public void preInit() {
|
public void preInitAction() {
|
||||||
//NOP
|
//NOP
|
||||||
}
|
}
|
||||||
|
public LauncherModule preInit()
|
||||||
|
{
|
||||||
|
if(!initStatus.equals(InitStatus.PRE_INIT_WAIT)) throw new IllegalStateException("PreInit not allowed in current state");
|
||||||
|
initStatus = InitStatus.PRE_INIT;
|
||||||
|
preInitAction();
|
||||||
|
initStatus = InitStatus.INIT_WAIT;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Basic module initialization method
|
* Basic module initialization method
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
public interface LauncherModulesManager {
|
public interface LauncherModulesManager {
|
||||||
|
|
||||||
LauncherModule loadModule(LauncherModule module);
|
LauncherModule loadModule(LauncherModule module);
|
||||||
LauncherModule loadModule(Path file) throws IOException;
|
LauncherModule loadModule(Path file) throws IOException;
|
||||||
LauncherModule getModule(String name);
|
LauncherModule getModule(String name);
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
import java.nio.file.attribute.BasicFileAttributes;
|
import java.nio.file.attribute.BasicFileAttributes;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.jar.JarFile;
|
import java.util.jar.JarFile;
|
||||||
|
@ -54,39 +53,30 @@ public void autoload(Path dir) throws IOException {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initModules(LauncherInitContext initContext) {
|
public void initModules(LauncherInitContext initContext) {
|
||||||
List<LauncherModule> startedModules = Collections.unmodifiableList(new ArrayList<>(modules));
|
|
||||||
for(LauncherModule module : startedModules)
|
|
||||||
{
|
|
||||||
module.preInit();
|
|
||||||
}
|
|
||||||
boolean isAnyModuleLoad = true;
|
boolean isAnyModuleLoad = true;
|
||||||
modules.sort((m1, m2) -> {
|
modules.sort((m1, m2) -> {
|
||||||
int priority1 = m1.getModuleInfo().priority;
|
int priority1 = m1.getModuleInfo().priority;
|
||||||
int priority2 = m2.getModuleInfo().priority;
|
int priority2 = m2.getModuleInfo().priority;
|
||||||
return Integer.compare(priority1, priority2);
|
return Integer.compare(priority1, priority2);
|
||||||
});
|
});
|
||||||
int modules_size = modules.size();
|
|
||||||
int loaded = 0;
|
|
||||||
while(isAnyModuleLoad)
|
while(isAnyModuleLoad)
|
||||||
{
|
{
|
||||||
isAnyModuleLoad = false;
|
isAnyModuleLoad = false;
|
||||||
for(LauncherModule module : modules)
|
for(LauncherModule module : modules)
|
||||||
{
|
{
|
||||||
if(!module.getInitStatus().equals(LauncherModule.InitStatus.CREATED)) continue;
|
if(!module.getInitStatus().equals(LauncherModule.InitStatus.INIT_WAIT)) continue;
|
||||||
if(checkDepend(module))
|
if(checkDepend(module))
|
||||||
{
|
{
|
||||||
isAnyModuleLoad = true;
|
isAnyModuleLoad = true;
|
||||||
module.setInitStatus(LauncherModule.InitStatus.INIT);
|
module.setInitStatus(LauncherModule.InitStatus.INIT);
|
||||||
module.init(initContext);
|
module.init(initContext);
|
||||||
module.setInitStatus(LauncherModule.InitStatus.FINISH);
|
module.setInitStatus(LauncherModule.InitStatus.FINISH);
|
||||||
loaded++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//if(loaded >= modules_size) return;
|
|
||||||
}
|
}
|
||||||
for(LauncherModule module : modules)
|
for(LauncherModule module : modules)
|
||||||
{
|
{
|
||||||
if(module.getInitStatus().equals(LauncherModule.InitStatus.CREATED))
|
if(module.getInitStatus().equals(LauncherModule.InitStatus.INIT_WAIT))
|
||||||
{
|
{
|
||||||
LauncherModuleInfo info = module.getModuleInfo();
|
LauncherModuleInfo info = module.getModuleInfo();
|
||||||
LogHelper.warning("Module %s required %s. Cyclic dependencies?", info.name, Arrays.toString(info.dependencies));
|
LogHelper.warning("Module %s required %s. Cyclic dependencies?", info.name, Arrays.toString(info.dependencies));
|
||||||
|
@ -94,6 +84,11 @@ public void initModules(LauncherInitContext initContext) {
|
||||||
module.init(initContext);
|
module.init(initContext);
|
||||||
module.setInitStatus(LauncherModule.InitStatus.FINISH);
|
module.setInitStatus(LauncherModule.InitStatus.FINISH);
|
||||||
}
|
}
|
||||||
|
else if(module.getInitStatus().equals(LauncherModule.InitStatus.PRE_INIT_WAIT))
|
||||||
|
{
|
||||||
|
LauncherModuleInfo info = module.getModuleInfo();
|
||||||
|
LogHelper.error("Module %s skip pre-init phase. This module NOT finish loading", info.name, Arrays.toString(info.dependencies));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,7 +99,7 @@ private boolean checkDepend(LauncherModule module)
|
||||||
{
|
{
|
||||||
LauncherModule depModule = getModule(dep);
|
LauncherModule depModule = getModule(dep);
|
||||||
if(depModule == null) throw new RuntimeException(String.format("Module %s required %s. %s not found", info.name, dep, dep));
|
if(depModule == null) throw new RuntimeException(String.format("Module %s required %s. %s not found", info.name, dep, dep));
|
||||||
if(depModule.getInitStatus().equals(LauncherModule.InitStatus.CREATED)) return false;
|
if(!depModule.getInitStatus().equals(LauncherModule.InitStatus.FINISH)) return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -122,10 +117,12 @@ public LauncherModule loadModule(LauncherModule module) {
|
||||||
LauncherModuleInfo info = module.getModuleInfo();
|
LauncherModuleInfo info = module.getModuleInfo();
|
||||||
moduleNames.add(info.name);
|
moduleNames.add(info.name);
|
||||||
module.setContext(context);
|
module.setContext(context);
|
||||||
|
module.preInit();
|
||||||
if(initContext != null)
|
if(initContext != null)
|
||||||
{
|
{
|
||||||
module.preInit();
|
module.setInitStatus(LauncherModule.InitStatus.INIT);
|
||||||
module.init(initContext);
|
module.init(initContext);
|
||||||
|
module.setInitStatus(LauncherModule.InitStatus.FINISH);
|
||||||
}
|
}
|
||||||
return module;
|
return module;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package pro.gravit.launcher.impl;
|
package pro.gravit.launcher.impl;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Assertions;
|
import org.junit.jupiter.api.Assertions;
|
||||||
import pro.gravit.launcher.ModulesTest;
|
|
||||||
import pro.gravit.launcher.modules.LauncherInitContext;
|
import pro.gravit.launcher.modules.LauncherInitContext;
|
||||||
import pro.gravit.launcher.modules.LauncherModule;
|
import pro.gravit.launcher.modules.LauncherModule;
|
||||||
import pro.gravit.launcher.modules.LauncherModuleInfo;
|
import pro.gravit.launcher.modules.LauncherModuleInfo;
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package pro.gravit.launcher.impl;
|
package pro.gravit.launcher.impl;
|
||||||
|
|
||||||
import pro.gravit.launcher.ModulesTest;
|
|
||||||
import pro.gravit.launcher.modules.LauncherInitContext;
|
import pro.gravit.launcher.modules.LauncherInitContext;
|
||||||
import pro.gravit.launcher.modules.LauncherModule;
|
import pro.gravit.launcher.modules.LauncherModule;
|
||||||
import pro.gravit.launcher.modules.LauncherModuleInfo;
|
import pro.gravit.launcher.modules.LauncherModuleInfo;
|
||||||
|
@ -11,8 +10,7 @@ public Depend2Module() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void preInit() {
|
public void preInitAction() {
|
||||||
super.preInit();
|
|
||||||
modulesManager.loadModule(new InternalModule());
|
modulesManager.loadModule(new InternalModule());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue