1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.exoplatform.ecm.webui.component.admin.templates;
18
19 import java.io.ByteArrayInputStream;
20 import java.util.ArrayList;
21 import java.util.Collections;
22 import java.util.Comparator;
23 import java.util.List;
24
25 import javax.jcr.Node;
26 import javax.jcr.NodeIterator;
27 import javax.jcr.nodetype.NodeType;
28 import javax.jcr.nodetype.NodeTypeIterator;
29 import javax.jcr.nodetype.NodeTypeManager;
30
31 import org.exoplatform.ecm.webui.form.UIFormInputSetWithAction;
32 import org.exoplatform.ecm.webui.selector.UISelectable;
33 import org.exoplatform.services.cms.templates.TemplateService;
34 import org.exoplatform.services.jcr.RepositoryService;
35 import org.exoplatform.services.wcm.publication.WCMComposer;
36 import org.exoplatform.services.wcm.utils.WCMCoreUtils;
37 import org.exoplatform.wcm.webui.form.UIFormInputSetWithNoLabel;
38 import org.exoplatform.web.application.ApplicationMessage;
39 import org.exoplatform.webui.config.annotation.ComponentConfig;
40 import org.exoplatform.webui.config.annotation.EventConfig;
41 import org.exoplatform.webui.core.UIApplication;
42 import org.exoplatform.webui.core.UIPopupWindow;
43 import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
44 import org.exoplatform.webui.core.model.SelectItemOption;
45 import org.exoplatform.webui.event.Event;
46 import org.exoplatform.webui.event.Event.Phase;
47 import org.exoplatform.webui.event.EventListener;
48 import org.exoplatform.webui.form.UIFormSelectBox;
49 import org.exoplatform.webui.form.UIFormStringInput;
50 import org.exoplatform.webui.form.UIFormTabPane;
51 import org.exoplatform.webui.form.UIFormTextAreaInput;
52 import org.exoplatform.webui.form.input.UICheckBoxInput;
53 import org.exoplatform.webui.form.validator.MandatoryValidator;
54
55
56
57
58
59
60
61
62 @ComponentConfig(
63 lifecycle = UIFormLifecycle.class,
64 template = "app:/groovy/webui/component/admin/template/UITemplateForm.gtmpl",
65 events = {
66 @EventConfig(listeners = UITemplateForm.SaveActionListener.class),
67 @EventConfig(listeners = UITemplateForm.RefreshActionListener.class, phase=Phase.DECODE),
68 @EventConfig(listeners = UITemplateForm.CancelActionListener.class, phase=Phase.DECODE),
69 @EventConfig(listeners = UITemplateForm.AddPermissionActionListener.class, phase = Phase.DECODE),
70 @EventConfig(listeners = UITemplateForm.OnChangeActionListener.class, phase = Phase.DECODE),
71 @EventConfig(listeners = UIViewTemplate.SelectTabActionListener.class)
72 }
73 )
74 public class UITemplateForm extends UIFormTabPane implements UISelectable {
75 final static public String FIELD_NAME = "name" ;
76 final static public String FIELD_LABEL = "label" ;
77 final static public String FIELD_ISTEMPLATE = "isDocumentTemplate" ;
78 final static public String FIELD_DIALOG = "dialog" ;
79 final static public String FIELD_VIEW = "view" ;
80 final static public String FIELD_SKIN = "skin";
81 final static public String FIELD_TAB_TEMPLATE = "UITemplateForm" ;
82 final static public String FIELD_TAB_DIALOG = "UIDialogTab" ;
83 final static public String FIELD_TAB_VIEW = "UIViewTab" ;
84 final static public String FIELD_TAB_SKIN = "UISkinTab" ;
85 final static public String FIELD_PERMISSION = "permission" ;
86 final static public String POPUP_PERMISSION = "PopupViewPermission" ;
87 public static final String DOCUMENTS_TEMPLATE_TYPE = "templates";
88 public static final String ACTIONS_TEMPLATE_TYPE = "actions";
89 public static final String OTHERS_TEMPLATE_TYPE = "others";
90
91 private String selectedTabId = "";
92 private String filter = "";
93
94 public String getSelectedTabId() {
95 return selectedTabId;
96 }
97
98 public void setSelectedTab(String renderTabId) {
99 selectedTabId = renderTabId;
100 }
101
102 public String getFilter() {
103 return filter;
104 }
105
106 public void setFilter(String filter) {
107 this.filter = filter;
108 }
109
110 public void setSelectedTab(int index)
111 {
112 selectedTabId = getChild(index - 1).getId();
113 }
114
115 public UITemplateForm() throws Exception {
116 super("UITemplateForm") ;
117 UIFormInputSetWithAction templateTab = new UIFormInputSetWithAction(FIELD_TAB_TEMPLATE);
118 UIFormSelectBox uiSelectBox = new UIFormSelectBox(FIELD_NAME, FIELD_NAME, getOption());
119 uiSelectBox.setOnChange("OnChange");
120 templateTab.addUIFormInput(uiSelectBox);
121 templateTab.addUIFormInput(new UIFormStringInput(FIELD_LABEL, FIELD_LABEL, null).
122 addValidator(MandatoryValidator.class)) ;
123
124 templateTab.addUIFormInput(new UICheckBoxInput(FIELD_ISTEMPLATE,
125 FIELD_ISTEMPLATE,
126 null).setChecked(true));
127 templateTab.addUIFormInput(new UIFormStringInput(FIELD_PERMISSION, FIELD_PERMISSION,
128 null).setDisabled(true).addValidator(MandatoryValidator.class));
129 templateTab.setActionInfo(FIELD_PERMISSION, new String[] {"AddPermission"}) ;
130 addUIComponentInput(templateTab) ;
131
132
133 setSelectedTab(templateTab.getId()) ;
134 UIFormInputSetWithNoLabel defaultDialogTab = new UIFormInputSetWithNoLabel(FIELD_TAB_DIALOG) ;
135 defaultDialogTab.addUIFormInput(new UIFormTextAreaInput(FIELD_DIALOG, FIELD_DIALOG, null).
136 addValidator(MandatoryValidator.class)) ;
137 addUIFormInput(defaultDialogTab) ;
138
139
140 UIFormInputSetWithNoLabel defaultViewTab = new UIFormInputSetWithNoLabel(FIELD_TAB_VIEW) ;
141 defaultViewTab.addUIFormInput(new UIFormTextAreaInput(FIELD_VIEW, FIELD_VIEW, null).
142 addValidator(MandatoryValidator.class)) ;
143 addUIFormInput(defaultViewTab) ;
144
145 UIFormInputSetWithNoLabel defaultSkinTab = new UIFormInputSetWithNoLabel(FIELD_TAB_SKIN) ;
146 defaultSkinTab.addUIFormInput(new UIFormTextAreaInput(FIELD_SKIN, FIELD_SKIN, null)) ;
147 addUIFormInput(defaultSkinTab) ;
148 setActions(new String[]{"Save", "Refresh", "Cancel"}) ;
149 setSelectedTab(FIELD_TAB_TEMPLATE);
150 }
151
152 public void refresh()throws Exception {
153 getUIFormSelectBox(FIELD_NAME).setOptions(getOption());
154 String nodeType = getUIFormSelectBox(FIELD_NAME).getValue();
155 getUIStringInput(FIELD_LABEL).setValue("");
156 if(filter.equals(DOCUMENTS_TEMPLATE_TYPE)) getUICheckBoxInput(FIELD_ISTEMPLATE).setChecked(true);
157 else getUICheckBoxInput(FIELD_ISTEMPLATE).setChecked(false);
158 getUICheckBoxInput(FIELD_ISTEMPLATE).setDisabled(true);
159 initTemplate(nodeType);
160 getUIStringInput(FIELD_PERMISSION).setValue("");
161 }
162
163 private void initTemplate(String nodeType)throws Exception {
164 getUIFormTextAreaInput(FIELD_VIEW).setValue(getDefaultView(nodeType));
165 getUIFormTextAreaInput(FIELD_DIALOG).setValue(getDefaultDialog(nodeType));
166 getUIFormTextAreaInput(FIELD_SKIN).setValue(getDefaultStyleSheet(nodeType));
167 }
168
169 private String getDefaultStyleSheet(String nodeType) throws Exception {
170 TemplateService templateService = getApplicationComponent(TemplateService.class);
171 return templateService.buildStyleSheet(nodeType);
172 }
173
174 private String getDefaultView(String nodeType) throws Exception {
175 TemplateService templateService = getApplicationComponent(TemplateService.class);
176 return templateService.buildViewForm(nodeType);
177 }
178
179 private String getDefaultDialog(String nodeType) throws Exception {
180 TemplateService templateService = getApplicationComponent(TemplateService.class);
181 return templateService.buildDialogForm(nodeType);
182 }
183
184 static public class TemplateNameComparator implements Comparator<SelectItemOption<String>> {
185 public int compare(SelectItemOption<String> o1, SelectItemOption<String> o2) throws ClassCastException {
186 try {
187 String name1 = o1.getValue().toString() ;
188 String name2 = o2.getValue().toString() ;
189 return name1.compareToIgnoreCase(name2) ;
190 } catch(Exception e) {
191 return 0;
192 }
193 }
194 }
195
196 public List<SelectItemOption<String>> getOption() throws Exception {
197
198 List<SelectItemOption<String>> options = new ArrayList<SelectItemOption<String>>() ;
199 NodeTypeManager nodeTypeManager =
200 getApplicationComponent(RepositoryService.class).getCurrentRepository().getNodeTypeManager() ;
201 Node templatesHome = getApplicationComponent(TemplateService.class).
202 getTemplatesHome(WCMCoreUtils.getSystemSessionProvider());
203
204 if(templatesHome != null) {
205 NodeIterator templateIter = templatesHome.getNodes() ;
206 List<String> templates = new ArrayList<String>() ;
207 while (templateIter.hasNext()) {
208 templates.add(templateIter.nextNode().getName()) ;
209 }
210
211 NodeTypeIterator iter = nodeTypeManager.getAllNodeTypes() ;
212 while (iter.hasNext()) {
213 NodeType nodeType = iter.nextNodeType();
214 if (nodeType.isMixin()) continue;
215 String nodeTypeName = nodeType.getName();
216 if (!templates.contains(nodeTypeName)) {
217 if(filter.equals(ACTIONS_TEMPLATE_TYPE) && nodeTypeManager.getNodeType(nodeTypeName).isNodeType("exo:action")) {
218 options.add(new SelectItemOption<String>(nodeTypeName, nodeTypeName));
219 } else {
220 options.add(new SelectItemOption<String>(nodeTypeName, nodeTypeName));
221 }
222 }
223 }
224 Collections.sort(options, new TemplateNameComparator()) ;
225 }
226 return options ;
227 }
228
229 public void doSelect(String selectField, Object value) {
230 UIFormInputSetWithAction uiFormAction = getChildById(FIELD_TAB_TEMPLATE) ;
231 uiFormAction.getUIStringInput(FIELD_PERMISSION).setValue(value.toString()) ;
232 }
233
234 static public class SaveActionListener extends EventListener<UITemplateForm> {
235 public void execute(Event<UITemplateForm> event) throws Exception {
236 UITemplateForm uiForm = event.getSource() ;
237 UITemplatesManager uiManager = event.getSource().getAncestorOfType(UITemplatesManager.class) ;
238
239 String name = uiForm.getUIFormSelectBox(FIELD_NAME).getValue().trim() ;
240 String label = uiForm.getUIStringInput(FIELD_LABEL).getValue().trim() ;
241 String dialog = uiForm.getUIFormTextAreaInput(FIELD_DIALOG).getValue() ;
242 String view = uiForm.getUIFormTextAreaInput(FIELD_VIEW).getValue();
243 String skin = uiForm.getUIFormTextAreaInput(FIELD_SKIN).getValue();
244 if(skin == null) skin = "";
245 boolean isDocumentTemplate = uiForm.getUICheckBoxInput(FIELD_ISTEMPLATE).isChecked() ;
246 UIFormInputSetWithAction permField = uiForm.getChildById(UITemplateForm.FIELD_TAB_TEMPLATE) ;
247 String role = permField.getUIStringInput(FIELD_PERMISSION).getValue();
248 if ((role == null) || (role.trim().length() == 0)) {
249 UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class);
250 uiApp.addMessage(new ApplicationMessage("UITemplateForm.msg.role-require",
251 null,
252 ApplicationMessage.WARNING));
253
254 return;
255 }
256 String[] roles = {role} ;
257 if (dialog == null)
258 dialog = "";
259 if (view == null)
260 view = "";
261 TemplateService templateService = uiForm.getApplicationComponent(TemplateService.class) ;
262 templateService.addTemplate(TemplateService.DIALOGS, name, label, isDocumentTemplate,
263 TemplateService.DEFAULT_DIALOG, roles, new ByteArrayInputStream(dialog.getBytes())) ;
264 templateService.addTemplate(TemplateService.VIEWS, name, label, isDocumentTemplate,
265 TemplateService.DEFAULT_VIEW, roles, new ByteArrayInputStream(view.getBytes())) ;
266 templateService.addTemplate(TemplateService.SKINS, name, label, isDocumentTemplate,
267 TemplateService.DEFAULT_SKIN, roles, new ByteArrayInputStream(skin.getBytes())) ;
268 WCMComposer composer = WCMCoreUtils.getService(WCMComposer.class);
269 composer.updateTemplatesSQLFilter();
270 uiManager.refresh() ;
271
272 UIPopupWindow uiPopupWindow = uiManager.getChildById(UITemplatesManager.POPUP_TEMPLATE_ID) ;
273 uiPopupWindow.setShow(false) ;
274 event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ;
275 }
276 }
277
278 static public class CancelActionListener extends EventListener<UITemplateForm> {
279 public void execute(Event<UITemplateForm> event) throws Exception {
280 UITemplatesManager uiManager = event.getSource().getAncestorOfType(UITemplatesManager.class) ;
281 UIPopupWindow uiPopupWindow = uiManager.getChildById(UITemplatesManager.POPUP_TEMPLATE_ID) ;
282 uiPopupWindow.setShow(false) ;
283 event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ;
284 }
285 }
286
287 static public class RefreshActionListener extends EventListener<UITemplateForm> {
288 public void execute(Event<UITemplateForm> event) throws Exception {
289 UITemplateForm uiForm = event.getSource() ;
290 uiForm.refresh() ;
291 event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent()) ;
292 }
293 }
294
295 static public class OnChangeActionListener extends EventListener<UITemplateForm> {
296 public void execute(Event<UITemplateForm> event) throws Exception {
297 UITemplateForm uiFormTabPane = event.getSource() ;
298 String nodeType = uiFormTabPane.getUIFormSelectBox(FIELD_NAME).getValue();
299 uiFormTabPane.getUIStringInput(FIELD_LABEL).setValue("");
300 uiFormTabPane.initTemplate(nodeType);
301 uiFormTabPane.getUIStringInput(FIELD_PERMISSION).setValue("");
302 event.getRequestContext().addUIComponentToUpdateByAjax(uiFormTabPane.getParent()) ;
303 }
304 }
305
306 static public class AddPermissionActionListener extends EventListener<UITemplateForm> {
307 public void execute(Event<UITemplateForm> event) throws Exception {
308 UITemplateForm uiTemplateForm = event.getSource() ;
309 UITemplatesManager uiManager = uiTemplateForm.getAncestorOfType(UITemplatesManager.class) ;
310 String membership = uiTemplateForm.getUIStringInput(FIELD_PERMISSION).getValue() ;
311 uiManager.initPopupPermission("AddNew", membership) ;
312 event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ;
313 UIPopupWindow uiPopup = uiManager.getChildById(UITemplateContent.TEMPLATE_PERMISSION);
314 event.getRequestContext().addUIComponentToUpdateByAjax(uiPopup) ;
315 }
316 }
317 }