/** * 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.holding; import biblivre3.cataloging.bibliographic.BiblioSearchBO; import biblivre3.cataloging.bibliographic.RecordDTO; import biblivre3.circulation.CirculationBO; import biblivre3.circulation.UserDTO; import biblivre3.circulation.lending.LendingBO; import biblivre3.enums.Availability; import biblivre3.enums.Database; import biblivre3.enums.HoldingSave; import biblivre3.enums.MaterialType; import biblivre3.enums.RecordStatus; import biblivre3.marcutils.Indexer; import biblivre3.marcutils.MarcReader; import biblivre3.marcutils.MarcUtils; import biblivre3.utils.ApplicationConstants; import biblivre3.utils.TextUtils; import java.util.Properties; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import mercury.ErrorDTO; import mercury.IFJson; import mercury.LoginDTO; import mercury.BaseHandler; import mercury.RootJsonHandler; import mercury.SuccessDTO; import org.apache.commons.lang.StringUtils; import org.json.JSONObject; import org.marc4j_2_3_1.marc.Record; public class JsonHoldingHandler extends RootJsonHandler { @Override public JSONObject process(HttpServletRequest request, HttpServletResponse response) { String submitButton = request.getParameter("submitButton"); Properties properties = BaseHandler.getI18nProperties(request, "biblivre3"); IFJson dto = null; if (submitButton == null || submitButton.isEmpty()) { } else if (submitButton.equals("open")) { dto = getHoldingRecord(request); } else if (submitButton.equals("switch")) { dto = switchRecord(request); } else if (submitButton.equals("save")) { dto = save(request); } else if (submitButton.equals("delete")) { dto = delete(request); } else if (submitButton.equals("generate_label")) { dto = generateLabel(request); } else if (submitButton.equals("create_automatic_holding")) { dto = createAutomaticHolding(request); } else if (submitButton.equals("get_next_location")) { dto = getNextLocation(request); } return dto.toJSONObject(properties); } private IFJson getHoldingRecord(HttpServletRequest request) { int holdingSerial = 0; try { holdingSerial = Integer.parseInt(request.getParameter("holding_id")); } catch (Exception e) { return new ErrorDTO("ERROR_INVALID_NUMERIC_PARAMETER", "error"); } String type = TextUtils.sanitize(request.getParameter("type"), "holding_form"); final HoldingBO bo = new HoldingBO(); final HoldingDTO dto = bo.getById(holdingSerial); final Record record = MarcUtils.iso2709ToRecord(dto.getIso2709()); if (type.equals("holding_marc")) { dto.setMarc(MarcReader.iso2709ToMarc(dto.getIso2709())); } else if (type.equals("holding_form")) { dto.setJson(MarcUtils.recordToJson(record)); } return dto; } private IFJson getNextLocation(HttpServletRequest request) { int recordSerial = 0; try { recordSerial = Integer.parseInt(request.getParameter("record_id")); } catch (Exception e) { return new ErrorDTO("ERROR_INVALID_NUMERIC_PARAMETER", "error"); } final BiblioSearchBO bo = new BiblioSearchBO(); final RecordDTO rdto = bo.getById(recordSerial); final LocationDTO ldto = new LocationDTO(); if (rdto != null) { final Record record = MarcUtils.iso2709ToRecord(rdto.getIso2709()); final String[] location = Indexer.listLocation(record); final HoldingBO holdingBo = new HoldingBO(); ldto.setLocationA(location[0]); ldto.setLocationB(location[1]); ldto.setLocationC(location[2]); ldto.setLocationD(holdingBo.getNextLocationD(recordSerial)); } return ldto; } private IFJson switchRecord(HttpServletRequest request) { String from = request.getParameter("from"); String to = request.getParameter("to"); String data = request.getParameter("data"); String serial = request.getParameter("serial"); RecordStatus status = RecordStatus.NEW; if (StringUtils.isNotBlank(serial) && !serial.equals("0")) { status = RecordStatus.CORRECTED; } int availability = 0; try { availability = Integer.parseInt(request.getParameter("available")); } catch (Exception e) { return new ErrorDTO("ERROR_INVALID_NUMERIC_PARAMETER", "error"); } HoldingDTO dto = new HoldingDTO(); dto.setAvailability(Availability.values()[availability]); Record record = null; try { if (from.equals("holding_marc")) { record = MarcReader.marcToRecord(data, MaterialType.HOLDINGS, status); } else if (from.equals("holding_form")) { record = MarcUtils.jsonToRecord(new JSONObject(data), MaterialType.HOLDINGS, status); } if (to.equals("holding_marc")) { String iso2709 = MarcUtils.recordToIso2709(record); dto.setMarc(MarcReader.iso2709ToMarc(iso2709)); } else if (to.equals("holding_form")) { dto.setJson(MarcUtils.recordToJson(record)); } } catch (Exception e) { return new ErrorDTO("ERROR_MARC_SWITCH", "warning"); } return dto; } private IFJson save(final HttpServletRequest request) { String dataType = request.getParameter("type"); String data = request.getParameter("data"); if (StringUtils.isBlank(dataType)) { return new ErrorDTO("ERROR_INVALID_REQUIRED_PARAMETER", "warning"); } int holdingSerial = 0; try { holdingSerial = Integer.parseInt(request.getParameter("holding_id")); } catch (Exception e) { return new ErrorDTO("ERROR_INVALID_NUMERIC_PARAMETER", "error"); } int recordSerial = 0; try { recordSerial = Integer.parseInt(request.getParameter("record_id")); } catch (Exception e) { return new ErrorDTO("ERROR_INVALID_NUMERIC_PARAMETER", "error"); } int availability = 0; try { availability = Integer.parseInt(request.getParameter("available")); } catch (Exception e) { return new ErrorDTO("ERROR_INVALID_NUMERIC_PARAMETER", "error"); } Database base = Database.valueOf(request.getParameter("base")); RecordStatus status = RecordStatus.NEW; if (holdingSerial != 0) { status = RecordStatus.CORRECTED; } String marc = null; try { if (dataType.equals("holding_form")) { Record record = MarcUtils.jsonToRecord(new JSONObject(data), MaterialType.HOLDINGS, status); marc = MarcReader.iso2709ToMarc(MarcUtils.recordToIso2709(record)); } else if (dataType.equals("holding_marc")) { marc = data; } } catch (Exception e) { return new ErrorDTO("ERROR_SAVE_HOLDING", "error"); } LoginDTO ldto = (LoginDTO) request.getSession().getAttribute("LOGGED_USER"); UserDTO user = new CirculationBO().searchByLoginId(ldto.getLoginId()); HoldingBO bo = new HoldingBO(user); HoldingSave result; if (status.equals(RecordStatus.NEW)) { result = bo.insert(recordSerial, base, marc, Availability.values()[availability]); } else { result = bo.update(holdingSerial, recordSerial, marc, Availability.values()[availability]); } switch (result) { case SUCCESS: return new SuccessDTO(holdingSerial == 0 ? "SUCCESS_CREATE_HOLDING" : "SUCCESS_UPDATE_HOLDING"); case SUCCESS_WITH_NEW_ASSET_HOLDING: return new SuccessDTO(holdingSerial == 0 ? "SUCCESS_CREATE_HOLDING_NEW_ASSET" : "SUCCESS_UPDATE_HOLDING_NEW_ASSET"); case ASSET_HOLDING_ALREADY_IN_USE: return new ErrorDTO("ERROR_ASSET_HOLDING_ALREADY_IN_USE", "warning"); default: return new ErrorDTO("ERROR_SAVE_HOLDING", "warning"); } } private IFJson delete(final HttpServletRequest request) { int holdingSerial = 0; try { holdingSerial = Integer.parseInt(request.getParameter("holding_id")); } catch (Exception e) { return new ErrorDTO("ERROR_INVALID_NUMERIC_PARAMETER", "error"); } HoldingDTO dto = new HoldingDTO(); dto.setSerial(holdingSerial); LendingBO lbo = new LendingBO(); if (lbo.isLent(dto) || lbo.wasLent(dto)) { return new ErrorDTO("MESSAGE_DELETE_HOLDING_ERROR", "warning"); } HoldingBO bo = new HoldingBO(); if (bo.delete(dto)) { return new SuccessDTO("SUCCESS_REMOVE_RECORD"); } else { return new ErrorDTO("ERROR_REMOVE_RECORD", "warning"); } } private IFJson generateLabel(HttpServletRequest request) { int holdingSerial = 0; try { holdingSerial = Integer.parseInt(request.getParameter("holding_id")); } catch (Exception e) { return new ErrorDTO("ERROR_INVALID_NUMERIC_PARAMETER", "error"); } int recordSerial = 0; try { recordSerial = Integer.parseInt(request.getParameter("record_id")); } catch (Exception e) { return new ErrorDTO("ERROR_INVALID_NUMERIC_PARAMETER", "error"); } BiblioSearchBO bsbo = new BiblioSearchBO(); HoldingBO bo = new HoldingBO(); RecordDTO rdto = bsbo.getById(recordSerial); HoldingDTO hdto = bo.getById(holdingSerial); if (bo.generateLabel(holdingSerial, recordSerial, rdto, hdto)) { return new SuccessDTO("SUCCESS_CREATE_RECORD"); } else { return new ErrorDTO("ERROR", "warning"); } } private IFJson createAutomaticHolding(HttpServletRequest request) { int recordSerial = 0; try { recordSerial = Integer.parseInt(request.getParameter("record_id")); } catch (Exception e) { return new ErrorDTO("ERROR_INVALID_NUMERIC_PARAMETER", "error"); } Database base = Database.valueOf(request.getParameter("base")); final String[] ex_auto = new String[6]; ex_auto[0] = request.getParameter("quant"); ex_auto[1] = request.getParameter("nvol"); ex_auto[2] = request.getParameter("nvol_obra"); ex_auto[3] = request.getParameter("biblio_dep"); ex_auto[4] = request.getParameter("aquis"); ex_auto[5] = request.getParameter("dt_tomb"); LoginDTO ldto = (LoginDTO)request.getSession().getAttribute("LOGGED_USER"); UserDTO user = new CirculationBO().searchByLoginId(ldto.getLoginId()); BiblioSearchBO bsbo = new BiblioSearchBO(); HoldingBO bo = new HoldingBO(user); RecordDTO dto = bsbo.getById(recordSerial); Record record = MarcUtils.iso2709ToRecord(dto.getIso2709()); if (bo.createAutomaticHolding(record, base, recordSerial, Availability.AVAILABLE, ex_auto)) { return new SuccessDTO("SUCCESS_CREATE_RECORD"); } else { return new ErrorDTO("ERROR", "warning"); } } }