/**
* $URL: https://source.sakaiproject.org/svn/basiclti/trunk/portlet-util/src/java/org/sakaiproject/portlet/util/PortletHelper.java $
* $Id: PortletHelper.java 105077 2012-02-24 22:54:29Z ottenhoff@longsight.com $
*
* Copyright (c) 2005-2009 The Sakai Foundation
*
* Licensed under the Educational Community 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.opensource.org/licenses/ECL-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.sakaiproject.portlet.util;
import java.io.PrintStream;
import java.io.OutputStream;
import java.io.ByteArrayOutputStream;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.portlet.PortletRequest;
import javax.portlet.PortletPreferences;
import javax.portlet.PortletSession;
import org.sakaiproject.util.FormattedText;
/**
* Some Utility Functions
*/
public class PortletHelper {
public static String snoopPortlet(PortletRequest request)
{
String retval = "==== Portlet Request Snoop:\n";
String remoteUser = request.getRemoteUser();
retval += "getRemoteUser()="+remoteUser+"\n";
Map userInfo = (Map) request.getAttribute(PortletRequest.USER_INFO);
retval += "UserInfo (needs Pluto 1.1.1 or later)\n"+userInfo+"\n";
retval += "isUserInRole(admin)="+request.isUserInRole("admin")+"\n";
retval += "isUserInRole(access)="+request.isUserInRole("access")+"\n";
retval += "isUserInRole(maintain)="+request.isUserInRole("maintain")+"\n";
retval += "isUserInRole(student)="+request.isUserInRole("student")+"\n";
retval += "isUserInRole(instructor)="+request.isUserInRole("instructor")+"\n";
retval += "isUserInRole(site.upd)="+request.isUserInRole("site.upd")+"\n";
retval += "isUserInRole(content.read)="+request.isUserInRole("content.read")+"\n";
return retval;
}
// Error Message
public static void clearErrorMessage(PortletRequest request)
{
PortletSession pSession = request.getPortletSession(true);
pSession.removeAttribute("error.message");
pSession.removeAttribute("error.output");
pSession.removeAttribute("error.map");
}
public static String getErrorMessage(PortletRequest request)
{
PortletSession pSession = request.getPortletSession(true);
try {
return (String) pSession.getAttribute("error.message");
} catch (Throwable t) {
return null;
}
}
public static String getErrorOutput(PortletRequest request)
{
PortletSession pSession = request.getPortletSession(true);
try {
return (String) pSession.getAttribute("error.output");
} catch (Throwable t) {
return null;
}
}
public static Map getErrorMap(PortletRequest request)
{
PortletSession pSession = request.getPortletSession(true);
try {
return (Map) pSession.getAttribute("error.map");
} catch (Throwable t) {
return null;
}
}
public static void setErrorMessage(PortletRequest request, String errorMsg)
{
Throwable t = new Throwable("Just to generate a traceback");
setErrorMessage(request, errorMsg, t);
}
public static void setErrorMessage(PortletRequest request, String errorMsg, Throwable t)
{
if ( errorMsg == null ) errorMsg = "null";
PortletSession pSession = request.getPortletSession(true);
pSession.setAttribute("error.message",errorMsg);
OutputStream oStream = new ByteArrayOutputStream();
PrintStream pStream = new PrintStream(oStream);
t.printStackTrace(pStream);
// System.out.println("+++++++++++++++++++++++++");
// System.out.println(oStream.toString());
// System.out.println("+++++++++++++++++++++++++");
// errorMsg = errorMsg .replaceAll("<","<").replaceAll(">",">");
StringBuffer errorOut = new StringBuffer();
errorOut.append("<p class=\"portlet-msg-error\">\n");
errorOut.append(FormattedText.escapeHtmlFormattedText(errorMsg));
errorOut.append("\n</p>\n<!-- Traceback for this error\n");
errorOut.append(oStream.toString());
errorOut.append("\n-->\n");
pSession.setAttribute("error.output",errorOut.toString());
Map map = request.getParameterMap();
pSession.setAttribute("error.map",map);
}
public static void clearDebugOutput(PortletRequest request)
{
PortletSession pSession = request.getPortletSession(true);
pSession.removeAttribute("debug.print");
}
public static String getDebugOutput(PortletRequest request)
{
PortletSession pSession = request.getPortletSession(true);
try {
return (String) pSession.getAttribute("debug.print");
} catch (Throwable t) {
return null;
}
}
public static void debugPrint(PortletRequest request, String line)
{
if ( line == null ) return;
line = line.replaceAll("<","<").replaceAll(">",">");
PortletSession pSession = request.getPortletSession(true);
String debugOut = null;
try {
debugOut = (String) pSession.getAttribute("debug.print");
} catch (Throwable t) {
debugOut = null;
}
if ( debugOut == null ) {
debugOut = line;
} else {
debugOut = debugOut + "\n" + line;
}
pSession.setAttribute("debug.print",debugOut);
}
/**
* The gridsphere attribute information is available from the following:
* http://www.gridsphere.org/gridsphere/docs/FAQ/FAQ.html question #5
*
* The uPortal attribute information is available from
* http://www.uportal.org/implementors/portlets/workingWithPortlets.html#User_Information
* Note that with uPortal you need to configure it to export user information to
* portlets, so the user attribute names used is somewhat arbitrary but here I
* am trying to stick to the suggestions in the JSR 168 Portlet Standard (PLT.D).
*/
public static final int UNKNOWN = 0;
public static final int PLUTO = 0;
public static final int SAKAI = 0;
public static final int GRIDSPHERE = 1;
public static final int UPORTAL = 2;
public static final int ORACLEPORTAL = 3;
// TODO: Need to grok Oracle Portal and GridSphere
public static int lookupPortalType(PortletRequest request)
{
String portalInfo = request.getPortalContext().getPortalInfo();
if ( portalInfo.toLowerCase().startsWith("sakai-charon") ) {
return SAKAI;
} else {
return PLUTO; // Assume a Pluto-based portal
}
}
public static String getUsername(PortletRequest request) {
String username = null;
Map userInfo = (Map) request.getAttribute(PortletRequest.USER_INFO);
switch (lookupPortalType(request)) {
case GRIDSPHERE:
if (userInfo != null) {
username = (String) userInfo.get("user.name");
}
break;
case ORACLEPORTAL:
//System.out.println("userInfo" + userInfo); // Changes by Venkatesh for Oracle Portal
//System.out.println("Remote User=" + username); // Oracle portal is populating user name with [1] at the end
// the following code will get rid of the unnecessary characters
username = request.getRemoteUser();
if(username != null && username.indexOf("[") != -1)
{
debugPrint(request,"Modifying user name for Oracle Portal=" + username);
int corruptIndex = username.indexOf('[');
username = username.substring(0,corruptIndex);
}
break;
case PLUTO:
case UPORTAL:
username = request.getRemoteUser();
break;
}
debugPrint(request,"Remote User=" + username);
return username;
}
public static String getFirstName(PortletRequest request) {
String firstName = null;
Map userInfo = (Map) request.getAttribute(PortletRequest.USER_INFO);
switch (lookupPortalType(request)) {
case GRIDSPHERE:
String fullName = getGridsphereFullName(request);
firstName = fullName.trim().substring(0, fullName.indexOf(" "));
break;
case PLUTO:
case UPORTAL:
if (userInfo != null) {
firstName = (String) userInfo.get("user.name.given");
}
break;
}
debugPrint(request,"First Name="+firstName);
return firstName;
}
public static String getLastName(PortletRequest request) {
String lastName = null;
Map userInfo = (Map) request.getAttribute(PortletRequest.USER_INFO);
switch (lookupPortalType(request)) {
case GRIDSPHERE:
String fullName = getGridsphereFullName(request);
lastName = fullName.substring(fullName.trim().lastIndexOf(" ") + 1);
break;
case PLUTO:
case UPORTAL:
if (userInfo != null) {
lastName = (String) userInfo.get("user.name.family");
}
break;
}
debugPrint(request,"Last Name="+lastName);
return lastName;
}
@SuppressWarnings("unchecked")
public static String getEmail(PortletRequest request) {
String email = null;
Map<String,String> userInfo = (Map<String,String>) request.getAttribute(PortletRequest.USER_INFO);
switch (lookupPortalType(request)) {
case GRIDSPHERE:
if (userInfo != null) {
email = userInfo.get("user.email");
}
break;
case PLUTO:
case UPORTAL:
if (userInfo != null) {
email = userInfo.get("user.home-info.online.email");
}
}
debugPrint(request,"EMail="+email);
return email;
}
@SuppressWarnings("unchecked")
private static String getGridsphereFullName(PortletRequest request) {
String fullName = null;
Map<String,String> userInfo = (Map<String,String>) request.getAttribute(PortletRequest.USER_INFO);
if (userInfo != null) {
fullName = userInfo.get("user.name.full");
}
return fullName;
}
}