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