/** * 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.cataloging.authorities; import biblivre3.config.Config; import biblivre3.config.ConfigurationEnum; import biblivre3.marcutils.Indexer; import biblivre3.marcutils.MarcUtils; import biblivre3.utils.TextUtils; import java.util.ArrayList; import mercury.BaseBO; import java.util.Collection; import java.util.Arrays; import java.util.Date; import java.util.HashSet; import java.util.Set; import mercury.DTOCollection; import org.apache.commons.lang.StringUtils; import org.marc4j_2_3_1.marc.Record; public class AuthoritiesBO extends BaseBO { private int recordsPPage; private AuthoritiesDAO dao; public AuthoritiesBO() { try { this.recordsPPage = Integer.valueOf(Config.getConfigProperty(ConfigurationEnum.RECORDS_PER_PAGE)); dao = new AuthoritiesDAO(); } catch (Exception e) { log.error(e.getMessage(), e); this.recordsPPage = 25; } } public AuthoritySearchResultsDTO list(int offset) { return this.search(null, offset); } public AuthoritySearchResultsDTO search(String searchTerms, int offset) { AuthoritySearchResultsDTO dto = new AuthoritySearchResultsDTO(); try { dto.al = new ArrayList<AuthoritiesResultRow>(); ArrayList<AuthorityRecordDTO> authorities; String[] searchArray = null; if (searchTerms != null) { searchArray = TextUtils.removeDiacriticals(searchTerms).toLowerCase().split("\\s+"); } if (searchArray == null) { authorities = dao.list(offset, recordsPPage); } else { authorities = dao.search(searchArray, offset, recordsPPage); } if (!authorities.isEmpty()) { for (AuthorityRecordDTO authRecord : authorities) { Record fmRecord = MarcUtils.iso2709ToRecord(authRecord.getIso2709()); AuthoritiesResultRow rr = new AuthoritiesResultRow(); rr.setRecordSerial(String.valueOf(authRecord.getRecordId())); rr.setName(Indexer.listPrimaryAuthor(fmRecord)); rr.setCreated(authRecord.getCreated()); rr.setModified(authRecord.getModified()); dto.al.add(rr); } int total; if (searchTerms == null) { total = dao.countAll(); } else { total = dao.count(searchArray); } int nroPages = total / recordsPPage; int mod = total % recordsPPage; dto.recordsPerPage = recordsPPage; dto.totalRecords = total; dto.totalPages = mod == 0 ? nroPages : nroPages + 1; dto.currentPage = (offset / recordsPPage) + 1; return dto; } } catch (Exception e) { System.out.println("[AUTHBO.searchAuthorities(..)] Exception: " + e); } return null; } public DTOCollection<AuthorityRecordDTO> autoComplete(String query) { DTOCollection<AuthorityRecordDTO> dto = new DTOCollection<AuthorityRecordDTO>(); try { String[] searchArray = null; if (query != null) { searchArray = TextUtils.removeDiacriticals(query).toLowerCase().split("\\s+"); } if (searchArray == null) { return dto; } ArrayList<AuthorityRecordDTO> authorities = dao.search(searchArray, 0, 1000); if (!authorities.isEmpty()) { for (AuthorityRecordDTO adto : authorities) { Record record = MarcUtils.iso2709ToRecord(adto.getIso2709()); adto.setName(Indexer.listPrimaryAuthor(record)); adto.setJson(MarcUtils.recordToJson(record)); dto.add(adto); } return dto; } } catch (Exception e) { System.out.println("[AUTHBO.autoComplete(..)] Exception: " + e); } return dto; } public AuthorityRecordDTO getById(final String serial) { return dao.getById(Integer.valueOf(serial)); } public boolean delete(final String[] recordIds) { final Collection<AuthorityRecordDTO> records = new ArrayList<AuthorityRecordDTO>(); for (String id : recordIds) { final AuthorityRecordDTO dto = new AuthorityRecordDTO(); dto.setRecordId(Integer.valueOf(id)); records.add(dto); } if (dao.delete(records)) { for (AuthorityRecordDTO dto : records) { this.deleteIdx(dto.getRecordId()); } } return true; } public boolean deleteIdx(int recordId) { dao.deleteIdx(recordId); dao.deleteSortIdx(recordId); return true; } public boolean insert(final Record authRecord) { AuthorityRecordDTO dto = new AuthorityRecordDTO(); dto.setIso2709(MarcUtils.recordToIso2709(authRecord)); Date now = new Date(); dto.setCreated(now); dto.setModified(now); return dao.insert(dto) && this.insertIndex(dto, authRecord); } public boolean update(final Record authRecord, int id) { AuthorityRecordDTO dto = new AuthorityRecordDTO(); dto.setRecordId(id); dto.setModified(new Date()); dto.setIso2709(MarcUtils.recordToIso2709(authRecord)); return dao.update(dto) && this.updateIdx(dto, authRecord); } public boolean insertIndex(AuthorityRecordDTO dto, Record record) { try { String primary = Indexer.listPrimaryAuthor(record); String secondary = Indexer.listSecondaryAuthor(record); String otherNames = Indexer.listAuthorOtherNames(record); String[] words = TextUtils.removeDiacriticals(primary + " " + secondary + " " + otherNames).toLowerCase().split("\\s+"); Set<String> wordsSet = new HashSet(Arrays.asList(words)); for (String word : wordsSet) { if (StringUtils.isNotBlank(word) && word.length() >= 2) { dao.insertIdx(dto.getRecordId(), word); } } dao.insertSortIdx(dto.getRecordId(), TextUtils.removeDiacriticals(primary).toLowerCase()); } catch (Exception e) { log.error(e.getMessage(), e); return false; } return true; } public boolean updateIdx(final AuthorityRecordDTO dto, Record authRecord) { return this.deleteIdx(dto.getRecordId()) && this.insertIndex(dto, authRecord); } public void clearAllIndexes() { dao.deleteAllIdx(); dao.deleteAllSortIdx(); } public final boolean reindexBase() { this.clearAllIndexes(); final int limit = 100; final int recordCount = dao.countAll(); for (int offset = 0; offset < recordCount; offset += limit) { ArrayList<AuthorityRecordDTO> records = dao.list(offset, limit); for (AuthorityRecordDTO dto : records) { final Record record = MarcUtils.iso2709ToRecord(dto.getIso2709()); this.insertIndex(dto, record); } } return true; } }