diff --git a/src/main/java/fucoin/Main.java b/src/main/java/fucoin/Main.java index 3d9aee4dc1624be257d4e686ba92627b5e4325d5..a42c3888e50de17e55c10e477f7d9b213576ed56 100644 --- a/src/main/java/fucoin/Main.java +++ b/src/main/java/fucoin/Main.java @@ -24,7 +24,7 @@ import java.util.*; public class Main { - + private static ActorSystem cSystem; static { @@ -50,8 +50,19 @@ public class Main { ConfigurationSelection[] configs = new ConfigurationSelection[configurations.size()]; configurations.toArray(configs); - ConfigurationSelection selectedConfig = (ConfigurationSelection) JOptionPane.showInputDialog(null, "Select a configuration to run", "Configuration Selection", JOptionPane.QUESTION_MESSAGE, null, configs, configurations.get(0)); + // Display the selection dialog to select a configuration + ConfigurationSelection selectedConfig = (ConfigurationSelection) JOptionPane.showInputDialog( + null, + "Select a configuration to run", + "Configuration Selection", + JOptionPane.QUESTION_MESSAGE, + null, + configs, + configurations.get(0) + ); + if (selectedConfig != null) { + // The Configuration will be an actor in the system, so we tell akka to create the actor Props theProps = AbstractConfiguration.props(selectedConfig.getConfigurationClass()); cSystem.actorOf(theProps, "Configuration"); @@ -60,8 +71,16 @@ public class Main { } } + /** + * This method crawls the fucoin.configurations package for classes extending the AbstractConfiguration. + * + * @return The list contains all non abstract extensions of AbstractConfiguration in the namespace, wrapped in ConfigurationSelection objects + * @throws InstantiationException + * @throws IllegalAccessException + */ private static List<ConfigurationSelection> getAbstractConfigurations() throws InstantiationException, IllegalAccessException { List<ClassLoader> classLoadersList = new LinkedList<>(); + // Lots of reflection magic happening here! classLoadersList.add(ClasspathHelper.contextClassLoader()); classLoadersList.add(ClasspathHelper.staticClassLoader()); @@ -76,6 +95,7 @@ public class Main { List<ConfigurationSelection> configurations = new ArrayList<>(); + // Filter the found classes for non abstract classes, that inherit from AbstractConfiguration allClasses.stream().filter(oneClass -> !Modifier.isAbstract(oneClass.getModifiers()) && AbstractConfiguration.class.isAssignableFrom(oneClass)).forEach(oneClass -> { ConfigurationSelection cfg = new ConfigurationSelection((Class<AbstractConfiguration>) oneClass); configurations.add(cfg); diff --git a/src/main/java/fucoin/configurations/DefaultConfiguration.java b/src/main/java/fucoin/configurations/DefaultConfiguration.java index ff6df01c578390927427822f4b069a6a4ae508be..81e59cc97c32b41a34b241e172cdf13352839ff1 100644 --- a/src/main/java/fucoin/configurations/DefaultConfiguration.java +++ b/src/main/java/fucoin/configurations/DefaultConfiguration.java @@ -5,7 +5,7 @@ import fucoin.actions.control.ActionWalletSendMoney; import fucoin.configurations.internal.ConfigurationName; /** - * + * This configuration is the previous default of 2 wallets with GUI and a supervisor. */ @ConfigurationName("Default Configuration") public class DefaultConfiguration extends AbstractConfiguration { diff --git a/src/main/java/fucoin/configurations/MassWalletConfiguration.java b/src/main/java/fucoin/configurations/MassWalletConfiguration.java index 0439612a335796f2dcceb859fc5a51bd6a24b221..1ebb3ee921a1d5e8a0dff9febce2a0bc7815f538 100644 --- a/src/main/java/fucoin/configurations/MassWalletConfiguration.java +++ b/src/main/java/fucoin/configurations/MassWalletConfiguration.java @@ -3,7 +3,7 @@ package fucoin.configurations; import fucoin.configurations.internal.ConfigurationName; /** - * + * This configuration spawns 200 wallets to demonstrate the spawning of many headless wallets */ @ConfigurationName("Lots of Wallets") public class MassWalletConfiguration extends AbstractConfiguration { diff --git a/src/main/java/fucoin/configurations/internal/ConfigurationCreator.java b/src/main/java/fucoin/configurations/internal/ConfigurationCreator.java index 423e495c35ba1457b9563f4450a058f8b065fbaa..46e7f0af2d91c5fc631ac15a999dde91a0a9c6ab 100644 --- a/src/main/java/fucoin/configurations/internal/ConfigurationCreator.java +++ b/src/main/java/fucoin/configurations/internal/ConfigurationCreator.java @@ -4,7 +4,7 @@ import akka.japi.Creator; import fucoin.configurations.AbstractConfiguration; /** - * + * This is used by Akka to spawn the Configuration Actor */ public class ConfigurationCreator implements Creator<AbstractConfiguration> { diff --git a/src/main/java/fucoin/configurations/internal/ConfigurationName.java b/src/main/java/fucoin/configurations/internal/ConfigurationName.java index de15502f4b12e17aca529324bae36b638722974d..9f18a0bc1b62767944ec94542a43cb95fc0ad883 100644 --- a/src/main/java/fucoin/configurations/internal/ConfigurationName.java +++ b/src/main/java/fucoin/configurations/internal/ConfigurationName.java @@ -4,7 +4,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** - * + * This Annotation can be used by Configurations to display + * a more friendly title than the class name in the startup dialog */ @Retention(RetentionPolicy.RUNTIME) public @interface ConfigurationName { diff --git a/src/main/java/fucoin/configurations/internal/ConfigurationSelection.java b/src/main/java/fucoin/configurations/internal/ConfigurationSelection.java index 935ba072bf683ffb6b2e569d1c4935c9edb28d26..f43ec8aa58299cbbf68863162d7005423b05db72 100644 --- a/src/main/java/fucoin/configurations/internal/ConfigurationSelection.java +++ b/src/main/java/fucoin/configurations/internal/ConfigurationSelection.java @@ -2,10 +2,9 @@ package fucoin.configurations.internal; import fucoin.configurations.AbstractConfiguration; -import java.util.Arrays; - /** - * + * A ConfigurationSelection is a wrapper around the configuration class objects + * to display a custom text in the configuration selection dropdown. */ public class ConfigurationSelection { private Class<AbstractConfiguration> configurationClass;