Skip to content

Commit

Permalink
added extractFromJar api from addon
Browse files Browse the repository at this point in the history
  • Loading branch information
eric2788 committed Dec 31, 2024
1 parent f5dee8e commit 400e380
Show file tree
Hide file tree
Showing 9 changed files with 202 additions and 184 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.51-SNAPSHOT</version>
<version>0.0.54-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

import com.google.inject.Module;

import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Path;

/**
* groovier addon
*/
Expand All @@ -12,4 +16,15 @@ public interface GroovierAddon {
* @param module module
*/
void installModule(Module module);

/**
* extract file from jar
* @param jar jar class
* @param sourceFolder source folder
* @param targetFolder target folder
* @throws URISyntaxException uri syntax exception
* @throws IOException io exception
*/
void extractFromJar(Class<?> jar, String sourceFolder, String targetFolder) throws URISyntaxException, IOException;

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ public interface ScriptPlugin {

File getPluginFolder();

boolean isCopyDefaults();

void copyResources();

Logger getLogger();
Expand Down
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.51-SNAPSHOT</version>
<version>0.0.54-SNAPSHOT</version>
</parent>


Expand Down
321 changes: 158 additions & 163 deletions groovier-plugin/src/main/groovy/com/ericlam/mc/groovier/GroovierCore.java
Original file line number Diff line number Diff line change
@@ -1,180 +1,175 @@
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 com.google.inject.Module;
import org.jetbrains.annotations.NotNull;

import javax.inject.Provider;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
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.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Collections;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.logging.Level;

import javax.inject.Provider;

import org.jetbrains.annotations.NotNull;

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);
}

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

private Injector injector;
private GroovierScriptLoader loader;

private GroovierLifeCycle lifeCycle;


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 CompletableFuture<Void> reloadAllScripts() {
return loader.reloadAllScripts();
}

@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> 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, P extends Provider<T>> void bindProvider(Class<T> type, Class<P> clazz) {
this.groovierModule.bindProvider(type, clazz);
}

@Override
public void installModule(Module module) {
this.groovierModule.installModule(module);
}

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

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

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

public void copyFromJar(String source, final Path target) throws URISyntaxException, IOException {

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()
)) {


final Path jarPath = fileSystem.getPath(source);

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

@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 @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;
}

});

}
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);
}

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

private Injector injector;
private GroovierScriptLoader loader;
private ScriptPlugin plugin;

private GroovierLifeCycle lifeCycle;


public void onLoad(ScriptPlugin plugin) {
this.plugin = plugin;
groovierModule.bindScriptPlugin(plugin);
plugin.copyResources();
}


public void onEnable() {
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() {
lifeCycle.onDisable();
loader.unloadAllScripts();
}

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

@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> 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, P extends Provider<T>> void bindProvider(Class<T> type, Class<P> clazz) {
this.groovierModule.bindProvider(type, clazz);
}

@Override
public void installModule(Module module) {
this.groovierModule.installModule(module);
}

@Override
public void extractFromJar(Class<?> jar, String sourceFolder, String targetFolder) throws URISyntaxException, IOException {

if (!plugin.isCopyDefaults()) return;

URL url = jar.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()
)) {

final Path target = new File(plugin.getPluginFolder(), targetFolder).toPath();
final Path jarPath = fileSystem.getPath(sourceFolder);

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

@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 @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;
}

});

}
}

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

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

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

public void copyFromJar(String source) throws URISyntaxException, IOException {
extractFromJar(getClass(), source, "");
}
}
Loading

0 comments on commit 400e380

Please sign in to comment.