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.commands.CommandsManager;
37 import info.magnolia.context.Context;
38 import info.magnolia.ui.ValueContext;
39 import info.magnolia.ui.api.action.AbstractAction;
40 import info.magnolia.ui.api.action.CommandActionDefinition;
41 import info.magnolia.ui.contentapp.async.AsyncActionExecutor;
42
43 import java.util.Collection;
44 import java.util.HashMap;
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
56
57
58 public class CommandAction<T, D extends CommandActionDefinition> extends AbstractAction<D> {
59
60 private final CommandsManager commandsManager;
61 private final ValueContext<T> valueContext;
62 private final Context context;
63 private final AsyncActionExecutor asyncActionExecutor;
64
65 @Inject
66 public CommandAction(D definition, CommandsManager commandsManager, ValueContext<T> valueContext, Context context, AsyncActionExecutor asyncActionExecutor) {
67 super(definition);
68 this.commandsManager = commandsManager;
69 this.valueContext = valueContext;
70 this.context = context;
71 this.asyncActionExecutor = asyncActionExecutor;
72 }
73
74 @Override
75 public void execute() {
76 Collection<T> items = resolveTargetItems();
77 if (getDefinition().isAsynchronous()) {
78 executeAsynchronously(items);
79 } else {
80 executeSynchronously(items);
81 }
82 }
83
84 protected Collection<T> resolveTargetItems() {
85 return valueContext.get().collect(Collectors.toList());
86 }
87
88 protected Map<String, Object> buildParams(T item) {
89 Map<String, Object> params = new HashMap<>(getDefinition().getParams());
90 params.put(Context.ATTRIBUTE_USERNAME, context.getUser().getName());
91 return params;
92 }
93
94 protected ValueContext<T> getValueContext() {
95 return valueContext;
96 }
97
98 private void executeAsynchronously(Collection<T> items) {
99 asyncActionExecutor.execute(AsyncActionExecutor.AsyncAction.builder()
100 .action(() -> executeSynchronously(items))
101 .delaySeconds(getDefinition().getDelay())
102 .timeToWaitMilliseconds(getDefinition().getTimeToWait())
103 .description(String.format(getDefinition().getDescription(), items))
104 .successMessage(getDefinition().isNotifyUser() ? getDefinition().getSuccessMessage() : null)
105 .failureMessage(getDefinition().getFailureMessage())
106 .build()
107 );
108 }
109
110 private void executeSynchronously(Collection<T> items) {
111 items.forEach(Exceptions.wrap().consumer(
112 item -> commandsManager.executeCommand(getDefinition().getCatalog(), getDefinition().getCommand(), buildParams(item))
113 ));
114 }
115 }