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.contentapp.action;
35
36 import info.magnolia.objectfactory.ComponentProvider;
37 import info.magnolia.ui.api.action.AbstractAction;
38 import info.magnolia.ui.api.action.AbstractActionExecutor;
39 import info.magnolia.ui.api.action.ActionDefinition;
40 import info.magnolia.ui.api.action.ActionExecutionException;
41 import info.magnolia.ui.availability.AvailabilityChecker;
42 import info.magnolia.ui.ValueContext;
43
44 import java.util.List;
45 import java.util.Map;
46 import java.util.stream.Collectors;
47
48 import javax.inject.Inject;
49
50 import com.machinezoo.noexception.Exceptions;
51
52
53
54
55 public class ChainedAction<T> extends AbstractAction<ChainedActionDefinition> {
56
57 private final ChainedActionExecutor actionExecutor;
58 private final ValueContext<T> valueContext;
59 private final AvailabilityChecker<T> availabilityChecker;
60
61 @Inject
62 public ChainedAction(ChainedActionDefinition actionDefinition, ComponentProvider componentProvider, ValueContext<T> valueContext, AvailabilityChecker<T> availabilityChecker) {
63 super(actionDefinition);
64 this.actionExecutor = new ChainedActionExecutor(componentProvider);
65 this.valueContext = valueContext;
66 this.availabilityChecker = availabilityChecker;
67 }
68
69 @Override
70 public void execute() throws ActionExecutionException {
71 final List<T> items = valueContext.get().collect(Collectors.toList());
72
73 getDefinition().getActions().entrySet().stream()
74 .filter(actionDefinitionEntry -> availabilityChecker.isAvailable(actionDefinitionEntry.getValue().getAvailability(), items))
75 .map(Map.Entry::getKey)
76 .forEach(Exceptions.wrap().consumer(this::execute));
77 }
78
79 protected void execute(String action, Object... arguments) throws ActionExecutionException {
80 actionExecutor.execute(action, arguments);
81 }
82
83 protected ValueContext<T> getValueContext() {
84 return valueContext;
85 }
86
87 private class ChainedActionExecutor extends AbstractActionExecutor {
88
89 private ChainedActionExecutor(ComponentProvider componentProvider) {
90 super(componentProvider);
91 }
92
93 @Override
94 public ActionDefinition getActionDefinition(String actionName) {
95 return getDefinition().getActions().get(actionName);
96 }
97 }
98 }