View Javadoc
1   /*
2    * Copyright (C) 2003-2007 eXo Platform SAS.
3    *
4    * This program is free software; you can redistribute it and/or
5    * modify it under the terms of the GNU Affero General Public License
6    * as published by the Free Software Foundation; either version 3
7    * of the License, or (at your option) any later version.
8    *
9    * This program is distributed in the hope that it will be useful,
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   * GNU General Public License for more details.
13   *
14   * You should have received a copy of the GNU General Public License
15   * along with this program; if not, see<http://www.gnu.org/licenses/>.
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   * Created by The eXo Platform SARL
57   * Author : pham tuan
58   *          phamtuanchip@yahoo.de
59   * Oct 03, 2006
60   * 9:43:23 AM
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 = ""; //DOCUMENTS_TEMPLATE_TYPE;
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       //uiForm.refresh() ;
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 }