package cn.newgxu.bbs.common.util;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.context.WebApplicationContext;
import cn.newgxu.bbs.common.Constants;
import cn.newgxu.bbs.common.MessageList;
import cn.newgxu.bbs.common.filter.FilterUtil;
import com.opensymphony.util.TextUtils;
/**
*
* @author polly
* @since 4.0.0
* @version $Revision 1.1$
*/
public class Util {
private static final Log log = LogFactory.getLog(Util.class);
private final static int ENCODE_XORMASK = 820103;
private final static char ENCODE_DELIMETER = '\002';
private final static char ENCODE_CHAR_OFFSET1 = 'X';
private final static char ENCODE_CHAR_OFFSET2 = 'y';
public static final long ONE_SECOND = 1000L;
public static final long ONE_MINUTE = 60 * ONE_SECOND;
public static final long ONE_HOUR = 60 * ONE_MINUTE;
public static final long ONE_DAY = 24 * ONE_HOUR;
public static final long ONE_WEEK = 7 * ONE_DAY;
public static final long ONE_MONTH = 30 * ONE_DAY;
public static final String DEFAULT_DATE_TIME = "yyyy-MM-dd HH:mm:ss";
public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
public static final String DATE_FORMAT = "yyyy-MM-dd";
public static final String[] allowedExt = new String[] { "jpg", "gif",
"png" };
private static int UPLOAD_FILE_TOKEN = 0;
private static WebApplicationContext wac;
private static final char[] RANDOM_CHARS = { '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'm', 'p',
'r', 't', 'w' };/*
* , 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J',
* 'K', 'M', 'P', 'R', 'T', 'W' };
*/
// private static final String STATIC_DOMAIN = Constants.SCREEN_CONTENT
// .startsWith("http://") ? Constants.SCREEN_CONTENT : "http://"
// + Constants.STATIC_DOMAIN;
/**
* hash 方法使用。
*/
private static MessageDigest digest = null;
/**
* 将输入字符串按MD5运算法则转换成 hash 字符串,返回的结果是16进制的数字。 这个方法是一个同步的方法,以防止过多的
* MessageDigest 对象产生。 如果使用这个方法成为了系统的瓶颈,那么可以考虑使用 MessageDigest 对象池 来消除瓶颈。
* <p>
* 这个hash()方法是一个单向的加密方法。加密字符串不能还原。
* <p>
* 在论坛中,每次用户登录的时候,都将用户输入的纯文本密码字符串用这个方法
* 加密成hash字符串。即使黑客得到了加密以后储存的用户密码字符串,也很难破解。
* <p>
* 加密过后的字符串长度为32位。
*
* @param data
* 要加密的字符串。
* @return 一个hash字符串。
*/
public synchronized static String hash(String data) {
if (data == null) {
return null;
}
if (digest == null) {
try {
digest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
log.error(e);
throw new RuntimeException(e);
}
}
// 转换成 hash 字符串。
digest.update(data.getBytes());
return encodeHex(digest.digest());
}
/**
* Method by Santeri Paavolainen, Helsinki Finland 1996<br>
* (c) Santeri Paavolainen, Helsinki Finland 1996<br>
* Distributed under LGPL.
*
* @param bytes
* 要转换的字节数组。
* @return 转换后的十六进制字符串。
*/
public static final String encodeHex(byte[] bytes) {
StringBuffer buf = new StringBuffer(bytes.length * 2);
int i;
for (i = 0; i < bytes.length; i++) {
if (((int) bytes[i] & 0xff) < 0x10) {
buf.append("0");
}
buf.append(Long.toString((int) bytes[i] & 0xff, 16));
}
return buf.toString();
}
public static final byte[] decodeHex(String hex) {
char[] chars = hex.toCharArray();
byte[] bytes = new byte[chars.length / 2];
int byteCount = 0;
for (int i = 0; i < chars.length; i += 2) {
byte newByte = 0x00;
newByte |= hexCharToByte(chars[i]);
newByte <<= 4;
newByte |= hexCharToByte(chars[i + 1]);
bytes[byteCount] = newByte;
byteCount++;
}
return bytes;
}
private static final byte hexCharToByte(char ch) {
switch (ch) {
case '0':
return 0x00;
case '1':
return 0x01;
case '2':
return 0x02;
case '3':
return 0x03;
case '4':
return 0x04;
case '5':
return 0x05;
case '6':
return 0x06;
case '7':
return 0x07;
case '8':
return 0x08;
case '9':
return 0x09;
case 'a':
return 0x0A;
case 'b':
return 0x0B;
case 'c':
return 0x0C;
case 'd':
return 0x0D;
case 'e':
return 0x0E;
case 'f':
return 0x0F;
}
return 0x00;
}
public static String encodePasswordCookie(String username, String password) {
StringBuffer buf = new StringBuffer();
if (username != null && password != null) {
byte[] bytes = (username + ENCODE_DELIMETER + password).getBytes();
int b;
for (int n = 0; n < bytes.length; n++) {
b = bytes[n] ^ (ENCODE_XORMASK + n);
buf.append((char) (ENCODE_CHAR_OFFSET1 + (b & 0x0F)));
buf.append((char) (ENCODE_CHAR_OFFSET2 + ((b >> 4) & 0x0F)));
}
}
return buf.toString();
}
public static String[] decodePasswordCookie(String cookieVal) {
if (cookieVal == null || cookieVal.length() <= 0) {
return null;
}
// 解析COOKIE的值
char[] chars = cookieVal.toCharArray();
byte[] bytes = new byte[chars.length / 2];
int b;
for (int n = 0, m = 0; n < bytes.length; n++) {
b = chars[m++] - ENCODE_CHAR_OFFSET1;
b |= (chars[m++] - ENCODE_CHAR_OFFSET2) << 4;
bytes[n] = (byte) (b ^ (ENCODE_XORMASK + n));
}
cookieVal = new String(bytes);
int pos = cookieVal.indexOf(ENCODE_DELIMETER);
String username = (pos < 0) ? "" : cookieVal.substring(0, pos);
String password = (pos < 0) ? "" : cookieVal.substring(pos + 1);
return new String[] { username, password };
}
public static final String formatSellTime(Date overdueTime) {
long distance = overdueTime.getTime() - new Date().getTime();
if (distance <= ONE_HOUR) {
return "<1小时";
} else if (distance >= Constants.FREE_MARKET_SELL_DAY * ONE_DAY) {
return ">" + Constants.FREE_MARKET_SELL_DAY + "天";
} else if (distance >= ONE_DAY) {
return "<" + (distance / ONE_DAY) + "天";
} else {
return "<" + (distance / ONE_HOUR) + "小时";
}
}
public static final String formatTime(Date currentTime, Date lastTime) {
if (!isSameYear(currentTime, lastTime)) {
return formatTime(DATE_TIME_FORMAT, lastTime);
}
long distance = currentTime.getTime() - lastTime.getTime();
if (distance >= ONE_MONTH) {
return distance / ONE_MONTH + "个月前";
} else if (distance < ONE_MONTH && distance >= ONE_WEEK) {
return distance / ONE_WEEK + "星期前";
} else if (distance < ONE_WEEK && distance >= ONE_DAY) {
return distance / ONE_DAY + "天前";
} else if (distance < ONE_DAY && distance >= ONE_HOUR) {
return distance / ONE_HOUR + "小时前";
} else if (distance < ONE_HOUR && distance >= ONE_MINUTE) {
return distance / ONE_MINUTE + "分钟前";
} else {
return "1分钟内";
}
}
public static final String formatDateTime(Date dt) {
return formatTime(DEFAULT_DATE_TIME, dt);
}
public static final String formatTime(Date lastTime) {
return formatTime(new Date(), lastTime);
}
public static String formatTime(String source, Date date) {
SimpleDateFormat formatter = new SimpleDateFormat(source);
return formatter.format(date);
}
public static boolean isSameYear(Date currentTime, Date lastTime) {
Calendar currentCalendar = Calendar.getInstance();
currentCalendar.setTime(currentTime);
Calendar lastCalendar = Calendar.getInstance();
lastCalendar.setTime(lastTime);
return currentCalendar.get(Calendar.YEAR)
- lastCalendar.get(Calendar.YEAR) <= 0;
}
public static final int days(Date beginTime, Date endTime) {
return (int) ((endTime.getTime() - beginTime.getTime()) / ONE_DAY);
}
public static void setWebApplicationContext(WebApplicationContext context) {
wac = context;
}
public static WebApplicationContext getWebApplicationContext() {
return wac;
}
public static Object getBean(String name) {
return wac.getBean(name);
}
public static String getFilenameExtension(String filename) {
File file = new File(filename.toLowerCase());
if (log.isDebugEnabled()) {
log.debug("filename:" + filename + ", ext:"
+ StringUtils.substringAfterLast(file.getName(), "."));
}
return StringUtils.substringAfterLast(file.getName(), ".");
}
private static String makeDirs(String ext) {
StringBuffer sb = new StringBuffer();
Calendar c = Calendar.getInstance();
sb.append(Constants.FILE_ROOT).append("/upload/").append(ext).append(
"/").append(c.get(Calendar.YEAR)).append("/").append(
c.get(Calendar.MONTH) + 1).append("/").append(
c.get(Calendar.DAY_OF_MONTH)).append("/").append(
c.get(Calendar.HOUR_OF_DAY));
String path = sb.toString();
File file = new File(path);
file.mkdirs();
return file.toString();
}
private static int getFileIndex() {
return UPLOAD_FILE_TOKEN++;
}
/**
* 修改记录:
* 之前是在文件名前加一个 $
* 可以这个 $ 在编辑器中会使用 img 标签的 src 属性不正常,现在去掉
*
* 2011.10.11 集成显卡
*
* @param ext
* @return
*/
public static String getUploadFilePath(String ext) {
String path = makeDirs(ext);
StringBuffer sb = new StringBuffer(path.length() + 20);
sb.append(path).append("/@").append(System.currentTimeMillis()).append(
"_").append(getFileIndex()).append(".").append(ext);
return sb.toString();
}
public static String getUploadFacePath(String ext) {
StringBuffer sb = new StringBuffer(
Constants.FILE_FACE_ROOT.length() + 20);
sb.append(Constants.FILE_FACE_ROOT).append("/images/user_face/")
.append(System.currentTimeMillis()).append("_").append(
getFileIndex()).append(".").append(ext);
return sb.toString();
}
public static String getSafeFilename(String filename) {
int safeLength = 254;
if (filename.length() > safeLength) {
return StringUtils.right(filename, safeLength);
} else {
return filename;
}
}
public static String getUriFromStoragePath(String storagePath) {
// if (log.isDebugEnabled()) {
// log.debug("storagePath=" + storagePath);
// log.debug("result="
// + STATIC_DOMAIN
// + StringUtils.remove(storagePath.replaceAll("\\\\", "/"),
// Constants.FILE_ROOT));
// }
System.out.println("-------->"+storagePath.startsWith(Constants.FILE_ROOT.replaceAll("/","\\\\")));
return storagePath.startsWith(Constants.FILE_ROOT.replaceAll("/",
"\\\\")) ?
// STATIC_DOMAIN+
StringUtils.remove(storagePath.replaceAll("\\\\", "/"),
Constants.FILE_ROOT)
: StringUtils.remove(storagePath.replaceAll("\\\\", "/"),
Constants.FILE_ROOT);
}
public static String getFaceUriFromStoragePath(String storagePath) {
if (log.isDebugEnabled()) {
log.debug("storagePath=" + storagePath);
log.debug("result="
// + STATIC_DOMAIN
+ StringUtils.remove(storagePath.replaceAll("\\\\", "/"),
Constants.FILE_FACE_ROOT));
}
return StringUtils.remove(storagePath.replaceAll("\\\\", "/"),
Constants.FILE_FACE_ROOT);
}
public static void saveCookie(HttpServletResponse response,
String username, String password, boolean isAutoLogin) {
if (password == null) {
password = "";
}
Cookie cookie = null;
try {
cookie = new Cookie(Constants.AUTH_USER_COOKIE, URLEncoder.encode(
encodePasswordCookie(username, password), "utf8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Cookie autoLogin = new Cookie(Constants.AUTOLOGIN_COOKIE, String
.valueOf(isAutoLogin));
if (isAutoLogin) {
cookie.setMaxAge(Integer.MAX_VALUE);
autoLogin.setMaxAge(Integer.MAX_VALUE);
}
cookie.setPath("/");
autoLogin.setPath("/");
response.addCookie(cookie);
response.addCookie(autoLogin);
}
public static Cookie getCookie(HttpServletRequest request, String name) {
Cookie cookies[] = request.getCookies();
if (cookies == null || name == null || name.length() == 0) {
return null;
}
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals(name)) {
return cookies[i];
}
}
return null;
}
public static Date getCurrentTime() {
Calendar c = Calendar.getInstance();
return c.getTime();
}
public static void putMessageList(MessageList messageList,
HttpSession session) {
if (log.isDebugEnabled()) {
log.debug("set session attribute:" + messageList);
log.debug(session);
}
SessionUtil.setAttribute(session, Constants.MESSAGE_SESSION,
messageList);
}
public static MessageList getMessageList(HttpSession session) {
MessageList messageList = (MessageList) SessionUtil.getAttribute(
session, Constants.MESSAGE_SESSION, MessageList
.getSessionIsInvalidateMessageList());
if (messageList == null) {
messageList = MessageList.getSayHelloMessageList();
}
return messageList;
}
public static Date getDateAfterDay(Date date, int day) {
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DAY_OF_MONTH, day);
return c.getTime();
}
public static Date getDateAfterDay(int day) {
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, day);
return c.getTime();
}
public static Date getDateAfterHour(int hour) {
Calendar c = Calendar.getInstance();
c.add(Calendar.HOUR_OF_DAY, hour);
return c.getTime();
}
public static Date getDateAfterMinute(int minute) {
Calendar c = Calendar.getInstance();
c.add(Calendar.MINUTE, minute);
return c.getTime();
}
public static int getHour(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
return c.get(Calendar.HOUR_OF_DAY);
}
public static int getDay(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
return c.get(Calendar.DATE);
}
public static int getMonth(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
return c.get(Calendar.MONTH);
}
public static int getYear(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
return c.get(Calendar.YEAR);
}
public static Date getDate(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
c.clear();
c.set(year, month, day);
return c.getTime();
}
// 增加此方法用于注册时间段的搜索 2010-04-07 23:50
public static String getDisignDate(String start, int day) {
Calendar ca = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = sdf.parse(start);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
ca.set(Calendar.YEAR, calendar.get(Calendar.YEAR));
ca.set(Calendar.MONTH, calendar.get(Calendar.MONTH));
ca.set(Calendar.DAY_OF_MONTH, Calendar.DAY_OF_MONTH + day);
date = ca.getTime();
} catch (ParseException e) {
e.printStackTrace();
}
return sdf.format(date);
}
private static double getAgio(int agio) {
return (double) agio / 100;
}
public static int reckonTax(int money, int taxRate) {
return (int) ((double) money * ((double) taxRate / 100));
}
public static int reckonTax(int money, int taxRate, int agio) {
return (int) (getAgio(agio) * reckonTax(money, taxRate));
}
public static int reckonAfterTax(int money, int taxRate) {
return money - reckonTax(money, taxRate);
}
public static int reckonAfterTax(int money, int taxRate, int agio) {
return money - reckonTax(money, taxRate, agio);
}
public static int reckonCost(int money, int agio) {
return (int) (getAgio(agio) * money);
}
public static String getRandomString() {
StringBuffer sb = new StringBuffer(Constants.RANDOM_STRING_LENGTH);
for (int i = 0; i < Constants.RANDOM_STRING_LENGTH; i++) {
Random r = new Random();
sb.append(RANDOM_CHARS[r.nextInt(RANDOM_CHARS.length)]);
}
return sb.toString();
}
public static void saveValidCode(HttpSession session, String code) {
SessionUtil.setAttribute(session, Constants.VALID_CODE_SESSION, code);
}
public static String getValidCode(HttpSession session) {
return (String) SessionUtil.getAttribute(session,
Constants.VALID_CODE_SESSION);
}
public static boolean equalsValidCode(String input, String code) {
if (StringUtils.isEmpty(input)) {
return false;
}
return input.equalsIgnoreCase(code);
}
public static boolean equalsIDCard(String IDCard1, String IDCard2) {
IDCard1 = StringUtils.replace(IDCard1, "x", "X");
IDCard2 = StringUtils.replace(IDCard2, "x", "X");
return IDCard2.equalsIgnoreCase(IDCard1);
}
public static List<String> splitOptions(String str) {
str = FilterUtil.optionString(str);
str = StringUtils.replace(str, "|", "|");
str = StringUtils.replaceChars(str, "\r\n", "\r");
str = StringUtils.replaceChars(str, "\n", "\r");
String[] options = str.split("\r");
List<String> result = new LinkedList<String>();
int i = 0;
for (String option : options) {
if (!StringUtils.isWhitespace(option)
&& i < Constants.VOTE_OPTION_SIZE) {
result.add(StringUtils.left(TextUtils.innerTrim(option).trim(),
Constants.VOTE_OPTION_LENGTH));
i++;
}
}
return result;
}
public static List<String> splitNicks(String str) {
str = StringUtils.replaceChars(str, "\r\n", ",");
str = StringUtils.replaceChars(str, "\n", ",");
String[] nicks = str.split(",");
List<String> result = new LinkedList<String>();
for (String nick : nicks) {
if (!StringUtils.isWhitespace(nick)
&& !result.contains(TextUtils.innerTrim(nick).trim())) {
result.add(TextUtils.innerTrim(nick).trim());
}
}
return result;
}
public static int[] splitIds(String str) {
str = StringUtils.replace(str, "|", ",");
str = StringUtils.replace(str, "&", ",");
String[] options = str.split(",");
int result[] = new int[options.length];
int i = 0;
for (String option : options) {
result[i] = Integer.parseInt(option);
i++;
}
return result;
}
public static String intsToString(int[] ints) {
if (ints == null || ints.length == 0) {
return "";
}
StringBuffer sb = new StringBuffer();
for (int i : ints) {
sb.append("," + i);
}
if (sb != null) {
sb.replace(0, 1, "");
}
return sb.toString();
}
public static void main(String[] args) throws Exception {
String s = "1234567我";
System.out.println(s.getBytes().length);
}
public static String getDayOfWeek(String theDate) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = dateFormat.parse(theDate);
} catch (ParseException e) {
}
Calendar cd = Calendar.getInstance();
cd.setTime(date);
int mydate = cd.get(Calendar.DAY_OF_WEEK);
String showDate = "";
switch (mydate) {
case 1:
showDate = "星期日";
break;
case 2:
showDate = "星期一";
break;
case 3:
showDate = "星期二";
break;
case 4:
showDate = "星期三";
break;
case 5:
showDate = "星期四";
break;
case 6:
showDate = "星期五";
break;
default:
showDate = "星期六";
break;
}
return showDate;
}
@SuppressWarnings("deprecation")
public static Date getUitDate() {
Date date = new Date();
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
return date;
}
public static String toGB(String toGB) {
if (toGB == null) {
return null;
} else {
try {
toGB = new String(toGB.getBytes("UTF-8"), "gbk");
} catch (Exception exception) {
}
}
return toGB;
}
public static boolean checkFileExt(String ext) {
int allowFlag = 0;
int allowedExtCount = allowedExt.length;
for (; allowFlag < allowedExtCount; allowFlag++) {
if (allowedExt[allowFlag].equals(ext))
return true;
}
return false;
}
}