亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? searchengineplugin.java

?? 個(gè)人Blog java編寫的Blog可以直接使用!
?? JAVA
字號(hào):
/*
 *  SearchEnginePlugIn.java
 *  
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Library General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *  
 *  Author: Winter Lau (javayou@gmail.com)
 *  http://dlog4j.sourceforge.net
 */
package com.liusoft.dlog4j.plugin;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.config.ModuleConfig;

import com.liusoft.dlog4j.Globals;
import com.liusoft.dlog4j.db.HibernateUtils;
import com.liusoft.dlog4j.search.SearchDataProvider;
import com.liusoft.dlog4j.search.SearchEnabled;
import com.liusoft.dlog4j.search.SearchProxy;
import com.liusoft.dlog4j.util.StringUtils;

/**
 * <p>A search engine daemon using lucene implements struts's plugin</p>
 * <p>This plugin require a property named "basePath"
 * to indicate where the lucene files stored.</p>
 * <p>
 * In UNIX or Linux OS, you must use "file://" to a no-webapp-context path<br/>
 * Example: "file:///data/lucene" refer to /data/lucene but {webapp}/data/lucene
 * </p>
 * @author Winter Lau
 */
public class SearchEnginePlugIn extends DaemonPlugin {

	private String basePath;
	private String dataProvider0;
	private String dataProvider1;
	private String dataProvider2;
	private String dataProvider3;
	private String dataProvider4;
	private String dataProvider5;
	private String dataProvider6;
	private String dataProvider7;
	private String dataProvider8;
	private String dataProvider9;
	
	private ThreadGroup tGroup = new ThreadGroup("build_idx_thread");
	
	private boolean stop = false;
	
	/**
	 * 初始化搜索引擎
	 */
	public void init(ActionServlet servlet, ModuleConfig config) 
		throws ServletException 
	{		
		if(basePath.startsWith(Globals.LOCAL_PATH_PREFIX)){
			basePath = basePath.substring(Globals.LOCAL_PATH_PREFIX.length());
		}
		else if(basePath.startsWith("/")){
			basePath = servlet.getServletContext().getRealPath(basePath);
		}
		//初始化搜索代理
		SearchProxy.init(basePath);

		super.init(servlet, config);
		
	}

	public void destroy() {
		stop = true;
		int tCount = tGroup.activeCount();
		if(tCount > 0){
			Thread[] threads = new Thread[tCount];
			int tc = tGroup.enumerate(threads);
			for(int i=0;i<tc;i++){
				if(threads[i] instanceof BuildIndexThread)					
				try{
					threads[i].join(10000, 200);
				}catch(InterruptedException e){
					log.error("Exception occurred when waiting for thread " + threads[i].getClass().getName(), e);
				}
			}
		}
		super.destroy();
	}

	/**
	 * 自動(dòng)build文檔的索引
	 */
	protected void service() throws Exception {
		if(StringUtils.isNotEmpty(dataProvider0))
			buildIndexes(dataProvider0);
		if(StringUtils.isNotEmpty(dataProvider1))
			buildIndexes(dataProvider1);
		if(StringUtils.isNotEmpty(dataProvider2))
			buildIndexes(dataProvider2);
		if(StringUtils.isNotEmpty(dataProvider3))
			buildIndexes(dataProvider3);
		if(StringUtils.isNotEmpty(dataProvider4))
			buildIndexes(dataProvider4);
		if(StringUtils.isNotEmpty(dataProvider5))
			buildIndexes(dataProvider5);
		if(StringUtils.isNotEmpty(dataProvider6))
			buildIndexes(dataProvider6);
		if(StringUtils.isNotEmpty(dataProvider7))
			buildIndexes(dataProvider7);
		if(StringUtils.isNotEmpty(dataProvider8))
			buildIndexes(dataProvider8);
		if(StringUtils.isNotEmpty(dataProvider9))
			buildIndexes(dataProvider9);		
	}
	
	/**
	 * 構(gòu)建索引
	 * TODO: 如何防止上一個(gè)線程還沒結(jié)束又啟動(dòng)了一個(gè)新的線程
	 * @param providerClass
	 * @param lastTime
	 */
	private int buildIndexes(final String providerClass){
		if(stop)
			return -1;
		
		new BuildIndexThread(context(), tGroup, providerClass).start();
		
		return 0;
	}
	
	protected String name() {
		return "search_engine";
	}

	public void setBasePath(String basePath) {
		this.basePath = basePath;
	}

	public void setDataProvider0(String dataProvider0) {
		this.dataProvider0 = dataProvider0;
	}

	public void setDataProvider1(String dataProvider1) {
		this.dataProvider1 = dataProvider1;
	}

	public void setDataProvider2(String dataProvider2) {
		this.dataProvider2 = dataProvider2;
	}

	public void setDataProvider3(String dataProvider3) {
		this.dataProvider3 = dataProvider3;
	}

	public void setDataProvider4(String dataProvider4) {
		this.dataProvider4 = dataProvider4;
	}

	public void setDataProvider5(String dataProvider5) {
		this.dataProvider5 = dataProvider5;
	}

	public void setDataProvider6(String dataProvider6) {
		this.dataProvider6 = dataProvider6;
	}

	public void setDataProvider7(String dataProvider7) {
		this.dataProvider7 = dataProvider7;
	}

	public void setDataProvider8(String dataProvider8) {
		this.dataProvider8 = dataProvider8;
	}

	public void setDataProvider9(String dataProvider9) {
		this.dataProvider9 = dataProvider9;
	}

}

/**
 * 構(gòu)建索引的線程
 * @author liudong
 */
class BuildIndexThread extends Thread {

	protected final static Log log = LogFactory.getLog(BuildIndexThread.class);

	private ServletContext context;
	private String providerClass;

	public BuildIndexThread(ServletContext context, ThreadGroup group,
			String providerClass) {
		super(group, providerClass);
		this.context = context;
		this.providerClass = providerClass;
	}
	
	public void run() {
		List objs = null;
		try {
			Date lastTime = getLastActiveTime(providerClass);
			SearchDataProvider sdp = (SearchDataProvider) Class.forName(
					providerClass).newInstance();
			if (lastTime == null)
				lastTime = new Date(0);
			objs = sdp.fetchAfter(lastTime);
			if (objs != null) {
				for (int i = 0; i < objs.size(); i++) {
					SearchEnabled obj = (SearchEnabled) objs.get(i);
					SearchProxy.add(obj);
					if (i > 0 && (i + 1) % 10 == 0)
						log.info((i + 1) + " document's indexes added.");
				}
				saveLastActiveTime(providerClass, new Date());
				if (objs.size() > 0) {
					log.info(objs.size() + " documents writed to disk of "
							+ providerClass);
				}
			} else
				log.warn("fetch data of " + providerClass + " return null");
		} catch (Exception e) {
			log.error("Exception occur when buildIndexes using "
					+ providerClass, e);
		} finally {
			HibernateUtils.closeSession();
			objs = null;
		}
	}

	/**
	 * 獲取某個(gè)數(shù)據(jù)接口上次的活動(dòng)時(shí)間
	 * 
	 * @param pvdClass
	 * @return
	 * @throws IOException
	 */
	private Date getLastActiveTime(String pvdClass) throws IOException {
		// Date lastTime = null;
		StringBuffer status_file_uri = new StringBuffer(STATUS_FILE_PATH);
		status_file_uri.append(pvdClass);
		status_file_uri.append(".his");
		String realPath = context.getRealPath(status_file_uri.toString());
		Properties props = new Properties();
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(realPath);
			props.load(fis);
			String s_last_time = props.getProperty(TIME_KEY);
			return new Date(Long.parseLong(s_last_time));
		} catch (FileNotFoundException e) {
		} catch (NumberFormatException e) {
		} catch (NullPointerException e) {
		} finally {
			props = null;
			if (fis != null)
				fis.close();
		}
		return null;
	}

	/**
	 * 保存最近一次活動(dòng)時(shí)間
	 * 
	 * @param pvdClass
	 * @param time
	 * @throws IOException
	 */
	private void saveLastActiveTime(String pvdClass, Date time)
			throws IOException {
		StringBuffer status_file_uri = new StringBuffer(STATUS_FILE_PATH);
		status_file_uri.append(pvdClass);
		status_file_uri.append(".his");
		String realPath = context.getRealPath(status_file_uri.toString());
		Properties props = new Properties();
		FileOutputStream fos = null;
		try {
			props.setProperty(TIME_KEY, String.valueOf(time.getTime()));
			props.setProperty("LAST_TIME", time.toString());
			fos = new FileOutputStream(realPath);
			props.store(fos, null);
		} finally {
			props = null;
			if (fos != null){
				fos.close();
				fos = null;
			}
		}
	}

	private final static String STATUS_FILE_PATH = "/WEB-INF/tmp/";

	private final static String TIME_KEY = "LAST_ACTIVITY_TIME";

}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产色产综合色产在线视频| 亚洲精品日日夜夜| 99精品久久久久久| 日本伊人精品一区二区三区观看方式| 久久精品一区二区三区av| 欧洲视频一区二区| 国产成人免费视频| 午夜精品一区二区三区三上悠亚| 国产日产欧美一区二区视频| 欧美日韩一二区| 99久久伊人网影院| 精品影院一区二区久久久| 亚洲国产综合91精品麻豆| 国产午夜精品一区二区三区嫩草| 欧美乱妇20p| 色av成人天堂桃色av| 懂色av噜噜一区二区三区av | 亚洲一区精品在线| 国产欧美日韩综合精品一区二区| 91精品国产高清一区二区三区| 91视频国产资源| 国产福利一区二区三区视频| 奇米色一区二区三区四区| 中文字幕在线观看一区二区| 国产欧美日韩麻豆91| 精品人在线二区三区| 欧美美女一区二区三区| 欧美综合色免费| 色婷婷国产精品久久包臀| 成人av在线看| 国产福利精品一区| 黄色资源网久久资源365| 免费一区二区视频| 美女脱光内衣内裤视频久久网站 | 中文字幕一区二区三区乱码在线| 久久理论电影网| 精品久久久久一区| 日韩一区二区三区观看| 91精品欧美福利在线观看| 欧美美女一区二区在线观看| 欧美酷刑日本凌虐凌虐| 欧美日韩一区二区三区高清| 欧美无乱码久久久免费午夜一区| 一本大道久久a久久综合婷婷| av电影一区二区| 91在线视频观看| 91麻豆国产自产在线观看| 99久久久精品免费观看国产蜜| 国产69精品久久99不卡| 成人国产免费视频| 99re热这里只有精品视频| 99久久婷婷国产综合精品电影| av在线免费不卡| 在线观看亚洲精品| 欧美日韩性生活| 91精品国产aⅴ一区二区| 日韩三级电影网址| 久久综合一区二区| 国产精品国产三级国产aⅴ中文 | 黄一区二区三区| 成人涩涩免费视频| 日本高清不卡一区| 欧美日韩成人激情| 精品久久一区二区| 国产精品午夜在线观看| 亚洲免费在线观看视频| 日韩一区精品字幕| 国产剧情在线观看一区二区| 成人激情av网| 欧洲在线/亚洲| 精品日韩欧美一区二区| 日本一区二区三区在线不卡| 亚洲综合在线免费观看| 日韩avvvv在线播放| 国产美女娇喘av呻吟久久| 91原创在线视频| 日韩色视频在线观看| 国产精品视频麻豆| 亚洲成在人线在线播放| 国产一区二区三区黄视频 | 蜜臀av性久久久久蜜臀aⅴ流畅| 国产曰批免费观看久久久| 国产成人在线免费观看| 色婷婷激情一区二区三区| 日韩欧美高清一区| 中文字幕在线一区免费| 图片区小说区国产精品视频| 国产成人精品亚洲午夜麻豆| 91国产免费看| 久久综合色8888| 一个色综合av| 国产一区二三区好的| 色狠狠综合天天综合综合| 精品日韩一区二区三区| 一区二区欧美精品| 国产一区二区三区国产| 欧美人狂配大交3d怪物一区| 国产区在线观看成人精品| 日韩精品乱码av一区二区| eeuss鲁一区二区三区| 欧美一二区视频| 中文字幕一区免费在线观看| 久久av中文字幕片| 欧美人牲a欧美精品| 亚洲视频在线观看三级| 久久精品国产久精国产爱| 在线精品视频免费播放| 国产亚洲精品aa午夜观看| 蜜桃精品视频在线观看| 欧美色偷偷大香| 亚洲人成网站色在线观看| 国产成a人无v码亚洲福利| 538prom精品视频线放| 亚洲免费大片在线观看| 成人精品免费看| 久久色在线视频| 美国十次了思思久久精品导航| 91久久香蕉国产日韩欧美9色| 国产精品少妇自拍| 国产精品91一区二区| 久久影院电视剧免费观看| 日韩激情一区二区| 欧美日本乱大交xxxxx| 亚洲精品中文在线影院| 不卡的电影网站| 中文字幕乱码久久午夜不卡| 激情综合五月天| 欧美成人a在线| 美女视频黄久久| 制服丝袜亚洲精品中文字幕| 五月天视频一区| 欧美日韩精品福利| 亚洲成a人片综合在线| 在线免费观看日本欧美| 亚洲一区免费在线观看| 欧洲亚洲国产日韩| 亚洲超碰97人人做人人爱| 色就色 综合激情| 亚洲国产精品一区二区尤物区| 91在线观看高清| 亚洲欧美日韩在线| 91蜜桃传媒精品久久久一区二区| 中文字幕日本不卡| 99精品视频一区| 一区二区三区在线视频免费 | 久久精品亚洲国产奇米99| 国产真实乱对白精彩久久| wwwwxxxxx欧美| 91看片淫黄大片一级在线观看| 中文字幕日本不卡| 91黄视频在线观看| 亚洲福利视频三区| 欧美日韩国产首页在线观看| 天天影视涩香欲综合网| 制服丝袜亚洲播放| 狠狠v欧美v日韩v亚洲ⅴ| 久久久国产综合精品女国产盗摄| 国产精品亚洲综合一区在线观看| 国产精品美日韩| 色婷婷香蕉在线一区二区| 一区二区高清在线| 欧美精品18+| 国产呦萝稀缺另类资源| 最近中文字幕一区二区三区| 欧美性大战久久久久久久蜜臀| 亚洲成a人v欧美综合天堂下载 | 日韩中文字幕区一区有砖一区| 日韩欧美不卡在线观看视频| 国产精品1区2区3区在线观看| 亚洲视频一区在线| 91精品国产综合久久精品app| 麻豆精品久久久| 国产精品入口麻豆原神| 欧美三区免费完整视频在线观看| 麻豆精品视频在线观看视频| 亚洲欧洲精品一区二区三区不卡| 欧美日韩国产精品成人| 精品一区二区在线免费观看| 亚洲人成网站色在线观看| 日韩欧美不卡在线观看视频| 99久久精品国产毛片| 日韩电影一区二区三区四区| 国产精品 欧美精品| 亚洲欧美一区二区三区久本道91 | 欧美日韩亚洲综合在线| 国产免费成人在线视频| 精品视频123区在线观看| 国产精品综合一区二区三区| 日韩毛片高清在线播放| 日韩午夜激情av| 色吧成人激情小说| 国产精品系列在线观看| 亚洲国产精品久久久男人的天堂| 久久久天堂av| 欧美天堂亚洲电影院在线播放| 国产成人午夜片在线观看高清观看| 亚洲午夜激情av| 国产精品久久久久aaaa| 日韩精品专区在线影院观看| 欧美三级中文字幕在线观看|