/**
SpagoBI - The Business Intelligence Free Platform
Copyright (C) 2005-2008 Engineering Ingegneria Informatica S.p.A.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
**/
/*
* Created on 24-mar-2005
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package it.eng.spagobi.commons.utilities;
import it.eng.spago.base.PortletAccess;
import it.eng.spago.base.SourceBean;
import it.eng.spagobi.commons.SingletonConfig;
import it.eng.spagobi.commons.constants.SpagoBIConstants;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.StringTokenizer;
import javax.portlet.ActionRequest;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;
import javax.portlet.PortletURL;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.portlet.PortletFileUpload;
import org.apache.log4j.Logger;
/**
* Contains some SpagoBI's portlet utilities.
*
* @author Zoppello
*/
public class PortletUtilities {
static private Logger logger = Logger.getLogger(PortletUtilities.class);
/**
* Starting from the original URL and the request, creates a string representing the
* Portlet URL.
*
* @param aHttpServletRequest The request object at input
* @param originalURL The starting original URL
*
* @return A String representing the Portlet URL
*/
public static String createPortletURL(HttpServletRequest aHttpServletRequest, String originalURL){
RenderResponse renderResponse =(RenderResponse)aHttpServletRequest.getAttribute("javax.portlet.response");
PortletURL aPortletURL = renderResponse.createActionURL();
logger.debug("Original URL.... " + originalURL + "indexOf ? is " + originalURL.indexOf("?"));
String parameters = originalURL.substring(originalURL.indexOf("?")+1);
StringTokenizer st = new StringTokenizer(parameters, "&", false);
String parameterToken = null;
String parameterName = null;
String parameterValue = null;
while (st.hasMoreTokens()){
parameterToken = st.nextToken();
logger.debug("Parameter Token [" + parameterToken +"]");
parameterName = parameterToken.substring(0, parameterToken.indexOf("="));
parameterValue = parameterToken.substring(parameterToken.indexOf("=") + 1);
logger.debug("Parameter Name [" + parameterName +"]");
logger.debug("Parameter Value [" + parameterValue +"]");
aPortletURL.setParameter(parameterName, parameterValue);
}
return aPortletURL.toString();
}
/**
* Creates the particular portlet URL for a resource, given its path.
*
* @param aHttpServletRequest The request object at input
* @param resourceAbsolutePath The resource Absolute path
*
* @return The resource Portlet URL String
*/
public static String createPortletURLForResource(HttpServletRequest aHttpServletRequest, String resourceAbsolutePath){
RenderResponse renderResponse =(RenderResponse)aHttpServletRequest.getAttribute("javax.portlet.response");
RenderRequest renderRequest =(RenderRequest)aHttpServletRequest.getAttribute("javax.portlet.request");
return renderResponse.encodeURL(renderRequest.getContextPath() + resourceAbsolutePath).toString();
}
/**
* Gets the <code>PortletRequest</code> object.
*
* @return The portlet request object
*/
public static PortletRequest getPortletRequest(){
return PortletAccess.getPortletRequest();
}
/**
* Gets the <code>PortletResponse</code> object.
*
* @return The portlet response object
*/
public static PortletResponse getPortletResponse(){
return PortletAccess.getPortletResponse();
}
/**
* Gets the first uploaded file from a portlet request. This method creates a new file upload handler,
* parses the request, processes the uploaded items and then returns the first file as an
* <code>UploadedFile</code> object.
* @param portletRequest The input portlet request
* @return The first uploaded file object.
*/
public static UploadedFile getFirstUploadedFile(PortletRequest portletRequest){
UploadedFile uploadedFile = null;
try{
DiskFileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
PortletFileUpload upload = new PortletFileUpload(factory);
// Parse the request
List /* FileItem */ items = upload.parseRequest((ActionRequest)portletRequest);
// Process the uploaded items
Iterator iter = items.iterator();
boolean endLoop = false;
while (iter.hasNext() && !endLoop) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
//serviceRequest.setAttribute(item.getFieldName(), item.getString());
} else {
uploadedFile = new UploadedFile();
uploadedFile.setFileContent(item.get());
uploadedFile.setFieldNameInForm(item.getFieldName());
uploadedFile.setSizeInBytes(item.getSize());
uploadedFile.setFileName(item.getName());
endLoop = true;
}
}
}catch(Exception e){
logger.error("Cannot parse multipart request", e);
}
return uploadedFile;
}
/**
* Gets the portal locale.
*
* @return the portal locale
*/
public static Locale getPortalLocale() {
return PortletAccess.getPortalLocale();
}
/**
* Gets a localized message given its code and bundle
* information. If there isn't any message matching to these infromation, a
* warning is traced.
*
* @param code The message's code string
* @param bundle The message's bundel string
*
* @return A string containing the message
*/
public static String getMessage(String code, String bundle) {
Locale locale = getLocaleForMessage();
ResourceBundle messages = ResourceBundle.getBundle(bundle, locale);
if (messages == null) {
return null;
}
String message = code;
try {
message = messages.getString(code);
}
catch (Exception ex) {
logger.warn("code [" + code + "] not found ", ex);
}
return message;
} // public String getMessage(String code)
/**
* Get the locale of the portal or the one setted into the configuration files
* @return locale for message resolution
*/
public static Locale getLocaleForMessage() {
logger.info("IN");
Locale locale = null;
Locale portalLocale;
try {
portalLocale = PortletAccess.getPortalLocale();
if (portalLocale == null) {
logger.error("Portal locale not found by PortletAccess.getPortalLocale() method");
} else {
logger.debug("Portal locale read succesfully: [" + portalLocale.getLanguage() + "," + portalLocale.getCountry() + "]");
}
if( isLocaleSupported(portalLocale) ) {
logger.debug("Portal locale [" + portalLocale.getLanguage() + "," + portalLocale.getCountry() + "] is supported by SpagoBI");
locale = portalLocale;
} else {
logger.warn("Portal locale [" + portalLocale.getLanguage() + "," + portalLocale.getCountry() + "] is not supported by SpagoBI");
locale = GeneralUtilities.getDefaultLocale();
logger.debug("Default locale [" + locale.getLanguage() + "," + locale.getCountry() + "] will be used");
}
} catch (Exception e) {
logger.error("Error while getting portal locale", e);
}
logger.info("OUT");
return locale;
}
private static boolean isLocaleSupported(Locale locale) {
String defaultLocal=SingletonConfig.getInstance().getConfigValue("SPAGOBI.LANGUAGE_SUPPORTED.LANGUAGES");
String tmp="["+locale.getLanguage()+","+locale.getCountry()+"]";
logger.debug("Check if "+tmp+" is supported");
return defaultLocal.contains(tmp);
}
/**
* Gets the language code of the user portal language. If it's not possible to gather
* the locale of the portal it returns the default language code
*
* @return A string containing the language code
*/
public static String getPortalLanguageCode() {
try {
Locale portalLocale = PortletAccess.getPortalLocale();
if(portalLocale == null) {
logger.error( "Portal locale not found by PortletAccess.getPortalLocale() method!! " +
"May be there is not a portlet request");
} else {
String portalLang = portalLocale.getLanguage();
return portalLang;
}
} catch (Exception e) {
logger.error( "Error while getting portal locale", e);
}
// get the configuration sourceBean/language code/country code of the default language
String languageConfig = SingletonConfig.getInstance().getConfigValue("SPAGOBI.LANGUAGE_SUPPORTED.LANGUAGE.default");
return languageConfig.substring(0, 2);
}
}