1 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 ; 44 import java.util.List ; 45 import java.util.ListIterator ; 46 import java.util.HashMap ; 47 import java.util.Iterator ; 48 import java.util.Random ; 49 50 64 public class MemberAdmin extends BaseProjectModule { 65 67 private static final String MEMBER_PAGER = "__project_member_pager_"; 68 69 71 public String getMainMethod() { 72 return "editMembers"; 73 } 74 75 public String getModuleDescription() { 76 return "This allows " + ProjectConstants.PROJECT_NAME 77 + " members and users to be administrated"; 78 } 79 80 public String getModuleDisplayName() { 81 return "Members Administration"; 82 } 83 84 public CoefficientContext addMember(CoefficientContext ctx) throws HibernateException { 85 Project prj = ctx.getProject(); 86 String userName = ctx.getParameter("userName"); 87 String 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 users = 105 new ArrayList (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 canExecuteForRole(CoefficientContext ctx, String 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 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 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 HibernateUtil.saveOrUpdate(prj); 188 ctx.setForward("memberAdmin", "editMembers"); 189 } 190 } 191 return ctx; 192 } 193 194 public CoefficientContext deleteAllForProject(CoefficientContext ctx) { 196 return ctx; 197 } 198 199 public CoefficientContext editMembers(CoefficientContext ctx) { 200 HashMap map = new HashMap (); 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 sb = VelocityScreenUtil.getProcessedScreen("edit.vm", map); 207 208 ctx.setModuleContent(sb.toString(), getModuleDisplayName()); 210 return ctx; 211 } 212 213 public CoefficientContext memberSelect(CoefficientContext ctx) throws Exception { 214 HashMap map = new HashMap (); 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 searchParams = new HashMap (); 226 searchParams.put("active", new Boolean (true)); 227 searchParams.put("userName", ctx.getParameter("userName")); 228 searchParams.put("!systemRole.roleValue", 229 new Long (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 searchParams = new HashMap (); 255 searchParams.put("active", new Boolean (true)); 256 searchParams.put("!systemRole.roleValue", 257 new Long (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 sb = 270 VelocityScreenUtil.getProcessedScreen("selectMember.vm", map); 271 272 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 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 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 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 projectMemberships = HibernateUtil.find("FROM " + 313 ProjectMember.class.getName() + 314 " as pm where pm.coefficientUser.id = ?", user.getId(), Hibernate.LONG); 315 316 for(Iterator it = projectMemberships.iterator(); it.hasNext();) { 317 ProjectMember pm = (ProjectMember)it.next(); 318 List 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 its = projects.iterator(); its.hasNext(); ) { 324 Project prj = (Project)its.next(); 325 prj.deleteMember(pm); 326 HibernateUtil.saveOrUpdate(prj); 327 } 328 } 330 } 331 332 333 public CoefficientContext leaveProject(CoefficientContext ctx) throws HibernateException { 334 Project project = ctx.getProject(); 335 HashMap map = new HashMap (); 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 message = VelocityScreenUtil 343 .getProcessedScreen("memberLeavingMessage.vm", map).toString(); 344 345 map.clear(); 346 List champions = project.getChampionsAsUsers(); 347 ListIterator 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 sb = VelocityScreenUtil 361 .getProcessedScreen("requestLeaveProject.vm", map); 362 363 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 map = new HashMap (); 372 373 if(! project.getMembersPending().contains(ctx.getCurrentUser())) { 374 project.getMembersPending().add(ctx.getCurrentUser()); 376 377 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 message = VelocityScreenUtil 386 .getProcessedScreen("confirmationMessage.vm", map).toString(); 387 388 map.clear(); 389 390 List champions = project.getChampionsAsUsers(); 391 ListIterator 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 sb = VelocityScreenUtil 406 .getProcessedScreen("requestedMembership.vm", map); 407 408 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 map = new HashMap (); 418 Project project = ctx.getProject(); 419 Long memberId = null; 420 421 try { 422 memberId = new Long (ctx.getParameter("memberId")); 423 } 424 catch ( Throwable t ) { 425 System.out.println("problem with " + memberId); 426 } 427 428 for(Iterator 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 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 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 sb = VelocityScreenUtil.getProcessedScreen("edit.vm", map); 461 462 ctx.setModuleContent(sb.toString(), getModuleDisplayName()); 464 return ctx; 465 } 466 467 public CoefficientContext rejectMembership(CoefficientContext ctx) { 468 HashMap map = new HashMap (); 469 Project project = ctx.getProject(); 470 Long memberId = null; 471 472 try { 473 memberId = new Long (ctx.getParameter("memberId")); 474 } 475 catch ( Throwable t ) { 476 System.out.println("problem with " + memberId); 477 } 478 479 for(Iterator 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 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 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 sb = VelocityScreenUtil.getProcessedScreen("edit.vm", map); 510 511 ctx.setModuleContent(sb.toString(), getModuleDisplayName()); 513 return ctx; 514 } 515 516 public String viewMembers(CoefficientContext ctx) { 517 HashMap map = new HashMap (); 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 (true)); 528 } 529 if (ctx.getCurrentUser() != null) { 530 map.put("loggedIn", new Boolean (true)); 531 } 532 StringBuffer sb = VelocityScreenUtil.getProcessedScreen("view.vm", map); 533 534 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 |