package org.springframework.samples.jpetstore.domain.logic;
import java.util.List;
import org.springframework.samples.jpetstore.dao.AccountDao;
import org.springframework.samples.jpetstore.dao.CategoryDao;
import org.springframework.samples.jpetstore.dao.ItemDao;
import org.springframework.samples.jpetstore.dao.OrderDao;
import org.springframework.samples.jpetstore.dao.ProductDao;
import org.springframework.samples.jpetstore.domain.Account;
import org.springframework.samples.jpetstore.domain.Category;
import org.springframework.samples.jpetstore.domain.Item;
import org.springframework.samples.jpetstore.domain.Order;
import org.springframework.samples.jpetstore.domain.Product;
/**
* JPetStore's business layer facade.
*
* <p>This object makes use of five DAO objects, decoupling it from the
* details of working with persistence APIs. Therefore, although this
* application uses iBATIS for data access, a different persistence
* strategy could be incorporated without breaking this class.
*
* <p>The DAOs are made available to the instance of this object
* using Dependency Injection. (The DAOs are in turn configured
* using Dependency Injection.) We use Setter Injection here,
* exposing JavaBean setter methods for each DAO. This means there is
* a JavaBean "property" for each DAO. In this case the properties
* are write-only: there is no getter method to accompany the setter
* methods. Getter methods are optional: implement them only if you
* want to expose access to the properties in your business object.
*
* <p>There is one instance of this class in the JPetStore application.
* In Spring terminology, it is a "singleton". This means a singleton
* per Spring Application Context instance. The factory creates a
* single instance; there is no need for a private constructor,
* static factory method etc as in the traditional implementation
* of the Singleton Design Pattern.
*
* <p>This is a POJO. It does not depend on any Spring APIs.
* It is usable outside a Spring container, and can be instantiated
* using new in a JUnit test. However, we can still apply declarative
* transaction management to it using Spring AOP.
*
* <p>This class defines a default transaction attribute for all methods.
* Note that this attribute definition is only necessary if using Commons
* Attributes auto-proxying (see the "attributes" directory under the root of
* JPetStore). No attributes are required with a TransactionFactoryProxyBean;
* see the default <code>applicationContext.xml</code> config file in the
* <code>war/WEB-INF</code> directory for an example.
*
* <p>The following attribute definition uses Commons Attributes attribute syntax.
* @@org.springframework.transaction.interceptor.DefaultTransactionAttribute()
*
* @author Juergen Hoeller
* @since 30.11.2003
*/
public class PetStoreImpl implements PetStoreFacade, OrderService {
private AccountDao accountDao;
private CategoryDao categoryDao;
private ProductDao productDao;
private ItemDao itemDao;
private OrderDao orderDao;
//-------------------------------------------------------------------------
// Setter methods for dependency injection
//-------------------------------------------------------------------------
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
public void setCategoryDao(CategoryDao categoryDao) {
this.categoryDao = categoryDao;
}
public void setProductDao(ProductDao productDao) {
this.productDao = productDao;
}
public void setItemDao(ItemDao itemDao) {
this.itemDao = itemDao;
}
public void setOrderDao(OrderDao orderDao) {
this.orderDao = orderDao;
}
//-------------------------------------------------------------------------
// Operation methods, implementing the PetStoreFacade interface
//-------------------------------------------------------------------------
public Account getAccount(String username) {
return this.accountDao.getAccount(username);
}
public Account getAccount(String username, String password) {
return this.accountDao.getAccount(username, password);
}
public void insertAccount(Account account) {
this.accountDao.insertAccount(account);
}
public void updateAccount(Account account) {
this.accountDao.updateAccount(account);
}
public List getUsernameList() {
return this.accountDao.getUsernameList();
}
public List getCategoryList() {
return this.categoryDao.getCategoryList();
}
public Category getCategory(String categoryId) {
return this.categoryDao.getCategory(categoryId);
}
public List getProductListByCategory(String categoryId) {
return this.productDao.getProductListByCategory(categoryId);
}
public List searchProductList(String keywords) {
return this.productDao.searchProductList(keywords);
}
public Product getProduct(String productId) {
return this.productDao.getProduct(productId);
}
public List getItemListByProduct(String productId) {
return this.itemDao.getItemListByProduct(productId);
}
public Item getItem(String itemId) {
return this.itemDao.getItem(itemId);
}
public boolean isItemInStock(String itemId) {
return this.itemDao.isItemInStock(itemId);
}
public void insertOrder(Order order) {
this.orderDao.insertOrder(order);
this.itemDao.updateQuantity(order);
}
public Order getOrder(int orderId) {
return this.orderDao.getOrder(orderId);
}
public List getOrdersByUsername(String username) {
return this.orderDao.getOrdersByUsername(username);
}
}