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;
35
36 import info.magnolia.context.Context;
37 import info.magnolia.context.MgnlContext;
38 import info.magnolia.event.EventBus;
39 import info.magnolia.i18nsystem.SimpleTranslator;
40 import info.magnolia.jcr.util.NodeTypes;
41 import info.magnolia.objectfactory.ComponentProvider;
42 import info.magnolia.registry.RegistrationException;
43 import info.magnolia.rendering.template.TemplateDefinition;
44 import info.magnolia.rendering.template.registry.TemplateDefinitionRegistry;
45 import info.magnolia.ui.api.action.AbstractAction;
46 import info.magnolia.ui.api.action.ActionExecutionException;
47 import info.magnolia.ui.api.app.SubAppContext;
48 import info.magnolia.ui.api.app.SubAppEventBus;
49 import info.magnolia.ui.api.event.ContentChangedEvent;
50 import info.magnolia.ui.dialog.DialogView;
51 import info.magnolia.ui.dialog.formdialog.FormDialogPresenter;
52 import info.magnolia.ui.dialog.formdialog.FormDialogPresenterFactory;
53 import info.magnolia.ui.form.EditorCallback;
54 import info.magnolia.ui.vaadin.gwt.client.shared.AreaElement;
55 import info.magnolia.ui.vaadin.integration.jcr.DefaultProperty;
56 import info.magnolia.ui.vaadin.integration.jcr.JcrNewNodeAdapter;
57 import info.magnolia.ui.vaadin.integration.jcr.JcrNodeAdapter;
58 import info.magnolia.ui.vaadin.integration.jcr.ModelConstants;
59
60 import javax.inject.Inject;
61 import javax.inject.Named;
62 import javax.jcr.Node;
63 import javax.jcr.RepositoryException;
64 import javax.jcr.Session;
65
66 import org.apache.commons.lang3.StringUtils;
67 import org.slf4j.Logger;
68 import org.slf4j.LoggerFactory;
69
70
71
72
73
74 public class CreateComponentAction extends AbstractAction<CreateComponentActionDefinition> {
75
76 private static final Logger log = LoggerFactory.getLogger(CreateComponentAction.class);
77
78 private static final String NEW_COMPONENT_DIALOG = "pages:newComponent";
79
80 private final AreaElement area;
81 private final EventBus eventBus;
82 private final TemplateDefinitionRegistry templateDefinitionRegistry;
83 private final SubAppContext subAppContext;
84 private final FormDialogPresenterFactory formDialogPresenterFactory;
85 private final Context ctx;
86
87 private DialogView dialogView;
88
89 @Inject
90 public CreateComponentAction(CreateComponentActionDefinition definition, AreaElement area, @Named(SubAppEventBus.NAME) EventBus eventBus, TemplateDefinitionRegistry templateDefinitionRegistry,
91 SubAppContext subAppContext, FormDialogPresenterFactory formDialogPresenterFactory, Context ctx) {
92 super(definition);
93 this.area = area;
94 this.eventBus = eventBus;
95 this.templateDefinitionRegistry = templateDefinitionRegistry;
96 this.subAppContext = subAppContext;
97 this.formDialogPresenterFactory = formDialogPresenterFactory;
98 this.ctx = ctx;
99 }
100
101
102
103
104 @Deprecated
105 public CreateComponentAction(CreateComponentActionDefinition definition, AreaElement area, @Named(SubAppEventBus.NAME) EventBus eventBus, TemplateDefinitionRegistry templateDefinitionRegistry,
106 SubAppContext subAppContext, ComponentProvider componentProvider, FormDialogPresenterFactory formDialogPresenterFactory) {
107 this(definition, area, eventBus, templateDefinitionRegistry, subAppContext, formDialogPresenterFactory, MgnlContext.getInstance());
108 }
109
110
111
112
113
114 @Deprecated
115 public CreateComponentAction(CreateComponentActionDefinition definition, AreaElement area, @Named(SubAppEventBus.NAME) EventBus eventBus, TemplateDefinitionRegistry templateDefinitionRegistry,
116 SubAppContext subAppContext, ComponentProvider componentProvider, FormDialogPresenterFactory formDialogPresenterFactory, SimpleTranslator i18n) {
117 this(definition, area, eventBus, templateDefinitionRegistry, subAppContext, formDialogPresenterFactory, MgnlContext.getInstance());
118 }
119
120 @Override
121 public void execute() throws ActionExecutionException {
122 String workspace = area.getWorkspace();
123 String path = area.getPath();
124
125 try {
126 Session session = ctx.getJCRSession(workspace);
127 if (path == null || !session.itemExists(path)) {
128 path = "/";
129 }
130
131 if (StringUtils.isNotBlank(area.getAvailableComponents())) {
132 Node areaNode = session.getNode(path);
133
134
135 final JcrNodeAdapter item = new JcrNewNodeAdapter(areaNode, NodeTypes.Component.NAME);
136 item.addItemProperty(ModelConstants.JCR_NAME, new DefaultProperty<>(String.class, "0"));
137
138
139 final FormDialogPresenter formDialogPresenter = formDialogPresenterFactory.createFormDialogPresenter(NEW_COMPONENT_DIALOG);
140 final EditorCallback callback = new ComponentCreationCallback(item, formDialogPresenter);
141
142
143 if (area.getAvailableComponents().split(",").length > 1) {
144 this.dialogView = formDialogPresenter.start(item, NEW_COMPONENT_DIALOG, subAppContext, callback);
145 } else {
146 item.addItemProperty(NodeTypes.Renderable.TEMPLATE, new DefaultProperty<>(String.class, area.getAvailableComponents()));
147 callback.onSuccess(getDefinition().getName());
148 }
149 } else {
150 log.warn("No available components defined for {} area.", area.getPath());
151 }
152 } catch (RepositoryException e) {
153 throw new ActionExecutionException(e);
154 }
155 }
156
157 private void openDialog(final JcrNodeAdapter item, String dialogId) {
158
159 final FormDialogPresenter dialogPresenter = formDialogPresenterFactory.createFormDialogPresenter(dialogId);
160 dialogPresenter.start(item, dialogId, subAppContext, new EditorCallback() {
161
162 @Override
163 public void onSuccess(String actionName) {
164 eventBus.fireEvent(new ContentChangedEvent(item.getItemId()));
165 dialogPresenter.closeDialog();
166 }
167
168 @Override
169 public void onCancel() {
170 dialogPresenter.closeDialog();
171 }
172 });
173 }
174
175 private class ComponentCreationCallback implements EditorCallback {
176
177 private final JcrNodeAdapter item;
178 private final FormDialogPresenter formDialogPresenter;
179
180 public ComponentCreationCallback(JcrNodeAdapter item, FormDialogPresenter formDialogPresenter) {
181 this.item = item;
182 this.formDialogPresenter = formDialogPresenter;
183 }
184
185 @Override
186 public void onSuccess(String actionName) {
187 String templateId = String.valueOf(item.getItemProperty(NodeTypes.Renderable.TEMPLATE).getValue());
188 try {
189 TemplateDefinition templateDef = templateDefinitionRegistry.getTemplateDefinition(templateId);
190 String dialogId = templateDef.getDialog();
191
192 if (StringUtils.isNotEmpty(dialogId)) {
193 openDialog(item, dialogId);
194 } else {
195
196 try {
197 final Node node = item.applyChanges();
198 node.getSession().save();
199
200 } catch (RepositoryException e) {
201 log.error("Exception caught: {}", e.getMessage(), e);
202 }
203
204 eventBus.fireEvent(new ContentChangedEvent(item.getItemId()));
205 }
206 } catch (RegistrationException e) {
207 log.error("Exception caught: {}", e.getMessage(), e);
208 } finally {
209 if (dialogView != null) {
210 dialogView.close();
211 }
212 }
213 }
214
215 @Override
216 public void onCancel() {
217 formDialogPresenter.closeDialog();
218 }
219 }
220 }