1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.ui.availability;
35
36 import info.magnolia.objectfactory.ComponentProvider;
37 import info.magnolia.ui.api.availability.AvailabilityDefinition;
38 import info.magnolia.ui.api.availability.AvailabilityRuleDefinition;
39 import info.magnolia.ui.availability.rule.AccessGrantedRuleDefinition;
40 import info.magnolia.ui.availability.rule.MultipleItemsRuleDefinition;
41
42 import java.util.List;
43 import java.util.stream.Stream;
44
45 import javax.inject.Inject;
46
47
48
49
50 public class DefaultAvailabilityChecker<T> implements AvailabilityChecker<T> {
51
52 private final ComponentProvider componentProvider;
53
54 @Inject
55 public DefaultAvailabilityChecker(ComponentProvider componentProvider) {
56 this.componentProvider = componentProvider;
57 }
58
59 @Override
60 public boolean isAvailable(AvailabilityDefinition availabilityDefinition, List<T> items) {
61
62 boolean rulesPass = Stream.concat(getDefaultRulesDefinitions(), availabilityDefinition.getRules().stream())
63 .filter(ruleDefinition -> ruleDefinition.getImplementationClass() != null)
64 .allMatch(ruleDefinition -> isAvailable(availabilityDefinition, ruleDefinition, items));
65
66
67
68 if (rulesPass && items.isEmpty()) {
69 return availabilityDefinition.isRoot();
70 }
71
72 return rulesPass;
73 }
74
75 protected Stream<AvailabilityRuleDefinition> getDefaultRulesDefinitions() {
76 return Stream.of(new AccessGrantedRuleDefinition(), new MultipleItemsRuleDefinition());
77 }
78
79 private boolean isAvailable(AvailabilityDefinition availabilityDefinition, AvailabilityRuleDefinition ruleDefinition, List<T> items) {
80 return componentProvider.newInstance(ruleDefinition.getImplementationClass(), availabilityDefinition, ruleDefinition).isAvailable(items);
81 }
82 }