001    package market;
002    
003    import java.util.Iterator;
004    
005    import market.statistics.CICustomerStats;
006    import sale.SalesPoint;
007    import sale.Shop;
008    import users.User;
009    import users.UserManager;
010    import users.UserManagerFilter;
011    import users.swing.UserFilter;
012    import data.events.VetoException;
013    
014    /**
015     * The market's UserManager.
016     */
017    public class UMUserBase extends UserManager {
018    
019        public static final int CUSTOMER = 1;
020        public static final int WAREHOUSE_WORKER = 2;
021        public static final int SELLER = 3;
022        public static final int MANAGER = 4;
023    
024        /**
025         * Filters market's customers.
026         */
027        private UserFilter ufCustomers = new UserFilter(){
028            public boolean match(User user) {
029                return UCustomer.class.isInstance(user);
030            }
031        };
032    
033        /**
034         * Filters market's warehouse workers.
035         */
036        private UserFilter ufWarehouseWorker = new UserFilter(){
037            public boolean match(User user) {
038                if(UStaffer.class.isInstance(user) && ((UStaffer)user).getQualification().
039                        equals(UStaffer.WAREHOUSE_WORKER)){
040                    return true;
041                }
042                return false;
043            }
044        };
045    
046        /**
047         * Filters market's sellers.
048         */
049        private UserFilter ufSellers = new UserFilter(){
050            public boolean match(User user) {
051                if(UStaffer.class.isInstance(user) && ((UStaffer)user).getQualification().
052                        equals(UStaffer.SELLER)){
053                    return true;
054                }
055                return false;
056            }
057        };
058    
059        /**
060         * Filters the market's manager(s)
061         */
062        private UserFilter ufManager = new UserFilter(){
063            public boolean match(User user) {
064                if(UStaffer.class.isInstance(user) && ((UStaffer)user).getQualification().equals(UStaffer.MANAGER)){
065                    return true;
066                }
067                return false;
068            }
069        };
070    
071        /**
072         * Filters the market's staff (warehouse-worker, seller, manager)
073         */
074        private UserFilter ufStaff = new UserFilter() {
075                                        public boolean match(User user) {
076                                            return user instanceof UStaffer;
077                                        }
078        };
079    
080    
081        /**
082         * A UserManagerFilter containing all managers of the market.
083         */
084        private UserManagerFilter umfManager = new UserManagerFilter(this, ufManager);
085    
086    
087        /**
088         * Static method that gets the {@link UserManager#getGlobalUM() global user manager}.
089         * @return the global user manager.
090         */
091        public static UMUserBase getGlobalBase() {
092            return (UMUserBase)getGlobalUM();
093        }
094    
095        /**
096         * creates a new User with given name, type and qualification
097         *
098         * @param sName the User's ID
099         * @param type the User's type: 1 for customer, other numbers for employees.
100         * @param qualification the employee's qualification (manager, seller, warehouse worker)
101         */
102        public static User createUser(String sName, int type, String qualification) {
103            if(isUser(sName)) return null;
104            User user;
105            switch(type){
106                case CUSTOMER: user = new UCustomer(sName);
107                    //add to customer catalog (base for queues)
108                    SMarket.getCustomers().add(Conversions.customerToCI((UCustomer)user), null);
109                    //add to customer statistics catalog
110                    SMarket.getCustomerStats().add(new CICustomerStats(user.getName()), null);
111                    break;
112                default: user = new UStaffer(sName, qualification);
113            }
114            UserManager.getGlobalUM().addUser(user);
115            return user;
116        }
117    
118        /**
119         * Checks the global UserManager for a String.
120         *
121         * @param userName the name of the user
122         * @return <code>true</code> if a User could be identified by <code>userName</code>, otherwise
123         * <code>false</code>.
124         */
125        public static boolean isUser(String userName) {
126            if(UserManager.getGlobalUM().getUser(userName)==null){
127                return false;
128            }
129            return true;
130        }
131    
132        /**
133         * Gets the {@link #ufCustomers customer filter}.
134         * @return the customer filter.
135         */
136        public UserFilter getCustomers() {
137            return ufCustomers;
138        }
139    
140        /**
141         * Gets the {@link #ufWarehouseWorker warehouse worker filter}.
142         * @return the warehouse worker filter.
143         */
144        public UserFilter getWarehouseWorker() {
145            return ufWarehouseWorker;
146        }
147    
148        /**
149         * Gets the {@link #ufSellers sellers filter}.
150         * @return the sellers filter.
151         */
152        public UserFilter getSeller() {
153            return ufSellers;
154        }
155    
156        /**
157         * Gets the {@link #ufManager mangaer filter}.
158         * @return the manager filter.
159         */
160        public UserFilter getManager() {
161            return ufManager;
162        }
163    
164        /**
165         * Gets the {@link #ufStaff staff filter}.
166         * @return the staff filter.
167         */
168        public UserFilter getStaff() {
169            return ufStaff;
170        }
171    
172        /**
173         * Counts and returns the number of Users that are managers.
174         * @return the number of the market's managers.
175         */
176        public static int getNumberOfManagers() {
177            return ((UMUserBase)getGlobalUM()).umfManager.getUsers().size();
178        }
179    
180        /**
181         * Checks whether there is a SalesPoint with the searched User logged on.
182         *
183         * @param user the searched user.
184         * @return <code>true</code> if the user is logged on on any open SalesPoint,
185         * otherwise <code>false</code>.
186         */
187        public static boolean isLoggedOn(User user){
188            Iterator it = Shop.getTheShop().getSalesPoints().iterator();
189            while(it.hasNext()){
190                if(((SalesPoint)it.next()).getUser()==user) return true;
191            }
192            return false;
193        }
194    
195        /**
196         * Removes a User from market.
197         *
198         * @param user the user to be removed.
199         * @throws VetoException if user to be removed is currently logged on.
200         */
201        public static void deleteUser(UPerson user) throws VetoException{
202            if(!isLoggedOn(user)){
203                String key = user.getName();
204                if(user instanceof UCustomer) {
205                    SMarket.getOffer().addStock(((UCustomer)user).getShoppingBasket(), null, true);
206                    SSListenable orderQueue = SMarket.getWarehouseQueue();
207                    SSListenable tillQueue = SMarket.getTillQueue();
208                    if(orderQueue.contains(key, null)) orderQueue.remove(key, null);
209                    Iterator it = tillQueue.get(key, null, false);
210                    while(it.hasNext()){
211                        if(((SICustomer)it.next()).getOrderCount(false)==0){
212                            tillQueue.remove(key, null);
213                        }
214                    }
215                    if(!tillQueue.contains(key, null)) SMarket.getCustomers().remove(key, null);
216                    SMarket.getCustomerStats().remove(key);
217                }
218                UserManager.getGlobalUM().deleteUser(key);
219            }
220            else {
221                throw new VetoException("Nutzer " + user.getFullName() + " ist noch am System angemeldet.");
222            }
223        }
224    
225        /**
226         * Sums up and returns wages of all currently employed persons.
227         * @return the sum of all employee's wages.
228         */
229        public int getCurrentWages() {
230            UserFilter staff = UMUserBase.getGlobalBase().getStaff();
231            Iterator it = new UserManagerFilter(staff).getUsers().iterator();
232            int sum = 0;
233            while (it.hasNext()) {
234                UStaffer us = (UStaffer)it.next();
235                sum += Conversions.valueToInt(us.getSalary());
236            }
237            return sum;
238        }
239    }
240