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

📄 messagesearchproxy.java

📁 非常有影响的 j道 论 坛 源码 国外很有明的专家编写的 ....对java爱好者很有参考价值
💻 JAVA
字号:
package com.jdon.jivejdon.dao.search;

import java.util.ArrayList;
import java.util.Collection;

import org.apache.log4j.Logger;
import org.compass.annotations.config.CompassAnnotationsConfiguration;
import org.compass.core.Compass;
import org.compass.core.CompassException;
import org.compass.core.CompassHits;
import org.compass.core.CompassSession;
import org.compass.core.CompassTemplate;
import org.compass.core.CompassTransaction;
import org.compass.core.config.CompassConfiguration;
import org.compass.core.config.CompassEnvironment;
import org.compass.core.config.ConfigurationException;
import org.compass.core.engine.SearchEngineException;

import com.jdon.jivejdon.dao.MessageQueryDao;
import com.jdon.jivejdon.model.ForumMessage;
import com.jdon.jivejdon.model.ForumMessageReply;
import com.jdon.jivejdon.model.query.MessageSearchSpec;

public class MessageSearchProxy {
    private final static Logger logger = Logger.getLogger(MessageSearchProxy.class);
    private Compass compass;

	private CompassTemplate compassTemplate;
	
	private MessageQueryDao messageQueryDao;
    
    public MessageSearchProxy(MessageQueryDao messageQueryDao) {
    	this.messageQueryDao = messageQueryDao;
    	init();
    }    
    
    public MessageSearchProxy(boolean rebuild) {
    	if (rebuild){
    		reInit();
    	}else{
    		init();	
    	}
    	
    }    
    
    public void init()  {
		try {
			logger.debug("compass init");
			CompassConfiguration config = 
				new CompassAnnotationsConfiguration();
			//.configure("/com/jdon/jivejdon/search/compass/compass.cfg.xml");
			//in j2ee env, the configure seem can not be found
			//error :org.compass.core.config.ConfigurationException: Failed to open config resource
			//com/jdon/jivejdon/search/compass/compass.cfg.xml
			config.setSetting(CompassEnvironment.CONNECTION, "target/testindex");
			config.setSetting("compass.engine.highlighter.default.formatter.simple.pre", "<font color=CC0033>");
			config.setSetting("compass.engine.highlighter.default.formatter.simple.post", "</font>");
			config.setSetting("compass.transaction.factory", "org.compass.core.transaction.JTASyncTransactionFactory");
			//config.setSetting("compass.transaction.isolation", "read_committed");
			//config.setSetting("compass.transaction.lockTimeout", "15");
			
			/**
			config.setSetting("compass.engine.connection", "jdbc://java:/JiveJdonDS");
			config.setSetting("compass.jndi.enable", "true");
			config.setSetting("compass.engine.store.jdbc.connection.provider.class", "org.compass.core.lucene.engine.store.jdbc.ExternalDataSourceProvider"); 
			ExternalDataSourceProvider.setDataSource(ds); 
			

			TableToResourceMapping folderMapping = new TableToResourceMapping("frmfolders", "frmfolders"); 
			TableToResourceMapping templateMapping = new TableToResourceMapping("frmtemplates", "frmtemplates"); 
			TableToResourceMapping variantMapping = new TableToResourceMapping("frmvariants", "frmvariants"); 

			config.addMappingResover(new ResultSetResourceMappingResolver(folderMapping, ds)); 
			config.addMappingResover(new ResultSetResourceMappingResolver(templateMapping, ds)); 
			config.addMappingResover(new ResultSetResourceMappingResolver(variantMapping, ds)); 
			
**/
			config.addClass(com.jdon.jivejdon.model.ForumMessage.class);
			config.addClass(com.jdon.jivejdon.model.Forum.class);
			compass = config.buildCompass();
			compassTemplate = new CompassTemplate(compass);
		} catch (ConfigurationException e) {
            logger.error(e);
			e.printStackTrace();
		} catch (SearchEngineException e) {
			logger.error(e);
			e.printStackTrace();
		} catch (CompassException e) {
			logger.error(e);
			e.printStackTrace();
		}
	}
    
    public void reInit()  {
		try {
			logger.debug("compass init");
			CompassConfiguration config = 
				new CompassAnnotationsConfiguration();
			config.setSetting(CompassEnvironment.CONNECTION, "target/testindex");
		
			config.addClass(com.jdon.jivejdon.model.ForumMessage.class);
			config.addClass(com.jdon.jivejdon.model.Forum.class);
			compass = config.buildCompass();
			//compass.getSearchEngineIndexManager().deleteIndex();
			//compass.getSearchEngineIndexManager().createIndex();
			compassTemplate = new CompassTemplate(compass);
		} catch (ConfigurationException e) {
            logger.error(e);
			e.printStackTrace();
		} catch (SearchEngineException e) {
			logger.error(e);
			e.printStackTrace();
		} catch (CompassException e) {
			logger.error(e);
			e.printStackTrace();
		}
	}

        
    public void createMessage(ForumMessage  forumMessage) throws Exception{
        logger.debug("MessageSearchProxy.createMessage");
		CompassSession session = compass.openSession();
		CompassTransaction tx = null;
		try {
		    tx = session.beginTransaction();
			session.save(forumMessage);
			tx.commit();
		} catch (Exception ce) {
		    if (tx != null) tx.rollback();
		    logger.error(ce);
		    throw new Exception(" createMessage error " + ce );
		} finally {
		    session.close();
		}
    }
    
    public void createMessageReply(ForumMessageReply  forumMessageReply) throws Exception{
        logger.debug("MessageSearchProxy.createMessageReply");
		CompassSession session = compass.openSession();
		CompassTransaction tx = null;
		try {
		    tx = session.beginTransaction();
			session.save(forumMessageReply);
			tx.commit();
		} catch (Exception ce) {
		    if (tx != null) tx.rollback();
		    logger.error(ce);
		    throw new Exception(" createMessageReply error " + ce );
		} finally {
		    session.close();
		}
    }
    
    public void updateMessage(ForumMessage  forumMessage) throws Exception{
        logger.debug("MessageSearchProxy.updateMessage");
		CompassSession session = compass.openSession();
		CompassTransaction tx = null;
		try {
		    tx = session.beginTransaction();
		    ForumMessage messageS = (ForumMessage) session.load(ForumMessage.class,
		    		forumMessage.getMessageId());
		    messageS.setSubject(forumMessage.getSubject());
		    messageS.setBody(forumMessage.getBody());
		    messageS.setTagTitle(forumMessage.getTagTitle());
		    session.save(messageS);
			tx.commit();
		} catch (Exception ce) {
		    if (tx != null) tx.rollback();
		    logger.error(ce);
		    throw new Exception(" updateMessage error " + ce );
		} finally {
		    session.close();
		}
    }
    
   
    
    public void deleteMessage(Long  forumMessageId) throws Exception{
        logger.debug("MessageSearchProxy.deleteMessage");
		CompassSession session = compass.openSession();
		CompassTransaction tx = null;
		try {
		    tx = session.beginTransaction();
		    ForumMessage messageS = (ForumMessage) session.load(ForumMessage.class,
		    		forumMessageId);
			session.delete(messageS);
			tx.commit();
		} catch (Exception ce) {
		    if (tx != null) tx.rollback();
		    logger.error(ce);
		    throw new Exception(" deleteMessage error " + ce );
		} finally {
		    session.close();
		}
    }
    
    /**
     * 
     * @param iquery
     * @return MessageSearchSpec Collection include highlight subject and body
     * @throws Exception
     */
    public Collection find(String query, int start, int count)  {
		logger.debug("MessageSearchProxy.find");
		Collection result = new ArrayList();
		CompassSession session = compass.openSession();
		CompassTransaction tx = null;
		MessageSearchSpec messageSearchSpec = null;
		CompassHits hits = null;
		try {
			tx = session.beginTransaction();
			hits = session.find(query);
			logger.debug("Found [" + hits.getLength() + "] hits for [" + query
					+ "] query");
			int end = start + count;
			if (end >=  hits.getLength())
				end = hits.getLength();
				
			for (int i = start; i < end; i++) {
				logger.debug("create  messageSearchSpec collection");
				ForumMessage smessage = (ForumMessage) hits.data(i);
				messageSearchSpec = new MessageSearchSpec();
				messageSearchSpec.setMessageId(smessage.getMessageId());
				String body = hits.highlighter(i).fragment("body");
				messageSearchSpec.setBody(body);
				//String tagTitle[] = hits.highlighter(i).fragments("tagTitle");
				//messageSearchSpec.setTagTitle(tagTitle);
				messageSearchSpec.setResultAllCount(hits.getLength());
				result.add(messageSearchSpec);
			}
			hits.close();
			tx.commit();
		} catch (Exception ce) {
			if (hits != null) hits.close();
		    if (tx != null) tx.rollback();
		    logger.error(ce);
		} finally {
		    session.close();
		}
		return result;
	}
    
    public int findThreadsAllCount(String query)  {
		logger.debug("findThreadsAllCount.find");
		CompassSession session = compass.openSession();
		CompassTransaction tx = null;
		int allCount = 0;
		try {
			tx = session.beginTransaction();
			CompassHits hits = session.find(query);
			allCount = hits.getLength();
			hits.close();
			tx.commit();
		} catch (Exception ce) {
		    if (tx != null) tx.rollback();
		    logger.error(ce);
		} finally {
		    session.close();
		}
		return allCount;
	}
    
    
    public Collection findThread(String query, int start, int count)  {
		logger.debug("MessageSearchProxy.find");
		Collection result = new ArrayList();
		CompassSession session = compass.openSession();
		CompassTransaction tx = null;
		MessageSearchSpec messageSearchSpec = null;
		try {
			tx = session.beginTransaction();
			CompassHits hits = session.find(query);
			logger.debug("Found [" + hits.getLength() + "] hits for [" + query
					+ "] query");
			int end = start + count;
			if (end >=  hits.getLength())
				end = hits.getLength();
			
			start = getNewStart(hits, start);
			int j = start;
			for (int i = start; j < start + count; i++) {		
				if (i >= hits.getLength()) break;
				logger.debug("create  messageSearchSpec collection");
				ForumMessage smessage = (ForumMessage) hits.data(i);
				messageSearchSpec = messageQueryDao.getMessageSearchSpec(smessage.getMessageId());
				if (messageSearchSpec.isRoot()){
					messageSearchSpec.setMessageId(smessage.getMessageId());
					String body = hits.highlighter(i).fragment("body");
					messageSearchSpec.setBody(body);
					messageSearchSpec.setResultAllCount(hits.getLength());
					result.add(messageSearchSpec);
					j++;
				}
			}
			hits.close();
			tx.commit();
		} catch (Exception ce) {
		    if (tx != null) tx.rollback();
		    logger.error(ce);
		} finally {
		    session.close();
		}
		return result;
	}
    
    private int getNewStart(CompassHits hits, int end){
    	int newStart = 0;
    	int j = 0;
    	MessageSearchSpec messageSearchSpec;
    	for (int i = 0; j < end; i++) {	
    		newStart = i;
			if (i >= hits.getLength()) break;
			logger.debug("create  messageSearchSpec collection");
			ForumMessage smessage = (ForumMessage) hits.data(i);
			messageSearchSpec = messageQueryDao.getMessageSearchSpec(smessage.getMessageId());
			if (messageSearchSpec.isRoot()){
				j++;
			}
			
		}
    	return newStart;
    }
    
    
}

⌨️ 快捷键说明

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