Skip to content

Commit

Permalink
added install module api
Browse files Browse the repository at this point in the history
  • Loading branch information
eric2788 committed Dec 20, 2024
1 parent 62899ba commit 8bb43f9
Show file tree
Hide file tree
Showing 7 changed files with 169 additions and 126 deletions.
2 changes: 1 addition & 1 deletion groovier-engine/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>groovier</artifactId>
<groupId>org.groovier</groupId>
<version>0.0.4</version>
<version>0.0.51-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.ericlam.mc.groovier;

import com.google.inject.Module;

/**
* groovier addon
*/
public interface GroovierAddon {

/**
* install guice module
* @param module module
*/
void installModule(Module module);
}
2 changes: 1 addition & 1 deletion groovier-plugin/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>groovier</artifactId>
<groupId>org.groovier</groupId>
<version>0.0.4</version>
<version>0.0.51-SNAPSHOT</version>
</parent>


Expand Down
260 changes: 140 additions & 120 deletions groovier-plugin/src/main/groovy/com/ericlam/mc/groovier/GroovierCore.java
Original file line number Diff line number Diff line change
@@ -1,160 +1,180 @@
package com.ericlam.mc.groovier;

import com.ericlam.mc.groovier.providers.ArgumentParserProvider;
import com.ericlam.mc.groovier.providers.GroovierLifeCycleProvider;
import com.ericlam.mc.groovier.providers.ServiceInjectorProvider;
import com.ericlam.mc.groovier.scriptloaders.*;
import com.google.inject.Guice;
import com.google.inject.Injector;

import javax.inject.Provider;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.*;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.StandardCopyOption;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Collections;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.logging.Level;

public class GroovierCore implements GroovierAPI {

private final GroovierModule groovierModule = new GroovierModule();

private static GroovierAPI api;

public GroovierCore() {
api = this;

this.bindInstance(GroovierAPI.class, this);
this.addScriptLoader(ServiceScriptsManager.class);
this.addScriptLoader(CommandScriptsManager.class);
this.addScriptLoader(EventScriptsManager.class);
this.addScriptLoader(ArgumentScriptManager.class);
this.addScriptLoader(LifeCycleScriptsManager.class);
this.bindProvider(ArgumentParser.class, ArgumentParserProvider.class);
this.bindProvider(ServiceInjector.class, ServiceInjectorProvider.class);
this.bindProvider(GroovierLifeCycle.class, GroovierLifeCycleProvider.class);
}
import javax.inject.Provider;

public static GroovierAPI getApi() {
return Optional.ofNullable(api).orElseThrow(() -> new IllegalStateException("groovier not initialized"));
}
import org.jetbrains.annotations.NotNull;

private Injector injector;
private GroovierScriptLoader loader;
import com.ericlam.mc.groovier.providers.ArgumentParserProvider;
import com.ericlam.mc.groovier.providers.GroovierLifeCycleProvider;
import com.ericlam.mc.groovier.providers.ServiceInjectorProvider;
import com.ericlam.mc.groovier.scriptloaders.ArgumentScriptManager;
import com.ericlam.mc.groovier.scriptloaders.CommandScriptsManager;
import com.ericlam.mc.groovier.scriptloaders.EventScriptsManager;
import com.ericlam.mc.groovier.scriptloaders.GroovierLifeCycle;
import com.ericlam.mc.groovier.scriptloaders.LifeCycleScriptsManager;
import com.ericlam.mc.groovier.scriptloaders.ServiceScriptsManager;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;

public class GroovierCore implements GroovierAPI, GroovierAddon {

private final GroovierModule groovierModule = new GroovierModule();

private static GroovierAPI api;

public GroovierCore() {
api = this;

this.bindInstance(GroovierAPI.class, this);
this.addScriptLoader(ServiceScriptsManager.class);
this.addScriptLoader(CommandScriptsManager.class);
this.addScriptLoader(EventScriptsManager.class);
this.addScriptLoader(ArgumentScriptManager.class);
this.addScriptLoader(LifeCycleScriptsManager.class);
this.bindProvider(ArgumentParser.class, ArgumentParserProvider.class);
this.bindProvider(ServiceInjector.class, ServiceInjectorProvider.class);
this.bindProvider(GroovierLifeCycle.class, GroovierLifeCycleProvider.class);
}

private GroovierLifeCycle lifeCycle;
public static GroovierAPI getApi() {
return Optional.ofNullable(api).orElseThrow(() -> new IllegalStateException("groovier not initialized"));
}

private Injector injector;
private GroovierScriptLoader loader;

public void onLoad(ScriptPlugin plugin) {
groovierModule.bindScriptPlugin(plugin);
plugin.copyResources();
}
private GroovierLifeCycle lifeCycle;


public void onEnable(ScriptPlugin plugin) {
injector = Guice.createInjector(groovierModule);
loader = injector.getInstance(GroovierScriptLoader.class);
loader.addClassPath();
loader.loadAllScripts().whenComplete((v, e) -> {
if (e != null) {
plugin.getLogger().severe("error while loading scripts: "+e.getMessage());
e.printStackTrace();
}
lifeCycle = injector.getInstance(GroovierLifeCycle.class);
plugin.runSyncTask(() -> lifeCycle.onEnable());
});
}
public void onLoad(ScriptPlugin plugin) {
groovierModule.bindScriptPlugin(plugin);
plugin.copyResources();
}


public void onEnable(ScriptPlugin plugin) {
injector = Guice.createInjector(groovierModule);
loader = injector.getInstance(GroovierScriptLoader.class);
loader.addClassPath();
loader.loadAllScripts().whenComplete((v, e) -> {
if (e != null) {
plugin.getLogger().log(Level.SEVERE, e, () -> "error while loading scripts: " + e.getMessage());
}
lifeCycle = injector.getInstance(GroovierLifeCycle.class);
plugin.runSyncTask(() -> lifeCycle.onEnable());
});
}

public void onDisable(ScriptPlugin plugin) {
lifeCycle.onDisable();
loader.unloadAllScripts();
}
public void onDisable(ScriptPlugin plugin) {
lifeCycle.onDisable();
loader.unloadAllScripts();
}

public CompletableFuture<Void> reloadAllScripts(){
return loader.reloadAllScripts();
}
public CompletableFuture<Void> reloadAllScripts() {
return loader.reloadAllScripts();
}

@Override
public void addScriptLoader(Class<? extends ScriptLoader> scriptLoader) {
this.groovierModule.addReloadable(scriptLoader);
}
@Override
public void addScriptLoader(Class<? extends ScriptLoader> scriptLoader) {
this.groovierModule.addReloadable(scriptLoader);
}

@Override
public <T extends ScriptValidator> void bindRegisters(Class<T> validator, T ins) {
this.groovierModule.bindRegisters(validator, ins);
}
@Override
public <T extends ScriptValidator> void bindRegisters(Class<T> validator, T ins) {
this.groovierModule.bindRegisters(validator, ins);
}

@Override
public <T> void bindInstance(Class<T> type, T ins) {
this.groovierModule.bindInstance(type, ins);
}
@Override
public <T> void bindInstance(Class<T> type, T ins) {
this.groovierModule.bindInstance(type, ins);
}

@Override
public <T, V extends T> void bindType(Class<T> type, Class<V> clazz) {
this.groovierModule.bindType(type, clazz);
}
@Override
public <T, V extends T> void bindType(Class<T> type, Class<V> clazz) {
this.groovierModule.bindType(type, clazz);
}

@Override
public <T, P extends Provider<T>> void bindProvider(Class<T> type, Class<P> clazz) {
this.groovierModule.bindProvider(type, clazz);
}
@Override
public <T, P extends Provider<T>> void bindProvider(Class<T> type, Class<P> clazz) {
this.groovierModule.bindProvider(type, clazz);
}

@Override
public Injector getBaseInjector() {
return Optional.ofNullable(injector).orElseThrow(() -> new IllegalStateException("groovier not initialized"));
}
@Override
public void installModule(Module module) {
this.groovierModule.installModule(module);
}

@Override
public ServiceInjector getServiceInjector() {
return getBaseInjector().getInstance(ServiceInjector.class);
}
@Override
public Injector getBaseInjector() {
return Optional.ofNullable(injector).orElseThrow(() -> new IllegalStateException("groovier not initialized"));
}

@Override
public ArgumentParser getArgumentParser() {
return getBaseInjector().getInstance(ArgumentParser.class);
}
@Override
public ServiceInjector getServiceInjector() {
return getBaseInjector().getInstance(ServiceInjector.class);
}

public void copyFromJar(String source, final Path target) throws URISyntaxException, IOException {
@Override
public ArgumentParser getArgumentParser() {
return getBaseInjector().getInstance(ArgumentParser.class);
}

URL url = getClass().getResource("");
public void copyFromJar(String source, final Path target) throws URISyntaxException, IOException {

if (url == null) {
throw new IllegalStateException("can't find resource inside jar");
}

URI resource = url.toURI();
URL url = getClass().getResource("");

if (url == null) {
throw new IllegalStateException("can't find resource inside jar");
}

URI resource = url.toURI();

try (FileSystem fileSystem = FileSystems.newFileSystem(
resource,
Collections.<String, String>emptyMap()
)) {
try (FileSystem fileSystem = FileSystems.newFileSystem(
resource,
Collections.<String, String>emptyMap()
)) {


final Path jarPath = fileSystem.getPath(source);
final Path jarPath = fileSystem.getPath(source);

Files.walkFileTree(jarPath, new SimpleFileVisitor<>() {
Files.walkFileTree(jarPath, new SimpleFileVisitor<>() {

@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
Path currentTarget = target.resolve(jarPath.relativize(dir).toString());
if (Files.notExists(currentTarget)) Files.createDirectories(currentTarget);
return FileVisitResult.CONTINUE;
}
@Override
public @NotNull FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
Path currentTarget = target.resolve(jarPath.relativize(dir).toString());
if (Files.notExists(currentTarget)) Files.createDirectories(currentTarget);
return FileVisitResult.CONTINUE;
}

@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
var targetPath = target.resolve(jarPath.relativize(file).toString());
if (Files.notExists(targetPath)) Files.copy(file, targetPath, StandardCopyOption.REPLACE_EXISTING);
return FileVisitResult.CONTINUE;
}
@Override
public @NotNull FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
var targetPath = target.resolve(jarPath.relativize(file).toString());
if (Files.notExists(targetPath)) Files.copy(file, targetPath, StandardCopyOption.REPLACE_EXISTING);
return FileVisitResult.CONTINUE;
}

});

}

});

}


}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.ericlam.mc.groovier

import com.google.inject.AbstractModule
import com.google.inject.Module
import com.google.inject.Scopes
import com.google.inject.multibindings.Multibinder

Expand All @@ -13,7 +14,9 @@ class GroovierModule extends AbstractModule {

private final Map<Class, Object> registerMap = new HashMap<>()
private final Map<Class, Class> classMap = new HashMap<>()
private final Map<Class, Class<Provider<?>>> providerMap = new HashMap<>();
private final Map<Class, Class<Provider<?>>> providerMap = new HashMap<>()

private final Set<Module> modules = new HashSet<>()

private final GroovyClassLoader classLoader = new GroovyClassLoader(getClass().getClassLoader())

Expand All @@ -34,6 +37,7 @@ class GroovierModule extends AbstractModule {
registerMap.forEach((type, obj) -> bind(type).toInstance(obj))
classMap.forEach((type, clazz) -> bind(type).to(clazz).in(Scopes.SINGLETON))
providerMap.forEach((type, provider) -> bind(type).toProvider(provider).in(Scopes.SINGLETON))
modules.forEach(this::install)
}


Expand Down Expand Up @@ -61,4 +65,8 @@ class GroovierModule extends AbstractModule {
this.registerMap.put(validator, ins)
}

def installModule(Module module) {
this.modules.add(module)
}

}
2 changes: 1 addition & 1 deletion groovier-scripts/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>groovier</artifactId>
<groupId>org.groovier</groupId>
<version>0.0.4</version>
<version>0.0.51-SNAPSHOT</version>
</parent>

<modelVersion>4.0.0</modelVersion>
Expand Down
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>org.groovier</groupId>
<artifactId>groovier</artifactId>
<version>0.0.4</version>
<version>0.0.51-SNAPSHOT</version>
<packaging>pom</packaging>

<name>Groovier</name>
Expand Down Expand Up @@ -260,7 +260,7 @@
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.3.1</version>
<version>5.11.4</version>
<scope>test</scope>
</dependency>
</dependencies>
Expand Down

0 comments on commit 8bb43f9

Please sign in to comment.