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.pages.app.action.browser;
35
36 import info.magnolia.jcr.util.NodeNameHelper;
37 import info.magnolia.jcr.util.NodeTypes;
38 import info.magnolia.jcr.util.NodeUtil;
39 import info.magnolia.rendering.template.TemplateDefinition;
40 import info.magnolia.rendering.template.registry.TemplateDefinitionRegistry;
41 import info.magnolia.ui.CloseHandler;
42 import info.magnolia.ui.ValueContext;
43 import info.magnolia.ui.api.action.AbstractAction;
44 import info.magnolia.ui.api.action.ActionExecutionException;
45 import info.magnolia.ui.datasource.jcr.JcrDatasource;
46 import info.magnolia.ui.editor.FormView;
47
48 import javax.inject.Inject;
49 import javax.jcr.Node;
50
51 import com.machinezoo.noexception.Exceptions;
52 import com.vaadin.data.BinderValidationStatus;
53
54
55
56
57
58
59 public class CreatePageAction extends AbstractAction<CreatePageActionDefinition> {
60
61 private final FormView<Node> form;
62 private ValueContext<Node> valueContext;
63 private final JcrDatasource jcrDatasource;
64 private final CloseHandler closeHandler;
65 private final NodeNameHelper nodeNameHelper;
66 private final TemplateDefinitionRegistry templateDefinitionRegistry;
67
68 @Inject
69 public CreatePageAction(CreatePageActionDefinition definition, FormView<Node> form,
70 ValueContext<Node> valueContext,
71 JcrDatasource jcrDatasource,
72 CloseHandler closeHandler,
73 NodeNameHelper nodeNameHelper,
74 TemplateDefinitionRegistry templateDefinitionRegistry) {
75 super(definition);
76 this.form = form;
77 this.valueContext = valueContext;
78 this.jcrDatasource = jcrDatasource;
79 this.closeHandler = closeHandler;
80 this.nodeNameHelper = nodeNameHelper;
81 this.templateDefinitionRegistry = templateDefinitionRegistry;
82 }
83
84
85 @Override
86 public void execute() {
87 Exceptions.wrap().run(() -> {
88 Node parent = valueContext.getSingle().orElseGet(jcrDatasource::getRoot);
89
90
91 String uniquePath = nodeNameHelper.getUniqueName(parent.getSession(), parent.getPath(), "untitled");
92
93
94 Node page = NodeUtil.createPath(parent, uniquePath, NodeTypes.Page.NAME);
95
96 valueContext.set(page);
97
98
99
100 boolean isInvalidForm = form.validate().stream().anyMatch(BinderValidationStatus::hasErrors);
101
102
103 if (isInvalidForm) {
104 valueContext.set(parent);
105 return;
106 }
107
108
109 String pageName = form.<String>getPropertyValue("jcrName")
110 .orElseThrow(ActionExecutionException::new);
111
112
113 pageName = nodeNameHelper.getUniqueName(parent, pageName);
114
115
116 pageName = nodeNameHelper.getValidatedName(pageName);
117
118 String pageTemplate = form.<String>getPropertyValue(NodeTypes.Renderable.TEMPLATE)
119 .orElseThrow(ActionExecutionException::new);
120
121 TemplateDefinition templateDefinition = templateDefinitionRegistry.getProvider(pageTemplate).get();
122
123
124 NodeUtil.renameNode(page, pageName);
125
126
127 NodeTypes.Renderable.set(page, templateDefinition.getId());
128
129
130 page.getSession().save();
131
132
133 valueContext.set(page);
134
135
136 closeHandler.close();
137 });
138 }
139 }