Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/TestCompile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
java: [ '21' ]
java: [ '25' ]
permissions:
actions: write
steps:
Expand Down
32 changes: 14 additions & 18 deletions .idea/inspectionProfiles/Project_Default.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 0 additions & 17 deletions .idea/runConfigurations/Run_Multi_Build.xml

This file was deleted.

2 changes: 1 addition & 1 deletion Common/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ dependencies {
implementation project(":MoseStream")
implementation 'org.spongepowered:spongeapi:' + property("SPONGE_VERSION")
implementation 'org.jetbrains:annotations:26.0.1'
implementation ('io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT')
implementation 'io.papermc.paper:paper-api:' + property("BUKKIT_VERSION") + '.build.+'

testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
package org.soak.exception;

import org.jetbrains.annotations.NotNull;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.stream.Collectors;

public class NotImplementedException extends RuntimeException {

private final Method interfaceMethod;

public NotImplementedException(Class<?> from, String methodName, Class<?>... parameters) throws NoSuchMethodException {
public NotImplementedException(@NotNull Class<?> from, @NotNull String methodName, @NotNull Class<?>... parameters) throws NoSuchMethodException {
this(from.getDeclaredMethod(methodName, parameters));
}

public NotImplementedException(Method interfaceMethod) {
public NotImplementedException(@NotNull Method interfaceMethod) {
super("The method is not implemented: " + interfaceMethod.getDeclaringClass().getName() + "." + interfaceMethod.getName() + "(" + Arrays.stream(interfaceMethod.getParameters()).map(parameter -> parameter.getType().getSimpleName() + " " + parameter.getName()).collect(Collectors.joining(", ")) + ")");
this.interfaceMethod = interfaceMethod;
}

@Deprecated
public NotImplementedException() {
super("This method is not implemented: " + Thread.currentThread().getStackTrace()[1].toString());
}

public static NotImplementedException createByLazy(Object fromObject, String name, Class<?>... parameters) {
Expand All @@ -38,28 +42,4 @@ public static NotImplementedException createByLazy(Class<?> from, String name, C
throw new RuntimeException("Could not create NotImplementedException for " + from.getSimpleName() + "#" + name + "(" + Arrays.stream(parameters).map(parameter -> parameter.getSimpleName() + " arg").collect(Collectors.joining(", ")) + ")", e);
}
}

@Deprecated(forRemoval = true)
public static NotImplementedException createByLazy(Class<?>... parameterTypes) {
StackTraceElement stacktrace = Thread.currentThread().getStackTrace()[0];
String className = stacktrace.getClassName();
String methodName = stacktrace.getMethodName();
Class<?> clazz;
try {
clazz = Class.forName(className);
} catch (ClassNotFoundException e) {
throw new RuntimeException("Could not find class when creating NotImplementedException", e);
}

try {
Method method = clazz.getDeclaredMethod(methodName, parameterTypes);
return new NotImplementedException(method);
} catch (NoSuchMethodException e) {
throw new RuntimeException("Could not find method when creating NotImplementedException: " + methodName + " With " + Arrays.stream(parameterTypes).map(Class::getSimpleName).collect(Collectors.joining(", ")), e);
}
}

public Method unimplementedMethod() {
return this.interfaceMethod;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,21 +49,25 @@ public SoakPluginClassLoader(PluginProviderContext context) throws MalformedURLE
private static URL[] librariesClassLoader(PluginProviderContext context) throws MalformedURLException {
PluginMeta meta = context.getConfiguration();
List<String> libraries;
if(meta instanceof SoakPluginMeta spm){
if (meta instanceof SoakPluginMeta spm) {
libraries = spm.getLibraries();
}else{
libraries = ((PluginDescriptionFile)meta).getLibraries();
} else {
libraries = ((PluginDescriptionFile) meta).getLibraries();
}
URL extra = context.getPluginSource().toUri().toURL();
List<File> paths = libraries.stream().map(string -> {
String[] split =string.split(":", 3);
String[] split = string.split(":", 3);
String group = split[0].replaceAll(Pattern.quote("."), "/");
String id = split[1];
String version = split[2];
return new File("soakLibraries/" + group + "/" + id + "/" + version + "/" + id + "-" + version + ".jar");
}).toList();
String missing = paths.stream().filter(file -> !file.exists()).map(File::getName).map(n -> n.substring(0, n.length() - 4)).collect(Collectors.joining(", "));
if(!missing.isBlank()){
String missing = paths.stream()
.filter(file -> !file.exists())
.map(File::getName)
.map(n -> n.substring(0, n.length() - 4))
.collect(Collectors.joining(", "));
if (!missing.isBlank()) {
context.getLogger().error("Not all libraries have loaded, they could be downloading: Missing " + missing);
}
var stream = paths.stream().filter(File::exists).map(file -> {
Expand All @@ -77,7 +81,9 @@ private static URL[] librariesClassLoader(PluginProviderContext context) throws

}

public static void setupPlugin(JavaPlugin javaPlugin, String loggerName, File pluginFile, File configFile, File dataFolder, Supplier<PluginMeta> descriptionGetter, Supplier<SoakPluginMeta> configurationGetter, Supplier<ClassLoader> loaderGetter) {
public static void setupPlugin(JavaPlugin javaPlugin, String loggerName, File pluginFile, File configFile,
File dataFolder, Supplier<PluginMeta> descriptionGetter,
Supplier<SoakPluginMeta> configurationGetter, Supplier<ClassLoader> loaderGetter) {
PluginMeta pDescription = descriptionGetter.get();
SoakPluginMeta pMeta = configurationGetter.get();
var logger = PaperPluginLogger.getLogger(loggerName);
Expand Down Expand Up @@ -112,7 +118,8 @@ public static void setupPlugin(JavaPlugin javaPlugin, String loggerName, File pl
}
}

private static void applyValue(String fieldName, JavaPlugin plugin, Object value) throws NoSuchFieldException, IllegalAccessException {
private static void applyValue(String fieldName, JavaPlugin plugin, Object value)
throws NoSuchFieldException, IllegalAccessException {
var field = JavaPlugin.class.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(plugin, value);
Expand All @@ -135,9 +142,9 @@ private static void copyYaml(YamlConfiguration configuration, File file) throws
configuration.addDefaults(defaultConfig);
}

public SoakPluginMeta buildMeta(){
public SoakPluginMeta buildMeta() {
var config = getConfiguration();
if(config instanceof SoakPluginMeta spm) {
if (config instanceof SoakPluginMeta spm) {
return spm;
}
return new SoakPluginMetaBuilder().from(config).build();
Expand All @@ -149,12 +156,41 @@ public SoakPluginMeta buildMeta(){
}

@Override
public @NotNull Class<?> loadClass(@NotNull String name, boolean resolve, boolean checkGlobal, boolean checkLibs) throws ClassNotFoundException {
public @NotNull Class<?> loadClass(@NotNull String name, boolean resolve, boolean checkGlobal, boolean checkLibs)
throws ClassNotFoundException {

//TODO GLOBAL AND LIBS
return loadClass(name, resolve);
}

@Override
public void init(@NotNull JavaPlugin javaPlugin) {
setupPlugin(javaPlugin,
this.getConfiguration().getName(),
this.context.getPluginSource().toFile(),
new File(this.context.getDataDirectory().toFile(), "config.yml"),
this.context.getDataDirectory().toFile(),
this::getConfiguration,
this::buildMeta,
() -> this);
}

@Override
public @Nullable JavaPlugin getPlugin() {
var config = this.getConfiguration();
return SoakManager.getManager()
.getBukkitSoakContainers()
.map(SoakPluginContainer::getBukkitInstance)
.filter(jp -> jp.getPluginMeta().getName().equals(config.getName()))
.findAny()
.orElse(null);
}

@Override
public @Nullable PluginClassLoaderGroup getGroup() {
return null;
}

@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
var clazz = super.loadClass(name, resolve);
Expand All @@ -170,14 +206,9 @@ public Class<?> findClass(String name) throws ClassNotFoundException {
return foundGeneratedClass.get();
}

var opOtherClass = SoakManager
.getManager()
var opOtherClass = SoakManager.getManager()
.getBukkitSoakContainers()
.flatMap(spc -> SoakManager
.getManager()
.getSoakClassLoader(spc)
.getClasses()
.stream())
.flatMap(spc -> SoakManager.getManager().getSoakClassLoader(spc).getClasses().stream())
.filter(clazz -> clazz.getTypeName().equals(name))
.findAny();

Expand All @@ -189,7 +220,11 @@ public Class<?> findClass(String name) throws ClassNotFoundException {
} catch (ClassNotFoundException e) {
//allow other class loaders to supply there solution if possible

var opClass = NMSBounceLoader.getLoader().classes().stream().filter(clazz -> clazz.getName().equals(name)).findAny();
var opClass = NMSBounceLoader.getLoader()
.classes()
.stream()
.filter(clazz -> clazz.getName().equals(name))
.findAny();
if (opClass.isPresent()) {
return opClass.get();
}
Expand All @@ -202,26 +237,4 @@ public Class<?> findClass(String name) throws ClassNotFoundException {
public @NotNull @UnmodifiableView Collection<Class<?>> getClasses() {
return Collections.unmodifiableCollection(this.classes);
}

@Override
public void init(@NotNull JavaPlugin javaPlugin) {
setupPlugin(javaPlugin, this.getConfiguration().getName(), this.context.getPluginSource().toFile(), new File(this.context.getDataDirectory().toFile(), "config.yml"), this.context.getDataDirectory().toFile(), this::getConfiguration, this::buildMeta, () -> this);
}

@Override
public @Nullable JavaPlugin getPlugin() {
var config = this.getConfiguration();
return SoakManager
.getManager()
.getBukkitSoakContainers()
.map(SoakPluginContainer::getBukkitInstance)
.filter(jp -> jp.getPluginMeta().equals(config))
.findAny()
.orElse(null);
}

@Override
public @Nullable PluginClassLoaderGroup getGroup() {
return null;
}
}
55 changes: 55 additions & 0 deletions Common/src/main/java/org/soak/utils/CollectionBuilder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package org.soak.utils;

import org.jetbrains.annotations.*;

import java.util.Collection;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class CollectionBuilder<T> {

private Stream<T> builder = Stream.empty();

@Contract("_ -> this")
public CollectionBuilder<T> add(@UnknownNullability T value){
builder = Stream.concat(builder, Stream.of(value));
return this;
}

@SafeVarargs
@Contract("_ -> this")
public final CollectionBuilder<T> addAll(@NotNull T... value){
builder = Stream.concat(builder, Stream.of(value));
return this;
}

@Contract("_ -> this")
public CollectionBuilder<T> add(@NotNull Collection<T> value){
builder = Stream.concat(builder, value.stream());
return this;
}

@Contract("_ -> this")
public CollectionBuilder<T> add(@NotNull Stream<T> value){
builder = Stream.concat(builder, value);
return this;
}

public <R> R collect(Collector<? super T, ?, R> collector){
return builder.collect(collector);
}

@Unmodifiable
public <K, R> Map<K, R> toMap(@NotNull Function<T, K> toKey, @NotNull Function<T, R> toResult){
return this.collect(Collectors.toUnmodifiableMap(toKey, toResult));
}

@Unmodifiable
public <K> Map<K, T> toMapKeyed(@NotNull Function<T, K> toKey){
return toMap(toKey, t -> t);
}

}
Loading
Loading