Skip to content

Commit

Permalink
refactor: Change the plugin config system to use the db
Browse files Browse the repository at this point in the history
  • Loading branch information
bendavies99 committed Jun 14, 2023
1 parent 056ec53 commit ab0f5b8
Show file tree
Hide file tree
Showing 7 changed files with 37 additions and 178 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,7 @@ public interface IPluginModel extends Serializable

String getClassPath();

String getConfig();

byte[] getFileData();
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,4 @@
@Retention(RetentionPolicy.RUNTIME)
public @interface PluginConfig
{
Class<? extends ICustomPluginConfig> value() default ICustomPluginConfig.class;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@interface Setup
{
boolean autoGenerate() default true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,125 +25,35 @@

package net.bdavies.babblebot.plugins;

import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import net.bdavies.babblebot.api.IApplication;
import net.bdavies.babblebot.api.plugins.ICustomPluginConfig;
import net.bdavies.babblebot.api.plugins.IPlugin;
import net.bdavies.babblebot.api.plugins.PluginConfig;
import lombok.val;
import net.bdavies.babblebot.api.plugins.IPluginModel;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.stereotype.Service;

import java.io.*;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.function.Supplier;

/**
* @author ben.davies99@outlook.com (Ben Davies)
* @since 1.2.7
* @author me@bdavies.net (Ben Davies)
* @since __RELEASE_VERSION__
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class PluginConfigParser
{
private final GenericApplicationContext applicationContext;

public static void parsePlugin(IApplication application, IPlugin settings, Object plugin)
@SneakyThrows
public <T> void setupPluginConfig(Class<T> pluginConfigClass, IPluginModel pluginModel)
{
Field[] fields = plugin.getClass().getDeclaredFields();
Arrays.stream(fields).forEach(field -> {
if (field.isAnnotationPresent(PluginConfig.class))
{
PluginConfig pluginConfig = field.getAnnotationsByType(PluginConfig.class)[0];
Class<?> clazz;
if (pluginConfig.value() != ICustomPluginConfig.class)
{
clazz = pluginConfig.value();
} else
{
clazz = field.getType();
}

log.info("Parsing Config class: " + clazz.getSimpleName());

String fileName = "";
boolean autoGenerate = true;

if (clazz.isAnnotationPresent(PluginConfig.Setup.class))
{
//Then handle a setup class
PluginConfig.Setup setup = clazz.getAnnotationsByType(PluginConfig.Setup.class)[0];
fileName = settings.getName();
autoGenerate = setup.autoGenerate();
} else
{
//Handle a interface
try
{
ICustomPluginConfig customPluginConfig = (ICustomPluginConfig) application.get(clazz);
autoGenerate = customPluginConfig.autoGenerateConfig();
fileName = customPluginConfig.fileName();
}
catch (ClassCastException exception)
{
log.error(
"Your config field does meet the type requirements it must either use " +
"PluginConfig.Setup or implement ICustomPluginConfig...",
exception);
return;
}

}

//noinspection ResultOfMethodCallIgnored
new File("config").mkdirs();
File file = new File("config/" + fileName + ".config.json");
if (!file.exists())
{
try
{
if (file.createNewFile())
{
if (autoGenerate)
{
FileWriter writer = new FileWriter(file);
writer.write(
new ObjectMapper().setDefaultPrettyPrinter(new DefaultPrettyPrinter())
.writeValueAsString(application.get(clazz)));
writer.flush();
writer.close();
}
}
}
catch (IOException e)
{
e.printStackTrace();
}

}

try
{
FileReader reader = new FileReader(file);

BufferedReader bufferedReader = new BufferedReader(reader);

StringBuilder stringBuilder = new StringBuilder();
String line;

while ((line = bufferedReader.readLine()) != null)
{
stringBuilder.append(line).append("\n");
}


field.setAccessible(true);

field.set(plugin, new ObjectMapper().readValue(stringBuilder.toString(), clazz));
}
catch (IOException | IllegalAccessException e)
{
e.printStackTrace();
}
}
});
val mapper = new ObjectMapper();
T configObj = mapper.readValue(pluginModel.getConfig(), pluginConfigClass);
Supplier<T> supplierObj = () -> configObj;
applicationContext.registerBean(pluginModel.getName() + "$$config",
pluginConfigClass, supplierObj);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,6 @@ public void addPlugin(Object obj, IPluginModel model)
maxServerVersion);
if (settings != null)
{
PluginConfigParser.parsePlugin(application, settings, obj);
if (obj instanceof IPluginEvents)
{
try
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ public class PluginModel implements IPluginModel
@Builder.Default
private String namespace = "$name";
private PluginPermissionContainer pluginPermissions;
@Builder.Default
private String config = "{}";

@Lob
@JsonIgnore
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import net.bdavies.babblebot.api.plugins.IPluginModel;
import net.bdavies.babblebot.api.plugins.Plugin;
import net.bdavies.babblebot.api.plugins.PluginConfig;
import net.bdavies.babblebot.plugins.PluginConfigParser;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
Expand Down Expand Up @@ -66,7 +67,7 @@ public class JarClassLoaderStrategy implements IPluginImportStrategy
public JarClassLoaderStrategy(IApplication application)
{
this.application = application;
this.jcl = new JarClassLoader(this.getClass().getClassLoader());
this.jcl = new JarClassLoader(Thread.currentThread().getContextClassLoader());
}

@Override
Expand Down Expand Up @@ -139,7 +140,14 @@ public Flux<Object> importPlugin(IPluginModel config)
.getBeanNamesForType(c)).forEach(
applicationContext::removeBeanDefinition);
}
applicationContext.registerBean(c);
if (c.isAnnotationPresent(PluginConfig.class))
{
application.get(PluginConfigParser.class)
.setupPluginConfig(c, config);
} else
{
applicationContext.registerBean(c);
}
})
.filter(c -> c.isAnnotationPresent(Plugin.class) ||
Arrays.stream(c.getInterfaces()).anyMatch(i -> i == IPlugin.class))
Expand All @@ -156,7 +164,7 @@ public Flux<Object> importPlugin(IPluginModel config)
}
catch (ClassNotFoundException e)
{
log.info("Plugin cannot be found please check your classpath.");
log.info("Plugin cannot be found please check your classpath.", e);
}

return Flux.empty();
Expand All @@ -182,15 +190,12 @@ private boolean isRegistrableBean(Class<?> c)

private boolean contains(String s, String s1, List<String> contains)
{
AtomicBoolean b = new AtomicBoolean(false);
var b = new AtomicBoolean(false);

contains.forEach(c -> {
if (!b.get())
if (!b.get() && (s.contains(c) || s1.contains(c)))
{
if (s.contains(c) || s1.contains(c))
{
b.set(true);
}
b.set(true);
}
});

Expand Down

0 comments on commit ab0f5b8

Please sign in to comment.