/*
* 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.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.OrderColumn;
/**
* An immutable persistent entity with complex primary key.
* The primary key is combination of the primary identity of {@linkplain PurchaseOrder} and
* an 1-based integer index.
*
* @author Pinaki Poddar
*
*/
@SuppressWarnings("serial")
@Entity
@IdClass(LineItem.LineItemId.class)
public class LineItem implements Serializable {
/**
* <A name="order">
* An example of a compound derived identity.
*/
@Id
@OneToOne
private PurchaseOrder order;
@Id
@OrderColumn
@Column(name="IDX") // index is keyword
private int index;
@ManyToOne(optional=false)
private Book book;
private int quantity;
protected LineItem() {
}
/**
* Constructed as a line item for the given PurchaseOrder for the given Book for the given quantity.
* Package protected because only the PurchaseOrder can create its own LineItem.
*
* @param order non-null PurchaseOrder
* @param i the 1-based index of this line item in its parent PurchaseOrder
* @param book non-null Book of this line item
* @param quantity no. of books must be greater than zero.
*/
LineItem(PurchaseOrder order, int i, Book book, int quantity) {
if (order == null)
throw new NullPointerException("Can not create LineItem for null PurchaseOrder");
if (i < 1)
throw new IllegalArgumentException("Can not create LineItem with index " + i + ". Must be > 0");
if (book == null)
throw new NullPointerException("Can not create LineItem for null Book");
if (quantity < 1)
throw new IllegalArgumentException("Can not create LineItem with quantity " + i + ". Must be > 0");
this.order = order;
this.index = i;
this.book = book;
this.quantity = quantity;
}
/**
* Gets the Book for this line item.
* @return non-null Book.
*/
public Book getBook() {
return book;
}
/**
* Gets the quantity of the book for this line item.
* @return a positive number.
*/
public int getQuantity() {
return quantity;
}
/**
* Gets the parent PurchaseOrder of this line item.
* @return non-null PurchaseOrder.
*/
public PurchaseOrder getOrder() {
return order;
}
/**
* Gets the 1-based index this line item in its parent PurchaseOrder.
* @return index must be greater than zero.
*/
public int getIndex() {
return index;
}
/**
* Separate identity class.
*
* @author Pinaki Poddar
*
*/
public static class LineItemId implements Serializable {
long order;
int index;
@Override
public boolean equals(Object other) {
if (other == this)
return true;
if (other instanceof LineItemId) {
LineItemId that = (LineItemId)other;
return order == that.order && index == that.index;
}
return false;
}
@Override
public int hashCode() {
return (int) (31 ^ order + index);
}
}
}