package com.javaeye.lonlysky.lforum.service;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Property;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springside.modules.orm.hibernate.SimpleHibernateTemplate;
import com.javaeye.lonlysky.lforum.cache.LForumCache;
import com.javaeye.lonlysky.lforum.comm.utils.Utils;
import com.javaeye.lonlysky.lforum.config.impl.ConfigLoader;
import com.javaeye.lonlysky.lforum.entity.forum.Bbcodes;
import com.javaeye.lonlysky.lforum.entity.forum.Forumlinks;
import com.javaeye.lonlysky.lforum.entity.forum.Forums;
import com.javaeye.lonlysky.lforum.entity.forum.Medals;
import com.javaeye.lonlysky.lforum.entity.forum.Onlinelist;
import com.javaeye.lonlysky.lforum.entity.forum.Smilies;
import com.javaeye.lonlysky.lforum.entity.forum.Templates;
import com.javaeye.lonlysky.lforum.entity.forum.Topicidentify;
/**
* 缓存论坛HTML数据
*
* @author 黄磊
*
*/
@Service
public class CachesManager {
private static final Object synObject = new Object();
private SimpleHibernateTemplate<Forumlinks, Integer> forumlinkDAO;
private SimpleHibernateTemplate<Topicidentify, Integer> topicidentifyDAO;
private SimpleHibernateTemplate<Medals, Integer> medalDAO;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
forumlinkDAO = new SimpleHibernateTemplate<Forumlinks, Integer>(sessionFactory, Forumlinks.class);
topicidentifyDAO = new SimpleHibernateTemplate<Topicidentify, Integer>(sessionFactory, Topicidentify.class);
medalDAO = new SimpleHibernateTemplate<Medals, Integer>(sessionFactory, Medals.class);
}
@Autowired
private TemplateManager templateManager;
@Autowired
private OnlineUserManager onlineUserManager;
@Autowired
private ForumManager forumManager;
@Autowired
private SmilieManager smilieManager;
@Autowired
private EditorManager editorManager;
/**
* 获得表情符的json数据
*
* @return 表情符的json数据
*/
public String getSmiliesCache() {
String smilesString = LForumCache.getInstance().getCache("SmiliesList", String.class);
if (smilesString == null) {
StringBuilder builder = new StringBuilder();
List<Smilies> smileList = smilieManager.getSmiliesList();
for (Smilies smilies : smileList) {
// 如果是表情分类
if (smilies.getType() == 0) {
builder.append("'" + smilies.getCode().trim().replace("'", "\\'") + "': [\r\n");
boolean flag = false;
for (Smilies smilies2 : smileList) {
// 如果属于以上表情分类
if (smilies2.getType().equals(smilies.getId())) {
builder.append("{'code' : '");
builder.append(smilies2.getCode().trim().replace("'", "\\'"));
builder.append("', 'url' : '");
builder.append(smilies2.getUrl().trim().replace("'", "\\'"));
builder.append("'},\r\n");
flag = true;
}
}//end for
if (builder.length() > 0 && flag) {
builder = builder.delete(builder.length() - 3, builder.length());
//builder = builder.deleteCharAt(builder.length() - 3);
}
builder.append("\r\n],\r\n");
}//end if
}//end for
builder = builder.delete(builder.length() - 3, builder.length());
smilesString = builder.toString();
LForumCache.getInstance().addCache("SmiliesList", smilesString);
}
return smilesString;
}
/**
* 获得表情分类列表
*
* @return 表情分类列表
*/
public List<Smilies> getSmilieTypesCache() {
List<Smilies> smilesList = LForumCache.getInstance().getListCache("SmilieTypes", Smilies.class);
if (smilesList == null) {
smilesList = smilieManager.getSmilieTypes();
LForumCache.getInstance().addCache("SmilieTypes", smilesList);
}
return smilesList;
}
/**
* 获取第一页的表情
*
* @return 获取第一页的表情
*/
public String getSmiliesFirstPageCache() {
String smiliesFirstPage = LForumCache.getInstance().getCache("SmiliesFirstPage", String.class);
if (smiliesFirstPage == null) {
StringBuilder builder = new StringBuilder();
List<Smilies> smileList = smilieManager.getSmiliesList();
for (int i = 0; i < smileList.size(); i++) {
// 如果是表情分类
if (smileList.get(i).getType() == 0) {
builder.append("'" + smileList.get(i).getCode().trim().replace("'", "\\'") + "': [\r\n");
boolean flag = false;
int smiliescount = 0;
for (int j = 0; j < smileList.size(); j++) {
// 如果属于以上表情分类
if (smileList.get(j).getType().equals(smileList.get(i).getId()) && smiliescount < 16) {
builder.append("{'code' : '");
builder.append(smileList.get(j).getCode().trim().replace("'", "\\'"));
builder.append("', 'url' : '");
builder.append(smileList.get(j).getUrl().trim().replace("'", "\\'"));
builder.append("'},\r\n");
flag = true;
smiliescount++;
}
}//end for
if (builder.length() > 0 && flag) {
builder = builder.delete(builder.length() - 3, builder.length());
}
builder.append("\r\n],\r\n");
}//end if
}//end for
builder = builder.delete(builder.length() - 3, builder.length());
smiliesFirstPage = builder.toString();
LForumCache.getInstance().addCache("SmiliesFirstPage", smiliesFirstPage);
}
return smiliesFirstPage;
}
/**
* 返回模板列表的下拉框html
*
* @return 下拉框html
*/
public String getTemplateListBoxOptionsCache() {
String templateListBoxOptions = LForumCache.getInstance().getCache("TemplateListBoxOptions", String.class);
if (templateListBoxOptions == null) {
synchronized (synObject) {
StringBuilder sb = new StringBuilder();
List<Templates> templateList = templateManager.getValidTemplateList();
for (Templates templates : templateList) {
sb.append("<li class=\"current\">");
sb.append("<a href=\"#\" onclick=\"window.location.href='showtemplate.action?templateid="
+ templates.getTemplateid() + "'\">");
sb.append(templates.getName().trim());
sb.append("</a>");
sb.append("</li>");
}
templateListBoxOptions = sb.toString();
LForumCache.getInstance().addCache("TemplateListBoxOptions", templateListBoxOptions);
}
}
return templateListBoxOptions;
}
/**
* 获得在线用户列表图例
* @return 在线用户列表图例
*/
public String getOnlineGroupIconList() {
String onlineGroupIconList = LForumCache.getInstance().getCache("OnlineGroupIconList", String.class);
if (onlineGroupIconList == null) {
List<Onlinelist> iconList = onlineUserManager.getOnlineGroupIconList();
StringBuilder sb = new StringBuilder();
for (Onlinelist onlinelist : iconList) {
sb.append("<img src=\"images/groupicons/");
sb.append(onlinelist.getImg());
sb.append("\" /> ");
sb.append(onlinelist.getTitle());
sb.append(" ");
}
onlineGroupIconList = sb.toString();
LForumCache.getInstance().addCache("OnlineGroupIconList", onlineGroupIconList);
}
return onlineGroupIconList;
}
/**
* 获得友情链接列表
* @return 友情链接列表
*/
@SuppressWarnings("unchecked")
public List<Forumlinks> getForumLinkList() {
List<Forumlinks> forumlinkList = LForumCache.getInstance().getListCache("ForumLinkList", Forumlinks.class);
if (forumlinkList == null) {
forumlinkList = forumlinkDAO.createCriteria(Property.forName("displayorder").gt(0)).add(
Property.forName("logo").ne("")).addOrder(Order.asc("displayorder")).list();
LForumCache.getInstance().addCache("ForumLinkList", forumlinkList);
}
return forumlinkList;
}
/**
* 前台版块列表弹出菜单
* @param usergroupid 用户组id
* @param userid 当前用户id
* @param extname 扩展名称
* @return 版块列表弹出菜单
*/
public String getForumListMenuDiv(int usergroupid, int userid, String extname) {
String forumListMenuDiv = LForumCache.getInstance().getCache("ForumListMenuDiv", String.class);
if (forumListMenuDiv == null) {
StringBuilder sb = new StringBuilder();
List<Forums> forumList = forumManager.getForumList();
if (forumList.size() > 0) {
sb
.append("<div class=\"popupmenu_popup\" id=\"forumlist_menu\" style=\"overflow-y: auto; display:none\">");
for (Forums forums : forumList) {
if (forums.getLayer() >= 0 && forums.getLayer() <= 1 && forums.getStatus() == 1) {
// 判断是否为私有论坛
if (!forums.getForumfields().getViewperm().trim().equals("")
&& !Utils.inArray(usergroupid + "", forums.getForumfields().getViewperm())) {
// 暂无处理
} else {
if (forums.getLayer() == 0) { // 如果是论坛分类
sb.append("<dl>");
sb.append("<dt>");
sb.append("<a href=\"showforum.action?forumid=");
sb.append(forums.getFid());
sb.append("\">");
sb.append(forums.getName());
sb.append("</a></dt>");
sb.append("<dd><ul>");
for (Forums forum : forumList) {
if (Utils.null2Int(forum.getParentidlist().split(",")[0].trim()) == forums.getFid()
&& forum.getLayer() == 1) {
// 判断是否为第一级板块
sb.append("<li><a href=\"showforum.action?forumid=");
sb.append(forum.getFid());
sb.append("\">");
sb.append(forum.getName());
sb.append("</a></li>");
}
}//end for
sb.append("</ul></dd>");
sb.append("</dl>");
}//end if
}//end if
}
}//end for
}
sb.append("</div>");
forumListMenuDiv = sb.toString().replace("<dd><ul></ul></dd>", "");
LForumCache.getInstance().addCache("ForumListMenuDiv", forumListMenuDiv);
}
return forumListMenuDiv;
}
/**
* 获得主题类型数组
*
* @return 主题类型数组
*/
@SuppressWarnings("unchecked")
public Map<Integer, Object> getTopicTypeArray() {
Map<Integer, Object> topicTypeArray = (Map<Integer, Object>) LForumCache.getInstance().getCache(
"TopicTypeArray");
if (topicTypeArray == null) {
topicTypeArray = new HashMap<Integer, Object>();
List<Object[]> objList = forumlinkDAO.find("select typeid,name from Topictypes order by displayorder");
if (objList.size() > 0) {
for (Object[] objects : objList) {
if (Utils.null2String(objects[0]) != "" && Utils.null2String(objects[1]) != "") {
topicTypeArray.put(Utils.null2Int(objects[0]), objects[1]);
}
}
}
LForumCache.getInstance().addCache("TopicTypeArray", topicTypeArray);
}
return topicTypeArray;
}
/**
* 获得版块下拉列表
* @return 列表内容的html
*/
@SuppressWarnings("unchecked")
public String getForumListBoxOptionsCache() {
String forumListBoxOptions = LForumCache.getInstance().getCache("ForumListBoxOptions", String.class);
if (forumListBoxOptions == null) {
StringBuilder sb = new StringBuilder();
List<Object[]> objList = forumlinkDAO
.find("select name,fid,layer from Forums where forums.fid not in (select fid from Forums where status<1 and layer=0) and status>0 and displayorder>=0 order by displayorder");
for (Object[] objects : objList) {
sb.append("<option value=\"");
sb.append(objects[1]);
sb.append("\">");
sb.append(Utils.getSpacesString(Utils.null2Int(objects[2], 0)));
sb.append(objects[0].toString().trim());
sb.append("</option>");
}
forumListBoxOptions = sb.toString();
LForumCache.getInstance().addCache("ForumListBoxOptions", forumListBoxOptions);
}
return forumListBoxOptions;
}
/**
* 获得编辑器自定义按钮信息的javascript数组
* @return 表情符的javascript数组
*/
public String getCustomEditButtonList() {
String str = LForumCache.getInstance().getCache("CustomEditButtonList", String.class);
if (str != null) {
return str;
}
StringBuilder sb = new StringBuilder();
List<Bbcodes> bbcodeList = editorManager.getCustomEditButtonList();
for (Bbcodes bbcodes : bbcodeList) {
//说明:[标签名,对应图标文件名,[参数1描述,参数2描述,...],[参数1默认值,参数2默认值,...]]
//实例["fly","swf.gif",["请输入flash网址","请输入flash宽度","请输入flash高度"],["http://","200","200"],3]
sb.append(",'" + Utils.replaceStrToScript(bbcodes.getTag()) + "':['");
sb.append(Utils.replaceStrToScript(bbcodes.getTag()));
sb.append("','");
sb.append(Utils.replaceStrToScript(bbcodes.getIcon()));
sb.append("','");
sb.append(Utils.replaceStrToScript(bbcodes.getExplanation()));
sb.append("',['");
sb.append(Utils.replaceStrToScript(bbcodes.getParamsdescript()).replace(",", "','"));
sb.append("'],['");
sb.append(Utils.replaceStrToScript(bbcodes.getParamsdefvalue()).replace(",", "','"));
sb.append("'],");
sb.append(Utils.replaceStrToScript(bbcodes.getParams().toString()));
sb.append("]");
}
if (sb.length() > 0) {
sb = sb.delete(0, 1);
}
str = sb.toString().replace("\r\n", "");
LForumCache.getInstance().addCache("CustomEditButtonList", str);
return str;
}
/**
* 返回脏字过滤列表
* @return 返回脏字过滤列表数组
*/
@SuppressWarnings("unchecked")
public String[][] getBanWordList() {
String[][] str = (String[][]) LForumCache.getInstance().getCache("BanWordList");
if (str != null) {
return str;
}
List list = forumlinkDAO.find("select find,replacement from Words");
if (list == null) {
return str;
}
List<Object[]> words = list;
str = new String[words.size()][2];
String temp = "";
Pattern pattern = Pattern.compile("\\{(\\d+)\\}");
for (int i = 0; i < words.size(); i++) {
temp = Utils.null2String(words.get(i)[0]);
Matcher matcher = pattern.matcher(temp);
for (int j = 0; j < matcher.groupCount(); j++) {
temp = temp.replace(matcher.group(j), matcher.group(j).replace("{", ".{0,"));
}
str[i][0] = temp.replace("\\", "\\\\").replace("\"", "\\\"").replace("'", "\'").replace("[", "\\[")
.replace("]", "\\]");
str[i][1] = Utils.null2String(words.get(i)[1]);
}
LForumCache.getInstance().addCache("BanWordList", str);
return str;
}
/**
* 替换原始字符串中的脏字词语
* @param text 原始字符串
* @return 替换后的结果
*/
public String banWordFilter(String text) {
StringBuilder sb = new StringBuilder(text);
String[][] str = getBanWordList();
int count = str.length / 2;
for (int i = 0; i < count; i++) {
if (!str[i][1].equals("{BANNED}") && !str[i][1].equals("{MOD}")) {
sb = new StringBuilder().append(sb.toString().replace(str[i][0], str[i][1]));
}
}
return sb.toString();
}
/**
* 判断字符串是否包含脏字词语
* @param text 原始字符串
* @return 如果包含则返回true, 否则返回false
*/
public boolean hasBannedWord(String text) {
String[][] str = getBanWordList();
int count = str.length / 2;
Pattern r_word = null;
for (int i = 0; i < count; i++) {
if (str[i][1].equals("{BANNED}")) {
r_word = Pattern.compile(str[i][0]);
Matcher matcher = r_word.matcher(text);
while (matcher.find()) {
return true;
}
}
}
return false;
}
/**
* 指定的字符串中是否含有需要审核词汇
*/
public boolean hasAuditWord(String text) {
String[][] str = getBanWordList();
int count = str.length / 2;
Pattern r_word = null;
for (int i = 0; i < count; i++) {
if (str[i][1].equals("{MOD}")) {
r_word = Pattern.compile(str[i][0]);
Matcher matcher = r_word.matcher(text);
while (matcher.find()) {
return true;
}
}
}
return false;
}
/**
* 获取主题鉴定项
* @param identifyid 主题签定id
* @return 主题鉴定信息
*/
public Topicidentify getTopicIdentify(int identifyid) {
for (Topicidentify ti : getTopicIdentifyList()) {
if (ti.getIdentifyid() == identifyid) {
return ti;
}
}
return new Topicidentify();
}
/**
* 获取主题签定集合项
* @return 主题签定集合项
*/
public List<Topicidentify> getTopicIdentifyList() {
List<Topicidentify> topicidentifyList = LForumCache.getInstance().getListCache("TopicIdentifyList",
Topicidentify.class);
if (topicidentifyList != null) {
return topicidentifyList;
}
topicidentifyList = new ArrayList<Topicidentify>();
topicidentifyList = topicidentifyDAO.findAll();
StringBuilder jsArray = new StringBuilder("<script type='text/javascript'>var topicidentify = { ");
for (Topicidentify topicidentify : topicidentifyList) {
jsArray.append("'" + topicidentify.getIdentifyid() + "':'" + topicidentify.getFilename() + "',");
}
jsArray.deleteCharAt(jsArray.length() - 1);
jsArray.append("};</script>");
LForumCache.getInstance().addCache("TopicIdentifyList", topicidentifyList);
LForumCache.getInstance().addCache("TopicIndentifysJsArray", jsArray.toString());
return topicidentifyList;
}
/**
* 获得勋章列表
* @return 勋章列表
*/
@SuppressWarnings("unchecked")
public Map<String, String> getMedalsList() {
Map<String, String> medalsMap = (Map<String, String>) LForumCache.getInstance().getCache("MedalsList");
if (medalsMap == null) {
medalsMap = new HashMap<String, String>();
List<Medals> medalList = medalDAO.findAll();
for (Medals medals : medalList) {
if (medals.getAvailable() == 1) {
if (!medals.getImage().trim().equals("")) {
medals.setImage("<img border=\"0\" src=\"images/medals/" + medals.getImage() + "\" alt=\""
+ medals.getName() + "\" title=\"" + medals.getName() + "\" class=\"medals\" />");
} else {
medals.setImage("");
}
} else {
medals.setImage("");
}
medalsMap.put(medals.getName(), medals.getImage());
}
LForumCache.getInstance().addCache("MedalsList", medalsMap);
}
return medalsMap;
}
/**
* 获取指定id的勋章列表html
* @param mdealList 勋章id
* @return 勋章列表html
*/
public String getMedalsList(String mdealList) {
Map<String, String> medalsMap = getMedalsList();
String[] list = mdealList.split(",");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < list.length; i++) {
sb.append(medalsMap.get(list[i]));
}
return sb.toString();
}
/**
* 获取自带头像列表
* @return 获取自带头像列表
*/
public List<String> getAvatarList() {
List<String> avatarList = LForumCache.getInstance().getListCache("CommonAvatarList", String.class);
if (avatarList == null) {
avatarList = new ArrayList<String>();
File dirinfo = new File(ConfigLoader.getConfig().getWebpath() + "avatars/common/");
String extname = "";
for (File file : dirinfo.listFiles()) {
if (file != null) {
extname = file.getName().substring(file.getName().lastIndexOf(".")).toLowerCase();
if (extname.equals(".jpg") || extname.equals(".gif") || extname.equals(".png")) {
avatarList.add("avatars/common/" + file.getName());
}
}
}
LForumCache.getInstance().addCache("CommonAvatarList", avatarList);
}
return avatarList;
}
/**
* 获取主题鉴定图片地址缓存数组
* @return 主题鉴定图片地址缓存数组
*/
public String getTopicIdentifyFileNameJsArray() {
String jsArray = LForumCache.getInstance().getCache("TopicIndentifysJsArray", String.class);
if (jsArray == null) {
getTopicIdentifyList();
jsArray = LForumCache.getInstance().getCache("TopicIndentifysJsArray", String.class);
}
return jsArray;
}
}