@JsonProperty
private List<Parameter> parameters = new ArrayList<Parameter>();
+ /** Runtime arguments for the part. */
+ @JsonProperty
+ private List<Parameter> runtimeArguments = new ArrayList<>();
+
/**
* Returns the name of the part’s class.
*
return parameters;
}
+ public List<Parameter> getRuntimeArguments() {
+ return runtimeArguments;
+ }
+
/**
* {@inheritDoc}
*/
for (Parameter parameter : parameters) {
hashCode ^= parameter.hashCode();
}
+ for (Parameter runtimeArgument : runtimeArguments) {
+ hashCode ^= runtimeArgument.hashCode();
+ }
return hashCode;
}
if (!(object instanceof Part part)) {
return false;
}
- if (!name.equals(part.name)) {
- return false;
- }
- if (parameters.size() != part.parameters.size()) {
- return false;
- }
- for (int parameterIndex = 0; parameterIndex < parameters.size(); ++parameterIndex) {
- if (!parameters.get(parameterIndex).equals(part.parameters.get(parameterIndex))) {
- return false;
- }
- }
- return true;
+ return name.equals(part.name) && parameters.equals(part.parameters) && runtimeArguments.equals(part.runtimeArguments);
}
}
import net.pterodactylus.rhynodge.loader.Chain.Parameter;
import net.pterodactylus.rhynodge.loader.Chain.Part;
import net.pterodactylus.rhynodge.Merger;
+import net.pterodactylus.rhynodge.output.Output;
/**
* Creates {@link Reaction}s from {@link Chain}s.
/* create action. */
Action action = createObject(chain.action().name(), "net.pterodactylus.rhynodge.actions", extractParameters(chain.action().parameters()));
+ if ((action == emailAction) && !chain.action().getRuntimeArguments().isEmpty()) {
+ action = (output, arguments) -> emailAction.execute(output, chain.action().getRuntimeArguments().stream().map(Parameter::value).toArray(String[]::new));
+ }
/* do we have a reaction defined? */
if (chain.watcher() != null) {
import net.pterodactylus.rhynodge.State
import net.pterodactylus.rhynodge.Watcher
import net.pterodactylus.rhynodge.actions.EmailAction
+import net.pterodactylus.rhynodge.output.DefaultOutput
import net.pterodactylus.rhynodge.output.Output
import net.pterodactylus.rhynodge.states.AbstractState
import net.pterodactylus.util.inject.ObjectBinding
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.contains
import org.hamcrest.Matchers.equalTo
+import org.hamcrest.Matchers.hasItem
import org.hamcrest.Matchers.instanceOf
import org.hamcrest.Matchers.sameInstance
import org.junit.jupiter.api.Test
assertThat(reaction.action(), sameInstance(emailAction))
}
- private val emailAction = EmailAction("local.host", "send@r", "recipi@nt")
+ @Test
+ fun `loader augments email action when runtime arguments are given`() {
+ val chain = objectMapper.readValue<Chain>(javaClass.getResourceAsStream("chain-with-email-action-and-runtime-arguments.json")!!)
+ val reaction = reactionLoader.loadReaction(chain)
+ reaction.action().execute(DefaultOutput(""))
+ assertThat(emailAction.sentEmails, hasItem("test1@test.com"))
+ }
+
+ private val emailAction = TestEmailAction("local.host", "send@r", "recipi@nt")
private val reactionLoader = ReactionLoader(emailAction)
}
override fun merger() = TestMerger1(three)
}
+class TestEmailAction(hostname: String, sender: String, recipient: String) : EmailAction(hostname, sender, recipient) {
+
+ override fun execute(output: Output, vararg additionalRecipients: String) {
+ additionalRecipients.forEach((sentEmails as MutableList<String>)::add)
+ }
+
+ val sentEmails: List<String> = mutableListOf()
+
+}
+
private val objectMapper = ObjectMapper()