/* * Copyright 2000-2001,2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jetspeed.modules.actions.portlets.security; // velocity import org.apache.velocity.context.Context; import org.apache.velocity.app.FieldMethodizer; // turbine util import org.apache.turbine.util.RunData; import org.apache.turbine.util.StringUtils; // jetspeed services import org.apache.jetspeed.services.JetspeedSecurity; import org.apache.jetspeed.services.logging.JetspeedLogFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogger; import org.apache.jetspeed.services.security.JetspeedSecurityException; import org.apache.jetspeed.services.resources.JetspeedResources; import org.apache.jetspeed.util.template.JetspeedLink; import org.apache.jetspeed.om.security.JetspeedUser; // jetspeed velocity import org.apache.jetspeed.modules.actions.portlets.VelocityPortletAction; import org.apache.jetspeed.portal.portlets.VelocityPortlet; import java.util.List; import java.util.Iterator; import java.util.ArrayList; // regexp stuff import org.apache.regexp.RE; import org.apache.regexp.RECompiler; /** * This action sets up the template context for browsing of users in the Turbine database. * * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a> * @version $Id: UserBrowserAction.java,v 1.14 2004/02/23 02:53:08 jford Exp $ */ public class UserBrowserAction extends VelocityPortletAction { /** name of the parameter to this portlet that tells us how many rows to show per page */ public static final String NUMBER_PER_PAGE = "number-per-page"; /** name of the parameter that holds the page number to display */ public static final String DISPLAY_PAGE = "ubpage"; /** name of the parameter that holds the filter value */ public static final String FILTER_VALUE = "filter_value"; /** name of the parameter that holds the regexp flag */ public static final String FILTER_REGEXP = "filter_regexp"; /** name of the parameter that holds the filter type */ public static final String FILTER_TYPE = "filter_type"; /** value of the filter type parameter for searching by username */ public static final String FILTER_TYPE_USERNAME = "filter_type_username"; /** value of the filter type parameter for searching by last name */ public static final String FILTER_TYPE_LASTNAME = "filter_type_lastname"; /** * Static initialization of the logger for this class */ private static final JetspeedLogger logger = JetspeedLogFactoryService.getLogger(UserBrowserAction.class.getName()); /** * Build the maximized state content for this portlet. (Same as normal state). * * @param portlet The velocity-based portlet that is being built. * @param context The velocity context for this request. * @param rundata The turbine rundata context for this request. */ protected void buildMaximizedContext( VelocityPortlet portlet, Context context, RunData rundata ) { buildNormalContext( portlet, context, rundata); } /** * Build the configure state content for this portlet. * TODO: we could configure this portlet with configurable skins, etc.. * * @param portlet The velocity-based portlet that is being built. * @param context The velocity context for this request. * @param rundata The turbine rundata context for this request. */ protected void buildConfigureContext( VelocityPortlet portlet, Context context, RunData rundata ) { buildNormalContext( portlet, context, rundata); } /** * Build the normal state content for this portlet. * * @param portlet The velocity-based portlet that is being built. * @param context The velocity context for this request. * @param rundata The turbine rundata context for this request. */ protected void buildNormalContext( VelocityPortlet portlet, Context context, RunData rundata ) { try { //hack to make the static variables visible in template context.put("s_config", new FieldMethodizer( context.get("config") ) ); // Currently, the getUsers(filter) is not implemented - need to do local filtering Iterator users = JetspeedSecurity.getUsers(); List userList = new ArrayList(); // Is filtering requested? String filterValue = rundata.getParameters().getString(FILTER_VALUE); if (filterValue != null) { String filterType = rundata.getParameters().getString(FILTER_TYPE, FILTER_TYPE_USERNAME); boolean useRE = rundata.getParameters().getBoolean(FILTER_REGEXP); RE r = null; RECompiler rc = null; if (useRE) { try { rc = new RECompiler(); r = new RE(); r.setProgram(rc.compile(filterValue)); } catch (org.apache.regexp.RESyntaxException rex) { logger.warn("UserBrowserAction: error processing regular expression [" + filterValue + "]: " + rex.toString()); } } while (users.hasNext()) { JetspeedUser user = (JetspeedUser) users.next(); String compareValue = null; if (filterType.equals(FILTER_TYPE_USERNAME)) { compareValue = user.getUserName(); } else if (filterType.equals(FILTER_TYPE_LASTNAME)) { compareValue = user.getLastName(); } if (compareValue != null) { if (useRE && r.match(compareValue)) { userList.add(user); } else if (compareValue.startsWith(filterValue)) { userList.add(user); } } } } else { while (users.hasNext()) { userList.add(users.next()); } } int currentPage = rundata.getParameters().getInt(DISPLAY_PAGE, 1); int numberPerPage; try { numberPerPage = Integer.parseInt(portlet.getPortletConfig().getInitParameter(NUMBER_PER_PAGE,"50")); } catch (NumberFormatException e) { numberPerPage = 50; } if (userList.size() > numberPerPage) { int numberOfPages = (int) ((userList.size() - 1 + numberPerPage) / numberPerPage); int from = (currentPage - 1) * numberPerPage; int to = Math.min(currentPage * numberPerPage,userList.size()); context.put(SecurityConstants.CONTEXT_USERS, userList.subList(from, to)); //now build a set of links to access each page (assumed we will show all links) StringBuffer pageLinks = new StringBuffer("page: "); for (int i = 1; i <= numberOfPages; i++) { if (i == currentPage) { pageLinks.append("( " + i + " )  "); } else { // make sure the page navigation always points to // the right pane Object jslink = context.get("jslink"); if (jslink instanceof JetspeedLink) { pageLinks.append("[ <a href=\"" + ((JetspeedLink)jslink).getPaneByName("UserBrowser").addQueryData(DISPLAY_PAGE, new Integer(i)).toString() + "\">" + i + "</a> ]  "); } else { pageLinks.append("[ <a href=\"./portal/" + DISPLAY_PAGE + "/" + i + "\">" + i + "</a> ]  "); } } } context.put("pagelinks", pageLinks); } else { context.put(SecurityConstants.CONTEXT_USERS, userList); } context.put(DISPLAY_PAGE,Integer.toString(currentPage)); } catch (JetspeedSecurityException e) { // log the error msg logger.error("Exception", e); rundata.setMessage("Error in Jetspeed User Security: " + e.toString()); rundata.setStackTrace(StringUtils.stackTrace(e), e); rundata.setScreenTemplate(JetspeedResources.getString("template.error","Error")); } } }