1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
46
47
48
49
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 }