package cn.jcenterhome.service;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.regex.Pattern;
import cn.jcenterhome.dao.DataBaseDao;
import cn.jcenterhome.util.BeanFactory;
import cn.jcenterhome.util.Common;
import cn.jcenterhome.util.FileHelper;
import cn.jcenterhome.util.JavaCenterHome;
import cn.jcenterhome.util.Serializer;
public class CacheService {
private DataBaseDao dataBaseDao = (DataBaseDao) BeanFactory.getBean("dataBaseDao");
private String[] cacheNames = {"config", "network", "usergroup", "profilefield", "profield", "censor",
"creditrule", "ad", "task", "click", "block", "userapp", "app", "eventclass", "magic"};
public void updateCache() throws Exception {
try {
for (String cacheName : cacheNames) {
Method method = this.getClass().getMethod(cacheName + "_cache");
method.invoke(this);
}
} catch (Exception e) {
String message = e.getMessage();
if (message == null) {
message = e.getCause().getMessage();
}
throw new Exception("All the cache update fails��<br>" + message);
}
}
public void config_cache() throws IOException {
config_cache(true);
}
public void config_cache(boolean updateData) throws IOException {
Map<String, Object> sConfig = new HashMap<String, Object>();
List<Map<String, Object>> configs = dataBaseDao.executeQuery("SELECT * FROM "
+ JavaCenterHome.getTableName("config"));
for (Map<String, Object> value : configs) {
String var = (String) value.get("var");
Object val = value.get("datavalue");
if ("privacy".equals(var)) {
val = Common.empty(val) ? val : Serializer.unserialize((String) val, false);
}
sConfig.put(var, val);
}
cache_write("cache_config", "sConfig", sConfig);
if (updateData) {
String setting = Common.getData("setting");
cache_write("cache_setting", "globalSetting", Serializer.unserialize(setting, false));
String mail = Common.getData("mail");
cache_write("cache_mail", "globalMail", Serializer.unserialize(mail, false));
String spam = Common.getData("spam");
cache_write("cache_spam", "globalSpam", Serializer.unserialize(spam, false));
}
}
public void network_cache() throws IOException {
String network = Common.getData("network");
cache_write("cache_network", "globalNetWork", Serializer.unserialize(network, false));
}
public void usergroup_cache() throws IOException {
Map<Integer, Map<String, String>> groupTitles = new LinkedHashMap<Integer, Map<String, String>>();
boolean highest = true;
int lower = 999999999;
List<Map<String, Object>> usergroups = dataBaseDao.executeQuery("SELECT * FROM "
+ JavaCenterHome.getTableName("usergroup") + " ORDER BY explower DESC");
for (Map<String, Object> usergroup : usergroups) {
Integer gid = (Integer) usergroup.get("gid");
usergroup.put("maxattachsize", ((Integer) usergroup.get("maxattachsize")) * 1024 * 1024);
if ((Integer) usergroup.get("system") == 0) {
if (highest) {
usergroup.put("exphigher", lower);
highest = false;
} else {
usergroup.put("exphigher", lower - 1);
}
lower = (Integer) usergroup.get("explower");
}
String magicaward = (String) usergroup.get("magicaward");
if (magicaward.length() > 0) {
usergroup.put("magicaward", Serializer.unserialize((String) usergroup.get("magicaward"),
false));
}
Map<String, String> groupTitle = new LinkedHashMap<String, String>();
groupTitle.put("grouptitle", (String) usergroup.get("grouptitle"));
groupTitle.put("color", (String) usergroup.get("color"));
groupTitle.put("icon", (String) usergroup.get("icon"));
groupTitles.put(gid, groupTitle);
cache_write("usergroup_" + gid, "usergroup" + gid, usergroup);
}
cache_write("usergroup", "globalGroupTitle", groupTitles);
}
public void profilefield_cache() throws IOException {
Map<Integer, Map<String, Object>> datas = new LinkedHashMap<Integer, Map<String, Object>>();
List<Map<String, Object>> profilefields = dataBaseDao
.executeQuery("SELECT fieldid, title, formtype, maxsize, required, invisible, allowsearch, choice FROM "
+ JavaCenterHome.getTableName("profilefield") + " ORDER BY displayorder");
for (Map<String, Object> value : profilefields) {
datas.put((Integer) value.get("fieldid"), value);
}
cache_write("cache_profilefield", "globalProfilefield", datas);
}
public void profield_cache() throws IOException {
Map<Integer, Map<String, Object>> datas = new LinkedHashMap<Integer, Map<String, Object>>();
List<Map<String, Object>> profields = dataBaseDao
.executeQuery("SELECT fieldid, title, formtype, inputnum, mtagminnum, manualmoderator, manualmember FROM "
+ JavaCenterHome.getTableName("profield") + " ORDER BY displayorder");
for (Map<String, Object> value : profields) {
datas.put((Integer) value.get("fieldid"), value);
}
cache_write("cache_profield", "globalProfield", datas);
}
public void censor_cache() throws IOException {
List<String> banned = new ArrayList<String>();
List<String> banwords = new ArrayList<String>();
Map<String, Object> globalCensor = new HashMap<String, Object>();
String censorDatavalue = (String) Common.getData("censor");
if (censorDatavalue != null) {
String[] censorarr = censorDatavalue.split("\n");
String[] tempArray;
String find = null;
String replace = null;
String findword;
Pattern pattern = Pattern.compile("\\\\\\{(\\d+)\\\\\\}");
if (censorarr != null) {
StringBuilder builder = new StringBuilder("(?i)");
int builderPrimalLen = builder.length();
for (String censor : censorarr) {
censor = censor.trim();
if (Common.empty(censor)) {
continue;
}
tempArray = censor.split("=");
if (tempArray.length > 1) {
find = tempArray[0];
replace = tempArray[1];
} else {
continue;
}
if (find.equals("")) {
continue;
}
findword = find;
find = pattern.matcher(Common.pregQuote(find, '/')).replaceAll(".{0,\\\\1}");
if ("{BANNED}".equals(replace)) {
banwords.add(pattern.matcher(Common.pregQuote(findword, '/')).replaceAll("*"));
banned.add(find);
} else {
Map<String, LinkedHashMap<Integer, String>> filterValue = (Map<String, LinkedHashMap<Integer, String>>) globalCensor
.get("filter");
if (filterValue == null) {
filterValue = new HashMap<String, LinkedHashMap<Integer, String>>();
globalCensor.put("filter", filterValue);
}
LinkedHashMap<Integer, String> findValue = filterValue.get("find");
if (findValue == null) {
findValue = new LinkedHashMap<Integer, String>();
filterValue.put("find", findValue);
}
findValue.put(findValue.size(), builder.append(find).toString());
builder.delete(builderPrimalLen, builder.length());
LinkedHashMap<Integer, String> replaceValue = filterValue.get("replace");
if (replaceValue == null) {
replaceValue = new LinkedHashMap<Integer, String>();
filterValue.put("replace", replaceValue);
}
replaceValue.put(replaceValue.size(), replace);
}
}
}
}
if (banned.size() > 0) {
globalCensor.put("banned", "(?i)(" + Common.implode(banned, "|") + ")");
globalCensor.put("banword", Common.implode(banwords, ", "));
}
cache_write("cache_censor", "globalCensor", globalCensor);
}
public void creditrule_cache() throws Exception {
Map<String, Map<String, Object>> datas = new LinkedHashMap<String, Map<String, Object>>();
List<Map<String, Object>> creditrules = dataBaseDao.executeQuery("SELECT * FROM "
+ JavaCenterHome.getTableName("creditrule") + "");
for (Map<String, Object> value : creditrules) {
datas.put((String) value.get("action"), value);
}
cache_write("cache_creditrule", "globalCreditrule", datas);
}
public void ad_cache() throws Exception {
Map<String, TreeMap<Integer, Object>> datas = new LinkedHashMap<String, TreeMap<Integer, Object>>();
List<Map<String, Object>> ads = dataBaseDao.executeQuery("SELECT adid, pagetype FROM "
+ JavaCenterHome.getTableName("ad") + " WHERE system='1' AND available='1'");
TreeMap<Integer, Object> tempMap = null;
for (Map<String, Object> value : ads) {
tempMap = datas.get((String) value.get("pagetype"));
if (tempMap == null) {
tempMap = new TreeMap<Integer, Object>();
}
tempMap.put(tempMap.size(), value.get("adid"));
datas.put((String) value.get("pagetype"), tempMap);
}
cache_write("cache_ad", "globalAd", datas);
}
public void task_cache() throws Exception {
int timestamp = (int) (System.currentTimeMillis() / 1000);
Map<Integer, Map<String, Object>> datas = new LinkedHashMap<Integer, Map<String, Object>>();
List<Map<String, Object>> tasks = dataBaseDao.executeQuery("SELECT * FROM "
+ JavaCenterHome.getTableName("task") + " WHERE available='1' ORDER BY displayorder");
for (Map<String, Object> value : tasks) {
int endtime = (Integer) value.get("endtime");
int maxnum = (Integer) value.get("maxnum");
int num = (Integer) value.get("num");
if ((endtime == 0 || endtime >= timestamp) && (maxnum == 0 || maxnum > num)) {
datas.put((Integer) value.get("taskid"), value);
}
}
cache_write("cache_task", "globalTask", datas);
}
public void click_cache() throws Exception {
Map<String, Map<Integer, Map<String, Object>>> datas = new LinkedHashMap<String, Map<Integer, Map<String, Object>>>();
List<Map<String, Object>> clicks = dataBaseDao.executeQuery("SELECT * FROM "
+ JavaCenterHome.getTableName("click") + " ORDER BY displayorder");
for (Map<String, Object> value : clicks) {
String idtype = (String) value.get("idtype");
Map<Integer, Map<String, Object>> idtypes = datas.get(idtype);
if (idtypes == null) {
idtypes = new LinkedHashMap<Integer, Map<String, Object>>();
datas.put(idtype, idtypes);
}
idtypes.put((Integer) value.get("clickid"), value);
}
cache_write("cache_click", "globalClick", datas);
}
public void block_cache() throws Exception {
Map<Integer, Integer> datas = new LinkedHashMap<Integer, Integer>();
List<Map<String, Object>> blocks = dataBaseDao.executeQuery("SELECT bid, cachetime FROM "
+ JavaCenterHome.getTableName("block"));
for (Map<String, Object> value : blocks) {
datas.put((Integer) value.get("bid"), (Integer) value.get("cachetime"));
}
cache_write("cache_block", "globalBlock", datas);
}
public void userapp_cache() throws IOException {
byte my_status = 1;
Map<Integer, Map<String, Object>> datas = new LinkedHashMap<Integer, Map<String, Object>>();
if (my_status > 0) {
List<Map<String, Object>> userapps = dataBaseDao.executeQuery("SELECT * FROM "
+ JavaCenterHome.getTableName("myapp") + " WHERE flag='1' ORDER BY displayorder");
for (Map<String, Object> value : userapps) {
datas.put((Integer) value.get("appid"), value);
}
}
cache_write("cache_userapp", "globalUserApp", datas);
}
public void app_cache() throws IOException {
Map<String, Object> data = new HashMap<String, Object>();
cache_write("cache_app", "globalApp", data);
}
public void eventclass_cache() throws IOException {
Map<Integer, Map<String, Object>> datas = new LinkedHashMap<Integer, Map<String, Object>>();
List<Map<String, Object>> eventclasses = dataBaseDao.executeQuery("SELECT * FROM "
+ JavaCenterHome.getTableName("eventclass") + " ORDER BY displayorder");
for (Map<String, Object> value : eventclasses) {
Integer classid = (Integer) value.get("classid");
Integer poster = (Integer) value.get("poster");
if (poster > 0) {
value.put("poster", "data/event/" + classid + ".jpg");
} else {
value.put("poster", "image/event/default.jpg");
}
datas.put(classid, value);
}
cache_write("cache_eventclass", "globalEventClass", datas);
}
public void magic_cache() throws Exception {
Map<Object, Object> magic = new LinkedHashMap<Object, Object>();
List<Map<String, Object>> magics = dataBaseDao.executeQuery("SELECT mid, name FROM "
+ JavaCenterHome.getTableName("magic") + " WHERE close='0'");
for (Map<String, Object> value : magics) {
magic.put(value.get("mid"), value.get("name"));
}
cache_write("cache_magic", "globalMagic", magic);
}
public void delTreeDir(String dir) {
File[] subFiles = Common.readDir(dir);
if (subFiles != null) {
for (File subFile : subFiles) {
if (subFile.isFile()) {
subFile.delete();
} else {
delTreeDir(subFile.getPath());
}
}
}
}
public void block_data_cache(Map<String, Object> sConfig) {
if ("database".equals(sConfig.get("cachemode"))) {
List<String> query = dataBaseDao.executeQuery("SHOW TABLES LIKE '"
+ JavaCenterHome.jchConfig.get("tablePre") + "cache%';", 1);
for (String table : query) {
dataBaseDao.execute("TRUNCATE TABLE `" + table + "`");
}
} else {
delTreeDir(JavaCenterHome.jchRoot + "data/block_cache");
}
}
@SuppressWarnings("unchecked")
private String arrayeval(String var, Map values, int level) {
StringBuffer space = new StringBuffer();
for (int i = 0; i < level; i++) {
space.append("\t");
}
StringBuffer curdata = new StringBuffer();
if (values instanceof LinkedHashMap) {
curdata.append("Map " + var + "= new LinkedHashMap();\n");
} else {
curdata.append("Map " + var + "= new HashMap();\n");
}
Object keyTemp = null;
String valTemp = null;
Set<Object> keys = values.keySet();
for (Object key : keys) {
Object val = values.get(key);
if (key instanceof String) {
keyTemp = "\"" + key + "\"";
} else {
keyTemp = key;
}
boolean isMap = val instanceof Map;
if (isMap) {
String temp = key.toString();
String varTemp = var + temp.substring(0, 1).toUpperCase() + temp.substring(1);
curdata.append(space);
curdata.append("\t");
curdata.append(arrayeval(varTemp, (Map) val, level + 1));
curdata.append(space);
curdata.append(var + ".put(" + keyTemp + "," + varTemp + ");\n");
} else {
valTemp = val.toString();
if (!valTemp.matches("^\\-?\\d+$") || Common.strlen(valTemp) > 12) {
valTemp = Common.addSlashes(valTemp);
valTemp = valTemp.replaceAll("\r\n", "\\\\r\\\\n");
val = "\"" + valTemp + "\"";
}
curdata.append(space);
curdata.append(var + ".put(" + keyTemp + "," + val + ");\n");
}
}
return curdata.toString();
}
@SuppressWarnings("unchecked")
private void cache_write(String fileName, String var, Map values) throws IOException {
String cachePath = JavaCenterHome.jchRoot + "data/cache/" + fileName + ".jsp";
StringBuffer cacheContent = new StringBuffer();
cacheContent.append("<%@ page language=\"java\" import=\"java.util.*\" pageEncoding=\"");
cacheContent.append(JavaCenterHome.JCH_CHARSET);
cacheContent.append("\"%>\n");
cacheContent.append("<%\n");
cacheContent.append(arrayeval(var, values, 0));
cacheContent.append("request.setAttribute(\"" + var + "\"," + var + ");\n");
cacheContent.append("%>");
if (!FileHelper.writeFile(cachePath, cacheContent.toString())) {
throw new IOException("File: " + cachePath + " write error.");
}
}
}