added first version of project 81 plugin
This commit is contained in:
110
plugins/Project81Plugin.groovy
Normal file
110
plugins/Project81Plugin.groovy
Normal file
@@ -0,0 +1,110 @@
|
||||
import de.frosch95.geofrogger.plugins.Plugin
|
||||
import javafx.concurrent.Service
|
||||
import javafx.concurrent.Task
|
||||
import javafx.concurrent.WorkerStateEvent
|
||||
import javafx.event.EventHandler
|
||||
import javafx.scene.control.Label
|
||||
import javafx.scene.control.ScrollPane
|
||||
import javafx.scene.control.TextArea
|
||||
import javafx.scene.layout.Pane
|
||||
import javafx.scene.layout.Priority
|
||||
import javafx.scene.layout.VBox
|
||||
import org.controlsfx.dialog.Dialog
|
||||
|
||||
class Project81Plugin implements Plugin {
|
||||
|
||||
final static DIFFICULTY_TERRAIN_VALUES = ['1', '1.5', '2', '2.5', '3', '3.5', '4', '4.5', '5']
|
||||
|
||||
final String name = "Project81"
|
||||
final String version = "0.0.1"
|
||||
final CalculateService service = new CalculateService();
|
||||
|
||||
Project81Plugin() {
|
||||
service.onSucceeded = {
|
||||
showDialog(createHeader(), createContent(it.source.value))
|
||||
} as EventHandler<WorkerStateEvent>;
|
||||
}
|
||||
|
||||
@Override
|
||||
void run(final Map context) {
|
||||
calculateStats(context.sessionContext)
|
||||
}
|
||||
|
||||
private javafx.scene.Node createHeader() {
|
||||
def pane = new Pane()
|
||||
def Label label = new Label()
|
||||
label.text = "Shows missing difficulty / terrain combination."
|
||||
pane.children.add(label)
|
||||
pane
|
||||
}
|
||||
|
||||
/**
|
||||
* creates the statistic charts to show
|
||||
* @param sessionContext context with the cache list in it
|
||||
* @return
|
||||
*/
|
||||
private void calculateStats(sessionContext) {
|
||||
// get the cache list out of the context
|
||||
def cacheList = sessionContext.getData("cache-list")
|
||||
service.cacheList = cacheList;
|
||||
service.restart();
|
||||
}
|
||||
|
||||
/**
|
||||
* creates the statistic charts to show
|
||||
* @param sessionContext context with the cache list in it
|
||||
* @return
|
||||
*/
|
||||
private javafx.scene.Node createContent(result) {
|
||||
|
||||
// create javafx chart
|
||||
def text = new TextArea();
|
||||
result.each { text.appendText("$it.name ($it.difficulty/$it.terrain)\n") }
|
||||
text
|
||||
}
|
||||
|
||||
private void showDialog(header, content) {
|
||||
Dialog dialog = new Dialog(null, name + " (" + version + ")", true)
|
||||
dialog.setMasthead(header)
|
||||
dialog.setContent(content)
|
||||
dialog.show()
|
||||
}
|
||||
}
|
||||
|
||||
class CalculateService extends Service {
|
||||
|
||||
def cacheList
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
protected Task createTask() {
|
||||
return new Task() {
|
||||
@Override
|
||||
protected ArrayList call() throws Exception {
|
||||
try {
|
||||
def dtFound = [:]
|
||||
for (def difficulty in Project81Plugin.DIFFICULTY_TERRAIN_VALUES) {
|
||||
for (def terrain in Project81Plugin.DIFFICULTY_TERRAIN_VALUES) {
|
||||
dtFound[difficulty + "_" + terrain] = false
|
||||
}
|
||||
}
|
||||
|
||||
for (def cache in cacheList) {
|
||||
if (cache.found) {
|
||||
dtFound[cache.difficulty + "_" + cache.terrain] = true
|
||||
}
|
||||
}
|
||||
|
||||
cacheList.findAll {
|
||||
cache -> !(cache.found || dtFound[cache.difficulty + "_" + cache.terrain])
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
@@ -9,22 +9,23 @@ import java.util.Map;
|
||||
*/
|
||||
public interface Plugin {
|
||||
|
||||
/**
|
||||
* @return name
|
||||
*/
|
||||
String getName();
|
||||
/**
|
||||
* @return name
|
||||
*/
|
||||
String getName();
|
||||
|
||||
/**
|
||||
* @return version
|
||||
*/
|
||||
String getVersion();
|
||||
/**
|
||||
* @return version
|
||||
*/
|
||||
String getVersion();
|
||||
|
||||
/**
|
||||
* Run the main method of the plugin. All the logic is done in this method.
|
||||
* Every run method will get a context map, with all the services inside,
|
||||
* to use them.
|
||||
* @param context services and data
|
||||
*/
|
||||
void run(Map context);
|
||||
/**
|
||||
* Run the main method of the plugin. All the logic is done in this method.
|
||||
* Every run method will get a context map, with all the services inside,
|
||||
* to use them.
|
||||
*
|
||||
* @param context services and data
|
||||
*/
|
||||
void run(Map context);
|
||||
|
||||
}
|
||||
|
||||
@@ -9,10 +9,9 @@ import java.util.List;
|
||||
*/
|
||||
public interface PluginService {
|
||||
|
||||
List<Plugin> getAllPlugins();
|
||||
|
||||
void executePlugin(Plugin plugin);
|
||||
List<Plugin> getAllPlugins();
|
||||
|
||||
void executePlugin(Plugin plugin);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -12,50 +12,50 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* TODO: class description
|
||||
* This service find, load and executes plugins based on the plugin interface.
|
||||
*
|
||||
* @author abi
|
||||
*/
|
||||
public class PluginServiceImpl implements PluginService {
|
||||
|
||||
private final GroovyClassLoader gcl = new GroovyClassLoader();
|
||||
private final ServiceManager serviceManager = ServiceManager.getInstance();
|
||||
private final GroovyClassLoader gcl = new GroovyClassLoader();
|
||||
private final ServiceManager serviceManager = ServiceManager.getInstance();
|
||||
|
||||
|
||||
@Override
|
||||
public List<Plugin> getAllPlugins() {
|
||||
@Override
|
||||
public List<Plugin> getAllPlugins() {
|
||||
|
||||
List<Plugin> plugins = new ArrayList<>();
|
||||
List<Plugin> plugins = new ArrayList<>();
|
||||
|
||||
try {
|
||||
File file = new File("./plugins");
|
||||
if (!file.exists()) {
|
||||
throw new IllegalArgumentException("plugins folder does not exit");
|
||||
}
|
||||
try {
|
||||
File file = new File("./plugins");
|
||||
if (!file.exists()) {
|
||||
throw new IllegalArgumentException("plugins folder does not exist");
|
||||
}
|
||||
|
||||
File[] pluginFiles = file.listFiles((dir, name) -> name.endsWith("Plugin.groovy"));
|
||||
for (File pluginFile: pluginFiles) {
|
||||
Class clazz = gcl.parseClass(pluginFile);
|
||||
for (Class interf: clazz.getInterfaces()) {
|
||||
if (interf.equals(Plugin.class)) {
|
||||
plugins.add((Plugin)clazz.newInstance());
|
||||
break;
|
||||
}
|
||||
File[] pluginFiles = file.listFiles((dir, name) -> name.endsWith("Plugin.groovy"));
|
||||
for (File pluginFile : pluginFiles) {
|
||||
Class clazz = gcl.parseClass(pluginFile);
|
||||
for (Class interf : clazz.getInterfaces()) {
|
||||
if (interf.equals(Plugin.class)) {
|
||||
plugins.add((Plugin) clazz.newInstance());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (IOException | InstantiationException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
} catch (IOException | InstantiationException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
return plugins;
|
||||
}
|
||||
|
||||
return plugins;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void executePlugin(final Plugin plugin) {
|
||||
Map<String, Object> context = new HashMap<>();
|
||||
context.put("sessionContext", SessionContext.getInstance());
|
||||
context.put("cacheService", serviceManager.getCacheService());
|
||||
plugin.run(context);
|
||||
}
|
||||
@Override
|
||||
public void executePlugin(final Plugin plugin) {
|
||||
Map<String, Object> context = new HashMap<>();
|
||||
context.put("sessionContext", SessionContext.getInstance());
|
||||
context.put("cacheService", serviceManager.getCacheService());
|
||||
plugin.run(context);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user