KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > za > org > coefficient > modules > user > MemberAdmin


1 /*
2  * Coefficient - facilitates project based collaboration
3  * Copyright (C) 2003, Dylan Etkin, CSIR icomtek
4  * PO Box 395
5  * Pretoria 0001, RSA
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
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
20 package za.org.coefficient.modules.user;
21
22 import org.apache.commons.lang.StringUtils;
23
24 import net.sf.hibernate.Hibernate;
25 import net.sf.hibernate.HibernateException;
26
27 import za.org.coefficient.authentication.CoefficientUser;
28 import za.org.coefficient.authentication.ProjectMember;
29 import za.org.coefficient.authentication.Role;
30 import za.org.coefficient.core.Constants;
31 import za.org.coefficient.core.Project;
32 import za.org.coefficient.events.CoefficientEvent;
33 import za.org.coefficient.events.RoleChangedEvent;
34 import za.org.coefficient.interfaces.CoefficientContext;
35 import za.org.coefficient.modules.BaseProjectModule;
36 import za.org.coefficient.modules.project.ProjectConstants;
37 import za.org.coefficient.util.common.HibernatePager;
38 import za.org.coefficient.util.common.MailUtil;
39 import net.sf.hibernate.util.HibernateUtil;
40 import za.org.coefficient.util.ejb.SecurityUtil;
41 import za.org.coefficient.util.ejb.VelocityScreenUtil;
42
43 import java.util.ArrayList JavaDoc;
44 import java.util.List JavaDoc;
45 import java.util.ListIterator JavaDoc;
46 import java.util.HashMap JavaDoc;
47 import java.util.Iterator JavaDoc;
48 import java.util.Random JavaDoc;
49
50 /**
51  * @pojo2ejb.class
52  * name="MemberAdmin"
53  * jndi-prefix="za/org/coefficient/orphan/"
54  * interface-extends="za.org.coefficient.interfaces.Module"
55  * interface-local-extends="za.org.coefficient.interfaces.ModuleLocal"
56  *
57  * @web.resource-env-ref
58  * name="za/org/coefficient/orphan/MemberAdmin"
59  * type="za.org.coefficient.modules.user.MemberAdmin"
60  * @web.resource-env-ref
61  * name="MemberAdmin"
62  * type="za.org.coefficient.modules.user.MemberAdmin"
63  */

64 public class MemberAdmin extends BaseProjectModule {
65     //~ Static fields/initializers =============================================
66

67     private static final String JavaDoc MEMBER_PAGER = "__project_member_pager_";
68
69     //~ Methods ================================================================
70

71     public String JavaDoc getMainMethod() {
72         return "editMembers";
73     }
74
75     public String JavaDoc getModuleDescription() {
76         return "This allows " + ProjectConstants.PROJECT_NAME
77             + " members and users to be administrated";
78     }
79
80     public String JavaDoc getModuleDisplayName() {
81         return "Members Administration";
82     }
83
84     public CoefficientContext addMember(CoefficientContext ctx) throws HibernateException {
85         Project prj = ctx.getProject();
86         String JavaDoc userName = ctx.getParameter("userName");
87         String JavaDoc roleName = ctx.getParameter("role");
88         if ((userName == null) || (roleName == null)) {
89             ctx.setError("userName and role are required to add a member");
90         }
91         if (!ctx.isError()) {
92             ProjectMember pm = new ProjectMember();
93             Role role = null;
94             if (roleName.equals("champ")) {
95                 role =
96                     SecurityUtil.getRoleForValue(SecurityUtil.PROJECT_CHAMPION_ROLE_VAL);
97             } else if (roleName.equals("member")) {
98                 role =
99                     SecurityUtil.getRoleForValue(SecurityUtil.PROJECT_MEMBER_ROLE_VAL);
100             }
101             pm.setProjectRole(role);
102             
103
104             ArrayList JavaDoc users =
105                 new ArrayList JavaDoc(HibernateUtil.find("from "
106                                                  + CoefficientUser.class.getName()
107                                                  + " as pe_users where pe_users.userName = ?", userName,
108                                                  Hibernate.STRING));
109             if (users.size() != 1) {
110                 ctx.setError("userName is not unique");
111             } else {
112                 CoefficientUser user = (CoefficientUser) users.get(0);
113
114                 if (!prj.containsUser(user)) {
115                     pm.setCoefficientUser(user);
116
117                     prj.addMember(pm);
118                     prj.getMembersPending().remove(user);
119
120                     HibernateUtil.saveOrUpdate(prj);
121                     ctx.setForward("memberAdmin", "editMembers");
122                 } else {
123                     ctx.setError("user is already in the "
124                                  + ProjectConstants.PROJECT_NAME);
125                 }
126             }
127         }
128         return ctx;
129     }
130
131     public String JavaDoc canExecuteForRole(CoefficientContext ctx, String JavaDoc methodName,
132                                     Role usersHighestRole) {
133         if ((usersHighestRole.getRoleValue() > SecurityUtil.PROJECT_CHAMPION_ROLE_VAL)
134             && (methodName.equals("editMembers")
135                 || methodName.equals("addMember")
136                 || methodName.equals("memberSelect")
137                 || methodName.equals("acceptMembership")
138                 || methodName.equals("rejectmembership")
139                 || methodName.equals("changeMemberRole")
140                 || methodName.equals("removeMember"))) {
141             return "Only a site administrator or project champion can administrate "
142                 + ProjectConstants.PROJECT_NAME + " members";
143         } else if ((usersHighestRole.getRoleValue() == SecurityUtil.GUEST_ROLE_VAL)
144                    && methodName.equals("requestMembership")) {
145             return "You must be logged into the system to request membership on a "
146                 + ProjectConstants.PROJECT_NAME;
147         } else {
148             return null;
149         }
150     }
151
152     public CoefficientContext changeMemberRole(CoefficientContext ctx)
153         throws HibernateException {
154         Project prj = ctx.getProject();
155         Long JavaDoc pmId = ctx.getParameterAsLong("memberId");
156         if (pmId == null) {
157             ctx.setError("memberId is required to change roles");
158         }
159         if (!ctx.isError()) {
160             for (Iterator JavaDoc it = prj.getMembers()
161                      .iterator(); it.hasNext();) {
162                 ProjectMember pm = (ProjectMember) it.next();
163                 if (pm.getId()
164                     .equals(pmId)) {
165                     if (pm.getProjectRole()
166                         .getRoleValue() == SecurityUtil.PROJECT_CHAMPION_ROLE_VAL) {
167                         if (prj.getChampionsAsMembers()
168                             .size() == 1) {
169                             ctx.setError(
170                                          "the " + ProjectConstants.PROJECT_NAME
171                                          + " must have at least one champion");
172                         } else {
173                             pm.setProjectRole(SecurityUtil.getRoleForValue(SecurityUtil.PROJECT_MEMBER_ROLE_VAL));
174                             publishEvent(new RoleChangedEvent("ROLE_CHANGED",prj));
175                         }
176                     } else if (pm.getProjectRole()
177                                .getRoleValue() == SecurityUtil.PROJECT_MEMBER_ROLE_VAL) {
178                         pm.setProjectRole(SecurityUtil.getRoleForValue(SecurityUtil.PROJECT_CHAMPION_ROLE_VAL));
179                         publishEvent(new RoleChangedEvent("ROLE_CHANGED",prj));
180                     }
181
182                     break;
183                 }
184             }
185             if (!ctx.isError()) {
186                 // Save the new member
187
HibernateUtil.saveOrUpdate(prj);
188                 ctx.setForward("memberAdmin", "editMembers");
189             }
190         }
191         return ctx;
192     }
193
194     // TODO: Implement this
195
public CoefficientContext deleteAllForProject(CoefficientContext ctx) {
196         return ctx;
197     }
198
199     public CoefficientContext editMembers(CoefficientContext ctx) {
200         HashMap JavaDoc map = new HashMap JavaDoc();
201         map.put("module", this);
202         map.put("project", ctx.getProject());
203         map.put("project_name", ProjectConstants.PROJECT_NAME);
204         map.put("project_name_cap",
205                 StringUtils.capitalise(ProjectConstants.PROJECT_NAME));
206         StringBuffer JavaDoc sb = VelocityScreenUtil.getProcessedScreen("edit.vm", map);
207
208         // Return the html since we are a child of the project module
209
ctx.setModuleContent(sb.toString(), getModuleDisplayName());
210         return ctx;
211     }
212
213     public CoefficientContext memberSelect(CoefficientContext ctx) throws Exception JavaDoc {
214         HashMap JavaDoc map = new HashMap JavaDoc();
215
216         HibernatePager hp = null;
217         if ((ctx.getParameter("userName") != null)
218             && !ctx.getParameter("userName")
219             .trim()
220             .equals("")) {
221             hp = (HibernatePager) ctx.getSessionAttribute(MEMBER_PAGER);
222             if (hp == null) {
223                 ctx.setError("Invalid operation");
224             } else {
225                 HashMap JavaDoc searchParams = new HashMap JavaDoc();
226                 searchParams.put("active", new Boolean JavaDoc(true));
227                 searchParams.put("userName", ctx.getParameter("userName"));
228                 searchParams.put("!systemRole.roleValue",
229                                  new Long JavaDoc(SecurityUtil.SITE_ADMIN_ROLE_VAL));
230                 hp.setAndSearchParams(searchParams);
231             }
232         } else if (ctx.getParameter("next") != null) {
233             hp = (HibernatePager) ctx.getSessionAttribute(MEMBER_PAGER);
234             if (hp == null) {
235                 ctx.setError("Invalid operation");
236             } else {
237                 hp.next();
238             }
239         } else if (ctx.getParameter("previous") != null) {
240             hp = (HibernatePager) ctx.getSessionAttribute(MEMBER_PAGER);
241             if (hp == null) {
242                 ctx.setError("Invalid operation");
243             } else {
244                 hp.previous();
245             }
246         } else if (ctx.getParameter("page") != null) {
247             hp = (HibernatePager) ctx.getSessionAttribute(MEMBER_PAGER);
248             if (hp == null) {
249                 ctx.setError("pager does not exist");
250             } else {
251                 hp.goToPage(ctx.getParameterAsInteger("page").intValue());
252             }
253         } else {
254             HashMap JavaDoc searchParams = new HashMap JavaDoc();
255             searchParams.put("active", new Boolean JavaDoc(true));
256             searchParams.put("!systemRole.roleValue",
257                              new Long JavaDoc(SecurityUtil.SITE_ADMIN_ROLE_VAL));
258             hp = new HibernatePager(CoefficientUser.class, "userName",
259                                     Constants.MAX_ELEMENTS_PER_PAGE, searchParams);
260         }
261
262         if (!ctx.isError()) {
263             map.put("userPager", hp);
264             map.put("module", this);
265             map.put("project", ctx.getProject());
266             map.put("project_name", ProjectConstants.PROJECT_NAME);
267             map.put("project_name_cap",
268                     StringUtils.capitalise(ProjectConstants.PROJECT_NAME));
269             StringBuffer JavaDoc sb =
270                 VelocityScreenUtil.getProcessedScreen("selectMember.vm", map);
271
272             // Return the html since we are a child of the project module
273
ctx.setModuleContent(sb.toString(), getModuleDisplayName());
274             ctx.setSessionAttribute(MEMBER_PAGER, hp);
275         }
276         return ctx;
277     }
278
279     public CoefficientContext removeMember(CoefficientContext ctx) throws HibernateException {
280         Project prj = ctx.getProject();
281         Long JavaDoc pmId = ctx.getParameterAsLong("memberId");
282         if (pmId == null) {
283             ctx.setError("memberId is required to delete a member");
284         }
285         if (!ctx.isError()) {
286             for (Iterator JavaDoc it = prj.getMembers().iterator(); it.hasNext();) {
287                 ProjectMember pm = (ProjectMember) it.next();
288                 if (pm.getId()
289                     .equals(pmId)) {
290                     if ((pm.getProjectRole().getRoleValue() == SecurityUtil.PROJECT_CHAMPION_ROLE_VAL) && (prj.getChampionsAsMembers().size() == 1)) {
291                         ctx.setError("the " + ProjectConstants.PROJECT_NAME
292                                      + " must have at least one champion");
293                     } else {
294                         it.remove();
295                     }
296
297                     break;
298                 }
299             }
300             if (!ctx.isError()) {
301                 // Save the new member
302
HibernateUtil.saveOrUpdate(prj);
303                 ctx.setForward("memberAdmin", "editMembers");
304             }
305         }
306         return ctx;
307     }
308
309     public void removeAllProjectMembershipFor(CoefficientUser user)
310         throws HibernateException
311     {
312         List JavaDoc projectMemberships = HibernateUtil.find("FROM " +
313                                             ProjectMember.class.getName() +
314                                             " as pm where pm.coefficientUser.id = ?", user.getId(), Hibernate.LONG);
315                                   
316         for(Iterator JavaDoc it = projectMemberships.iterator(); it.hasNext();) {
317             ProjectMember pm = (ProjectMember)it.next();
318             List JavaDoc projects = HibernateUtil.find("select prjs FROM "
319                                       + Project.class.getName() +
320                                       " as prjs, "
321                                       + ProjectMember.class.getName()
322                                       + " as pm where pm in elements (prjs.members) and pm.id = ?", pm.getId(), Hibernate.LONG);
323             for(Iterator JavaDoc its = projects.iterator(); its.hasNext(); ) {
324                 Project prj = (Project)its.next();
325                 prj.deleteMember(pm);
326                 HibernateUtil.saveOrUpdate(prj);
327             }
328             //HibernateUtil.delete(pm);
329
}
330     }
331
332
333     public CoefficientContext leaveProject(CoefficientContext ctx) throws HibernateException {
334         Project project = ctx.getProject();
335         HashMap JavaDoc map = new HashMap JavaDoc();
336
337         map.put("user", ctx.getCurrentUser());
338         map.put("project", project);
339         map.put("project_name", ProjectConstants.PROJECT_NAME);
340         map.put("project_name_cap",
341                 StringUtils.capitalise(ProjectConstants.PROJECT_NAME));
342         String JavaDoc message = VelocityScreenUtil
343             .getProcessedScreen("memberLeavingMessage.vm", map).toString();
344
345         map.clear();
346         List JavaDoc champions = project.getChampionsAsUsers();
347         ListIterator JavaDoc iterator = champions.listIterator();
348
349         while (iterator.hasNext() ) {
350             CoefficientUser champion = (CoefficientUser)iterator.next();
351             boolean success = MailUtil
352                 .sendEmail(message, "Member leaving " + ProjectConstants.PROJECT_NAME
353                            + " " + project.getName(), champion.getEmail(), null);
354         }
355
356         map.put("project_name", ProjectConstants.PROJECT_NAME);
357         map.put("project_name_cap",
358                 StringUtils.capitalise(ProjectConstants.PROJECT_NAME));
359         map.put("project", project);
360         StringBuffer JavaDoc sb = VelocityScreenUtil
361             .getProcessedScreen("requestLeaveProject.vm", map);
362
363         // Return the html since we are a child of the project module
364
ctx.setModuleContent(sb.toString(), getModuleDisplayName());
365         return ctx;
366     }
367
368     public CoefficientContext requestMembership(CoefficientContext ctx)
369         throws HibernateException {
370         Project project = ctx.getProject();
371         HashMap JavaDoc map = new HashMap JavaDoc();
372
373     if(! project.getMembersPending().contains(ctx.getCurrentUser())) {
374         // add to project members pending list
375
project.getMembersPending().add(ctx.getCurrentUser());
376
377         // save the project
378
HibernateUtil.saveOrUpdate(project);
379
380         map.put("user", ctx.getCurrentUser());
381         map.put("project", project);
382         map.put("project_name", ProjectConstants.PROJECT_NAME);
383         map.put("project_name_cap",
384                 StringUtils.capitalise(ProjectConstants.PROJECT_NAME));
385         String JavaDoc message = VelocityScreenUtil
386             .getProcessedScreen("confirmationMessage.vm", map).toString();
387
388         map.clear();
389
390         List JavaDoc champions = project.getChampionsAsUsers();
391         ListIterator JavaDoc iterator = champions.listIterator();
392
393         while ( iterator.hasNext() ) {
394             CoefficientUser champion = (CoefficientUser)iterator.next();
395             boolean success = MailUtil.sendEmail(message,
396                                                  "New member wanting to join "
397                                                  + ProjectConstants.PROJECT_NAME
398                                                  + " " + project.getName(),
399                                                  champion.getEmail(), null);
400         }
401
402         map.put("project_name", ProjectConstants.PROJECT_NAME);
403         map.put("project_name_cap",
404                 StringUtils.capitalise(ProjectConstants.PROJECT_NAME));
405         StringBuffer JavaDoc sb = VelocityScreenUtil
406             .getProcessedScreen("requestedMembership.vm", map);
407
408         // Return the html since we are a child of the project module
409
ctx.setModuleContent(sb.toString(), getModuleDisplayName());
410     } else {
411           ctx.setError("You have already requested to join this " + ProjectConstants.PROJECT_NAME);
412     }
413         return ctx;
414     }
415
416     public CoefficientContext acceptMembership(CoefficientContext ctx) {
417         HashMap JavaDoc map = new HashMap JavaDoc();
418         Project project = ctx.getProject();
419         Long JavaDoc memberId = null;
420
421         try {
422             memberId = new Long JavaDoc(ctx.getParameter("memberId"));
423         }
424         catch ( Throwable JavaDoc t ) {
425             System.out.println("problem with " + memberId);
426         }
427
428         for(Iterator JavaDoc it = project.getMembersPending().iterator(); it.hasNext();) {
429             CoefficientUser user = (CoefficientUser)it.next();
430
431             if (user.getId().equals(memberId)) {
432                 project.getMembersPending().remove(user);
433                 project.getMembers().add(new ProjectMember(user, SecurityUtil.getRoleForValue(SecurityUtil.PROJECT_MEMBER_ROLE_VAL)));
434                 try {
435                     HibernateUtil.saveOrUpdate(project);
436                     map.put("user", ctx.getCurrentUser());
437                     map.put("project", project);
438
439                     String JavaDoc message = VelocityScreenUtil
440                         .getProcessedScreen("acceptanceMessage.vm", map).toString();
441                     boolean success = MailUtil
442                         .sendEmail(message, "You have been accepted to project "
443                                    + project.getName(), user.getEmail(),
444                                    ctx.getCurrentUser().getEmail());
445                 }
446                 catch ( Throwable JavaDoc t ) {
447                     System.out.println("Could not save "
448                                        + ProjectConstants.PROJECT_NAME + t);
449                 }
450                 break;
451             }
452         }
453
454         map.clear();
455         map.put("module", this);
456         map.put("project", project);
457         map.put("project_name", ProjectConstants.PROJECT_NAME);
458         map.put("project_name_cap",
459                 StringUtils.capitalise(ProjectConstants.PROJECT_NAME));
460         StringBuffer JavaDoc sb = VelocityScreenUtil.getProcessedScreen("edit.vm", map);
461     
462         // Return the html since we are a child of the project module
463
ctx.setModuleContent(sb.toString(), getModuleDisplayName());
464         return ctx;
465     }
466
467     public CoefficientContext rejectMembership(CoefficientContext ctx) {
468         HashMap JavaDoc map = new HashMap JavaDoc();
469         Project project = ctx.getProject();
470         Long JavaDoc memberId = null;
471
472         try {
473             memberId = new Long JavaDoc(ctx.getParameter("memberId"));
474         }
475         catch ( Throwable JavaDoc t ) {
476             System.out.println("problem with " + memberId);
477         }
478
479         for(Iterator JavaDoc it = project.getMembersPending().iterator(); it.hasNext();) {
480             CoefficientUser user = (CoefficientUser)it.next();
481             if (user.getId().equals(memberId) ) {
482                 project.getMembersPending().remove(user);
483                 try {
484                     HibernateUtil.saveOrUpdate(project);
485                     map.put("user", ctx.getCurrentUser());
486                     map.put("project", project);
487
488                     map.put("project_name", ProjectConstants.PROJECT_NAME);
489                     map.put("project_name_cap",
490                             StringUtils.capitalise(ProjectConstants.PROJECT_NAME));
491                     String JavaDoc message = VelocityScreenUtil
492                         .getProcessedScreen("rejectionMessage.vm", map). toString();
493                     System.out.println("accept: " + message);
494                     boolean success = MailUtil
495                         .sendEmail(message, "Application to join project "
496                                    + project.getName(), user.getEmail(),
497                                    ctx.getCurrentUser().getEmail());
498                 }
499                 catch ( Throwable JavaDoc t ) {
500                     System.out.println("Could not save "
501                                        + ProjectConstants.PROJECT_NAME + t);
502                 }
503                 break;
504             }
505         }
506
507         map.put("module", this);
508         map.put("project", project);
509         StringBuffer JavaDoc sb = VelocityScreenUtil.getProcessedScreen("edit.vm", map);
510     
511         // Return the html since we are a child of the project module
512
ctx.setModuleContent(sb.toString(), getModuleDisplayName());
513         return ctx;
514     }
515
516     public String JavaDoc viewMembers(CoefficientContext ctx) {
517         // Get html content
518
HashMap JavaDoc map = new HashMap JavaDoc();
519         map.put("module", this);
520         map.put("project", ctx.getProject());
521         if ( ctx.getCurrentUser() != null )
522             map.put("currentUser", ctx.getCurrentUser());
523         Role role =
524             SecurityUtil.getHighestRoleForUser(ctx.getCurrentUser(),
525                                                ctx.getProject());
526         if (role.getRoleValue() <= SecurityUtil.PROJECT_CHAMPION_ROLE_VAL) {
527             map.put("admin", new Boolean JavaDoc(true));
528         }
529         if (ctx.getCurrentUser() != null) {
530             map.put("loggedIn", new Boolean JavaDoc(true));
531         }
532         StringBuffer JavaDoc sb = VelocityScreenUtil.getProcessedScreen("view.vm", map);
533
534         // Return the html since we are a child of the project module
535
return sb.toString();
536     }
537
538     public CoefficientContext displayMembers(CoefficientContext ctx) {
539         ctx.setModuleContent(viewMembers(ctx), getModuleDisplayName());
540         return ctx;
541     }
542 }
543
Popular Tags