KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > lucane > client > acl > AclEditor


1 /*
2  * Lucane - a collaborative platform
3  * Copyright (C) 2005 Vincent Fiack <vfiack@mail15.com>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  */

19 package org.lucane.client.acl;
20
21 import java.awt.BorderLayout JavaDoc;
22 import java.awt.Dimension JavaDoc;
23 import java.awt.GridLayout JavaDoc;
24 import java.awt.event.ActionEvent JavaDoc;
25 import java.awt.event.ActionListener JavaDoc;
26 import java.util.*;
27
28 import javax.swing.*;
29 import javax.swing.table.DefaultTableModel JavaDoc;
30 import javax.swing.event.ListSelectionListener JavaDoc;
31 import javax.swing.event.ListSelectionEvent JavaDoc;
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 JavaDoc, ListSelectionListener JavaDoc
47 {
48     private Plugin plugin;
49     private AclProducer producer;
50     private String JavaDoc itemId;
51     private String JavaDoc[] 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 JavaDoc itemId)
67     throws Exception JavaDoc {
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 JavaDoc(400, 400));
77         setName("ACLEditor");
78
79         //load acls from producer
80
AclInfo[] infos = producer.getAcls(itemId);
81         for(int i=0;i<infos.length;i++)
82         {
83             AclInfo info = infos[i];
84
85             //get concept (map key)
86
Concept concept;
87             if(info.getGroup() != null)
88                 concept = new GroupConcept(info.getGroup());
89             else
90                 concept = new UserConcept(info.getUser());
91
92             //set initial list if not yet in the map
93
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 JavaDoc());
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 JavaDoc());
129         allows.add(new JScrollPane(elements), BorderLayout.CENTER);
130         
131         JPanel buttons = new JPanel(new GridLayout JavaDoc(3, 1));
132         buttons.add(addGroup);
133         buttons.add(addUser);
134         buttons.add(removeAllow);
135         
136         JPanel container = new JPanel(new BorderLayout JavaDoc());
137         container.add(buttons, BorderLayout.NORTH);
138         
139         allows.add(container, BorderLayout.EAST);
140         
141         return allows;
142     }
143
144     public void actionPerformed(ActionEvent JavaDoc 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 JavaDoc e)
157     {
158         Concept selected = (Concept)elements.getSelectedValue();
159         if(selected == null)
160             permissions.setModel(new DefaultTableModel JavaDoc());
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 JavaDoc 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 JavaDoc)list.get(index);
177         } catch(Exception JavaDoc 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 JavaDoc 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 JavaDoc)list.get(index);
198         } catch(Exception JavaDoc 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 JavaDoc 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 JavaDoc access)
246     {
247         try {
248             addAclInfo(access, true);
249         } catch (Exception JavaDoc e) {
250             DialogBox.error(Translation.tr("acl.err.unableToAllowAccess"));
251             e.printStackTrace();
252         }
253     }
254
255     public void denyAccess(String JavaDoc access)
256     {
257         try {
258             addAclInfo(access, false);
259         } catch (Exception JavaDoc e) {
260             DialogBox.error(Translation.tr("acl.err.unableToDenyAccess"));
261             e.printStackTrace();
262         }
263     }
264
265     public void removeAccess(String JavaDoc access)
266     {
267         Concept selected = (Concept)elements.getSelectedValue();
268         if(selected == null)
269             return;
270
271         String JavaDoc group = null;
272         String JavaDoc 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 JavaDoc e) {
287             DialogBox.error(Translation.tr("acl.err.unableToRemoveAccessRule"));
288             e.printStackTrace();
289         }
290     }
291
292     private void addAclInfo(String JavaDoc access, boolean allow)
293     throws Exception JavaDoc
294     {
295         Concept selected = (Concept)elements.getSelectedValue();
296         if(selected == null)
297             return;
298
299         String JavaDoc group = null;
300         String JavaDoc 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