001 package videoautomat.transition;
002 import sale.Gate;
003 import sale.SaleProcess;
004 import sale.Transition;
005 import users.User;
006 import videoautomat.SaleProcessRent;
007 import videoautomat.VideoShop;
008 import data.BasketEntryValue;
009 import data.CatalogItem;
010 import data.DataBasket;
011 import data.DataBasketEntry;
012 import data.IntegerValue;
013 import data.NumberValue;
014 import data.QuoteValue;
015 import data.Value;
016 import data.events.VetoException;
017
018 /**
019 * <code>Transition</code> that sums up the prices of the selected videos and leads to the
020 * {@link SaleProcessRent#getPayGate()}, if no video is selected it leads to the
021 * {@link SaleProcessRent#getInitialGate()}
022 *
023 * @author Tobias Ruch
024 */
025 public class RentSumUpTransition implements Transition {
026
027 /**
028 * Performes the transition.
029 * @param sp - current process
030 * @param user - current user of this process
031 *
032 * @return the new <code>Gate</code> which should be shown after the transition
033 */
034 public Gate perform(SaleProcess sp, User user) {
035
036
037 NumberValue nv_sum = (NumberValue) sp.getBasket().sumSubBasket(
038 SaleProcessRent.SUB_SHOP_VIDEO,
039 null,
040 new SumBasketEntryValue(sp.getBasket()),
041 new IntegerValue(0));
042 sp.getContext().setProcessData(SaleProcessRent.SUM_KEY, nv_sum);
043 if (nv_sum.isAddZero()){
044 return ((SaleProcessRent)sp).restart();
045 }
046
047 sp.getBasket().setCurrentSubBasket(SaleProcessRent.SUB_TMP_MONEY);
048 return ((SaleProcessRent)sp).getPayGate();
049 }
050
051 /**
052 * Inner class to create a <code>BasketEntryValue</code> implemenation
053 * and to avoid anonymous classes and inline declarations.
054 *
055 * @author Tobias Ruch
056 */
057 private static class SumBasketEntryValue implements BasketEntryValue{
058 /** DataBasket which sould be summed */
059 private DataBasket dataBasket;
060
061 /**
062 * Creates a new instance
063 * @param db - DataBasket, which should be summed up.
064 */
065 public SumBasketEntryValue(DataBasket db){
066 this.dataBasket = db;
067 }
068
069 public Value getEntryValue(DataBasketEntry dbe) {
070 try {
071 CatalogItem ci = VideoShop.getVideoCatalog().get(
072 dbe.getSecondaryKey(),null, false);
073
074 int count = ((Integer) dbe.getValue()).intValue();
075
076 return ((QuoteValue) ci.getValue()).getOffer().multiply(count);
077
078 } catch (VetoException e) {
079 e.printStackTrace();
080 dataBasket.rollback();
081 }
082 return null;
083 }
084 }
085 }