diff --git a/jar-run.sh b/jar-run.sh index 0e0ed2a..e0447c2 100755 --- a/jar-run.sh +++ b/jar-run.sh @@ -1,4 +1,11 @@ ./build-jar.sh +mkdir mods/coleman-analysis +mkdir mods/kincaid-analysis +mv mods/jarred/easytext.algorithm.coleman@1.0.jar mods/coleman-analysis +mv mods/jarred/easytext.algorithm.kincaid@1.0.jar mods/kincaid-analysis +mv mods/jarred/easytext.algorithm.naivesyllablecounter@1.0.jar mods/kincaid-analysis +mv mods/jarred/easytext.algorithm.nextgensyllablecounter@1.0.jar mods/kincaid-analysis +cp lib/syllable-counter-3.0.1.jar mods/kincaid-analysis -java --module-path mods/jarred:lib -m easytext.gui +java --module-path mods/jarred -m easytext.gui diff --git a/src/easytext.algorithm.kincaid/javamodularity/easytext/algorithm/kincaid/KincaidAnalyzer.java b/src/easytext.algorithm.kincaid/javamodularity/easytext/algorithm/kincaid/KincaidAnalyzer.java index 5b4cd29..18bd218 100644 --- a/src/easytext.algorithm.kincaid/javamodularity/easytext/algorithm/kincaid/KincaidAnalyzer.java +++ b/src/easytext.algorithm.kincaid/javamodularity/easytext/algorithm/kincaid/KincaidAnalyzer.java @@ -12,7 +12,7 @@ public class KincaidAnalyzer implements Analyzer { private SyllableCounter syllableCounter; public KincaidAnalyzer() { - Iterator counters = ServiceLoader.load(SyllableCounter.class).iterator(); + Iterator counters = ServiceLoader.load(getClass().getModule().getLayer(), SyllableCounter.class).iterator(); if(counters.hasNext()) { this.syllableCounter = counters.next(); } else { diff --git a/src/easytext.gui/javamodularity/easytext/gui/Main.java b/src/easytext.gui/javamodularity/easytext/gui/Main.java index 1088a26..c775a95 100644 --- a/src/easytext.gui/javamodularity/easytext/gui/Main.java +++ b/src/easytext.gui/javamodularity/easytext/gui/Main.java @@ -1,6 +1,9 @@ package javamodularity.easytext.gui; -import java.util.ServiceLoader; +import java.lang.module.*; +import java.io.File; +import java.util.*; +import java.util.stream.Collectors; import javafx.application.Application; import javafx.event.ActionEvent; @@ -14,44 +17,56 @@ import javafx.scene.layout.VBox; import javafx.scene.text.Text; import javafx.stage.Stage; +import javafx.stage.DirectoryChooser; import javamodularity.easytext.algorithm.api.Analyzer; import static javamodularity.easytext.algorithm.api.Preprocessing.toSentences; public class Main extends Application { - private static Iterable analyzers; + private static List analyzers = new ArrayList<>(); private static ComboBox algorithm; private static TextArea input; private static Text output; private static String sampleText; public static void main(String[] args) { - analyzers = ServiceLoader.load(Analyzer.class); + ServiceLoader.load(Analyzer.class).forEach(analyzers::add); launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("EasyText"); - Button btn = new Button(); - btn.setText("Calculate"); - btn.setOnAction(event -> + Button btn1 = new Button(); + btn1.setText("Calculate"); + btn1.setOnAction(event -> output.setText(analyze(input.getText(), (String) algorithm.getValue())) ); + Button btn2 = new Button(); + btn2.setText("Add analysis"); + btn2.setOnAction(event -> { + File file = new DirectoryChooser().showDialog(primaryStage.getOwner()); + if (file != null) { + ModuleLayer layer = loadAnalysisInLayer(file); + ServiceLoader.load(layer, Analyzer.class).forEach(analyzers::add); + updateAlgorithmsDropdown(); + } + }); + + VBox vbox = new VBox(); vbox.setPadding(new Insets(3)); vbox.setSpacing(3); Text title = new Text("Choose an algorithm:"); algorithm = new ComboBox<>(); - for(Analyzer analyzer: analyzers) { - algorithm.getItems().add(analyzer.getName()); - } + updateAlgorithmsDropdown(); vbox.getChildren().add(title); vbox.getChildren().add(algorithm); - vbox.getChildren().add(btn); + vbox.getChildren().add(btn1); + vbox.getChildren().add(btn2); input = new TextArea(); input.setText(sampleText); @@ -62,6 +77,7 @@ public void start(Stage primaryStage) { pane.setBottom(output); primaryStage.setScene(new Scene(pane, 300, 250)); primaryStage.show(); + } private String analyze(String input, String algorithm) { @@ -74,6 +90,26 @@ private String analyze(String input, String algorithm) { return "No analyzer found for " + algorithm; } + private void updateAlgorithmsDropdown() { + algorithm.getItems().clear(); + for(Analyzer analyzer: analyzers) { + algorithm.getItems().add(analyzer.getName()); + } + } + + private ModuleLayer loadAnalysisInLayer(File dir) { + ModuleFinder finder = ModuleFinder.of(dir.toPath()); + + ModuleLayer parent = ModuleLayer.boot(); + Configuration cf = parent.configuration() + .resolveAndBind(finder, ModuleFinder.of(), Set.of()); + + ClassLoader scl = ClassLoader.getSystemClassLoader(); + ModuleLayer layer = parent.defineModulesWithOneLoader(cf, scl); + + return layer; + } + static { try { sampleText = new String (java.nio.file.Files.readAllBytes(java.nio.file.Paths.get("testinput.txt")));