Trigger.java
package com.redis.test.fi;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/** A cluster recipe producing its {@link Effect}, with the requirements it can run under. */
public final class Trigger {
private final StandaloneEffect effect;
private final String name;
private final String description;
private final List<Requirement> requirements;
private Trigger(StandaloneEffect effect, String name, String description,
List<Requirement> requirements) {
this.effect = effect;
this.name = name;
this.description = description;
this.requirements = Collections.unmodifiableList(requirements);
}
@SuppressWarnings("unchecked")
static Trigger parse(StandaloneEffect effect, Map<String, Object> trigger) {
List<Requirement> requirements = new ArrayList<>();
for (Object r : (List<Object>) trigger.get("requirements")) {
requirements.add(Requirement.parse((Map<String, Object>) r));
}
return new Trigger(effect, (String) trigger.get("name"), (String) trigger.get("description"),
requirements);
}
public StandaloneEffect effect() {
return effect;
}
public String name() {
return name;
}
public String description() {
return description;
}
/** A scenario running this trigger under the named requirement config; fails loudly if absent. */
public Scenario scenario(String config) {
return new Scenario(this, requirement(config));
}
/** Whether the FI environment offers the named requirement config for this trigger. */
public boolean offers(String config) {
return requirements.stream().anyMatch(r -> config.equals(r.config()));
}
/** The requirement with the given catalog config name; fails loudly if absent. */
public Requirement requirement(String config) {
return requirements.stream().filter(r -> config.equals(r.config())).findFirst()
.orElseThrow(() -> new IllegalArgumentException(
"Trigger " + name + " has no requirement config '" + config + "': " + requirements));
}
public List<Requirement> requirements() {
return requirements;
}
/** The base 'single' variant ��� requirements[0]; TLS/scaled variants are FI-flag opt-ins. */
public Requirement requirement() {
return requirements.get(0);
}
/** This trigger under its base requirement. */
public Scenario scenario() {
return new Scenario(this, requirement());
}
@Override
public String toString() {
return effect + "/" + name;
}
}