1
1
package me .smartstore .customer ;
2
2
3
+ import me .smartstore .customer .exception .DuplicateCustomerIdException ;
4
+ import me .smartstore .customer .exception .InvalidCustomerIdException ;
5
+ import me .smartstore .customer .exception .InvalidCustomerNameException ;
3
6
import me .smartstore .group .Group ;
4
7
5
- import java .util .Comparator ;
6
-
7
- public class CustomerRepository {
8
+ public class CustomerRepository extends List <Customer > {
8
9
9
10
private static class InstanceHolder {
10
11
private static final CustomerRepository INSTANCE = new CustomerRepository ();
11
12
}
12
13
public static CustomerRepository getInstance () { return InstanceHolder .INSTANCE ; }
13
14
private CustomerRepository () {}
14
15
15
- private final List <Customer > customerList = new List <>();
16
- private static Customer tempCustomer ;
17
- private static int tempIdx ;
18
-
19
- public void checkIfCanAddMore () throws MaxCapacityReachedException {
20
- customerList .checkIfReachedMaxCapacity ();
21
- }
16
+ private Customer tempCustomer ;
17
+ private int tempIdx ;
22
18
23
- public void resetTempCustomer () {
24
- tempCustomer = new Customer (null , null );
25
- }
19
+ public void resetTempCustomer () { tempCustomer = new Customer (null , null ); }
26
20
27
21
public void checkIfHasNoDuplicate (String id ) throws DuplicateCustomerIdException {
28
22
if (hasCustomerWithId (id ))
29
23
throw new DuplicateCustomerIdException ("The customer already exists which has same id." );
30
24
}
31
25
32
26
private boolean hasCustomerWithId (String id ) {
33
- return findIdxById (id ) >= 0 ;
34
- }
35
-
36
- private int findIdxById (String id ) {
37
27
assert id != null ;
38
-
39
- int size = customerList .size ();
40
- for (int i = 0 ; i < size ; ++i )
41
- if (id .equals (customerList .get (i ).getId ()))
42
- return i ;
43
- return -1 ;
28
+ for (Customer customer : this )
29
+ if (id .equals (customer .getId ()))
30
+ return true ;
31
+ return false ;
44
32
}
45
33
46
34
public void setTempId (String id ) throws InvalidCustomerIdException , DuplicateCustomerIdException {
47
35
Customer .checkIfIdIsValid (id );
48
36
checkIfHasNoDuplicate (id );
49
- tempCustomer .setId (id );
37
+ tempCustomer .setId (id , true );
50
38
}
51
39
52
40
public void setTempName (String name ) throws InvalidCustomerNameException {
53
- Customer .checkIfNameIsValid (name );
54
41
tempCustomer .setName (name );
55
42
}
56
43
57
- public void setTempSpentHours (Integer spentHours ) {
58
- tempCustomer .setSpentHours (spentHours );
59
- }
44
+ public void setTempSpentHours (Integer spentHours ) { tempCustomer .setSpentHours (spentHours ); }
60
45
61
- public void setTempTotalPaidAmount (Integer totalPaidAmount ) {
62
- tempCustomer .setTotalPaidAmount (totalPaidAmount );
63
- }
46
+ public void setTempTotalPaidAmount (Integer totalPaidAmount ) { tempCustomer .setTotalPaidAmount (totalPaidAmount ); }
64
47
65
48
public String getTempInfo () {
66
49
updateGroupOfTempCustomer ();
@@ -70,115 +53,48 @@ public String getTempInfo() {
70
53
public void addTempIntoRepository () {
71
54
// app logic에 따라 다음 두 구문이 true 임을 보장합니다.
72
55
assert tempCustomer != null ;
73
- assert !customerList . isReachedMaxCapacity ();
56
+ assert !isReachedMaxCapacity ();
74
57
75
- customerList . add (tempCustomer );
58
+ add (tempCustomer );
76
59
tempCustomer = null ;
77
60
}
78
61
79
- public boolean isTempIdNull () {
80
- return tempCustomer .getId () == null ;
81
- }
82
-
83
- public int size () {
84
- return customerList .size ();
85
- }
62
+ public boolean isTempIdNull () {return tempCustomer .getId () == null ; }
86
63
87
64
public String deleteAndGetInfoOf (int num ) {
88
65
int idx = num - 1 ;
89
- return customerList . remove (idx ).toString ();
66
+ return remove (idx ).toString ();
90
67
}
91
68
92
69
public String setTempAndGetInfoOf (int num ) {
93
70
int idx = num - 1 ;
94
- Customer updatingCustomer = customerList . get (idx );
71
+ Customer updatingCustomer = get (idx );
95
72
tempCustomer = new Customer (updatingCustomer );
96
73
tempIdx = idx ;
97
74
return updatingCustomer .toString ();
98
75
}
99
76
100
- public void updateTempInRepository () {
101
- customerList .get (tempIdx ).copy (tempCustomer );
102
- }
77
+ public void updateTempInRepository () { get (tempIdx ).copy (tempCustomer ); }
103
78
104
79
public String getUpdateBeforeAndAfterInfo () {
105
- Customer before = customerList . get (tempIdx );
80
+ Customer before = get (tempIdx );
106
81
Customer after = tempCustomer ;
107
82
updateGroupOfTempCustomer ();
108
83
return String .format ("\n No. %2d\n " , tempIdx ) +
109
84
"Before: " + before + '\n' +
110
85
"After : " + after ;
111
86
}
112
87
113
- public void updateGroupOfTempCustomer () {
114
- tempCustomer .updateGroup ();
115
- }
116
-
117
- public String getSummary () {
118
- Group [] groups = Group .values ();
119
- int len = groups .length ;
120
- StringBuilder [] stringBuilders = new StringBuilder [len ];
121
- int [] cnt = new int [len ];
122
- for (int i = 0 ; i < len ; ++i ) {
123
- StringBuilder sb = new StringBuilder ();
124
- sb .append ('\n' ).append ("==============================" )
125
- .append (groups [i ])
126
- .append ("==============================" ).append ('\n' );
127
- stringBuilders [i ] = sb ;
128
- }
129
-
130
- int size = customerList .size ();
131
- for (int i = 0 ; i < size ; ++i ) {
132
- Customer customer = customerList .get (i );
133
- Group group = customer .getGroup ();
134
- for (int j = 0 ; j < len ; ++j ) {
135
- if (group == groups [j ]) {
136
- stringBuilders [j ].append (customer ).append ('\n' );
137
- cnt [j ]++;
138
- break ;
139
- }
140
- }
141
- }
142
-
143
- StringBuilder sb = new StringBuilder ();
144
- for (int i = 0 ; i < len ; ++i ) {
145
- sb .append (stringBuilders [i ]);
146
- if (cnt [i ] == 0 )
147
- sb .append ("No Customers." ).append ('\n' );
148
- }
149
- return sb .append ('\n' ).toString ();
150
- }
151
-
152
- public String getSummaryByName (Order order ) {
153
- Comparator <Customer > cmp = order == Order .ASCENDING ? Customer .ORDER_NAME_ASC
154
- : Customer .ORDER_NAME_DEC ;
155
- customerList .sort (cmp );
156
- return getSummary ();
157
- }
158
-
159
- public String getSummaryBySpentHours (Order order ) {
160
- Comparator <Customer > cmp = order == Order .ASCENDING ? Customer .ORDER_SPENT_HOURS_ASC
161
- : Customer .ORDER_SPENT_HOURS_DEC ;
162
- customerList .sort (cmp );
163
- return getSummary ();
164
- }
165
-
166
- public String getSummaryByTotalPaidAmount (Order order ) {
167
- Comparator <Customer > cmp = order == Order .ASCENDING ? Customer .ORDER_TOTAL_PAID_AMOUNT_ASC
168
- : Customer .ORDER_TOTAL_PAID_AMOUNT_DEC ;
169
- customerList .sort (cmp );
170
- return getSummary ();
171
- }
88
+ public void updateGroupOfTempCustomer () { tempCustomer .updateGroup (); }
172
89
173
90
public void updateGroupIn (Group group ) {
174
91
Group [] groups = Group .values ();
175
92
int idx = 0 ;
176
93
while (groups [idx ] != group )
177
94
idx ++;
95
+ assert idx > 0 ;
178
96
Group rightLowGroup = groups [idx - 1 ];
179
- int size = customerList .size ();
180
- for (int i = 0 ; i < size ; ++i ) {
181
- Customer customer = customerList .get (i );
97
+ for (Customer customer : this ) {
182
98
Group g = customer .getGroup ();
183
99
if (g == group || g == rightLowGroup )
184
100
customer .updateGroup ();
@@ -187,7 +103,7 @@ public void updateGroupIn(Group group) {
187
103
188
104
@ Override
189
105
public String toString () {
190
- if (customerList . isEmpty ()) return "No Customers." + " Please input one first.\n " ;
191
- return customerList .toString ();
106
+ if (isEmpty ()) return "No Customers." + " Please input one first.\n " ;
107
+ return super .toString ();
192
108
}
193
109
}
0 commit comments