1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.exoplatform.ecm.webui.component.admin.drives;
18
19 import java.util.ArrayList;
20 import java.util.Arrays;
21 import java.util.List;
22 import java.util.MissingResourceException;
23 import java.util.ResourceBundle;
24 import java.util.Set;
25
26 import javax.jcr.Session;
27
28 import org.exoplatform.ecm.webui.selector.UISelectable;
29 import org.exoplatform.ecm.webui.utils.Utils;
30 import org.exoplatform.portal.webui.util.Util;
31 import org.exoplatform.services.cms.drives.DriveData;
32 import org.exoplatform.services.cms.drives.ManageDriveService;
33 import org.exoplatform.services.cms.templates.TemplateService;
34 import org.exoplatform.services.jcr.RepositoryService;
35 import org.exoplatform.services.jcr.config.WorkspaceEntry;
36 import org.exoplatform.services.jcr.impl.core.WorkspaceInitializer;
37 import org.exoplatform.web.application.ApplicationMessage;
38 import org.exoplatform.web.application.RequestContext;
39 import org.exoplatform.webui.application.WebuiRequestContext;
40 import org.exoplatform.webui.config.annotation.ComponentConfig;
41 import org.exoplatform.webui.config.annotation.EventConfig;
42 import org.exoplatform.webui.core.UIApplication;
43 import org.exoplatform.webui.core.UIComponent;
44 import org.exoplatform.webui.core.UIPopupWindow;
45 import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
46 import org.exoplatform.webui.core.model.SelectItemOption;
47 import org.exoplatform.webui.event.Event;
48 import org.exoplatform.webui.event.Event.Phase;
49 import org.exoplatform.webui.event.EventListener;
50 import org.exoplatform.webui.form.UIFormInputSet;
51 import org.exoplatform.webui.form.UIFormSelectBox;
52 import org.exoplatform.webui.form.UIFormStringInput;
53 import org.exoplatform.webui.form.UIFormTabPane;
54
55
56
57
58
59
60
61
62 @ComponentConfig(
63 lifecycle = UIFormLifecycle.class,
64 template = "system:/groovy/webui/form/UIFormTabPane.gtmpl",
65 events = {
66 @EventConfig(listeners = UIDriveForm.SaveActionListener.class),
67 @EventConfig(listeners = UIDriveForm.RefreshActionListener.class, phase = Phase.DECODE),
68 @EventConfig(listeners = UIDriveForm.CancelActionListener.class, phase = Phase.DECODE),
69 @EventConfig(listeners = UIDriveForm.AddPermissionActionListener.class, phase = Phase.DECODE),
70 @EventConfig(listeners = UIDriveForm.RemovePermissionActionListener.class, phase = Phase.DECODE),
71 @EventConfig(listeners = UIDriveForm.AddPathActionListener.class, phase = Phase.DECODE),
72 @EventConfig(listeners = UIDriveForm.AddIconActionListener.class, phase = Phase.DECODE),
73 @EventConfig(listeners = UIDriveForm.ChangeActionListener.class, phase = Phase.DECODE),
74 @EventConfig(listeners = UIDriveForm.ChooseNodeTypeActionListener.class, phase = Phase.DECODE),
75 @EventConfig(listeners = UIDriveForm.RemoveNodeTypeActionListener.class, phase = Phase.DECODE),
76 @EventConfig(listeners = UIDriveForm.SelectTabActionListener.class, phase = Phase.DECODE)
77 }
78 )
79 public class UIDriveForm extends UIFormTabPane implements UISelectable {
80
81 private boolean isAddNew_ = true;
82 final static public String[] ACTIONS = {"Save", "Refresh", "Cancel"};
83 final static public String POPUP_DRIVEPERMISSION = "PopupDrivePermission";
84 final static public String POPUP_NODETYPE_SELECTOR = "PopupNodeTypeSelector";
85 private String membershipString = "";
86 private String nodeTypes = "";
87
88 final static public String ANY_PERMISSION = "*";
89
90 public UIDriveForm() throws Exception {
91 super("UIDriveForm");
92 UIFormInputSet driveInputSet = new UIDriveInputSet("DriveInputSet");
93 UIFormSelectBox selectBox = driveInputSet.getChildById(UIDriveInputSet.FIELD_WORKSPACE);
94 selectBox.setOnChange("Change");
95 addUIFormInput(driveInputSet);
96 setSelectedTab(driveInputSet.getId());
97 UIFormInputSet viewInputSet = new UIViewsInputSet("ViewsInputSet");
98 addUIFormInput(viewInputSet);
99 setActions(ACTIONS);
100 }
101
102 public String getLabel(ResourceBundle res, String id) {
103 try {
104 return res.getString("UIDriveForm.label." + id);
105 } catch (MissingResourceException ex) {
106 return id + " ";
107 }
108 }
109
110 public void doSelect(String selectField, Object value) {
111 UIFormStringInput uiStringInput = getUIStringInput(selectField);
112 if (selectField.equals(UIDriveInputSet.FIELD_PERMISSION)){
113 String membership = value.toString();
114 String valuePermissions = uiStringInput.getValue();
115 List<String> permissionsList = new ArrayList<String>();
116 StringBuilder newsPermissions = new StringBuilder();
117 if(valuePermissions != null) {
118 String[] permissionsArray = valuePermissions.split(",");
119 permissionsList = Arrays.asList(permissionsArray);
120 if (permissionsList.size() > 0) {
121 for (String permission : permissionsList) {
122 if(newsPermissions.length() > 0) newsPermissions.append(",");
123 newsPermissions.append(permission.trim());
124 }
125 }
126 if(!permissionsList.contains(membership)) {
127 if(newsPermissions.length() > 0) {
128 newsPermissions.append(",").append(membership.trim());
129 } else {
130 newsPermissions.append(membership.trim());
131 }
132 }
133 uiStringInput.setValue(newsPermissions.toString());
134 } else uiStringInput.setValue(value.toString());
135 } else if (selectField.equals(UIDriveInputSet.FIELD_HOMEPATH)){
136 uiStringInput.setValue(value.toString());
137 UIDriveInputSet driveInputSet = getChild(UIDriveInputSet.class);
138 if (driveInputSet!=null) driveInputSet.updateFolderAllowed(value.toString());
139 } else {
140 uiStringInput.setValue(value.toString());
141 }
142 UIDriveManager uiContainer = getAncestorOfType(UIDriveManager.class) ;
143 for(UIComponent uiChild : uiContainer.getChildren()) {
144 if(uiChild.getId().equals(POPUP_DRIVEPERMISSION) || uiChild.getId().equals("JCRBrowser")
145 || uiChild.getId().equals("JCRBrowserAssets") || uiChild.getId().equals(POPUP_NODETYPE_SELECTOR)) {
146 UIPopupWindow uiPopup = uiContainer.getChildById(uiChild.getId()) ;
147 uiPopup.setRendered(false) ;
148 }
149 }
150 }
151
152 public void refresh(String driveName) throws Exception {
153 DriveData drive = null;
154 if(driveName == null) {
155 isAddNew_ = true;
156 } else {
157 isAddNew_ = false;
158 setActions(new String[] {"Save", "Cancel"});
159 drive = getApplicationComponent(ManageDriveService.class).getDriveByName(driveName);
160 }
161 getChild(UIDriveInputSet.class).update(drive);
162 getChild(UIViewsInputSet.class).update(drive);
163 }
164
165 public String getWorkspaceEntries(String selectedWorkspace) throws Exception {
166 RepositoryService repositoryService =
167 getApplicationComponent(RepositoryService.class);
168 List<WorkspaceEntry> wsEntries = repositoryService.getCurrentRepository()
169 .getConfiguration()
170 .getWorkspaceEntries();
171 String wsInitRootNodeType = null;
172 for(WorkspaceEntry wsEntry : wsEntries) {
173 if(wsEntry.getName().equals(selectedWorkspace)) {
174 wsInitRootNodeType = wsEntry.getInitializer().getParameterValue(WorkspaceInitializer.ROOT_NODETYPE_PARAMETER);
175 break;
176 }
177 }
178 return wsInitRootNodeType;
179 }
180
181
182
183
184 @Override
185 public void processRender(WebuiRequestContext context) throws Exception {
186 context.getJavascriptManager().require("SHARED/jquery", "gj")
187 .addScripts("gj(document).ready(function() { gj(\"*[rel='tooltip']\").tooltip();});");
188 super.processRender(context);
189 }
190
191 static public class SaveActionListener extends EventListener<UIDriveForm> {
192 public void execute(Event<UIDriveForm> event) throws Exception {
193 UIDriveForm uiDriveForm = event.getSource();
194 ManageDriveService dservice_ = uiDriveForm.getApplicationComponent(ManageDriveService.class);
195 RepositoryService rservice = uiDriveForm.getApplicationComponent(RepositoryService.class);
196 UIDriveInputSet driveInputSet = uiDriveForm.getChild(UIDriveInputSet.class);
197 UIApplication uiApp = uiDriveForm.getAncestorOfType(UIApplication.class);
198 String name = driveInputSet.getUIStringInput(UIDriveInputSet.FIELD_NAME).getValue().trim();
199 String workspace =
200 driveInputSet.getUIFormSelectBox(UIDriveInputSet.FIELD_WORKSPACE).getValue();
201 String path = driveInputSet.getUIStringInput(UIDriveInputSet.FIELD_HOMEPATH).getValue();
202 if((path == null)||(path.trim().length() == 0)) path = "/";
203
204
205 if (!dservice_.isVitualDrive(name)) {
206 Session session = null;
207 try {
208 session = rservice.getCurrentRepository().getSystemSession(workspace);
209 String userId = Util.getPortalRequestContext().getRemoteUser();
210 String pathReal = org.exoplatform.services.cms.impl.Utils.getPersonalDrivePath(path, userId);
211 session.getItem(pathReal);
212 session.logout();
213 } catch(Exception e) {
214 if(session!=null) {
215 session.logout();
216 }
217 uiApp.addMessage(new ApplicationMessage("UIDriveForm.msg.workspace-path-invalid", null,
218 ApplicationMessage.WARNING));
219 return;
220 }
221 }
222
223 boolean viewReferences =
224 driveInputSet.getUICheckBoxInput(UIDriveInputSet.FIELD_VIEWPREFERENCESDOC).isChecked();
225 boolean viewSideBar =
226 driveInputSet.getUICheckBoxInput(UIDriveInputSet.FIELD_VIEWSIDEBAR).isChecked();
227 boolean showHiddenNode =
228 driveInputSet.getUICheckBoxInput(UIDriveInputSet.SHOW_HIDDEN_NODE).isChecked();
229 boolean viewNonDocument =
230 driveInputSet.getUICheckBoxInput(UIDriveInputSet.FIELD_VIEWNONDOC).isChecked();
231 String[] allowCreateFolders = driveInputSet.getUIFormSelectBox(UIDriveInputSet.FIELD_ALLOW_CREATE_FOLDERS)
232 .getSelectedValues();
233 if (allowCreateFolders == null || allowCreateFolders.length == 0 ) {
234 allowCreateFolders = new String[] {};
235 }
236 StringBuilder foldertypes = new StringBuilder("");
237 for (String allowCreateFolder : allowCreateFolders) {
238 foldertypes.append(allowCreateFolder).append(",");
239 }
240 if (foldertypes.toString().endsWith(",")) foldertypes.deleteCharAt(foldertypes.length() -1 );
241 UIViewsInputSet viewsInputSet = uiDriveForm.getChild(UIViewsInputSet.class);
242 String views = viewsInputSet.getViewsSelected();
243 String permissions = driveInputSet.getUIStringInput(UIDriveInputSet.FIELD_PERMISSION).getValue();
244 if (permissions.subSequence(permissions.length() - 1, permissions.length()).equals(","))
245 permissions = permissions.substring(0, permissions.length() - 1);
246 String[] arrPermissions = permissions.split(",");
247 for (String itemPermission : arrPermissions) {
248 if (itemPermission != null && itemPermission.trim().equals("*")) {
249 permissions = "*";
250 break;
251 }
252 }
253
254 if(uiDriveForm.isAddNew_ && (dservice_.getDriveByName(name) != null)) {
255 uiApp.addMessage(new ApplicationMessage("UIDriveForm.msg.drive-exists", null,
256 ApplicationMessage.WARNING));
257 return;
258 }
259 String iconPath = driveInputSet.getUIStringInput(UIDriveInputSet.FIELD_WORKSPACEICON).getValue();
260 if(iconPath != null && iconPath.trim().length() > 0) {
261 Session jcrSession = null;
262 try {
263 if(iconPath.indexOf(":/") > -1) {
264 String[] paths = iconPath.split(":/");
265 jcrSession = rservice.getCurrentRepository().getSystemSession(paths[0]);
266 jcrSession.getItem("/" + paths[1]);
267 jcrSession.logout();
268 }
269 } catch(Exception e) {
270 if(jcrSession != null) {
271 jcrSession.logout();
272 }
273 uiApp.addMessage(new ApplicationMessage("UIDriveForm.msg.icon-not-found", null,
274 ApplicationMessage.WARNING));
275 return;
276 }
277 } else {
278 iconPath = "";
279 }
280 String allowNodeTypesOnTree = driveInputSet.getUIStringInput(UIDriveInputSet.FIELD_ALLOW_NODETYPES_ON_TREE).getValue();
281 if ((allowNodeTypesOnTree==null) || (allowNodeTypesOnTree.length()==0)) allowNodeTypesOnTree = "*";
282 dservice_.addDrive(name, workspace, permissions, path, views, iconPath, viewReferences,
283 viewNonDocument, viewSideBar, showHiddenNode, foldertypes.toString(), allowNodeTypesOnTree);
284 UIDriveManager uiManager = uiDriveForm.getAncestorOfType(UIDriveManager.class);
285 UIDriveList uiDriveList = uiManager.getChild(UIDriveList.class);
286 uiDriveList.refresh(uiDriveList.getUIPageIterator().getCurrentPage());
287 uiDriveForm.refresh(null);
288 UIDriveManager uiDriveManager = uiDriveForm.getAncestorOfType(UIDriveManager.class);
289 uiDriveManager.removeChildById(UIDriveForm.POPUP_DRIVEPERMISSION);
290 UIPopupWindow uiPopup = uiDriveManager.getChildById(UIDriveList.ST_ADD);
291 if(uiPopup != null) {
292 uiPopup.setShow(false);
293 uiPopup.setRendered(false);
294 }
295 UIPopupWindow uiEditPopup = uiDriveManager.getChildById(UIDriveList.ST_EDIT);
296 if(uiEditPopup != null) {
297 uiEditPopup.setShow(false);
298 uiEditPopup.setRendered(false);
299 }
300 event.getRequestContext().addUIComponentToUpdateByAjax(uiDriveManager);
301 }
302 }
303
304 static public class CancelActionListener extends EventListener<UIDriveForm> {
305 public void execute(Event<UIDriveForm> event) throws Exception {
306 UIDriveForm uiDriveForm = event.getSource();
307 uiDriveForm.refresh(null);
308 UIDriveManager uiDriveManager = uiDriveForm.getAncestorOfType(UIDriveManager.class);
309 uiDriveManager.removeChildById(UIDriveForm.POPUP_DRIVEPERMISSION);
310 UIPopupWindow uiPopup = uiDriveManager.getChildById(UIDriveList.ST_ADD);
311 if(uiPopup != null) {
312 uiPopup.setShow(false);
313 uiPopup.setRendered(false);
314 }
315 UIPopupWindow uiEditPopup = uiDriveManager.getChildById(UIDriveList.ST_EDIT);
316 if(uiEditPopup != null) {
317 uiEditPopup.setShow(false);
318 uiEditPopup.setRendered(false);
319 }
320 event.getRequestContext().addUIComponentToUpdateByAjax(uiDriveManager);
321 }
322 }
323
324 static public class RefreshActionListener extends EventListener<UIDriveForm> {
325 public void execute(Event<UIDriveForm> event) throws Exception {
326 event.getSource().refresh(null);
327 event.getRequestContext().addUIComponentToUpdateByAjax(event.getSource());
328 }
329 }
330
331 static public class AddPermissionActionListener extends EventListener<UIDriveForm> {
332 public void execute(Event<UIDriveForm> event) throws Exception {
333 UIDriveForm uiDriveForm = event.getSource();
334 UIDriveManager uiManager = uiDriveForm.getAncestorOfType(UIDriveManager.class);
335 String membership = uiDriveForm.getUIStringInput(UIDriveInputSet.FIELD_PERMISSION).getValue();
336 uiDriveForm.membershipString = membership;
337 uiDriveForm.getUIStringInput(UIDriveInputSet.FIELD_PERMISSION).setValue(uiDriveForm.membershipString);
338
339 uiManager.initPopupPermission(uiDriveForm.membershipString);
340 event.getRequestContext().addUIComponentToUpdateByAjax(uiManager);
341 }
342 }
343
344 static public class RemovePermissionActionListener extends EventListener<UIDriveForm> {
345 public void execute(Event<UIDriveForm> event) throws Exception {
346 UIDriveForm uiDriveForm = event.getSource();
347 uiDriveForm.membershipString = "";
348 uiDriveForm.getUIStringInput(UIDriveInputSet.FIELD_PERMISSION).setValue(null);
349 event.getRequestContext().addUIComponentToUpdateByAjax(uiDriveForm);
350 }
351 }
352
353 static public class AddPathActionListener extends EventListener<UIDriveForm> {
354 public void execute(Event<UIDriveForm> event) throws Exception {
355 UIDriveForm uiDriveForm = event.getSource();
356 UIDriveManager uiManager = uiDriveForm.getAncestorOfType(UIDriveManager.class);
357 UIDriveInputSet driveInputSet = uiDriveForm.getChild(UIDriveInputSet.class);
358 String workspace =
359 driveInputSet.getUIFormSelectBox(UIDriveInputSet.FIELD_WORKSPACE).getValue();
360 uiManager.initPopupJCRBrowser(workspace, true);
361 event.getRequestContext().addUIComponentToUpdateByAjax(uiManager);
362 }
363 }
364
365 static public class AddIconActionListener extends EventListener<UIDriveForm> {
366 public void execute(Event<UIDriveForm> event) throws Exception {
367 UIDriveForm uiDriveForm = event.getSource();
368 UIDriveManager uiManager = uiDriveForm.getAncestorOfType(UIDriveManager.class);
369 UIDriveInputSet driveInputSet = uiDriveForm.getChild(UIDriveInputSet.class);
370 String workspace =
371 driveInputSet.getUIFormSelectBox(UIDriveInputSet.FIELD_WORKSPACE).getValue();
372 uiManager.initPopupJCRBrowserAssets(workspace);
373 event.getRequestContext().addUIComponentToUpdateByAjax(uiManager);
374 }
375 }
376
377 static public class ChangeActionListener extends EventListener<UIDriveForm> {
378 public void execute(Event<UIDriveForm> event) throws Exception {
379 UIDriveForm uiDriveForm = event.getSource();
380 String driverName = uiDriveForm.getUIStringInput(UIDriveInputSet.FIELD_NAME).getValue();
381 String selectedWorkspace = uiDriveForm.getUIStringInput(UIDriveInputSet.FIELD_WORKSPACE).getValue();
382 UIDriveInputSet driveInputSet = uiDriveForm.getChild(UIDriveInputSet.class);
383 UIDriveManager uiManager = uiDriveForm.getAncestorOfType(UIDriveManager.class);
384 ManageDriveService manageDriveService =
385 uiDriveForm.getApplicationComponent(ManageDriveService.class);
386 RepositoryService repositoryService =
387 uiDriveForm.getApplicationComponent(RepositoryService.class);
388 List<WorkspaceEntry> wsEntries =
389 repositoryService.getCurrentRepository().getConfiguration().getWorkspaceEntries();
390 String wsInitRootNodeType = null;
391 for(WorkspaceEntry wsEntry : wsEntries) {
392 if(wsEntry.getName().equals(selectedWorkspace)) {
393 wsInitRootNodeType = wsEntry.getInitializer().getParameterValue(WorkspaceInitializer.ROOT_NODETYPE_PARAMETER);
394 }
395 }
396
397 TemplateService templateService = uiDriveForm.getApplicationComponent(TemplateService.class);
398 Set<String> setFoldertypes = templateService.getAllowanceFolderType();
399 List<SelectItemOption<String>> foldertypeOptions = new ArrayList<SelectItemOption<String>>();
400 RequestContext context = RequestContext.getCurrentInstance();
401 ResourceBundle res = context.getApplicationResourceBundle();
402 String label = null;
403 for(String folderType : setFoldertypes) {
404 try {
405 label = res.getString(driveInputSet.getId() + ".label." + folderType.replace(":", "_"));
406 } catch(MissingResourceException mi) {
407 label = folderType;
408 }
409 foldertypeOptions.add(new SelectItemOption<String>(label, folderType));
410 }
411 List<SelectItemOption<String>> folderOptions = new ArrayList<SelectItemOption<String>>();
412 UIFormSelectBox uiInput = driveInputSet.<UIFormSelectBox>getUIInput(UIDriveInputSet.FIELD_ALLOW_CREATE_FOLDERS);
413
414 if(wsInitRootNodeType != null && wsInitRootNodeType.equals(Utils.NT_FOLDER)) {
415 folderOptions.add(new SelectItemOption<String>(UIDriveInputSet.FIELD_FOLDER_ONLY, Utils.NT_FOLDER));
416 } else {
417 folderOptions.addAll(foldertypeOptions);
418 }
419 uiInput.setOptions(folderOptions);
420 if(!uiDriveForm.isAddNew_) {
421 DriveData drive = manageDriveService.getDriveByName(driverName);
422 String defaultPath = drive.getHomePath();
423 if(!drive.getWorkspace().equals(selectedWorkspace)) defaultPath = "/";
424 uiDriveForm.getUIStringInput(UIDriveInputSet.FIELD_HOMEPATH).setValue(defaultPath);
425 }
426 event.getRequestContext().addUIComponentToUpdateByAjax(uiManager);
427 }
428 }
429
430 static public class ChooseNodeTypeActionListener extends EventListener<UIDriveForm> {
431 public void execute(Event<UIDriveForm> event) throws Exception {
432 UIDriveForm uiDriveForm = event.getSource();
433 UIDriveManager uiManager = uiDriveForm.getAncestorOfType(UIDriveManager.class);
434 String nodeTypes = uiDriveForm.getUIStringInput(UIDriveInputSet.FIELD_ALLOW_NODETYPES_ON_TREE).getValue();
435 if (nodeTypes != null){
436 uiDriveForm.nodeTypes = nodeTypes;
437 } else {
438 uiDriveForm.nodeTypes = "";
439 }
440 uiDriveForm.getUIStringInput(
441 UIDriveInputSet.FIELD_ALLOW_NODETYPES_ON_TREE).setValue(uiDriveForm.nodeTypes);
442
443 uiManager.initPopupNodeTypeSelector(uiDriveForm.nodeTypes);
444 event.getRequestContext().addUIComponentToUpdateByAjax(uiManager);
445 }
446 }
447
448 static public class RemoveNodeTypeActionListener extends EventListener<UIDriveForm> {
449 public void execute(Event<UIDriveForm> event) throws Exception {
450 UIDriveForm uiDriveForm = event.getSource();
451 uiDriveForm.nodeTypes = "";
452 uiDriveForm.getUIStringInput(UIDriveInputSet.FIELD_ALLOW_NODETYPES_ON_TREE).setValue(null);
453 event.getRequestContext().addUIComponentToUpdateByAjax(uiDriveForm);
454 }
455 }
456
457 static public class SelectTabActionListener extends EventListener<UIDriveForm> {
458 public void execute(Event<UIDriveForm> event) throws Exception {
459 WebuiRequestContext context = event.getRequestContext();
460 String renderTab = context.getRequestParameter(UIComponent.OBJECTID);
461 if (renderTab == null)
462 return;
463 event.getSource().setSelectedTab(renderTab);
464 event.getRequestContext().addUIComponentToUpdateByAjax(event.getSource());
465 }
466 }
467
468 }