/** * 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> * */ package biblivre3.z3950; import biblivre3.cataloging.bibliographic.BiblioDAO; import biblivre3.cataloging.bibliographic.BiblioSearchBO; import com.k_int.sql.data_dictionary.EntityTemplate; import com.k_int.sql.data_dictionary.OID; import com.k_int.sql.data_dictionary.UnknownCollectionException; import java.sql.Connection; import java.sql.ResultSet; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Observer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jzkit.search.provider.iface.IRQuery; import org.jzkit.search.provider.jdbc.JDBCSearchable; import org.jzkit.search.util.QueryModel.Internal.AttrPlusTermNode; import org.jzkit.search.util.QueryModel.Internal.InternalModelNamespaceNode; import org.jzkit.search.util.ResultSet.IRResultSet; import org.jzkit.search.util.ResultSet.IRResultSetStatus; import org.springframework.context.ApplicationContext; /** * * @author Danniel */ public class BiblivreJDBCSearchable extends JDBCSearchable { private static Log log = LogFactory.getLog(JDBCSearchable.class); private String datasource_name = "z3950DataSource"; private String dictionary_name = "persistenceDictionary"; private com.k_int.sql.data_dictionary.Dictionary dictionary = null; private ApplicationContext ctx = null; private boolean setup_completed = false; private static final HashMap<String, String> accessPointMap; static { accessPointMap = new HashMap<String, String>(); accessPointMap.put("bib-1.1.1", "AUTHOR"); accessPointMap.put("bib-1.1.1003", "AUTHOR"); accessPointMap.put("bib-1.1.4", "TITLE"); accessPointMap.put("bib-1.1.21", "SUBJECT"); accessPointMap.put("bib-1.1.7", "ISBN"); accessPointMap.put("bib-1.1.8", "ISSN"); accessPointMap.put("bib-1.1.1016", "ANY"); accessPointMap.put("bib-1.1.1036", "ANY"); } public BiblivreJDBCSearchable() { } @Override public void close() { super.close(); } @Override public IRResultSet evaluate(IRQuery q) { return evaluate(q, null); } @Override public IRResultSet evaluate(IRQuery q, Object user_info) { return evaluate(q, user_info, null); } @Override public IRResultSet evaluate(IRQuery q, Object user_info, Observer[] observers) { checkSetup(); log.info("create JDBC Result Set"); JDBCResultSet result = new JDBCResultSet(this); try { result.init(); AttrPlusTermNode aptn = (AttrPlusTermNode) ((InternalModelNamespaceNode) q.query.toInternalQueryModel(ctx).getChild()).getChild(); String accessPoint = aptn.getAccessPoint().toString(); String term = (String) aptn.getTerm(); String[] searchTerms = new String[1]; String[] searchAttr = new String[1]; String[] boolOp = new String[1]; searchTerms[0] = term.replaceAll("[\\[\\]\\,]", ""); searchAttr[0] = accessPointMap.get(accessPoint); BiblioSearchBO bo = new BiblioSearchBO(); Object[] tuple = bo.createWhereClause(searchTerms, searchAttr, boolOp); if (tuple == null) { result.setStatus(IRResultSetStatus.FAILURE); return result; } final String clause = (String) tuple[0]; final List<String> values = (ArrayList<String>) tuple[1]; BiblioDAO dao = new BiblioDAO(); Object[] rc = dao.searchFromZ3950(clause, values, 0, 200); if (rc == null) { result.setStatus(IRResultSetStatus.FAILURE); return result; } Connection c = (Connection) rc[0]; ResultSet r = (ResultSet) rc[1]; if (r == null || c == null) { result.setStatus(IRResultSetStatus.FAILURE); return result; } EntityTemplate et = dictionary.lookup("Records"); while (r.next()) { OID key = new OID(datasource_name, "Records", new BiblivreEntityKey(et, r)); result.add(key); } r.close(); c.close(); result.setStatus(IRResultSetStatus.COMPLETE); } catch (UnknownCollectionException unknown_collection_exception) { log.warn("problem evaluating query ", unknown_collection_exception); result.setStatus(IRResultSetStatus.FAILURE); } catch (java.sql.SQLException sqle) { result.setStatus(IRResultSetStatus.FAILURE); } catch (Exception e) { result.setStatus(IRResultSetStatus.FAILURE); } finally { log.info("evaluate complete"); } return result; } /* @Override public void setRecordArchetypes(Map archetypes) { this.archetypes = archetypes; } @Override public Map getRecordArchetypes() { return archetypes; } @Override public void setDatasourceName(String datasource_name) { this.datasource_name = datasource_name; } @Override public String getDataSourceName() { return datasource_name; } @Override public void setDictionaryName(String dictionary_name) { this.dictionary_name = dictionary_name; } @Override public String getDictionaryName() { return dictionary_name; } @Override public void setAccessPathsConfigName(String access_paths_config_name) { this.access_paths_config_name = access_paths_config_name; } @Override public String getAccessPathsConfigName() { return access_paths_config_name; } @Override public void setTemplatesConfigName(String templates_config_name) { this.templates_config_name = templates_config_name; } @Override public String getTemplatesConfigName() { return templates_config_name; } @Override public void setSQLDialect(String sql_dialect) { this.sql_dialect = sql_dialect; } @Override public String getSQLDialect() { return sql_dialect; } */ private synchronized void checkSetup() { if (!setup_completed) { try { this.dictionary = (com.k_int.sql.data_dictionary.Dictionary) ctx.getBean(dictionary_name); setup_completed = true; } catch (Exception e) { } } } @Override public void setApplicationContext(ApplicationContext ctx) { this.ctx = ctx; } }