/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package openbook.domain; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.Version; /** * A mutable persistent entity. * * @author Pinaki Poddar * */ @SuppressWarnings("serial") @Entity public class Inventory implements Serializable { @Id @OneToOne(fetch=FetchType.EAGER, optional=false) private Book book; private int supplied; private int sold; protected Inventory() { } /** * Construct with the given Book and initial inventory count. * Package protected because only a Book can create its own inventory. * * @param book non-null Book. * @param initialSupply must be greater than zero. */ Inventory(Book book, int initialSupply) { if (book == null) throw new NullPointerException("Can not create inventory for null Book"); if (initialSupply < 1) throw new IllegalArgumentException("Can not create inventory " + initialSupply + " for " + book + " Initial inventory must be greater than zero."); this.book = book; increment(initialSupply); } /** * Gets the Book that this inventory represents. * * @return non-null Book. */ public Book getBook() { return book; } /** * Gets the available quantity. * This is an <em>in-flight</em> value representing the difference between the quantity supplied and quantity sold * so far. */ public int getInStock() { return supplied - sold; } /** * Gets the quantity supplied so far. * * @return a monotonically increasing positive number. */ public int getSupplied() { return supplied; } /** * Gets the quantity sold so far. * * @return a monotonically increasing positive number. */ public int getSold() { return sold; } /** * Increment this inventory by the given quantity. * * @param supplied must be positive. */ public void increment(int supplied) { if (supplied < 1) throw new IllegalArgumentException("Can not add " + supplied + " supplies to " + this + " Suuplied quanlity must be greater than zero."); this.supplied += supplied; } /** * Decrement this inventory by the given quantity. * * @param sold must be positive. */ public void decrement(int sold) { if (sold < 1) throw new IllegalArgumentException("can not sell " + sold + "quantity to " + this + "Sold quantity Must be greater than zero."); this.sold += sold; } @Version private int version; public int getVersion() { return version; } }