/* * UserView.java * * This work is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation; either version 2 of the License, * or (at your option) any later version. * * This work is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * * Copyright (c) 2004-2005 Per Cederberg. All rights reserved. */ package org.liquidsite.app.admin.view; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import org.liquidsite.app.admin.AdminUtils; import org.liquidsite.core.content.ContentException; import org.liquidsite.core.content.ContentManager; import org.liquidsite.core.content.ContentSecurityException; import org.liquidsite.core.content.Domain; import org.liquidsite.core.content.Group; import org.liquidsite.core.content.User; import org.liquidsite.core.web.Request; import org.liquidsite.core.web.RequestSession; /** * A helper class for the user view. This class contains methods * for creating the HTML responses to the pages in the user view. * * @author Per Cederberg, <per at percederberg dot net> * @version 1.0 */ public class UserView extends AdminView { /** * The maximum number of users or groups on a page. */ private static final int PAGE_SIZE = 25; /** * Creates a new user view helper. */ UserView() { // Nothing to initialize } /** * Shows the users page. * * @param request the request object * * @throws ContentException if the database couldn't be accessed * properly * @throws ContentSecurityException if the user didn't have the * required permissions */ public void viewUsers(Request request) throws ContentException, ContentSecurityException { ContentManager manager = AdminUtils.getContentManager(); RequestSession session = request.getSession(); User user = request.getUser(); Domain domain = null; String filter; ArrayList users = null; ArrayList groups = null; int page; int count; String str; // Find users or groups str = (String) session.getAttribute("users.list.domain", user.getDomainName()); str = request.getParameter("domain", str); session.setAttribute("users.list.domain", str); if (!str.equals("")) { domain = manager.getDomain(user, str); } str = (String) session.getAttribute("users.list.filter", ""); filter = request.getParameter("filter", str); session.setAttribute("users.list.filter", filter); str = request.getParameter("page", "1"); try { page = Integer.parseInt(str); } catch (NumberFormatException e) { page = 1; } str = (String) session.getAttribute("users.list.type", "user"); str = request.getParameter("type", str); if (!str.equals("group")) { session.setAttribute("users.list.type", "user"); users = findUsers(domain, filter, page); count = manager.getUserCount(domain, filter); } else { session.setAttribute("users.list.type", "group"); groups = findGroups(domain, filter); count = manager.getUserCount(domain, ""); } // Set request parameters if (domain == null) { request.setAttribute("domain", ""); } else { request.setAttribute("domain", domain.getName()); } request.setAttribute("domains", findDomains(user)); request.setAttribute("filter", filter); request.setAttribute("users", users); request.setAttribute("groups", groups); request.setAttribute("page", page); if (count == 0 || groups != null) { request.setAttribute("pages", 1); } else if (count % PAGE_SIZE == 0) { request.setAttribute("pages", count / PAGE_SIZE); } else { request.setAttribute("pages", count / PAGE_SIZE + 1); } request.setAttribute("userCount", count); AdminUtils.sendTemplate(request, "admin/users.ftl"); } /** * Shows the view group detail page. * * @param request the request object * * @throws ContentException if the database couldn't be accessed * properly * @throws ContentSecurityException if the user didn't have the * required permissions */ public void viewGroup(Request request) throws ContentException, ContentSecurityException { ContentManager manager = AdminUtils.getContentManager(); Domain domain = null; Group group; ArrayList users = null; int page; int count; String str; // Find users or groups str = request.getParameter("domain", ""); if (!str.equals("")) { domain = manager.getDomain(request.getUser(), str); } str = request.getParameter("page", "1"); try { page = Integer.parseInt(str); } catch (NumberFormatException e) { page = 1; } group = manager.getGroup(domain, request.getParameter("name")); users = findUsers(group, page); count = group.getUserCount(); // Set request parameters request.setAttribute("domain", group.getDomainName()); request.setAttribute("name", group.getName()); request.setAttribute("users", users); request.setAttribute("page", page); if (count == 0) { request.setAttribute("pages", 1); } else if (count % PAGE_SIZE == 0) { request.setAttribute("pages", count / PAGE_SIZE); } else { request.setAttribute("pages", count / PAGE_SIZE + 1); } request.setAttribute("userCount", count); AdminUtils.sendTemplate(request, "admin/view-group.ftl"); } /** * Shows the add or edit user page. * * @param request the request object * @param domain the user domain * @param user the user to edit, or null to add new * * @throws ContentException if the database couldn't be accessed * properly */ public void viewEditUser(Request request, Domain domain, User user) throws ContentException { String defaultName; boolean defaultEnabled; String defaultRealName; String defaultEmail; String defaultComment; Group[] groups; HashMap memberships = new HashMap(); ArrayList list; Iterator iter; String str; // Find default values if (user != null) { defaultName = user.getName(); defaultEnabled = user.getEnabled(); defaultRealName = user.getRealName(); defaultEmail = user.getEmail(); defaultComment = user.getComment(); } else { defaultName = ""; defaultEnabled = true; defaultRealName = ""; defaultEmail = ""; defaultComment = ""; } // Set request parameters if (domain == null) { request.setAttribute("domain", ""); } else { request.setAttribute("domain", domain.getName()); } str = request.getParameter("name", defaultName); request.setAttribute("name", str); str = request.getParameter("password", ""); request.setAttribute("password", str); request.setAttribute("passwordSuggestion", User.generatePassword()); str = request.getParameter("realname", defaultRealName); request.setAttribute("realname", str); str = request.getParameter("email", defaultEmail); request.setAttribute("email", str); str = request.getParameter("comment", defaultComment); request.setAttribute("comment", str); list = findGroups(domain, ""); request.setAttribute("groups", list); if (request.getParameter("comment") == null) { request.setAttribute("enabled", String.valueOf(defaultEnabled)); if (user != null) { groups = user.getGroups(); for (int i = 0; i < groups.length; i++) { memberships.put(groups[i].getName(), "true"); } } } else { if (request.getParameter("enabled") != null) { request.setAttribute("enabled", "true"); } else { request.setAttribute("enabled", "false"); } iter = request.getAllParameters().keySet().iterator(); while (iter.hasNext()) { str = iter.next().toString(); if (str.startsWith("member")) { memberships.put(request.getParameter(str), "true"); } } } request.setAttribute("memberships", memberships); AdminUtils.sendTemplate(request, "admin/edit-user.ftl"); } /** * Shows the add or edit group page. * * @param request the request object * @param group the group to edit, or null to add new */ public void viewEditGroup(Request request, Group group) { String defaultName; String defaultDescription; String defaultPublic; String defaultComment; String str; // Find default values if (group != null) { defaultName = group.getName(); defaultDescription = group.getDescription(); defaultPublic = String.valueOf(group.isPublic()); defaultComment = group.getComment(); } else { defaultName = ""; defaultDescription = ""; defaultPublic = "false"; defaultComment = ""; } // Set request parameters str = request.getParameter("domain", ""); request.setAttribute("domain", str); str = request.getParameter("name", defaultName); request.setAttribute("name", str); str = request.getParameter("description", defaultDescription); request.setAttribute("description", str); if (request.getParameter("comment") == null) { request.setAttribute("public", defaultPublic); } else { if (request.getParameter("public") != null) { request.setAttribute("public", "true"); } else { request.setAttribute("public", "false"); } } str = request.getParameter("comment", defaultComment); request.setAttribute("comment", str); AdminUtils.sendTemplate(request, "admin/edit-group.ftl"); } /** * Finds the matching users in a domain. The users will not be * added directly to the result list, but rather a simplified * hash map containing only certain properties will be added. * * @param domain the domain * @param filter the search filter (empty for all) * @param page the page to return (>= 1) * * @return the list of users found (in maps) * * @throws ContentException if the database couldn't be accessed * properly */ private ArrayList findUsers(Domain domain, String filter, int page) throws ContentException { ContentManager manager = AdminUtils.getContentManager(); ArrayList result = new ArrayList(); User[] users; HashMap map; int start = (page - 1) * PAGE_SIZE; users = manager.getUsers(domain, filter, start, PAGE_SIZE); for (int i = 0; i < users.length; i++) { map = new HashMap(5); map.put("name", users[i].getName()); map.put("realName", users[i].getRealName()); map.put("email", users[i].getEmail()); map.put("comment", users[i].getComment()); result.add(map); } return result; } /** * Finds the users in a group. The users will not be added * directly to the result list, but rather a simplified hash map * containing only certain properties will be added. * * @param group the group * @param page the page to return (>= 1) * * @return the list of users found (in maps) * * @throws ContentException if the database couldn't be accessed * properly */ private ArrayList findUsers(Group group, int page) throws ContentException { ArrayList result = new ArrayList(); User[] users; HashMap map; int start = (page - 1) * PAGE_SIZE; users = group.getUsers(start, PAGE_SIZE); for (int i = 0; i < users.length; i++) { map = new HashMap(5); map.put("name", users[i].getName()); map.put("realName", users[i].getRealName()); map.put("email", users[i].getEmail()); map.put("comment", users[i].getComment()); result.add(map); } return result; } }