/*
* ConcourseConnect
* Copyright 2009 Concursive Corporation
* http://www.concursive.com
*
* This file is part of ConcourseConnect, an open source social business
* software and community platform.
*
* Concursive ConcourseConnect is free software: you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, version 3 of the License.
*
* Under the terms of the GNU Affero General Public License you must release the
* complete source code for any application that uses any part of ConcourseConnect
* (system header files and libraries used by the operating system are excluded).
* These terms must be included in any work that has ConcourseConnect components.
* If you are developing and distributing open source applications under the
* GNU Affero General Public License, then you are free to use ConcourseConnect
* under the GNU Affero General Public License.
*
* If you are deploying a web site in which users interact with any portion of
* ConcourseConnect over a network, the complete source code changes must be made
* available. For example, include a link to the source archive directly from
* your web site.
*
* For OEMs, ISVs, SIs and VARs who distribute ConcourseConnect with their
* products, and do not license and distribute their source code under the GNU
* Affero General Public License, Concursive provides a flexible commercial
* license.
*
* To anyone in doubt, we recommend the commercial license. Our commercial license
* is competitively priced and will eliminate any confusion about how
* ConcourseConnect can be used and distributed.
*
* ConcourseConnect 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 Affero General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License
* along with ConcourseConnect. If not, see <http://www.gnu.org/licenses/>.
*
* Attribution Notice: ConcourseConnect is an Original Work of software created
* by Concursive Corporation
*/
package com.concursive.connect.web.portal;
import com.concursive.commons.date.DateUtils;
import com.concursive.commons.db.DatabaseUtils;
import com.concursive.commons.objects.ObjectUtils;
import com.concursive.commons.text.StringUtils;
import com.concursive.commons.web.mvc.beans.GenericBean;
import com.concursive.commons.workflow.ObjectHookAction;
import com.concursive.commons.workflow.ObjectHookManager;
import com.concursive.connect.Constants;
import com.concursive.connect.cache.utils.CacheUtils;
import com.concursive.connect.cms.portal.dao.DashboardPage;
import com.concursive.connect.cms.portal.dao.DashboardPortlet;
import com.concursive.connect.config.ApplicationPrefs;
import com.concursive.connect.indexer.IndexEvent;
import com.concursive.connect.scheduler.ScheduledJobs;
import com.concursive.connect.web.modules.login.dao.Instance;
import com.concursive.connect.web.modules.login.dao.User;
import com.concursive.connect.web.modules.login.utils.InstanceUtils;
import com.concursive.connect.web.modules.members.dao.TeamMember;
import com.concursive.connect.web.modules.profile.dao.Project;
import com.concursive.connect.web.modules.profile.utils.ProjectUtils;
import com.concursive.connect.web.utils.ClientType;
import com.concursive.connect.web.utils.LookupList;
import com.concursive.connect.web.utils.PagedListInfo;
import freemarker.template.Configuration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Scheduler;
import javax.portlet.*;
import java.io.IOException;
import java.security.Key;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.util.*;
import java.util.regex.Pattern;
/**
* Allowed portal capabilities accessible by embedded portlets
* <p/>
* User: matt rajkowski
* Date: Jan 19, 2008
*/
public class PortalUtils {
public final static String fs = System.getProperty("file.separator");
public final static String lf = System.getProperty("line.separator");
private static Log LOG = LogFactory.getLog(PortalUtils.class);
public PortalUtils() {
}
public static Connection useConnection(PortletRequest request) {
return (Connection) request.getAttribute("connection");
}
public static DashboardPage getDashboardPage(PortletRequest request) {
return (DashboardPage) request.getAttribute("dashboardPage");
}
public static Instance getInstance(PortletRequest request) {
return InstanceUtils.getInstance(getApplicationUrl(request));
}
public static Project getProject(PortletRequest request) {
DashboardPage dashboard = getDashboardPage(request);
if (dashboard != null && dashboard.getProjectId() > -1) {
return ProjectUtils.loadProject(dashboard.getProjectId());
} else {
return null;
}
}
public static Project findProject(PortletRequest request) {
Project project = null;
// Use the specified project in preferences first
String uniqueId = request.getPreferences().getValue("project", null);
if (uniqueId != null) {
int projectId = ProjectUtils.retrieveProjectIdFromUniqueId(uniqueId);
if (projectId > -1) {
project = ProjectUtils.loadProject(projectId);
}
}
// This portlet can consume data from other portlets
if (project == null) {
for (String event : PortalUtils.getDashboardPortlet(request).getConsumeDataEvents()) {
Object object = PortalUtils.getGeneratedData(request, event);
if (object instanceof Project) {
project = (Project) PortalUtils.getGeneratedData(request, event);
}
}
}
// Object from the portal
if (project == null) {
project = PortalUtils.getProject(request);
}
request.setAttribute("project", project);
return project;
}
public static User getUser(PortletRequest request) {
return (User) request.getAttribute(Constants.REQUEST_USER);
}
public static ApplicationPrefs getApplicationPrefs(PortletRequest request) {
return (ApplicationPrefs) request.getAttribute("applicationPrefs");
}
public static DashboardPortlet getDashboardPortlet(PortletRequest request) {
return (DashboardPortlet) request.getAttribute("dashboardPortlet");
}
public static TeamMember getCurrentTeamMember(PortletRequest request) {
return (TeamMember) request.getAttribute("currentMember");
}
public static void setGeneratedData(PortletRequest request, String event, Object data) {
LOG.debug("Setting generatedData for event: " + event);
request.setAttribute("event" + event, data);
}
public static Object getGeneratedData(PortletRequest request, String event) {
if (request.getAttribute("event" + event) == null) {
LOG.warn("getGeneratedData IS NULL for " + event);
}
return request.getAttribute("event" + event);
}
public static int getUserLevel(int roleLevel) {
LookupList roleList = CacheUtils.getLookupList("lookup_project_role");
return roleList.getIdFromLevel(roleLevel);
}
public static Key getApplicationKey(PortletRequest request) {
return (Key) request.getAttribute(ApplicationPrefs.TEAM_KEY);
}
public static String getApplicationUrl(PortletRequest request) {
if (request.getAttribute("secureUrl") != null) {
return (String) request.getAttribute("secureUrl");
} else {
return (String) request.getAttribute("url");
}
}
public static String getPageAction(PortletRequest request) {
String value = (String) request.getAttribute("portletAction");
if (value == null) {
LOG.debug("Looking at just this portlet for portlet-action");
value = request.getParameter("portlet-action");
}
return value;
}
public static String getPageDomainObject(PortletRequest request) {
String value = (String) request.getAttribute("portletDomainObject");
if (value == null) {
LOG.debug("Looking at just this portlet for portlet-object");
value = request.getParameter("portlet-object");
}
return value;
}
public static String getPageView(PortletRequest request) {
String value = (String) request.getAttribute("portletView");
if (value == null) {
LOG.debug("Looking at just this portlet for portlet-value");
value = request.getParameter("portlet-value");
}
return value;
}
public static int getPageViewAsInt(PortletRequest request) {
String value = getPageView(request);
if (!StringUtils.hasText(value)) {
return -1;
}
return Integer.parseInt(value);
}
public static String getPageParameter(PortletRequest request) {
String[] params = PortalUtils.getPageParameters(request);
if (params != null && params.length > 0) {
return params[0];
}
return null;
}
public static int getPageParameterAsInt(PortletRequest request) {
String param = getPageParameter(request);
if (param != null) {
return Integer.parseInt(param);
}
return -1;
}
public static double getPageParameterAsDouble(PortletRequest request) {
String param = getPageParameter(request);
if (StringUtils.hasText(param)) {
return Double.parseDouble(param);
}
return -1.0;
}
public static String[] getPageParameters(PortletRequest request) {
String paramsString = (String) request.getAttribute("portletParams");
if (paramsString != null) {
String[] params = paramsString.trim().split(Pattern.quote("_cc_"));
if (params != null && params.length > 0) {
return params;
}
}
return null;
}
public static String getQueryParameter(PortletRequest request, String paramName) {
Map<String, String> paramMap = getQueryParameterMap(request);
if (paramMap != null) {
if (paramMap.containsKey(paramName)) {
return paramMap.get(paramName);
}
}
return null;
}
/**
* Processes the query string in the requestedURL attribute
*
* @param request
* @return
*/
public static Map<String, String> getQueryParameterMap(PortletRequest request) {
String requestedURLString = ((String) request.getAttribute("requestedURL"));
if (requestedURLString.indexOf("?") != -1) {
String queryString = requestedURLString.substring(requestedURLString.indexOf("?") + 1);
String params[] = queryString.split("&");
if (params != null && params.length > 0) {
Map<String, String> paramMap = new HashMap<String, String>();
for (String param : params) {
String[] paramParts = param.split("=");
if (paramParts != null && paramParts.length == 2) {
String paramName = paramParts[0];
// Decode the raw url value
String paramValue = StringUtils.jsUnEscape(StringUtils.replace(paramParts[1], "+", " "));
paramMap.put(paramName, paramValue);
}
}
if (paramMap.size() > 0) {
return paramMap;
}
}
}
return null;
}
public static ClientType getClientType(PortletRequest request) {
return (ClientType) request.getAttribute(Constants.REQUEST_CLIENT_TYPE);
}
public static boolean hasMatchingFormToken(PortletRequest request) {
ClientType clientType = getClientType(request);
String requestToken = request.getParameter("token");
return (clientType != null && requestToken != null && StringUtils.hasText(clientType.getToken()) && requestToken.equals(clientType.getToken()));
}
public static void processInsertHook(PortletRequest request, Object object) {
process(request, ObjectHookAction.INSERT, null, object);
}
public static void processUpdateHook(PortletRequest request, Object previousObject, Object object) {
process(request, ObjectHookAction.UPDATE, previousObject, object);
}
public static void processSelectHook(PortletRequest request, Object object) {
process(request, ObjectHookAction.SELECT, null, object);
}
public static void processDeleteHook(PortletRequest request, Object previousObject) {
process(request, ObjectHookAction.DELETE, previousObject, null);
}
private static void process(PortletRequest request, int action, Object previousObject, Object object) {
// Required objects for workflow
User user = (User) request.getAttribute(Constants.REQUEST_USER);
int userId = -1;
if (user != null) {
userId = user.getId();
}
String url = (String) request.getAttribute("url");
String secureUrl = (String) request.getAttribute("secureUrl");
// Find the ObjectHookManager instance and execute the process asynchronously
ObjectHookManager hookManager = (ObjectHookManager) request.getAttribute("objectHookManager");
hookManager.process(action, previousObject, object, userId, url, secureUrl);
}
public static Scheduler getScheduler(PortletRequest request) {
return (Scheduler) request.getAttribute("scheduler");
}
public static boolean indexAddItem(PortletRequest request, Object item) throws IOException {
if (item == null) {
return false;
}
Scheduler scheduler = getScheduler(request);
try {
IndexEvent indexEvent = new IndexEvent(item, IndexEvent.ADD);
((Vector) scheduler.getContext().get("IndexArray")).add(indexEvent);
//if (scheduler.getCurrentlyExecutingJobs().)
scheduler.triggerJob("indexer", (String) scheduler.getContext().get(ScheduledJobs.CONTEXT_SCHEDULER_GROUP));
} catch (Exception e) {
LOG.error("indexAddItem failed: " + e.getMessage());
}
return true;
}
public static boolean indexDeleteItem(PortletRequest request, Object item) throws IOException {
if (item == null) {
return false;
}
Scheduler scheduler = getScheduler(request);
try {
IndexEvent indexEvent = new IndexEvent(item, IndexEvent.DELETE);
((Vector) scheduler.getContext().get("IndexArray")).add(indexEvent);
scheduler.triggerJob("indexer", (String) scheduler.getContext().get(ScheduledJobs.CONTEXT_SCHEDULER_GROUP));
} catch (Exception e) {
LOG.error("indexDeleteItem failed: " + e.getMessage());
}
return true;
}
public static String getServerDomainNameAndPort(PortletRequest request) {
String serverName = request.getServerName();
int port = request.getServerPort();
return (serverName + (port != 80 && port != 443 ? ":" + String.valueOf(port) : ""));
}
public static void processErrors(PortletRequest request, Map errors) {
for (Object o : errors.keySet()) {
String errorKey = (String) o;
String errorMsg = (String) errors.get(errorKey);
request.setAttribute(errorKey, errorMsg);
}
request.setAttribute("errors", errors);
if (errors.size() > 0) {
if (request.getAttribute("actionError") == null) {
request.setAttribute("actionError", "Form could not be submitted, review messages below.");
}
}
}
public static void setFormBean(ActionRequest request, Object object) {
PortletSession session = request.getPortletSession();
session.setAttribute(AbstractPortletModule.FORM_BEAN, object);
}
public static Object getFormBean(RenderRequest request, String beanName, Class beanClass) {
// The RenderRequest will not auto-populate, but looks for an existing form bean from the action
Object beanRef = request.getAttribute(AbstractPortletModule.FORM_BEAN);
if (beanRef == null) {
// Construct the bean if not found
try {
beanRef = beanClass.newInstance();
} catch (InstantiationException ie) {
LOG.error("Instantiation Exception. MESSAGE = " + ie.getMessage(), ie);
} catch (IllegalAccessException iae) {
LOG.error("Illegal Access Exception. MESSAGE = " + iae.getMessage(), iae);
}
}
if (beanRef != null) {
// Add it to the request
request.setAttribute(beanName, beanRef);
}
return beanRef;
}
public static Object getFormBean(ActionRequest request, Class beanClass) {
try {
// Construct the bean
Object beanRef = beanClass.newInstance();
// The ActionRequest will auto-populate any values
populateObject(beanRef, request);
return beanRef;
} catch (InstantiationException ie) {
LOG.error("Instantiation Exception. MESSAGE = " + ie.getMessage(), ie);
} catch (IllegalAccessException iae) {
LOG.error("Illegal Access Exception. MESSAGE = " + iae.getMessage(), iae);
}
return null;
}
public static void processFormBean(RenderRequest request) {
// Retrieve a form from the portlet session, turn it into a request
// attribute and remove the session attribute
// TODO: Use a URL token for managing the specific bean instance per request
// for thread safety
PortletSession session = request.getPortletSession(false);
if (session != null) {
GenericBean formBean = (GenericBean) session.getAttribute(AbstractPortletModule.FORM_BEAN);
if (formBean != null) {
// Manage the scope
request.setAttribute(AbstractPortletModule.FORM_BEAN, formBean);
session.removeAttribute(AbstractPortletModule.FORM_BEAN);
// Populate the error properties for the view
if (formBean.hasErrors()) {
// Add errors from the bean
for (Object o : formBean.getErrors().keySet()) {
String errorKey = (String) o;
String errorMsg = (String) formBean.getErrors().get(errorKey);
request.setAttribute(errorKey, errorMsg);
}
request.setAttribute("errors", formBean.getErrors());
// Add errors from the action
String actionError = (String) formBean.getErrors().get("actionError");
if (actionError == null) {
actionError = "Form could not be submitted, review messages below.";
}
request.setAttribute("actionError", actionError);
}
}
}
}
public static void populateObject(Object bean, ActionRequest request) {
String nestedAttribute = "_";
Enumeration en = request.getParameterNames();
String paramName = null;
while (en.hasMoreElements()) {
paramName = (String) en.nextElement();
// a form has been submitted and requested to be auto-populated,
// so we do that here..going through every element and trying
// to call a setXXX() method on the bean object passed in for the value
// of the request parameter currently being checked.
String[] paramValues = request.getParameterValues(paramName);
if (paramValues.length > 1) {
ObjectUtils.setParam(bean, paramName, paramValues, nestedAttribute);
} else {
ObjectUtils.setParam(bean, paramName, paramValues[0], nestedAttribute);
}
}
// TODO: currently for ticket and ticket history
//ObjectUtils.invokeMethod(bean, "setRequestItems", new HttpRequestContext(request));
// Check for valid user
User thisUser = (User) request.getAttribute(Constants.REQUEST_USER);
if (thisUser != null) {
// Populate date/time fields using the user's timezone and locale
if (thisUser.getTimeZone() != null) {
ArrayList timeParams = (ArrayList) ObjectUtils.getObject(bean, "TimeZoneParams");
if (timeParams != null) {
Calendar cal = Calendar.getInstance();
Iterator i = timeParams.iterator();
while (i.hasNext()) {
// The property that can be set
String name = (String) i.next();
// See if it is in the request
String value = request.getParameter(name);
if (value != null) {
// See if time is in request too
String hourValue = request.getParameter(name + "Hour");
if (hourValue == null) {
// Date fields: 1-1 mapping between HTML field and Java property
ObjectUtils.setParam(bean, name, DateUtils.getUserToServerDateTimeString(TimeZone.getTimeZone(thisUser.getTimeZone()), DateFormat.SHORT, DateFormat.LONG, value, thisUser.getLocale()));
} else {
// Date & Time fields: 4-1 mapping between HTML fields and Java property
try {
Timestamp timestamp = DatabaseUtils.parseDateToTimestamp(value, thisUser.getLocale());
cal.setTimeInMillis(timestamp.getTime());
int hour = Integer.parseInt(hourValue);
int minute = Integer.parseInt(request.getParameter(name + "Minute"));
String ampmString = request.getParameter(name + "AMPM");
if (ampmString != null) {
int ampm = Integer.parseInt(ampmString);
if (ampm == Calendar.AM) {
if (hour == 12) {
hour = 0;
}
} else {
if (hour < 12) {
hour += 12;
}
}
}
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.MINUTE, minute);
cal.setTimeZone(TimeZone.getTimeZone(thisUser.getTimeZone()));
ObjectUtils.setParam(bean, name, new Timestamp(cal.getTimeInMillis()));
} catch (Exception dateE) {
}
}
}
}
}
}
// Populate number fields using the user's locale
if (thisUser.getLocale() != null) {
ArrayList numberParams = (ArrayList) ObjectUtils.getObject(bean, "NumberParams");
if (numberParams != null) {
NumberFormat nf = NumberFormat.getInstance(thisUser.getLocale());
Iterator i = numberParams.iterator();
while (i.hasNext()) {
// The property that can be set
String name = (String) i.next();
// See if it is in the request
String value = (String) request.getParameter(name);
if (value != null && !"".equals(value)) {
try {
// Parse the value
ObjectUtils.setParam(bean, name, nf.parse(value).doubleValue());
} catch (Exception e) {
//e.printStackTrace(System.out);
}
}
}
}
}
}
}
/**
* When a form is submitted with enctype="multipart/form-data", then the
* parameters and values are placed into a parts HashMap which can now
* be auto-populated
*
* @param bean
* @param parts
*/
public static void populateObject(Object bean, HashMap parts) {
if (parts != null) {
Iterator names = parts.keySet().iterator();
while (names.hasNext()) {
String paramName = (String) names.next();
Object paramValues = parts.get(paramName);
if (paramValues != null && paramValues instanceof String) {
ObjectUtils.setParam(bean, paramName, paramValues, "_");
}
}
}
}
/**
* Handles caching an instance specific paged list info
*
* @param request used for storing the pagedlist
* @param viewName the name to use for the pagedListInfo
* @return a cached or new PagedListInfo
*/
public static PagedListInfo getPagedListInfo(PortletRequest request, String viewName) {
PagedListInfo tmpInfo = new PagedListInfo();
tmpInfo.setId(viewName);
request.setAttribute(viewName, tmpInfo);
LOG.debug("View: " + PortalUtils.getPageView(request));
LOG.debug("Param: " + PortalUtils.getPageParameter(request));
// Determine the paging info
String offsetStr = request.getParameter("offset");
int offset = offsetStr == null ? 0 : Integer.parseInt(offsetStr);
tmpInfo.setCurrentOffset(offset);
//searchBeanInfo.setRenderParameters(searchBean.getParameterMap());
tmpInfo.setContextPath(request.getContextPath());
return tmpInfo;
}
// TODO: Ask why this method exists... curious about specific use for portlets
public static Project retrieveAuthorizedProject(int projectId, PortletRequest request) throws SQLException {
// Get the project from cache
Project project = ProjectUtils.loadProject(projectId);
// Check the user's permission
User thisUser = PortalUtils.getUser(request);
if (thisUser.getAccessAdmin()) {
return project;
}
// Allowed reasons to retrieve a project (permissions will be validated elsewhere)
if (project.getTeam().hasUserId(thisUser.getId()) ||
project.getFeatures().getAllowGuests() ||
(thisUser.isLoggedIn() && project.getFeatures().getAllowParticipants()) ||
project.getPortal()) {
return project;
}
project = new Project();
project.setId(projectId);
return project;
}
public static String getFileLibraryPath(PortletRequest request, String moduleFolderName) {
return (getApplicationPrefs(request).get("FILELIBRARY") +
getUser(request).getGroupId() + fs +
moduleFolderName + fs);
}
public static Configuration getFreemarkerConfiguration(PortletRequest request) {
return (Configuration) request.getAttribute("freemarkerConfiguration");
}
/**
* This call will close panels and perform redirects based on whether a popup
* is used and whether a redirectTo is specified by the calling a href
*
* @param request
* @param response
* @param defaultUrl
* @return
* @throws java.io.IOException
*/
public static GenericBean performRefresh(ActionRequest request, ActionResponse response, String defaultUrl) throws java.io.IOException {
return performRefresh(request, response, defaultUrl, null);
}
public static GenericBean performRefresh(ActionRequest request, ActionResponse response, String defaultUrl, HashMap<String, String> params) throws java.io.IOException {
String ctx = request.getContextPath();
boolean isPopup = "true".equals(request.getParameter("popup"));
if (request.getParameter("redirectTo") != null) {
// Redirect to the suggested location
LOG.debug("Sending to the specified redirectTo parameter");
response.sendRedirect(ctx + "/redirect302.jsp?redirectTo=" + request.getParameter("redirectTo") + (isPopup ? "&popup=true" : ""));
} else {
if (isPopup) {
// If the portlet is using a project, it will be in the request
Project project = (Project) request.getAttribute("project");
if (defaultUrl == null || project == null) {
// Close the panel without a redirect
LOG.debug("Closing the panel WITHOUT a redirect");
response.sendRedirect(ctx + "/projects_center_panel_refresh.jsp");
} else {
// Close the panel WITH a redirect
LOG.debug("Closing the panel WITH a redirect");
int offset = 0;
if (defaultUrl.startsWith("/")) {
offset = 1;
}
String[] url = defaultUrl.split("[/]");
StringBuffer redirectUrl = new StringBuffer();
redirectUrl.append("/");
// The action
redirectUrl.append(url[offset]).append("/");
// The listing
redirectUrl.append(project.getUniqueId());
// The module
if (url.length > 1 + offset) {
redirectUrl.append("/").append(url[1 + offset]);
}
// The object
if (url.length > 2 + offset) {
redirectUrl.append("/").append(url[2 + offset]);
}
LOG.debug("Redirect to: " + redirectUrl.toString());
response.sendRedirect(ctx + "/redirect302.jsp?popup=true&redirectTo=" + StringUtils.encodeUrl(redirectUrl.toString()));
}
} else {
// Use the default redirect
LOG.debug("Using the specified redirect");
int offset = 0;
if (defaultUrl.startsWith("/")) {
offset = 1;
}
String[] url = defaultUrl.split("[/]");
if (url.length > offset) {
response.setRenderParameter("portlet-action", url[offset]);
}
if (url.length > 1 + offset) {
response.setRenderParameter("portlet-object", url[1 + offset]);
}
if (url.length > 2 + offset) {
response.setRenderParameter("portlet-value", url[2 + offset]);
}
if (params != null && params.size() > 0) {
StringBuffer sb = new StringBuffer("?");
Iterator i = params.keySet().iterator();
while (i.hasNext()) {
String param = (String) i.next();
sb.append(param).append("=").append(params.get(param));
if (i.hasNext()) {
sb.append("&");
}
}
response.setRenderParameter("portlet-params", sb.toString());
}
}
}
return null;
}
/**
* This method will redirect the browser to another portlet viewer and will
* reconstruct the generic bean in the request after the redirect
*
* @param request
* @param response
* @param viewer
* @param genericBean
* @return
* @throws java.io.IOException
*/
public static GenericBean goToViewer(ActionRequest request, ActionResponse response, String viewer, GenericBean genericBean) throws java.io.IOException {
request.setAttribute("portlet-command", viewer);
return genericBean;
}
/**
* The portletCommand is set after the AbstractPortletModule has determined
* the view for the portlet.
*
* @param request
* @return
*/
public static String getViewer(PortletRequest request) {
String value = (String) request.getAttribute("portletCommand");
if (value == null) {
LOG.debug("Looking at just this portlet for portlet-command");
value = request.getParameter("portlet-command");
}
return value;
}
public static String getPortletUniqueKey(PortletRequest request) {
DashboardPortlet portlet = PortalUtils.getDashboardPortlet(request);
if (portlet.getPortletId() > -1) {
return String.valueOf(portlet.getPortletId());
} else {
return portlet.getPageName() + "|" + portlet.getWindowConfigId();
}
}
public static boolean isPortletInProtectedMode(PortletRequest request) {
// Use the application prefs
ApplicationPrefs prefs = PortalUtils.getApplicationPrefs(request);
return PortalUtils.getDashboardPortlet(request).isSensitive() &&
"true".equals(prefs.get(ApplicationPrefs.INFORMATION_IS_SENSITIVE));
}
/**
* Looks for portlet preferences named "labels" and adds them to the request
* as "labelMap"
*
* @param request
*/
public static void populateDisplayLabels(PortletRequest request) {
String[] displayPreferences = request.getPreferences().getValues("labels", null);
if (displayPreferences != null) {
HashMap<String, String> preferenceMap = new HashMap<String, String>();
int numberOfEntries = displayPreferences.length;
int count = 0;
while (count < numberOfEntries) {
String label = null;
String value = null;
String displayPreference = displayPreferences[count];
if (displayPreference.indexOf("=") != -1) {
label = displayPreference.split("=")[0];
value = displayPreference.split("=")[1];
} else {
label = displayPreference;
value = displayPreference;
}
preferenceMap.put(label, value);
count++;
}
request.setAttribute("labelMap", preferenceMap);
}
}
}