public interface TransitionFilter {
boolean accept(Transition<?, ?> transition);
}
@Component
@ConditionalOnProperty(name = "app.test-mode", havingValue = "false", matchIfMissing = true)
public class TestOnlyFilter implements TransitionFilter {
private static final String TEST_ONLY = "test-only";
private final TestContext testContext;
public TestOnlyFilter(TestContext testContext) {
this.testContext = testContext;
}
@Override
public boolean accept(Transition<?, ?> transition) {
Object meta = transition.getMetadata().get(TEST_ONLY);
boolean testOnly = Boolean.TRUE.equals(meta);
return !testOnly || testContext.isTestMode();
}
}
@Service
@RequiredArgsConstructor
public class TransitionAccessService {
private final List<TransitionFilter> filters;
public boolean isAcceptedByFilters(Transition<?, ?> transition) {
return filters.stream()
.allMatch(filter -> filter.accept(transition));
}
}