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.script;
18  
19  import org.apache.commons.lang.StringEscapeUtils;
20  import org.exoplatform.commons.utils.LazyPageList;
21  import org.exoplatform.commons.utils.ListAccess;
22  import org.exoplatform.commons.utils.ListAccessImpl;
23  import org.exoplatform.services.cms.impl.Utils;
24  import org.exoplatform.services.cms.scripts.ScriptService;
25  import org.exoplatform.services.wcm.core.NodetypeConstant;
26  import org.exoplatform.services.wcm.utils.WCMCoreUtils;
27  import org.exoplatform.web.application.ApplicationMessage;
28  import org.exoplatform.webui.config.annotation.ComponentConfig;
29  import org.exoplatform.webui.config.annotation.EventConfig;
30  import org.exoplatform.webui.core.UIComponentDecorator;
31  import org.exoplatform.webui.core.UIPageIterator;
32  import org.exoplatform.webui.event.Event;
33  import org.exoplatform.webui.event.EventListener;
34  import org.exoplatform.webui.exception.MessageException;
35  
36  import javax.jcr.AccessDeniedException;
37  import javax.jcr.Node;
38  import javax.jcr.PathNotFoundException;
39  import java.util.ArrayList;
40  import java.util.Collections;
41  import java.util.Comparator;
42  import java.util.List;
43  
44  /**
45   * Created by The eXo Platform SARL
46   * Author : pham tuan
47   *          phamtuanchip@yahoo.de
48   * September 27, 2006
49   * 10:37:15 AM
50   */
51  @ComponentConfig(
52                   template = "app:/groovy/webui/component/admin/script/UIScriptList.gtmpl",
53                   events = {
54                       @EventConfig(listeners = UIScriptList.EditActionListener.class),
55                       @EventConfig(listeners = UIScriptList.DeleteActionListener.class, confirm="UIScriptList.msg.confirm-delete"),
56                       @EventConfig(listeners = UIScriptList.AddNewActionListener.class)
57                   }
58      )
59  
60  public class UIScriptList extends UIComponentDecorator {
61  
62    private UIPageIterator uiPageIterator_;
63    public static final String ACTION_SCRIPT_TYPE = "action";
64    public static final String INTERCEPTOR_SCRIPT_TYPE = "interceptor";
65    public static final String WIDGET_SCRIPT_TYPE = "widget";
66    
67    private static final String EDITED_CONFIGURED_SCRIPTS = "EditedConfiguredScripts";
68  
69    private String filter = ACTION_SCRIPT_TYPE;
70  
71    public void setTemplateFilter(String filter) {
72      this.filter = filter;
73    }  
74    public String getTemplateFilter() {
75      return this.filter;
76    }
77  
78    public UIScriptList() throws Exception {
79      uiPageIterator_ = createUIComponent(UIPageIterator.class, null, "ScriptListIterator");
80      setUIComponent(uiPageIterator_);
81    }
82  
83    public void updateGrid(List<ScriptData> scriptData, int currentPage) throws Exception {
84      Collections.sort(scriptData, new ScriptComparator());
85      ListAccess<ScriptData> scriptList = new ListAccessImpl<ScriptData>(ScriptData.class, scriptData);
86      LazyPageList<ScriptData> dataPageList = new LazyPageList<ScriptData>(scriptList, 10);
87      uiPageIterator_.setPageList(dataPageList);
88      if (currentPage > uiPageIterator_.getAvailablePage())
89        uiPageIterator_.setCurrentPage(uiPageIterator_.getAvailablePage());
90      else
91        uiPageIterator_.setCurrentPage(currentPage);
92    }
93  
94    public UIPageIterator getUIPageIterator() { return uiPageIterator_; }
95  
96    public List getScriptList() throws Exception { return uiPageIterator_.getCurrentPageData(); }
97  
98    public String getScriptCategory() throws Exception {
99      ScriptService scriptService =  getApplicationComponent(ScriptService.class);
100     UIScriptManager uiManager = getAncestorOfType(UIScriptManager.class);
101     UIScriptContainer uiContainer = uiManager.getChildById(uiManager.getSelectedTabId());
102     UIScriptList uiScriptList = uiContainer.getChild(UIScriptList.class);
103     Node script = scriptService.getECMScriptHome(WCMCoreUtils.getSystemSessionProvider()).getNode(uiScriptList.getTemplateFilter());
104     String basePath = scriptService.getBaseScriptPath() + "/";
105     return script.getPath().substring(basePath.length());
106   }
107 
108   public void refresh(String templateFilter, int currentPage) throws Exception {
109     this.updateGrid(getScript(templateFilter), currentPage);
110   }
111 
112   public List<ScriptData> getScript(String name) throws Exception {
113     List <ScriptData> scriptData = new ArrayList <ScriptData>() ;
114     List<Node> scripts = new ArrayList<Node> () ;
115     if(name.equals(ACTION_SCRIPT_TYPE)) {
116       scripts = getApplicationComponent(ScriptService.class).getECMActionScripts(WCMCoreUtils.getSystemSessionProvider());
117     }else if(name.equals(WIDGET_SCRIPT_TYPE)){
118       scripts = getApplicationComponent(ScriptService.class).getECMWidgetScripts(WCMCoreUtils.getSystemSessionProvider());
119     }else if(name.equals(INTERCEPTOR_SCRIPT_TYPE)) {
120       scripts = 
121           getApplicationComponent(ScriptService.class).getECMInterceptorScripts(WCMCoreUtils.getSystemSessionProvider());
122     }
123     for(Node scriptNode : scripts) {
124       Node content = scriptNode.getNode(NodetypeConstant.JCR_CONTENT);
125       String scriptDescription;
126       try {
127         scriptDescription = content.getProperty(NodetypeConstant.DC_DESCRIPTION).getValues()[0].getString();
128       } catch(ArrayIndexOutOfBoundsException are) {
129 	      scriptDescription = scriptNode.getName();
130       } catch(PathNotFoundException pne) {
131         scriptDescription = scriptNode.getName();
132       }
133       scriptData.add(new ScriptData(scriptNode.getName(), scriptNode.getPath(), StringEscapeUtils.escapeHtml(scriptDescription)));
134     }
135     return scriptData ;
136   }
137 
138   public String[] getActions() {return new String[]{"AddNew"};}
139 
140   public Node getScriptNode(String templateFilter, String nodeName) throws Exception {
141     ScriptService scriptService =  getApplicationComponent(ScriptService.class);
142     Node category = scriptService.getECMScriptHome(WCMCoreUtils.getSystemSessionProvider()).getNode(templateFilter);
143     return category.getNode(nodeName);
144   }
145 
146   static public class ScriptComparator implements Comparator<ScriptData> {
147     public int compare(ScriptData o1, ScriptData o2) throws ClassCastException {
148       String name1 = o1.getName();
149       String name2 = o2.getName();
150       return name1.compareToIgnoreCase(name2);
151     }
152   }
153 
154   static public class AddNewActionListener extends EventListener<UIScriptList> {
155     public void execute(Event<UIScriptList> event) throws Exception {
156       UIScriptList uiScriptList = event.getSource();
157       UIScriptManager uiManager = uiScriptList.getAncestorOfType(UIScriptManager.class);
158       UIScriptContainer uiScriptContainer = uiManager.getChildById(uiManager.getSelectedTabId());      
159       UIScriptForm uiScriptForm = uiScriptContainer.createUIComponent(UIScriptForm.class, null, null) ;
160       uiManager.initPopup(uiScriptForm);
161       uiScriptForm.update(null, true);
162       event.getRequestContext().addUIComponentToUpdateByAjax(uiManager);      
163     }
164   }
165 
166   static public class EditActionListener extends EventListener<UIScriptList> {
167     public void execute(Event<UIScriptList> event) throws Exception {
168       UIScriptManager uiManager = event.getSource().getAncestorOfType(UIScriptManager.class);
169       UIScriptContainer uiScriptContainer = uiManager.getChildById(uiManager.getSelectedTabId());
170       UIScriptList uiScriptList = uiScriptContainer.getChild(UIScriptList.class);
171 
172       String scriptName = event.getRequestContext().getRequestParameter(OBJECTID);
173       UIScriptForm uiScriptForm = uiScriptContainer.createUIComponent(UIScriptForm.class, null, null) ;
174       uiScriptForm.update(uiScriptList.getScriptNode(uiScriptList.getTemplateFilter(), scriptName), false);
175       uiManager.initPopup(uiScriptForm);    
176       event.getRequestContext().addUIComponentToUpdateByAjax(uiManager);
177     }
178   }
179 
180   static public class DeleteActionListener extends EventListener<UIScriptList> {
181     public void execute(Event<UIScriptList> event) throws Exception {
182       UIScriptManager uiManager = event.getSource().getAncestorOfType(UIScriptManager.class);
183       UIScriptContainer uiScriptContainer = uiManager.getChildById(uiManager.getSelectedTabId());
184       UIScriptList uiScriptList = uiScriptContainer.getChild(UIScriptList.class);
185       ScriptService scriptService =  uiScriptList.getApplicationComponent(ScriptService.class);
186       String scriptName = event.getRequestContext().getRequestParameter(OBJECTID);
187       String namePrefix = uiScriptList.getScriptCategory();
188       try {
189         scriptService.removeScript(namePrefix + "/" + scriptName, WCMCoreUtils.getSystemSessionProvider());
190         Utils.addEditedConfiguredData(namePrefix + "/" + scriptName, "ScriptServiceImpl", EDITED_CONFIGURED_SCRIPTS, true);
191       } catch(AccessDeniedException ace) {
192         throw new MessageException(new ApplicationMessage("UIECMAdminControlPanel.msg.access-denied",
193                                                           null, ApplicationMessage.WARNING));
194       }
195       uiScriptList.refresh(uiScriptList.getTemplateFilter(), uiScriptList.uiPageIterator_.getCurrentPage());
196       event.getRequestContext().addUIComponentToUpdateByAjax(uiManager);
197     }
198   }
199   public static class ScriptData {
200     private String name;
201     private String path;
202     private String label;
203 
204     public ScriptData(String scriptName, String scriptParth, String label) {
205       this.name = scriptName;
206       this.path = scriptParth;
207       this.label = label;
208     }
209     public String getName() { return name; }
210     public String getPath() { return path; }
211     public String getLabel() { return label; }
212   }
213 }