View Javadoc
1   /***************************************************************************
2    * Copyright (C) 2003-2009 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   **************************************************************************/
18  package org.exoplatform.ecm.webui.component.admin.views;
19  
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  
27  import org.exoplatform.commons.utils.LazyPageList;
28  import org.exoplatform.commons.utils.ListAccess;
29  import org.exoplatform.commons.utils.ListAccessImpl;
30  import org.exoplatform.ecm.webui.core.UIPagingGrid;
31  import org.exoplatform.services.cms.views.ManageViewService;
32  import org.exoplatform.services.wcm.utils.WCMCoreUtils;
33  import org.exoplatform.web.application.ApplicationMessage;
34  import org.exoplatform.webui.config.annotation.ComponentConfig;
35  import org.exoplatform.webui.config.annotation.EventConfig;
36  import org.exoplatform.webui.core.UIApplication;
37  import org.exoplatform.webui.event.Event;
38  import org.exoplatform.webui.event.EventListener;
39  
40  /**
41   * Created by The eXo Platform SARL
42   * Author : Dang Van Minh
43   *          minh.dang@exoplatform.com
44   * Feb 19, 2013
45   * 4:26:03 PM  
46   */
47  
48  @ComponentConfig(
49    template = "system:/groovy/ecm/webui/UIGridWithButton.gtmpl",
50    events = {
51      @EventConfig(listeners = UIViewPermissionList.DeleteActionListener.class, confirm = "UIViewPermissionList.msg.confirm-delete")
52    }
53  )
54  public class UIViewPermissionList extends UIPagingGrid {
55  
56    public static String[] PERMISSION_BEAN_FIELD = {"friendlyPermission"} ;
57    
58    private String viewName;
59    
60    public UIViewPermissionList() throws Exception {
61      getUIPageIterator().setId("PermissionListPageIterator") ;
62      configure("permission", UIViewPermissionList.PERMISSION_BEAN_FIELD, new String[] {"Delete"});
63    }
64    
65    public String[] getActions() { return new String[] {} ;}
66  
67    public String getViewName() {
68      return viewName;
69    }
70    
71    public void setViewName(String name) {
72      viewName = name;
73    }  
74    
75    @Override
76    public void refresh(int currentPage) throws Exception {
77      UIViewPermissionContainer uiPerContainer = getParent();
78      UIViewFormTabPane uiTabPane = uiPerContainer.getParent();
79      UIViewForm uiViewForm = uiTabPane.getChild(UIViewForm.class);
80      List<PermissionBean> permissions = new ArrayList<PermissionBean>();
81      if(uiPerContainer.isView()) {
82        ManageViewService viewService = WCMCoreUtils.getService(ManageViewService.class);
83        Node viewNode = viewService.getViewByName(viewName, WCMCoreUtils.getSystemSessionProvider());
84        String strPermission = viewNode.getProperty("exo:accessPermissions").getString();
85        permissions = getBeanList(strPermission);
86      } else {
87        permissions = getBeanList(uiViewForm.getPermission());
88      }
89      Collections.sort(permissions, new ViewPermissionComparator());
90      ListAccess<PermissionBean> permissionBeanList = new ListAccessImpl<PermissionBean>(PermissionBean.class, permissions);
91      getUIPageIterator().setPageList(new LazyPageList<PermissionBean>(permissionBeanList, getUIPageIterator().getItemsPerPage()));
92      getUIPageIterator().setTotalItems(permissions.size());
93      if (currentPage > getUIPageIterator().getAvailablePage()) {
94        getUIPageIterator().setCurrentPage(getUIPageIterator().getAvailablePage());
95      } else {
96        getUIPageIterator().setCurrentPage(currentPage);
97      }
98    }
99    
100   static  public class DeleteActionListener extends EventListener<UIViewPermissionList> {
101     public void execute(Event<UIViewPermissionList> event) throws Exception {
102       UIViewPermissionList uiPermissionList = event.getSource();
103       UIViewPermissionContainer uiContainer = uiPermissionList.getParent();
104       UIViewFormTabPane uiTabPane = uiContainer.getParent();
105       UIViewForm uiViewForm = uiTabPane.getChild(UIViewForm.class);
106       String permission = event.getRequestContext().getRequestParameter(OBJECTID);
107       String permissions = uiPermissionList.removePermission(permission, uiViewForm.getPermission());
108       if(permissions.length() == 0) {
109         UIApplication uiApp = uiPermissionList.getAncestorOfType(UIApplication.class);
110         uiApp.addMessage(new ApplicationMessage("UIViewPermissionList.msg.permission-cannot-empty",
111                                               null,
112                                               ApplicationMessage.WARNING));
113         event.getRequestContext().addUIComponentToUpdateByAjax(uiContainer);
114         uiTabPane.setSelectedTab(uiContainer.getId());
115         return;
116       }
117       uiViewForm.setPermission(permissions); 
118       uiPermissionList.refresh(uiPermissionList.getUIPageIterator().getCurrentPage());
119       event.getRequestContext().addUIComponentToUpdateByAjax(uiPermissionList.getParent());
120     }
121   }  
122   
123   static public class ViewPermissionComparator implements Comparator<PermissionBean> {
124     public int compare(PermissionBean t1, PermissionBean t2) throws ClassCastException {
125       String per1 = t1.getPermission();
126       String per2 = t2.getPermission();
127       return per1.compareToIgnoreCase(per2);
128     }
129   } 
130   
131   public static class PermissionBean {
132     
133     private String permssion ;
134     private String friendlyPermission;
135 
136     public PermissionBean() {}
137 
138     public String getPermission(){ return this.permssion ; }
139     public void setPermission( String permission) { this.permssion = permission ; }
140 
141     public String getFriendlyPermission() { return friendlyPermission; }
142     public void setFriendlyPermission(String friendlyPer) { this.friendlyPermission = friendlyPer; }
143   }
144   
145   private String removePermission(String removePermission, String permissions) {
146     StringBuilder perBuilder = new StringBuilder();
147     if(permissions.indexOf(",") > -1) {
148       String[] arrPer = permissions.split(",");
149       for(String per : arrPer) {
150         if(per.equals(removePermission)) continue;
151         if(perBuilder.length() > 0) perBuilder.append(",");
152         perBuilder.append(per);
153       }
154     }
155     return perBuilder.toString();
156   }
157   
158   private List<PermissionBean> getBeanList(String permissions) throws Exception {
159     UIViewContainer uiContainer = getAncestorOfType(UIViewContainer.class);
160     List<PermissionBean> listBean = new ArrayList<PermissionBean>();
161     String[] arrPers = new String[] {};
162     if(permissions.contains(",")) {
163       arrPers = permissions.split(",");
164     } else if(permissions.length() > 0) {
165       arrPers = new String[] {permissions};
166     }
167     for(String per : arrPers) {
168       PermissionBean bean = new PermissionBean();
169       bean.setPermission(per);
170       bean.setFriendlyPermission(uiContainer.getFriendlyPermission(per));
171       listBean.add(bean);
172     }
173     return listBean;
174   }
175 }