/** * Copyright (C) 2016 by Johan von Forstner under the MIT license: * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and * associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or * substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package de.geeksfactory.opacclient.objects; import org.joda.time.LocalDate; import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.ISODateTimeFormat; /** * Represents a copy of a medium ({@link DetailedItem}) available in a library. */ public class Copy { private String barcode; private String location; private String department; private String branch; private String status; private LocalDate returnDate; private String reservations; private String shelfmark; private String resInfo; private String url; /** * @return The barcode of a copy. Optional. */ public String getBarcode() { return barcode; } /** * @param barcode The barcode of a copy. Optional. */ public void setBarcode(String barcode) { this.barcode = barcode; } /** * @return The location (like "third floor") of a copy. Optional. */ public String getLocation() { return location; } /** * @param location The location (like "third floor") of a copy. Optional. */ public void setLocation(String location) { this.location = location; } /** * @return The department (like "music library") of a copy. Optional. */ public String getDepartment() { return department; } /** * @param department The department (like "music library") of a copy. Optional. */ public void setDepartment(String department) { this.department = department; } /** * @return The branch a copy is in. Should be set, if your library has more than one branch. */ public String getBranch() { return branch; } /** * @param branch The branch a copy is in. Should be set, if your library has more than one * branch. */ public void setBranch(String branch) { this.branch = branch; } /** * @return Current status of a copy ("lent", "free", ...). Should be set. */ public String getStatus() { return status; } /** * @param status Current status of a copy ("lent", "free", ...). Should be set. */ public void setStatus(String status) { this.status = status; } /** * @return Expected date of return if a copy is lent out. Optional. */ public LocalDate getReturnDate() { return returnDate; } /** * @param returndate Expected date of return if a copy is lent out. Optional. */ public void setReturnDate(LocalDate returndate) { this.returnDate = returndate; } /** * @return Number of pending reservations if a copy is currently lent out. Optional. */ public String getReservations() { return reservations; } /** * @param reservations Number of pending reservations if a copy is currently lent out. * Optional. */ public void setReservations(String reservations) { this.reservations = reservations; } /** * @return Identification in the libraries' shelf system. Optional. */ public String getShelfmark() { return shelfmark; } /** * @param shelfmark Identification in the libraries' shelf system. Optional. */ public void setShelfmark(String shelfmark) { this.shelfmark = shelfmark; } /** * @return Reservation information for copy-based reservations. Intended for use in your {@link * de.geeksfactory.opacclient.apis.OpacApi#reservation(DetailedItem, Account, int, String)} * implementation. */ public String getResInfo() { return resInfo; } /** * @param resInfo Reservation information for copy-based reservations. Intended for use in your * {@link de.geeksfactory.opacclient.apis.OpacApi#reservation (DetailedItem, * Account, int, String)} implementation. */ public void setResInfo(String resInfo) { this.resInfo = resInfo; } /** * @return URL to an online copy */ public String getUrl() { return url; } /** * @param url URL to an online copy */ public void setUrl(String url) { this.url = url; } /** * Set property using the following keys: barcode, location, department, branch, status, * returndate, reservations, signature, resinfo, url * * If you supply an invalid key, an {@link IllegalArgumentException} will be thrown. * * This method is used to simplify refactoring of old APIs from the Map<String, String> data * structure to this class. If you are creating a new API, you probably don't need to use it. * * @param key one of the keys mentioned above * @param value the value to set. Dates must be in ISO-8601 format (yyyy-MM-dd). */ public void set(String key, String value) { switch (key) { case "barcode": setBarcode(value); break; case "location": setLocation(value); break; case "department": setDepartment(value); break; case "branch": setBranch(value); break; case "status": setStatus(value); break; case "returndate": setReturnDate(new LocalDate(value)); break; case "reservations": setReservations(value); break; case "signature": setShelfmark(value); break; case "resinfo": setResInfo(value); break; case "url": setUrl(value); break; default: throw new IllegalArgumentException("key unknown"); } } /** * Set property using the following keys: barcode, location, department, branch, status, * returndate, reservations, signature, resinfo, url * * For "returndate", the given {@link DateTimeFormatter} will be used to parse the date. * * If you supply an invalid key, an {@link IllegalArgumentException} will be thrown. * * This method is used to simplify refactoring of old APIs from the Map<String, String> data * structure to this class. If you are creating a new API, you probably don't need to use it. * * @param key one of the keys mentioned above * @param value the value to set. Dates must be in a format parseable by the given {@link * DateTimeFormatter}, otherwise an {@link IllegalArgumentException} will be * thrown. * @param fmt the {@link DateTimeFormatter} to use for parsing dates */ public void set(String key, String value, DateTimeFormatter fmt) { if (key.equals("returndate")) { if (!value.isEmpty()) { setReturnDate(fmt.parseLocalDate(value)); } } else { set(key, value); } } /** * Get property using the following keys: barcode, location, department, branch, status, * returndate, reservations, signature, resinfo, url * * Dates will be returned in ISO-8601 format (yyyy-MM-dd). If you supply an invalid key, an * {@link IllegalArgumentException} will be thrown. * * This method is used to simplify refactoring of old APIs from the Map<String, String> data * structure to this class. If you are creating a new API, you probably don't need to use it. * * @param key one of the keys mentioned above */ public String get(String key) { switch (key) { case "barcode": return getBarcode(); case "location": return getLocation(); case "department": return getDepartment(); case "branch": return getBranch(); case "status": return getStatus(); case "returndate": return ISODateTimeFormat.date().print(getReturnDate()); case "reservations": return getReservations(); case "signature": return getShelfmark(); case "resinfo": return getResInfo(); case "url": return getUrl(); default: throw new IllegalArgumentException("key unknown"); } } /** * @return boolean value indicating if this copy contains any data or not. */ public boolean notEmpty() { return getBarcode() != null || getLocation() != null || getDepartment() != null || getBranch() != null || getStatus() != null || getReturnDate() != null || getReservations() != null || getShelfmark() != null || getResInfo() != null || getUrl() != null; } @Override public String toString() { return "Copy{" + "barcode='" + barcode + '\'' + ", location='" + location + '\'' + ", department='" + department + '\'' + ", branch='" + branch + '\'' + ", status='" + status + '\'' + ", returnDate=" + returnDate + ", reservations='" + reservations + '\'' + ", shelfmark='" + shelfmark + '\'' + ", resInfo='" + resInfo + '\'' + ", url='" + url + '\'' + '}'; } }