/** * Este arquivo é parte do Biblivre3. * * Biblivre3 é um software livre; você pode redistribuí-lo e/ou * modificá-lo dentro dos termos da Licença Pública Geral GNU como * publicada pela Fundação do Software Livre (FSF); na versão 3 da * Licença, ou (caso queira) qualquer versão posterior. * * Este programa é distribuído na esperança de que possa ser útil, * mas SEM NENHUMA GARANTIA; nem mesmo a garantia implícita de * MERCANTIBILIDADE OU ADEQUAÇÃO PARA UM FIM PARTICULAR. Veja a * Licença Pública Geral GNU para maiores detalhes. * * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto * com este programa, Se não, veja em <http://www.gnu.org/licenses/>. * * @author Alberto Wagner <alberto@biblivre.org.br> * @author Danniel Willian <danniel@biblivre.org.br> * */ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package biblivre3.z3950; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; import org.jzkit.search.LandscapeSpecification; import org.jzkit.search.SearchSession; import org.jzkit.search.landscape.SimpleLandscapeSpecification; import org.jzkit.search.util.QueryModel.QueryModel; import org.jzkit.search.util.RecordModel.ArchetypeRecordFormatSpecification; import org.jzkit.search.util.RecordModel.RecordFormatSpecification; import org.jzkit.search.util.ResultSet.IRResultSetStatus; import org.jzkit.search.util.ResultSet.RSStatusMaskCondition; import org.jzkit.search.util.ResultSet.TransformingIRResultSet; import org.jzkit.z3950.QueryModel.Type1QueryModel; import org.jzkit.z3950.gen.v3.Z39_50_APDU_1995.RPNQuery_type; import org.jzkit.z3950.server.BackendPresentResult; import org.jzkit.z3950.server.BackendSearchResult; import org.jzkit.z3950.server.Z3950NonBlockingBackend; import org.jzkit.z3950.server.ZServerAssociation; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class JZKitBackend implements Z3950NonBlockingBackend, ApplicationContextAware { Logger log = Logger.getLogger(this.getClass().getName()); ApplicationContext ctx = null; private transient SearchSession search_session = null; private Map result_sets = new HashMap(); private static final RecordFormatSpecification SPEC = new ArchetypeRecordFormatSpecification("F"); public JZKitBackend() {} @Override public void search(BackendSearchResult bsr) { checkSearchSession(); QueryModel qm = new Type1QueryModel((RPNQuery_type) (bsr.query.o)); LandscapeSpecification ls = new SimpleLandscapeSpecification(bsr.database_names); try { TransformingIRResultSet active_result_set = search_session.search(ls, qm, null, null, SPEC); bsr.search_status = true; bsr.result_count = 0; if ((bsr.result_set_name != null) && (bsr.result_set_name.length() > 0)) { result_sets.put(bsr.result_set_name, active_result_set); } else { result_sets.put("default", active_result_set); } if (active_result_set.waitForCondition(new RSStatusMaskCondition(IRResultSetStatus.COMPLETE | IRResultSetStatus.FAILURE), 10000)) { bsr.result_count = active_result_set.getFragmentCount(); } else { // timeout... bsr.search_status = false; } } catch (org.jzkit.search.util.ResultSet.IRResultSetException irrse) { log.error(irrse.getMessage(), irrse); bsr.search_status = false; } catch (org.jzkit.search.SearchException se) { log.error(se.getMessage(), se); bsr.search_status = false; } catch (Exception e) { log.error(e.getMessage(), e); bsr.search_status = false; } bsr.assoc.notifySearchResult(bsr); } /** * Implementor must call assoc.notifyPresentResult(result); */ @Override public void present(BackendPresentResult bpr) { try { TransformingIRResultSet rs = (TransformingIRResultSet) result_sets.get(bpr.result_set_name); if (rs != null) { bpr.result_records = rs.getFragment(bpr.start, bpr.count, bpr.archetype); bpr.next_result_set_position = bpr.start + bpr.count; } } catch (org.jzkit.search.util.ResultSet.IRResultSetException irrse) { irrse.printStackTrace(); } bpr.assoc.notifyPresentResult(bpr); } /** * Implementor must call assoc.notifyDeleteResultSetResult(result); */ @Override public void deleteResultSet(ZServerAssociation assoc, String result_set_name, Object refid) {} @Override public void setApplicationContext(ApplicationContext ctx) { this.ctx = ctx; } private synchronized void checkSearchSession() { search_session = (org.jzkit.search.impl.SearchSessionImpl) ctx.getBean("SearchService"); } }