11package me .smartstore .customer ;
22
3+ import me .smartstore .customer .exception .DuplicateCustomerIdException ;
4+ import me .smartstore .customer .exception .InvalidCustomerIdException ;
5+ import me .smartstore .customer .exception .InvalidCustomerNameException ;
36import me .smartstore .group .Group ;
47
5- import java .util .Comparator ;
8+ import java .util .Arrays ;
9+ import java .util .Iterator ;
610
7- public class CustomerRepository {
11+ public class CustomerRepository extends List < Customer > {
812
913 private static class InstanceHolder {
1014 private static final CustomerRepository INSTANCE = new CustomerRepository ();
1115 }
1216 public static CustomerRepository getInstance () { return InstanceHolder .INSTANCE ; }
1317 private CustomerRepository () {}
1418
15- private final List <Customer > customerList = new List <>();
16- private static Customer tempCustomer ;
17- private static int tempIdx ;
19+ private Customer tempCustomer ;
20+ private int tempIdx ;
1821
19- public void checkIfCanAddMore () throws MaxCapacityReachedException {
20- customerList .checkIfReachedMaxCapacity ();
21- }
22-
23- public void resetTempCustomer () {
24- tempCustomer = new Customer (null , null );
25- }
22+ public void resetTempCustomer () { tempCustomer = new Customer (null , null ); }
2623
2724 public void checkIfHasNoDuplicate (String id ) throws DuplicateCustomerIdException {
2825 if (hasCustomerWithId (id ))
2926 throw new DuplicateCustomerIdException ("The customer already exists which has same id." );
3027 }
3128
3229 private boolean hasCustomerWithId (String id ) {
33- return findIdxById (id ) >= 0 ;
34- }
35-
36- private int findIdxById (String id ) {
3730 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 ;
31+ for (Customer customer : this )
32+ if (id .equals (customer .getId ()))
33+ return true ;
34+ return false ;
4435 }
4536
4637 public void setTempId (String id ) throws InvalidCustomerIdException , DuplicateCustomerIdException {
4738 Customer .checkIfIdIsValid (id );
4839 checkIfHasNoDuplicate (id );
49- tempCustomer .setId (id );
40+ tempCustomer .setId (id , true );
5041 }
5142
5243 public void setTempName (String name ) throws InvalidCustomerNameException {
53- Customer .checkIfNameIsValid (name );
5444 tempCustomer .setName (name );
5545 }
5646
57- public void setTempSpentHours (Integer spentHours ) {
58- tempCustomer .setSpentHours (spentHours );
59- }
47+ public void setTempSpentHours (Integer spentHours ) { tempCustomer .setSpentHours (spentHours ); }
6048
61- public void setTempTotalPaidAmount (Integer totalPaidAmount ) {
62- tempCustomer .setTotalPaidAmount (totalPaidAmount );
63- }
49+ public void setTempTotalPaidAmount (Integer totalPaidAmount ) { tempCustomer .setTotalPaidAmount (totalPaidAmount ); }
6450
6551 public String getTempInfo () {
6652 updateGroupOfTempCustomer ();
@@ -70,115 +56,48 @@ public String getTempInfo() {
7056 public void addTempIntoRepository () {
7157 // app logic에 따라 다음 두 구문이 true 임을 보장합니다.
7258 assert tempCustomer != null ;
73- assert !customerList . isReachedMaxCapacity ();
59+ assert !isReachedMaxCapacity ();
7460
75- customerList . add (tempCustomer );
61+ add (tempCustomer );
7662 tempCustomer = null ;
7763 }
7864
79- public boolean isTempIdNull () {
80- return tempCustomer .getId () == null ;
81- }
82-
83- public int size () {
84- return customerList .size ();
85- }
65+ public boolean isTempIdNull () {return tempCustomer .getId () == null ; }
8666
8767 public String deleteAndGetInfoOf (int num ) {
8868 int idx = num - 1 ;
89- return customerList . remove (idx ).toString ();
69+ return remove (idx ).toString ();
9070 }
9171
9272 public String setTempAndGetInfoOf (int num ) {
9373 int idx = num - 1 ;
94- Customer updatingCustomer = customerList . get (idx );
74+ Customer updatingCustomer = get (idx );
9575 tempCustomer = new Customer (updatingCustomer );
9676 tempIdx = idx ;
9777 return updatingCustomer .toString ();
9878 }
9979
100- public void updateTempInRepository () {
101- customerList .get (tempIdx ).copy (tempCustomer );
102- }
80+ public void updateTempInRepository () { get (tempIdx ).copy (tempCustomer ); }
10381
10482 public String getUpdateBeforeAndAfterInfo () {
105- Customer before = customerList . get (tempIdx );
83+ Customer before = get (tempIdx );
10684 Customer after = tempCustomer ;
10785 updateGroupOfTempCustomer ();
10886 return String .format ("\n No. %2d\n " , tempIdx ) +
10987 "Before: " + before + '\n' +
11088 "After : " + after ;
11189 }
11290
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- }
91+ public void updateGroupOfTempCustomer () { tempCustomer .updateGroup (); }
17292
17393 public void updateGroupIn (Group group ) {
17494 Group [] groups = Group .values ();
17595 int idx = 0 ;
17696 while (groups [idx ] != group )
17797 idx ++;
98+ assert idx > 0 ;
17899 Group rightLowGroup = groups [idx - 1 ];
179- int size = customerList .size ();
180- for (int i = 0 ; i < size ; ++i ) {
181- Customer customer = customerList .get (i );
100+ for (Customer customer : this ) {
182101 Group g = customer .getGroup ();
183102 if (g == group || g == rightLowGroup )
184103 customer .updateGroup ();
@@ -187,7 +106,7 @@ public void updateGroupIn(Group group) {
187106
188107 @ Override
189108 public String toString () {
190- if (customerList . isEmpty ()) return "No Customers." + " Please input one first.\n " ;
191- return customerList .toString ();
109+ if (isEmpty ()) return "No Customers." + " Please input one first.\n " ;
110+ return super .toString ();
192111 }
193112}
0 commit comments