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.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   * Created by The eXo Platform SARL
57   * Author : Tran The Trong
58   *          trongtt@exoplatform.com
59   * Sep 19, 2006
60   * 5:31:04 PM
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   /* (non-Javadoc)
182    * @see org.exoplatform.webui.form.UIForm#processRender(org.exoplatform.webui.application.WebuiRequestContext)
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       // Only check path if Drive is not virtual drive
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 }