001
002 /** GroupController
003 * A class that handles group management.
004 * @author Daniel Fredriksson
005 * @version 0.1
006 *
007 */
008
009 package sharpster.daemon.groupmanagement;
010
011 import sharpster.common.*;
012 import java.util.Hashtable;
013 import java.util.LinkedList;
014 import java.util.Iterator;
015 import java.util.Enumeration;
016 import java.util.ListIterator;
017 import java.io.FileOutputStream;
018 import java.io.FileInputStream;
019 import net.jxta.document.*;
020 import net.jxta.id.*;
021 import sharpster.daemon.usermanagement.*;
022
023 public class GroupController {
024
025 private UserManager userManager;
026
027
028 /**
029 *
030 */
031 public void initialize(UserManager um) {
032
033 userManager = um;
034 }
035
036 /** A table containing all the groups. */
037 private Hashtable groupTable;
038
039
040 /** Initialize the groupTable and read the groups from the disk. */
041 public GroupController() {
042 groupTable = new Hashtable();
043 if(!readFromDisk())
044 System.out.println("Couldn't read \"groups.cfg\".");
045 }
046
047
048 /** Checks if a given group exists.
049 * @param groupName A name of a group.
050 * @return True if a group with the name groupName exists, otherwise false.
051 */
052 private boolean existGroup(String groupName) {
053 return groupTable.containsKey(groupName);
054 }
055
056 /** Add a given group to the groups.
057 * @param group A groupname.
058 * @return A groupResponse contaning the result of the method.
059 */
060 private GroupResponse addGroup(String group) {
061 GroupClass groupClass;
062 GroupResponse groupResponse = new GroupResponse();
063
064 if(existGroup(group))
065 groupResponse.setSubError(sharpster.common.SubError.GROUP_EXIST);
066 else {
067 groupResponse.setSubError(sharpster.common.SubError.NO_ERROR);
068 groupClass = new GroupClass();
069 groupClass.setName(group);
070 groupTable.put(group, groupClass);
071 if( !(saveToDisk() && saveToFile(group,true)))
072 System.out.println("Couldn't write \"groups.cfg\".");
073 }
074 return groupResponse;
075 }
076
077 /** Remove a given group from the groups.
078 * @param group A groupname.
079 * @return A groupResponse containing the result of the method.
080 */
081 private GroupResponse removeGroup(String group) {
082 GroupClass groupClass;
083 GroupResponse groupResponse = new GroupResponse();
084
085 if(!existGroup(group))
086 groupResponse.setSubError(sharpster.common.SubError.NO_SUCH_GROUP);
087 else {
088 groupResponse.setSubError(sharpster.common.SubError.NO_ERROR);
089 groupTable.remove(group);
090 if( !(saveToDisk() && saveToFile(group,false)))
091 System.out.println("Couldn't write \"groups.cfg\".");
092 }
093 return groupResponse;
094 }
095
096 /** Add a given user to a given group.
097 * @param group A groupname.
098 * @param user A username.
099 * @return A groupResponse containing the result of the method.
100 */
101 private GroupResponse addUser(String group, String user) {
102 GroupResponse groupResponse = new GroupResponse();
103
104 if(!existGroup(group))
105 groupResponse.setSubError(sharpster.common.SubError.NO_SUCH_GROUP);
106 else if(findGroupFromString(group).isUserInGroup(user))
107 groupResponse.setSubError(sharpster.common.SubError.
108 USER_ALREADY_IN_GROUP);
109 else {
110 findGroupFromString(group).addUser(user);
111 groupResponse.setSubError(sharpster.common.SubError.NO_ERROR);
112 if(!saveToDisk())
113 System.out.println("Couldn't write \"groups.cfg\".");
114 }
115 return groupResponse;
116 }
117
118 /** Remove a given user from a given group.
119 * @param group A groupname.
120 * @param user A username.
121 * @return A groupResponse containing the result of the method.
122 */
123 private GroupResponse removeUser(String group, String user) {
124 GroupResponse groupResponse = new GroupResponse();
125
126 if(!existGroup(group))
127 groupResponse.setSubError(sharpster.common.SubError.NO_SUCH_GROUP);
128 else if(!findGroupFromString(group).isUserInGroup(user))
129 groupResponse.setSubError(sharpster.common.SubError.
130 USER_NOT_IN_GROUP);
131 else {
132 findGroupFromString(group).removeUser(user);
133 groupResponse.setSubError(sharpster.common.SubError.NO_ERROR);
134 if(!saveToDisk())
135 System.out.println("Couldn't write \"groups.cfg\".");
136 }
137 return groupResponse;
138 }
139
140
141 /** Save the group data to disk.
142 * @return True if the groupinformation was successfully written,
143 * otherwise false.
144 * @throws Exception if the groupinformation couldn't be written.
145 */
146 private boolean saveToDisk() {
147
148 StructuredDocument document;
149 Element groupElement, userElement;
150 Iterator groupsIterator, usersIterator;
151 String groupName;
152
153 try {
154 document = (StructuredTextDocument)
155 StructuredDocumentFactory.newStructuredDocument(new
156 MimeMediaType("text/xml"), "groups");
157
158 groupsIterator = groupTable.keySet().iterator();
159
160 while(groupsIterator.hasNext()) {
161 groupName = (String)groupsIterator.next();
162 groupElement = document.createElement("group");
163 document.appendChild(groupElement);
164
165 groupElement.appendChild(document.createElement("name",
166 groupName));
167
168 usersIterator = findGroupFromString(groupName).getUsers().
169 iterator();
170 while(usersIterator.hasNext()) {
171 userElement = document.createElement("user",
172 usersIterator.next());
173 groupElement.appendChild(userElement);
174 } // UserIterator
175 } // GroupIterator
176
177 // annan fil...
178 FileOutputStream output = new FileOutputStream("config/groups.cfg");
179 document.sendToStream(output);
180 output.close();
181 } // try
182 catch(Exception e) {
183 //e.printStackTrace();
184 return false;
185 }
186 return true;
187 }
188
189
190 /** Read the groups file from disk.
191 * @return True if the groupinformation was successfully read,
192 * otherwise false
193 * @throws Exception is thrown if the groupinformation couldn't be read.
194 */
195 private boolean readFromDisk() {
196 FileInputStream input;
197 StructuredDocument document;
198 Enumeration groupsEnum, groupEnum;
199 Element element;
200 String currentGroup="";
201
202 try {
203 input = new FileInputStream("config/groups.cfg");
204
205 document = (StructuredTextDocument)
206 StructuredDocumentFactory.newStructuredDocument(new
207 MimeMediaType("text/xml"), input);
208 groupsEnum = document.getChildren(); // "groups" level
209
210 while(groupsEnum.hasMoreElements()) { // "group" level
211 groupEnum = ((Element)groupsEnum.nextElement()).getChildren();
212
213 while(groupEnum.hasMoreElements()) { // "name", "user" level
214 element = (Element)groupEnum.nextElement();
215
216 // getting the name of a group, add the group
217 if(element.getKey().equals("name")) {
218 currentGroup = (String)element.getValue();
219 addGroup((String)element.getValue());
220 }
221
222 // getting a user in a group
223 // add the user to the last read group
224 // or return false
225 else if(element.getKey().equals("user")) {
226 if(currentGroup.length()==0) {
227 System.out.println("user before name in user.cfg");
228 return false;
229 }
230
231 else
232 addUser(currentGroup, (String)element.getValue());
233 }
234
235 // getting something that doesn't belong in the file
236 // return false
237 else {
238 System.out.println("Error in user.cfg");
239 return false;
240 }
241 }
242 currentGroup="";
243 }
244 }
245 catch(Exception e) {
246 //e.printStackTrace();
247 return false;
248 }
249 // file was read ok, return true
250 return true;
251 }
252
253
254 /** List all the groups.
255 * @return A groupResponse containing a list with all the groups.
256 */
257 private GroupResponse listGroups() {
258 GroupResponse groupResponse = new GroupResponse();
259 LinkedList groups = new LinkedList();
260 groups.addAll(groupTable.keySet());
261 groupResponse.setGroups(groups);
262 groupResponse.setSubError(sharpster.common.SubError.NO_ERROR);
263 return groupResponse;
264 }
265
266
267 /** Returns a list containing all the users in a given group.
268 * @param group A groupname.
269 * @return A groupResponse contaning a list with all the users in the
270 * group
271 */
272 private GroupResponse listUsersInGroup(String group) {
273 GroupResponse groupResponse = new GroupResponse();
274 LinkedList users = new LinkedList();
275 if(!existGroup(group))
276 groupResponse.setSubError(sharpster.common.SubError.NO_SUCH_GROUP);
277 else {
278 users.addAll(findGroupFromString(group).getUsers());
279 groupResponse.setUsers(users);
280 groupResponse.setSubError(sharpster.common.SubError.NO_ERROR);
281 }
282 return groupResponse;
283 }
284
285
286 /** Returns all groups and all users.
287 * @return A groupResponse contaning a list with all the groups
288 * and a list with all the users.
289 */
290 private GroupResponse listAll() {
291 GroupResponse groupResponse = new GroupResponse();
292 LinkedList groups = new LinkedList();
293 LinkedList users = new LinkedList();
294 ListIterator groupsIterator;
295 String Dummy = "!!SHARPSTER--DUMMY!!";
296 GroupClass group;
297
298 groups.addAll(groupTable.keySet());
299 groupResponse.setGroups(groups);
300
301 groupsIterator = groups.listIterator();
302 System.out.println(groups);
303 while(groupsIterator.hasNext()) {
304 group = (GroupClass)findGroupFromString((String)groupsIterator.
305 next());
306 users.addAll(group.getUsers());
307 users.add(Dummy);
308 }
309
310 // remove the last !!SHARPSTER--DUMMY!!
311 if(!users.isEmpty())
312 users.removeLast();
313
314 groupResponse.setUsers(users);
315 return groupResponse;
316 }
317
318
319 /** Return the GroupClass for a given string representation of a group.
320 * @param group A groupname.
321 * @return A group with the given name.
322 */
323 private GroupClass findGroupFromString(String group) {
324 return (GroupClass)groupTable.get(group);
325 }
326
327
328 /** Returns a list containing a given user as the first element followed
329 * by every group the user is a memeber of.
330 * @param user A username.
331 * @return A list containing all the groups the user is a member of.
332 */
333 public LinkedList getGroups(String user) {
334 LinkedList userGroups = new LinkedList();
335 Iterator groupsIterator;
336 GroupClass group;
337
338 groupsIterator = groupTable.keySet().iterator();
339 userGroups.add(user);
340
341 while(groupsIterator.hasNext()) {
342 group = (GroupClass)findGroupFromString((String)groupsIterator.
343 next());
344 if( group.isUserInGroup(user))
345 userGroups.add(group.getName());
346 }
347
348 return userGroups;
349 }
350
351 /** Recieves a groupcommand, executes the given command and returns
352 * the result.
353 * @param command A groupcommand.
354 * @return A responseCollection contaning the result of the command.
355 */
356 public ResponseCollection groupCommand(GroupCommand command) {
357 GroupResponse groupResponse = new GroupResponse();
358 ResponseCollection response = new ResponseCollection();
359
360 switch(command.command) {
361 case sharpster.common.SubCommand.ADD_USER :
362 groupResponse = addUser(command.group, command.user);
363 break;
364 case sharpster.common.SubCommand.REMOVE_USER :
365 groupResponse = removeUser(command.group, command.user);
366 break;
367 case sharpster.common.SubCommand.LIST_GROUPS :
368 groupResponse = listGroups();
369 break;
370 case sharpster.common.SubCommand.LIST_ALL :
371 groupResponse = listAll();
372 break;
373 case sharpster.common.SubCommand.LIST_USERS_IN_GROUP :
374 groupResponse = listUsersInGroup(command.group);
375 break;
376 case sharpster.common.SubCommand.ADD_GROUP :
377 groupResponse = addGroup(command.group);
378 break;
379 case sharpster.common.SubCommand.REMOVE_GROUP :
380 groupResponse = removeGroup(command.group);
381 break;
382 default :
383 System.out.println("GM: Unknown Group Command.");
384 }
385
386 if(groupResponse.getSubError()==sharpster.common.SubError.NO_ERROR)
387 groupResponse.setError(false);
388 else
389 groupResponse.setError(true);
390 groupResponse.setOrigin("GroupManagement");
391 groupResponse.setCommand(command.command);
392 response.addResponse(groupResponse);
393 return response;
394 }
395
396 /**
397 * Saves the user information to a configuration file.
398
399 */
400 public boolean saveToFile(String name, boolean add) {
401
402
403
404 try {
405 if (add) {
406 userManager.userKeyManager.add(name, null);
407 }
408 else {
409 userManager.userKeyManager.remove(name);
410 }
411
412 String[] users = userManager.userKeyManager.getAllValues();
413
414 StructuredDocument document = (StructuredTextDocument)
415 StructuredDocumentFactory.newStructuredDocument(new MimeMediaType("text/xml"), "users");
416 Element element, userElement;
417
418 for(int i=0;i<users.length;i++) {
419 userElement = document.createElement("user");
420 document.appendChild(userElement);
421
422 element = document.createElement("name", users[i]);
423 userElement.appendChild(element);
424
425 ID id = userManager.userKeyManager.getKey(users[i]);
426 element = document.createElement("id", id.toString());
427 userElement.appendChild(element);
428 }
429
430 FileOutputStream output = new FileOutputStream("config/users.cfg");
431 StructuredTextDocument doc = (StructuredTextDocument)document;
432 doc.sendToStream(output);
433 output.close();
434 }
435 catch(Exception e) {
436 //e.printStackTrace();
437 return false;
438 }
439
440 return true;
441 }
442
443
444 }
445
446
447
448