1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.jpetstore.domain;
17
18 import java.io.Serializable;
19 import java.math.BigDecimal;
20 import java.util.ArrayList;
21 import java.util.Iterator;
22 import java.util.List;
23 import java.util.Map;
24 import java.util.concurrent.ConcurrentHashMap;
25
26
27
28
29 public class Cart implements Serializable {
30
31
32 private static final long serialVersionUID = 8329559983943337176L;
33
34
35 private final Map<String, CartItem> itemMap = new ConcurrentHashMap<>();
36
37
38 private final List<CartItem> itemList = new ArrayList<>();
39
40
41
42
43
44
45 public Iterator<CartItem> getCartItems() {
46 return itemList.iterator();
47 }
48
49
50
51
52
53
54 public List<CartItem> getCartItemList() {
55 return itemList;
56 }
57
58
59
60
61
62
63 public int getNumberOfItems() {
64 return itemList.size();
65 }
66
67
68
69
70
71
72 public Iterator<CartItem> getAllCartItems() {
73 return itemList.iterator();
74 }
75
76
77
78
79
80
81
82
83
84 public boolean containsItemId(String itemId) {
85 return itemMap.containsKey(itemId);
86 }
87
88
89
90
91
92
93
94
95
96 public void addItem(Item item, boolean isInStock) {
97 CartItem cartItem = itemMap.get(item.getItemId());
98 if (cartItem == null) {
99 cartItem = new CartItem();
100 cartItem.setItem(item);
101 cartItem.setQuantity(0);
102 cartItem.setInStock(isInStock);
103 itemMap.put(item.getItemId(), cartItem);
104 itemList.add(cartItem);
105 }
106 cartItem.incrementQuantity();
107 }
108
109
110
111
112
113
114
115
116
117 public Item removeItemById(String itemId) {
118 CartItem cartItem = itemMap.remove(itemId);
119 if (cartItem == null) {
120 return null;
121 } else {
122 itemList.remove(cartItem);
123 return cartItem.getItem();
124 }
125 }
126
127
128
129
130
131
132
133 public void incrementQuantityByItemId(String itemId) {
134 CartItem cartItem = itemMap.get(itemId);
135 cartItem.incrementQuantity();
136 }
137
138
139
140
141
142
143
144
145
146 public void setQuantityByItemId(String itemId, int quantity) {
147 CartItem cartItem = itemMap.get(itemId);
148 cartItem.setQuantity(quantity);
149 }
150
151
152
153
154
155
156 public BigDecimal getSubTotal() {
157 return itemList.stream()
158 .map(cartItem -> cartItem.getItem().getListPrice().multiply(new BigDecimal(cartItem.getQuantity())))
159 .reduce(BigDecimal.ZERO, BigDecimal::add);
160 }
161
162 }