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