🚸 Ignore configured parameters for email actions
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sun, 10 Nov 2024 21:05:57 +0000 (22:05 +0100)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sun, 10 Nov 2024 21:29:56 +0000 (22:29 +0100)
src/main/java/net/pterodactylus/rhynodge/engine/Starter.java
src/main/java/net/pterodactylus/rhynodge/loader/ChainWatcher.java
src/main/java/net/pterodactylus/rhynodge/loader/ReactionLoader.java

index 477a755..20611c1 100644 (file)
@@ -51,6 +51,9 @@ public class Starter {
                                createErrorEmailAction(options.smtpHostname, options.errorEmailSender, options.errorEmailRecipient);
 
                Injector injector = Guice.createInjector(Arrays.asList(
+                               ObjectBinding.forClass(String.class).named("smtpHostname").is(options.smtpHostname),
+                               ObjectBinding.forClass(String.class).named("emailSender").is(options.emailSender),
+                               ObjectBinding.forClass(String.class).named("emailRecipient").is(options.emailRecipient),
                                ObjectBinding.forClass(StateDirectory.class).is(StateDirectory.of(options.stateDirectory)),
                                ObjectBinding.forClass(ChainDirectory.class).is(ChainDirectory.of(options.chainDirectory)),
                                ObjectBinding.forClass(EmailAction.class).is(errorEmailAction)
index 2dc071d..eae0505 100644 (file)
@@ -61,7 +61,7 @@ public class ChainWatcher extends AbstractExecutionThreadService {
        private static final ObjectMapper objectMapper = new ObjectMapper();
 
        /** The reaction loader. */
-       private final ReactionLoader reactionLoader = new ReactionLoader();
+       private final ReactionLoader reactionLoader;
 
        /** The engine to load reactions with. */
        private final Engine engine;
@@ -78,9 +78,10 @@ public class ChainWatcher extends AbstractExecutionThreadService {
         *            The directory to watch
         */
        @Inject
-       public ChainWatcher(Engine engine, ChainDirectory directory) {
+       public ChainWatcher(Engine engine, ChainDirectory directory, ReactionLoader reactionLoader) {
                this.engine = engine;
                this.directory = directory.getDirectory();
+               this.reactionLoader = reactionLoader;
        }
 
        //
index 94009af..d358c23 100644 (file)
@@ -23,6 +23,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
+import jakarta.inject.Inject;
+import jakarta.inject.Named;
 import net.pterodactylus.rhynodge.Action;
 import net.pterodactylus.rhynodge.Filter;
 import net.pterodactylus.rhynodge.Query;
@@ -39,6 +41,13 @@ import net.pterodactylus.rhynodge.Merger;
  */
 public class ReactionLoader {
 
+       @Inject
+       public ReactionLoader(@Named("smtpHostname") String smtpHostname, @Named("emailSender") String emailSender, @Named("emailRecipient") String emailRecipient) {
+               this.smtpHostname = smtpHostname;
+               this.emailSender = emailSender;
+               this.emailRecipient = emailRecipient;
+       }
+
        /**
         * Creates a {@link Reaction} from the given {@link Chain}.
         *
@@ -48,7 +57,6 @@ public class ReactionLoader {
         * @throws LoaderException
         *             if a class can not be loaded
         */
-       @SuppressWarnings("static-method")
        public Reaction loadReaction(Chain chain) throws LoaderException {
 
                /* check if chain is enabled. */
@@ -78,7 +86,7 @@ public class ReactionLoader {
                        /* create filters. */
                        List<Filter> filters = new ArrayList<Filter>();
                        for (Part filterPart : chain.filters()) {
-                               filters.add(ReactionLoader.<Filter> createObject(filterPart.name(), "net.pterodactylus.rhynodge.filters", extractParameters(filterPart.parameters())));
+                               filters.add(createObject(filterPart.name(), "net.pterodactylus.rhynodge.filters", extractParameters(filterPart.parameters())));
                        }
 
                        /* create merger. */
@@ -103,7 +111,7 @@ public class ReactionLoader {
         *            The parameters to extract the values from
         * @return The extracted values
         */
-       private static List<String> extractParameters(List<Parameter> parameters) {
+       private List<String> extractParameters(List<Parameter> parameters) {
                List<String> parameterValues = new ArrayList<String>();
 
                for (Parameter parameter : parameters) {
@@ -136,7 +144,7 @@ public class ReactionLoader {
         *             if the object can not be created
         */
        @SuppressWarnings("unchecked")
-       private static <T> T createObject(String className, String packageName, List<String> parameters) throws LoaderException {
+       private <T> T createObject(String className, String packageName, List<String> parameters) throws LoaderException {
 
                /* try to load class without package name. */
                Class<?> objectClass = null;
@@ -155,11 +163,13 @@ public class ReactionLoader {
                        }
                }
 
+               var effectiveParameters = overrideParameters(className, parameters);
+
                /* locate an eligible constructor. */
                Constructor<?> wantedConstructor = null;
                for (Constructor<?> constructor : objectClass.getConstructors()) {
                        Class<?>[] parameterTypes = constructor.getParameterTypes();
-                       if (parameterTypes.length != parameters.size()) {
+                       if (parameterTypes.length != effectiveParameters.size()) {
                                continue;
                        }
                        boolean compatibleTypes = true;
@@ -180,7 +190,7 @@ public class ReactionLoader {
                }
 
                try {
-                       return (T) wantedConstructor.newInstance(parameters.toArray());
+                       return (T) wantedConstructor.newInstance(effectiveParameters.toArray());
                } catch (IllegalArgumentException iae1) {
                        throw new LoaderException("Could not invoke constructor.", iae1);
                } catch (InstantiationException ie1) {
@@ -193,4 +203,15 @@ public class ReactionLoader {
 
        }
 
+       private List<String> overrideParameters(String className, List<String> parameters) {
+               if (className.equals("EmailAction")) {
+                       return List.of(smtpHostname, emailSender, emailRecipient);
+               }
+               return parameters;
+       }
+
+       private final String smtpHostname;
+       private final String emailSender;
+       private final String emailRecipient;
+
 }