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.databinding;
35
36 import info.magnolia.ui.framework.databinding.ItemProviderStrategy;
37 import info.magnolia.ui.framework.databinding.view.EditorView;
38 import info.magnolia.ui.api.action.AbstractAction;
39 import info.magnolia.ui.api.action.ActionExecutionException;
40 import info.magnolia.ui.api.action.ConfiguredActionDefinition;
41 import info.magnolia.ui.api.app.SubAppContext;
42
43 import java.util.List;
44
45 import javax.inject.Inject;
46 import javax.jcr.Node;
47 import javax.jcr.RepositoryException;
48
49 import com.vaadin.data.BinderValidationStatus;
50
51
52
53
54 public class SaveFormAction extends AbstractAction<ConfiguredActionDefinition> {
55
56 private final SubAppContext subAppContext;
57 private final EditorView<Node> formView;
58 private final ItemProviderStrategy<Node> itemProviderStrategy;
59
60 @Inject
61 protected SaveFormAction(ConfiguredActionDefinition definition, SubAppContext subAppContext, EditorView<Node> formView, ItemProviderStrategy<Node> itemProviderStrategy) {
62 super(definition);
63 this.subAppContext = subAppContext;
64 this.formView = formView;
65 this.itemProviderStrategy = itemProviderStrategy;
66 }
67
68 @Override
69 public void execute() throws ActionExecutionException {
70 try {
71 List<BinderValidationStatus<?>> validationStatuses = formView.validate();
72 if (validationStatuses.stream().anyMatch(BinderValidationStatus::hasErrors)) {
73
74 return;
75 }
76 itemProviderStrategy.read().ifPresent(node -> {
77 try {
78 formView.write(node);
79 if (node.getSession().hasPendingChanges()) {
80 node.getSession().save();
81 }
82 subAppContext.close();
83 } catch (RepositoryException e) {
84 throw new RuntimeException(e);
85 }
86 });
87 } catch (Exception e) {
88 throw new ActionExecutionException(e);
89 }
90 }
91 }