⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cache.java

📁 论坛软件系统亦称电子公告板(BBS)系统
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
package cn.jsprun.utils;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.TreeMap;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;

import cn.jsprun.dao.DataBaseDao;

public final class Cache {
	private String tablepre = "jrun_";
	private String path = null;
	private String HTTP_HOST=null;
	private DataBaseDao dataBaseDao = (DataBaseDao)BeanFactory.getBean("dataBaseDao");
	private DataParse dataParse= (DataParse)BeanFactory.getBean("dataParse");
	public Cache(String rootPath) {
		path = rootPath;
	}
	public Cache(String rootPath,HttpServletRequest request) {
		path = rootPath;
		int port=request.getServerPort();
		String http_host=request.getServerName();
		if(port>0)
		{
			http_host=http_host.concat(":"+port);
		}
		HTTP_HOST=http_host;
	}
	static String JSPRUN_KERNEL_VERSION ="6.0.0";
	static String JSPRUN_KERNEL_RELEASE ="200806028";
	static Map<String, String> cachescript = new HashMap<String, String>();
	static {
		cachescript.put("settings", "settings");
		cachescript.put("admingroup", "admingroups");
		cachescript.put("usergroup", "usergroups");
		cachescript.put("archiver", "advs_archiver");
		cachescript.put("register", "advs_register");
		cachescript.put("forums", "forums");
		cachescript.put("plugins", "plugins");
		cachescript.put("style", "styles");
		cachescript.put("faqs", "faqs");
		cachescript.put("icons", "icons");
		cachescript.put("secqaa", "secqaa");
		cachescript.put("medals", "medals");
		cachescript.put("ranks", "ranks");
		cachescript.put("censor", "censor");
		cachescript.put("google", "google");
		cachescript.put("baidu", "baidu");
		cachescript.put("index","announcements,forumlinks,advs_index,onlinelist,tags_index,birthdays_index");
		cachescript.put("forumdisplay","announcements,announcements_forum,globalstick,onlinelist,advs_forumdisplay");
		cachescript.put("viewthread","announcements,ranks,bbcodes,advs_viewthread,tags_viewthread");
		cachescript.put("post","bbcodes_display,smilies_display,smilies");
		cachescript.put("profilefields","profilefields");
		cachescript.put("threadtypes", "threadtypes");
		cachescript.put("smilies_var", "smilies_var");
	}
	public boolean updatecache() throws Exception {
		return updatecache(null);
	}
	public boolean updatecache(String cachename) throws Exception {
		Map<String,String> settings=ForumInit.settings;
		if (cachename != null) {
			String cname = cachescript.get(cachename);
			if (cname != null && !cname.equals("")) {
				setcache(cname, cachename, null,settings);
			}
		} else {
			Set<String> keys = cachescript.keySet();
			for (String key : keys) {
				if(!key.equals("google")||!key.equals("baidu"))
				{
					String cname = cachescript.get(key);
					setcache(cname, key,null,settings);
				}
			}
		}
		return true;
	}

	@SuppressWarnings("unchecked")
	private void setcache(String cname, String cachename, String prefix,Map<String,String> settings)throws Exception {
		prefix = prefix != null? prefix : "cache_";
		boolean flag = false;
		String[] cnames = cname.split(",");
		for (String obj : cnames) {
			String cols=null;
			String table=null;
			String sql=null;
			String conditions=null;
			if ("settings".equals(obj)) {
				conditions="WHERE variable NOT IN ('siteuniqueid', 'mastermobile', 'closedreason', 'creditsnotify', 'backupdir', 'custombackup','maxonlines', 'newsletter')";
			}else if("forumlinks".equals(obj)||"onlinelist".equals(obj)){
				conditions="ORDER BY displayorder";
			}else if("forums".equals(obj)){
				Map<String, Map<String,String>> datas = new HashMap<String,  Map<String,String>>();
				List<Map<String,String>> forumList=dataBaseDao.executeQuery("SELECT f.fid, f.type, f.name, f.fup, ff.viewperm FROM "+tablepre+"forums f LEFT JOIN "+tablepre+"forumfields ff ON ff.fid=f.fid LEFT JOIN "+tablepre+"access a ON a.fid=f.fid AND a.allowview='1' WHERE f.status>0 AND f.type<>'group' ORDER BY f.type, f.displayorder");
				if(forumList!=null&&forumList.size()>0){
					Map<String,Map<String,String>> forums=new HashMap<String,Map<String,String>>(); 
					Map<String,Map<String,String>> subs=new HashMap<String,Map<String,String>>();
					for(Map<String,String> forum:forumList){
						forum.put("name", Common.strip_tags(forum.get("name")));
						String type=forum.get("type");
						if(type.equals("forum")){
							forums.put(forum.get("fid"), forum);
						}else if(type.equals("sub")){
							Map<String,String> upforum=forums.get(forum.get("fup"));
							if(upforum!=null){
								if(upforum.get("hasSub")==null){
									upforum.put("hasSub", "true");
								}								
							}
							subs.put(forum.get("fid"), forum);
						}
					}
					if(forums!=null&&forums.size()>0){
						Set<String> forumids=forums.keySet();
						for(String forumid:forumids){
							Map<String,String> forum=forums.get(forumid);
							boolean hasSub="true".equals(forum.get("hasSub"));
							forum.remove("hasSub");
							datas.put(forumid, forum);
							if(hasSub){
								Set<String> subids=subs.keySet();
								for(String subid:subids){
									Map<String,String> sub=subs.get(subid);		
									if(sub.get("fup").equals(forumid)){
										datas.put(subid, sub);
									}
								}
							}
						}
					}
					forums=null;
					subs=null;
				}
				forumList=null;
				Map<String,String> data=new HashMap<String,String>();
				data.put("forums", dataParse.combinationChar(datas));
				datas=null;
				writeToCacheFile(prefix + cachename,arrayeval(cachename, data), "", flag);
				data=null;
				break;
			}else if("plugins".equals(obj)){
				List<Map<String,String>> plugins=dataBaseDao.executeQuery("SELECT pluginid, available, adminid, name, identifier, datatables, directory, copyright, modules FROM "+tablepre+"plugins");
				if(plugins!=null&&plugins.size()>0){
					for(Map<String,String> plugin:plugins){
						List<Map<String,String>> queryvars=dataBaseDao.executeQuery("SELECT variable, value FROM "+tablepre+"pluginvars WHERE pluginid='"+plugin.get("pluginid")+"'");
						if(queryvars!=null&&queryvars.size()>0){
							Map<String,String> vars=new HashMap<String,String>();
							for(Map<String,String> var:queryvars){
								vars.put(var.get("variable"), var.get("value"));
							}
							plugin.put("vars", dataParse.combinationChar(vars));
						}
						writeToCacheFile("plugin_" + plugin.get("identifier"),arrayeval(plugin.get("identifier"), plugin), "", flag);
					}
				}
				break;
			}else if(obj.startsWith("tags_")){
				table="tags";
				int taglimit=Common.toDigit("viewthread".equals(obj.substring(5))?settings.get("viewthreadtags"):settings.get("hottags"));
				cols="tagname, total";
				conditions="WHERE closed=0 ORDER BY total DESC LIMIT "+taglimit;
			}else if("announcements".equals(obj)){
				int timestamp = Common.time();
				conditions="WHERE starttime<='"+timestamp+"' AND (endtime>='"+timestamp+"' OR endtime='0') ORDER BY displayorder, starttime DESC, id DESC";
			}else if("google".equals(obj)){
				table="settings";
				conditions="WHERE variable = 'google'";
			}else if("baidu".equals(obj)){
				table="settings";
				conditions="WHERE variable = 'baidu'";
			}else if("birthdays_index".equals(obj)){
				table="members";
				int timeoffset=(int)(Float.valueOf(settings.get("timeoffset"))*3600);
				conditions="WHERE RIGHT(bday, 5)='"+Common.gmdate("MM-dd", Common.time()+timeoffset)+"' ORDER BY bday LIMIT "+Common.toDigit(settings.get("maxbdays"));
			}else if ("styles".equals(obj)) {
				table="stylevars";
				sql="SELECT sv.* FROM "+ tablepre+ "stylevars sv LEFT JOIN "+ tablepre+ "styles s ON s.styleid = sv.styleid AND (s.available=1 OR s.styleid='0')";
			}else if ("icons".equals(obj)) {
				table="smilies";
				conditions="WHERE type='icon' ORDER BY displayorder";
			}else if ("secqaa".equals(obj)) {
				Random rand=new Random();
				int secqaanum=Integer.valueOf(dataBaseDao.executeQuery("SELECT COUNT(*) count FROM jrun_itempool").get(0).get("count"));
				int start_limit = secqaanum <= 10 ? 0 : rand.nextInt(secqaanum - 10);
				List<Map<String,String>> secqaas=dataBaseDao.executeQuery("SELECT question, answer FROM jrun_itempool LIMIT "+start_limit+", 10");
				Map<String,String> datas=new HashMap<String,String>();
				int size=secqaas.size();
				if(size>0){
					for (int i=0;i<size;i++) {
						Map<String,String> secqaa=secqaas.get(i);
						datas.put(String.valueOf(i), dataParse.combinationChar(secqaa));
					}
				}else{
					datas.put("0",null);
				}
				while((size=datas.size()) < 10) {
					datas.put(size+"", datas.get(rand.nextInt(size)+""));
				}
				writeToCacheFile(prefix + cachename,arrayeval(obj, datas), "", flag);
				datas=null;
				break;
			}else if ("medals".equals(obj)) {
				table="medals";
				cols="medalid, name, image";
				conditions="WHERE available='1'";
			}else if ("censor".equals(obj)) {
				table="words";
			}else if ("faqs".equals(obj)) {
				conditions="WHERE identifier!='' AND keyword!=''";
			}else if("announcements_forum".equals(obj)){
				int timestamp = Common.time();
				table="announcements";
				conditions="WHERE type!=2 AND groups = '' AND starttime<='"+timestamp+"' ORDER BY displayorder, starttime DESC, id DESC LIMIT 1";
			}else if("globalstick".equals(obj)){
				table="forums";
				conditions ="WHERE status>0 AND type IN ('forum', 'sub') ORDER BY type";
			}else if("bbcodes".equals(obj)){
				table="bbcodes";
				conditions="WHERE available='1' AND icon!=''";
			}else if("ranks".equals(obj)){
				table="ranks";
				cols="ranktitle, postshigher, stars, color";
				conditions="ORDER BY postshigher DESC";
			}
			else if("bbcodes_display".equals(obj)){
				table="bbcodes";
				conditions="WHERE available='1' AND icon!=''";
			}else if("smilies_display".equals(obj)){
				table="imagetypes";
				conditions="WHERE type='smiley' ORDER BY displayorder";
			}else if("smilies".equals(obj)){
				table="smilies";
				sql="SELECT s.* FROM " + tablepre + "smilies s LEFT JOIN "+tablepre+"imagetypes t ON t.typeid=s.typeid WHERE s.type='smiley' AND s.code<>'' AND t.typeid IS NOT NULL ORDER BY LENGTH(s.code) DESC";
			}else if("profilefields".equals(obj)){
				table="profilefields";
				cols="fieldid, invisible, title, description, required, unchangeable, selective, choices";
				conditions="WHERE available='1' ORDER BY displayorder";
			}else if(obj.length()>5&&obj.substring(0,5).equals("advs_")){
				Map<String,String> datas=new HashMap<String,String>();
				Map advs = advertisement(obj.substring(5));
				datas.put(obj.substring(0,4), advs!=null&&advs.size()>0?dataParse.combinationChar(advs):"");
				advs=null;
				writeToCacheFile(prefix + cachename,arrayeval(obj.substring(0,4), datas), "", flag);
				datas=null;
				flag = true;
				continue;
			}else if("smilies_var".equals(cachename)){
				String smrows = settings.get("smrows");
				String smcols = settings.get("smcols");
				int spp = Common.toDigit(smcols)*Common.toDigit(smrows);
				List<Map<String,String>>imagetypes = dataBaseDao.executeQuery("select typeid,name,directory from "+tablepre+"imagetypes order by displayorder");
				if(imagetypes!=null && imagetypes.size()>0){
					StringBuffer return_type = new StringBuffer("var smthumb = '20';var smilies_type = new Array();");
					StringBuffer return_datakey = new StringBuffer("var smilies_array = new Array();");
					for(Map<String,String> stypes:imagetypes){
						List<Map<String,String>> smileslist = dataBaseDao.executeQuery("SELECT id, code, url FROM "+tablepre+"smilies WHERE type='smiley' AND code<>'' AND typeid='"+stypes.get("typeid")+"' ORDER BY displayorder");
						if(smileslist!=null&&smileslist.size()>0){
							int j=1;int i=0;
							return_type.append("smilies_type["+stypes.get("typeid")+"] = ['"+stypes.get("name").replace("'", "\\'")+"','"+stypes.get("directory").replace("'", "\\'")+"'];");
							return_datakey.append("smilies_array["+stypes.get("typeid")+"] = new Array();");
							return_datakey.append("smilies_array["+stypes.get("typeid")+"]["+j+"]=[");
							for(Map<String,String>smiles:smileslist){
								if(i >=spp) {
									return_datakey.deleteCharAt(return_datakey.length()-1);
									return_datakey.append("];");
									j++;
									return_datakey.append("smilies_array["+stypes.get("typeid")+"]["+j+"]=[");
									i = 0;
								}
								i++;
								String smileycode = smiles.get("code").replace("'", "\\'");
								String url = smiles.get("url").replace("'","\\'");
								int windth = 20;
								URL imgurl=Thread.currentThread().getContextClassLoader().getResource("../../images/smilies/"+stypes.get("directory")+"/"+url);
								if(imgurl!=null){
									String path = Common.decode(imgurl.getPath());
									File file = new File(path);
									if(file.exists()){
										windth = ImageIO.read(file).getWidth();
									}
								}
								return_datakey.append("['"+smiles.get("id")+"','"+smileycode+"','"+url+"','20','20','"+windth+"'],");
							}
							return_datakey.deleteCharAt(return_datakey.length()-1);
							return_datakey.append("];");
						}
						smileslist = null;
					}
					imagetypes = null;
					writeToJsCacheFile("smilies", return_type.toString()+return_datakey.toString(), "_var");
				}
				break;
			}else if("usergroups".equals(obj)){
				sql = "SELECT * FROM "+tablepre+"usergroups u LEFT JOIN "+tablepre+"admingroups a ON u.groupid=a.admingid";
			}
			this.getDataList(sql,table!=null?table:obj,cols, conditions, cachename, obj,prefix, flag);
			flag = true;
		}
		if ("threadtypes".equals(cachename)) {
			Map<String, String> datas = new HashMap<String, String>();
			List<Map<String,String>> dataList=dataBaseDao.executeQuery("SELECT t.typeid, tt.optionid, tt.title, tt.type, tt.rules, tt.identifier, tt.description, tv.required, tv.unchangeable, tv.search FROM "+tablepre+"threadtypes t LEFT JOIN "+tablepre+"typevars tv ON t.typeid=tv.typeid	LEFT JOIN "+tablepre+"typeoptions tt ON tv.optionid=tt.optionid WHERE t.special='1' AND tv.available='1' ORDER BY tv.displayorder");
			Map<Integer,Map<Integer,Map<String,String>>> typelists=new HashMap<Integer, Map<Integer,Map<String,String>>>();
			Map<Integer,String> templatedata=new HashMap<Integer,String>();
			if(dataList!=null&&dataList.size()>0)
			{
				Map<Integer,Map<String,String>> typelist=null;
				for (Map<String, String> data : dataList) {
					Map<String,String> rules=dataParse.characterParse(data.get("rules"),false);
					Integer typeid=Integer.valueOf(data.get("typeid"));
					String type=data.get("type");
					typelist=typelists.get(typeid);
					if(typelist==null)
					{
						typelist=new HashMap<Integer, Map<String,String>>();
					}
					if(rules!=null&&rules.size()>0)
					{
						if("select".equals(type)||"checkbox".equals(type)||"radio".equals(type))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -