1 19 package org.lucane.client.acl; 20 21 import java.awt.BorderLayout ; 22 import java.awt.Dimension ; 23 import java.awt.GridLayout ; 24 import java.awt.event.ActionEvent ; 25 import java.awt.event.ActionListener ; 26 import java.util.*; 27 28 import javax.swing.*; 29 import javax.swing.table.DefaultTableModel ; 30 import javax.swing.event.ListSelectionListener ; 31 import javax.swing.event.ListSelectionEvent ; 32 33 import org.lucane.client.widgets.ManagedWindow; 34 import org.lucane.client.widgets.DialogBox; 35 import org.lucane.client.Plugin; 36 import org.lucane.client.Client; 37 import org.lucane.client.util.Translation; 38 import org.lucane.common.acl.AclInfo; 39 import org.lucane.common.acl.AclProducer; 40 import org.lucane.common.acl.ConceptComparator; 41 import org.lucane.common.concepts.Concept; 42 import org.lucane.common.concepts.GroupConcept; 43 import org.lucane.common.concepts.UserConcept; 44 45 public class AclEditor extends ManagedWindow 46 implements ActionListener , ListSelectionListener 47 { 48 private Plugin plugin; 49 private AclProducer producer; 50 private String itemId; 51 private String [] accesses; 52 private Map aclInfos; 53 54 private AclRenderer renderer; 55 56 private JList elements; 57 private JButton addGroup; 58 private JButton addUser; 59 private JButton removeAllow; 60 61 private JSplitPane split; 62 63 private JTable permissions; 64 private JButton btnAccept; 65 66 public AclEditor(Plugin plugin, AclProducer producer, String itemId) 67 throws Exception { 68 super(plugin, Translation.tr("acl.msg.accessControl") + ' ' + producer.getItemName(itemId)); 69 70 this.plugin = plugin; 71 this.producer = producer; 72 this.itemId = itemId; 73 this.accesses = producer.getAccesses(); 74 this.aclInfos = new HashMap(); 75 76 setPreferredSize(new Dimension (400, 400)); 77 setName("ACLEditor"); 78 79 AclInfo[] infos = producer.getAcls(itemId); 81 for(int i=0;i<infos.length;i++) 82 { 83 AclInfo info = infos[i]; 84 85 Concept concept; 87 if(info.getGroup() != null) 88 concept = new GroupConcept(info.getGroup()); 89 else 90 concept = new UserConcept(info.getUser()); 91 92 addAclInfoToMap(concept, info); 94 } 95 96 97 renderer = new AclRenderer(); 98 JPanel elements = createElementsPanel(); 99 100 permissions = new JTable(); 101 102 split = new JSplitPane(JSplitPane.VERTICAL_SPLIT, elements, new JScrollPane(permissions)); 103 split.setDividerLocation(220); 104 manageWidget(split); 105 getContentPane().add(split, BorderLayout.CENTER); 106 107 btnAccept = new JButton(Translation.tr("acl.btn.accept"), Client.getImageIcon("ok.png")); 108 btnAccept.addActionListener(this); 109 JPanel buttons = new JPanel(new BorderLayout ()); 110 buttons.add(btnAccept, BorderLayout.EAST); 111 getContentPane().add(buttons, BorderLayout.SOUTH); 112 113 refreshElementList(); 114 } 115 116 private JPanel createElementsPanel() 117 { 118 this.elements = new JList(new DefaultListModel()); 119 this.elements.setCellRenderer(renderer); 120 this.elements.addListSelectionListener(this); 121 this.addGroup = new JButton(Translation.tr("acl.btn.addGroup")); 122 this.addGroup.addActionListener(this); 123 this.addUser = new JButton(Translation.tr("acl.btn.addUser")); 124 this.addUser.addActionListener(this); 125 this.removeAllow = new JButton(Translation.tr("acl.btn.remove")); 126 this.removeAllow.addActionListener(this); 127 128 JPanel allows = new JPanel(new BorderLayout ()); 129 allows.add(new JScrollPane(elements), BorderLayout.CENTER); 130 131 JPanel buttons = new JPanel(new GridLayout (3, 1)); 132 buttons.add(addGroup); 133 buttons.add(addUser); 134 buttons.add(removeAllow); 135 136 JPanel container = new JPanel(new BorderLayout ()); 137 container.add(buttons, BorderLayout.NORTH); 138 139 allows.add(container, BorderLayout.EAST); 140 141 return allows; 142 } 143 144 public void actionPerformed(ActionEvent ae) 145 { 146 if(ae.getSource() == addGroup) 147 addGroup(); 148 else if(ae.getSource() == addUser) 149 selectUser(); 150 else if(ae.getSource() == removeAllow) 151 removeSelected(); 152 else if(ae.getSource() == btnAccept) 153 dispose(); 154 } 155 156 public void valueChanged(ListSelectionEvent e) 157 { 158 Concept selected = (Concept)elements.getSelectedValue(); 159 if(selected == null) 160 permissions.setModel(new DefaultTableModel ()); 161 else 162 { 163 ArrayList infos = (ArrayList)aclInfos.get(selected); 164 permissions.setModel(new AclTableModel(plugin, this, accesses, infos)); 165 } 166 } 167 168 private void addGroup() 169 { 170 String group = null; 171 try { 172 ArrayList list = producer.getAllGroups(); 173 int index = DialogBox.list(null, Translation.tr("acl.msg.selectUser"), 174 Translation.tr("acl.msg.selectGroup"), new Vector(list)); 175 if(index >= 0) 176 group = (String )list.get(index); 177 } catch(Exception e) { 178 DialogBox.error(Translation.tr("acl.err.unableToListGroups") + e); 179 } 180 181 if(group != null) 182 { 183 Concept concept = new GroupConcept(group); 184 aclInfos.put(concept, new ArrayList()); 185 refreshElementList(); 186 } 187 } 188 189 private void selectUser() 190 { 191 String user = null; 192 try { 193 ArrayList list = producer.getAllUsers(); 194 int index = DialogBox.list(null, Translation.tr("acl.msg.selectUser"), 195 Translation.tr("acl.msg.selectUser"), new Vector(list)); 196 if(index >= 0) 197 user = (String )list.get(index); 198 } catch(Exception e) { 199 DialogBox.error(Translation.tr("acl.err.unableToListUsers") + e); 200 } 201 202 if(user != null) 203 { 204 Concept concept = new UserConcept(user); 205 aclInfos.put(concept, new ArrayList()); 206 refreshElementList(); 207 } 208 } 209 210 private void removeSelected() 211 { 212 Concept selected = (Concept)elements.getSelectedValue(); 213 if(selected == null) 214 return; 215 216 ArrayList infos = (ArrayList)aclInfos.get(selected); 217 Iterator i = infos.iterator(); 218 while(i.hasNext()) 219 { 220 AclInfo info = (AclInfo)i.next(); 221 try { 222 producer.removeAcl(itemId, info); 223 } catch (Exception e) { 224 DialogBox.error(Translation.tr("acl.err.unableToRemoveAccessRule")); 225 e.printStackTrace(); 226 return; 227 } 228 } 229 aclInfos.remove(selected); 230 refreshElementList(); 231 } 232 233 private void refreshElementList() 234 { 235 ArrayList concepts = new ArrayList(aclInfos.keySet()); 236 Collections.sort(concepts, new ConceptComparator()); 237 DefaultListModel model = (DefaultListModel)elements.getModel(); 238 model.clear(); 239 240 Iterator i = concepts.iterator(); 241 while(i.hasNext()) 242 model.addElement(i.next()); 243 } 244 245 public void allowAccess(String access) 246 { 247 try { 248 addAclInfo(access, true); 249 } catch (Exception e) { 250 DialogBox.error(Translation.tr("acl.err.unableToAllowAccess")); 251 e.printStackTrace(); 252 } 253 } 254 255 public void denyAccess(String access) 256 { 257 try { 258 addAclInfo(access, false); 259 } catch (Exception e) { 260 DialogBox.error(Translation.tr("acl.err.unableToDenyAccess")); 261 e.printStackTrace(); 262 } 263 } 264 265 public void removeAccess(String access) 266 { 267 Concept selected = (Concept)elements.getSelectedValue(); 268 if(selected == null) 269 return; 270 271 String group = null; 272 String user = null; 273 274 if(selected instanceof GroupConcept) 275 group = selected.getName(); 276 else if(selected instanceof UserConcept) 277 user = selected.getName(); 278 279 AclInfo info = new AclInfo(access, true, group, user); 280 try { 281 producer.removeAcl(itemId, info); 282 removeAclInfoFromMap(selected, info); 283 refreshElementList(); 284 elements.setSelectedValue(selected, true); 285 valueChanged(null); 286 } catch (Exception e) { 287 DialogBox.error(Translation.tr("acl.err.unableToRemoveAccessRule")); 288 e.printStackTrace(); 289 } 290 } 291 292 private void addAclInfo(String access, boolean allow) 293 throws Exception 294 { 295 Concept selected = (Concept)elements.getSelectedValue(); 296 if(selected == null) 297 return; 298 299 String group = null; 300 String user = null; 301 302 if(selected instanceof GroupConcept) 303 group = selected.getName(); 304 else if(selected instanceof UserConcept) 305 user = selected.getName(); 306 307 AclInfo info = new AclInfo(access, allow, group, user); 308 producer.addAcl(itemId, info); 309 310 removeAclInfoFromMap(selected, info); 311 addAclInfoToMap(selected, info); 312 refreshElementList(); 313 elements.setSelectedValue(selected, true); 314 valueChanged(null); 315 } 316 317 private void addAclInfoToMap(Concept concept, AclInfo info) 318 { 319 ArrayList list = (ArrayList)aclInfos.get(concept); 320 if(list == null) 321 { 322 list = new ArrayList(); 323 aclInfos.put(concept, list); 324 } 325 326 list.add(info); 327 } 328 329 private void removeAclInfoFromMap(Concept concept, AclInfo info) 330 { 331 ArrayList list = (ArrayList)aclInfos.get(concept); 332 list.remove(info); 333 info = new AclInfo(info.getAccess(), !info.isAllow(), info.getGroup(), info.getUser()); 334 list.remove(info); 335 } 336 } | Popular Tags |