/*
* Copyright (c) JForum Team
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* 1) Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* 2) Redistributions in binary form must reproduce the
* above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or
* other materials provided with the distribution.
* 3) Neither the name of "Rafael Steil" nor
* the names of its contributors may be used to endorse
* or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
* HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
* IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*
* This file creation date: 02/04/2004 - 20:31:35
* The JForum Project
* http://www.jforum.net
*/
package net.jforum.view.forum.common;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.lang.StringUtils;
import net.jforum.JForumExecutionContext;
import net.jforum.context.RequestContext;
import net.jforum.entities.User;
import net.jforum.exceptions.ForumException;
import net.jforum.util.preferences.ConfigKeys;
import net.jforum.util.preferences.SystemGlobals;
import net.jforum.util.preferences.TemplateKeys;
import freemarker.template.SimpleHash;
/**
* @author Rafael Steil
* @version $Id: ViewCommon.java,v 1.32 2007/09/20 16:07:08 rafaelsteil Exp $
*/
public final class ViewCommon
{
/**
* Prepared the user context to use data pagination.
* The following variables are set to the context:
* <p>
* <ul>
* <li> <i>totalPages</i> - total number of pages
* <li> <i>recordsPerPage</i> - how many records will be shown on each page
* <li> <i>totalRecords</i> - number of records fount
* <li> <i>thisPage</i> - the current page being shown
* <li> <i>start</i> -
* </ul>
* </p>
* @param start int
* @param totalRecords int
* @param recordsPerPage int
*/
public static void contextToPagination(int start, int totalRecords, int recordsPerPage)
{
SimpleHash context = JForumExecutionContext.getTemplateContext();
context.put("totalPages", new Double(Math.ceil((double) totalRecords / (double) recordsPerPage)));
context.put("recordsPerPage", new Integer(recordsPerPage));
context.put("totalRecords", new Integer(totalRecords));
context.put("thisPage", new Double(Math.ceil((double) (start + 1) / (double) recordsPerPage)));
context.put("start", new Integer(start));
}
/**
* Prepares the template context to show the login page, using the current URI as return path.
* @return TemplateKeys.USER_LOGIN
*/
public static String contextToLogin()
{
RequestContext request = JForumExecutionContext.getRequest();
String uri = request.getRequestURI();
String query = request.getQueryString();
String returnPath = query == null ? uri : uri + "?" + query;
return contextToLogin(returnPath);
}
/**
* Prepares the template context to show the login page, using "returnPath" as return path
* @param returnPath the URI to use as return path
* @return TemplateKeys.USER_LOGIN
*/
public static String contextToLogin(String returnPath)
{
JForumExecutionContext.getTemplateContext().put("returnPath", returnPath);
if (ConfigKeys.TYPE_SSO.equals(SystemGlobals.getValue(ConfigKeys.AUTHENTICATION_TYPE))) {
String redirect = SystemGlobals.getValue(ConfigKeys.SSO_REDIRECT);
if (!StringUtils.isEmpty(redirect)) {
URI redirectUri = URI.create(redirect);
if (!redirectUri.isAbsolute()) {
throw new ForumException("SSO redirect URL should start with a scheme");
}
try {
returnPath = URLEncoder.encode( ViewCommon.getForumLink() + returnPath, "UTF-8");
}
catch (UnsupportedEncodingException e) {}
if (redirect.indexOf('?') == -1) {
redirect += "?";
}
else {
redirect += "&";
}
redirect += "returnUrl=" + returnPath;
JForumExecutionContext.setRedirect(redirect);
}
}
return TemplateKeys.USER_LOGIN;
}
/**
* Returns the initial page to start fetching records from.
*
* @return The initial page number
*/
public static int getStartPage()
{
String s = JForumExecutionContext.getRequest().getParameter("start");
int start;
if (StringUtils.isEmpty(s)) {
start = 0;
}
else {
start = Integer.parseInt(s);
if (start < 0) {
start = 0;
}
}
return start;
}
/**
* Gets the forum base link.
* The returned link has a trailing slash
* @return The forum link, with the trailing slash
*/
public static String getForumLink()
{
String forumLink = SystemGlobals.getValue(ConfigKeys.FORUM_LINK);
if (forumLink.charAt(forumLink.length() - 1) != '/') {
forumLink += "/";
}
return forumLink;
}
public static String toUtf8String(String s)
{
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if ((c >= 0) && (c <= 255)) {
sb.append(c);
}
else {
byte[] b;
try {
b = Character.toString(c).getBytes("utf-8");
}
catch (Exception ex) {
System.out.println(ex);
b = new byte[0];
}
for (int j = 0; j < b.length; j++) {
int k = b[j];
if (k < 0) {
k += 256;
}
sb.append('%').append(Integer.toHexString(k).toUpperCase());
}
}
}
return sb.toString();
}
/**
* Formats a date using the pattern defined in the configuration file.
* The key is the value of {@link net.jforum.util.preferences.ConfigKeys.DATE_TIME_FORMAT}
* @param date the date to format
* @return the string with the formated date
*/
public static String formatDate(Date date)
{
SimpleDateFormat df = new SimpleDateFormat(SystemGlobals.getValue(ConfigKeys.DATE_TIME_FORMAT));
return df.format(date);
}
/**
* Escapes < by < and > by >
* @param contents the string to parse
* @return the new string
*/
public static String espaceHtml(String contents)
{
StringBuffer sb = new StringBuffer(contents);
replaceAll(sb, "<", "<");
replaceAll(sb, ">", ">");
return sb.toString();
}
/**
* Replaces some string with another value
* @param sb the StrinbBuilder with the contents to work on
* @param what the string to be replaced
* @param with the new value
* @return the new string
*/
public static String replaceAll(StringBuffer sb, String what, String with)
{
int pos = sb.indexOf(what);
while (pos > -1) {
sb.replace(pos, pos + what.length(), with);
pos = sb.indexOf(what);
}
return sb.toString();
}
/**
* @see #replaceAll(StringBuffer, String, String)
* @param contents String
* @param what String
* @param with String
* @return String
*/
public static String replaceAll(String contents, String what, String with)
{
return replaceAll(new StringBuffer(contents), what, with);
}
/**
* Parse the user's signature, to make it proper to visualization
* @param u the user instance
*/
public static void prepareUserSignature(User u)
{
if (u.getSignature() != null) {
StringBuffer sb = new StringBuffer(u.getSignature());
replaceAll(sb, "\n", "<br />");
u.setSignature(sb.toString());
u.setSignature(PostCommon.prepareTextForDisplayExceptCodeTag(u.getSignature(), true, true));
}
}
}