]> git.mxchange.org Git - addressbook-war.git/blob - src/java/org/mxchange/addressbook/beans/addressbook/AddressbookWebBean.java
added caching of those count requests (currently unfinished)
[addressbook-war.git] / src / java / org / mxchange / addressbook / beans / addressbook / AddressbookWebBean.java
1 /*
2  * Copyright (C) 2015 Roland Haeder
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 package org.mxchange.addressbook.beans.addressbook;
18
19 import java.text.MessageFormat;
20 import java.util.ArrayList;
21 import java.util.Calendar;
22 import java.util.Collections;
23 import java.util.GregorianCalendar;
24 import java.util.List;
25 import java.util.concurrent.ConcurrentMap;
26 import javax.annotation.PostConstruct;
27 import javax.enterprise.context.SessionScoped;
28 import javax.enterprise.event.Observes;
29 import javax.faces.view.facelets.FaceletException;
30 import javax.inject.Inject;
31 import javax.inject.Named;
32 import javax.naming.Context;
33 import javax.naming.InitialContext;
34 import javax.naming.NamingException;
35 import org.mxchange.addressbook.beans.login.UserLoginWebController;
36 import org.mxchange.addressbook.events.AddressbookLoadedEvent;
37 import org.mxchange.addressbook.exceptions.AddressbookNameAlreadyUsedException;
38 import org.mxchange.addressbook.model.addressbook.Addressbook;
39 import org.mxchange.addressbook.model.addressbook.AddressbookSessionBeanRemote;
40 import org.mxchange.addressbook.model.addressbook.UserAddressbook;
41 import org.mxchange.addressbook.model.addressbook.entry.AddressbookEntry;
42 import org.mxchange.addressbook.model.addressbook.shared.ShareableAddressbook;
43 import org.mxchange.addressbook.model.addressbook.status.AddressbokStatus;
44 import org.mxchange.jusercore.model.user.User;
45
46 /**
47  * An address book bean (controller)
48  * <p>
49  * @author Roland Haeder<roland@mxchange.org>
50  */
51 @Named ("addressbookController")
52 @SessionScoped
53 public class AddressbookWebBean implements AddressbookWebController {
54
55         /**
56          * Serial number
57          */
58         private static final long serialVersionUID = 185_781_756_712_969L;
59
60         /**
61          * Remote address book bean
62          */
63         private AddressbookSessionBeanRemote addressbookBean;
64
65         /**
66          * When this address book has been created
67          */
68         private Calendar addressbookCreated;
69
70         /**
71          * Address book id number (from URL for example)
72          */
73         private Long addressbookId;
74
75         /**
76          * Name of the address book
77          */
78         private String addressbookName;
79
80         /**
81          * Who owns this address book
82          */
83         private User addressbookUser;
84
85         /**
86          * Map for count of user's shared addresses
87          */
88         private static ConcurrentMap<User, Integer> countSharesList;
89
90         /**
91          * Login controller
92          */
93         @Inject
94         private UserLoginWebController loginController;
95
96         /**
97          * A list of all user's shared (with others) address books
98          */
99         private List<ShareableAddressbook> sharedAddressbooks;
100
101         /**
102          * A list of all user's address books
103          */
104         private List<Addressbook> usersAddressbooks;
105
106         /**
107          * Default constructor
108          */
109         public AddressbookWebBean () {
110                 // Try it
111                 try {
112                         // Get initial context
113                         Context context = new InitialContext();
114
115                         // Try to lookup
116                         this.addressbookBean = (AddressbookSessionBeanRemote) context.lookup("ejb/stateless-addressbook"); //NOI18N
117                 } catch (final NamingException e) {
118                         // Throw again
119                         throw new FaceletException(e);
120                 }
121
122                 // Init list
123                 // TODO: AddressbookWebBean.countSharesList = new ConcurrentHashMap<>(this.addressbookBean.getUserCountMap());
124         }
125
126         @Override
127         public String addAddressbook () {
128                 // Is this name already used?
129                 if (!this.loginController.isUserLoggedIn()) {
130                         // Not logged in
131                         throw new FaceletException("This method can only be called as logged-in user."); //NOI18N
132                 } else if (this.getAddressbookName() == null) {
133                         // Address book name is null
134                         throw new NullPointerException("addressbookName is null"); //NOI18N
135                 } else if (this.getAddressbookName().isEmpty()) {
136                         // Address book name is empty
137                         throw new IllegalStateException("addressbookName is empty."); //NOI18N
138                 } else if (this.isAddressbookNameUsed(this.getAddressbookName())) {
139                         // Already used by this user
140                         throw new FaceletException(MessageFormat.format("Address book name {0} already used.", this.getAddressbookName())); //NOI18N
141                 }
142
143                 // Create address book instance with name
144                 Addressbook addressbook = new UserAddressbook(this.getAddressbookName());
145
146                 // Set default status to UNLOCKED and owner
147                 addressbook.setAddressbookStatus(AddressbokStatus.UNLOCKED);
148                 addressbook.setAddressbookUser(this.loginController.getLoggedInUser());
149                 addressbook.setAddressbookCreated(new GregorianCalendar());
150
151                 try {
152                         // Register this address book
153                         Addressbook updatedAddressbook = this.addressbookBean.createAddressbook(addressbook);
154
155                         // Remove name
156                         this.setAddressbookName(null);
157
158                         // Add address book entry to list
159                         this.usersAddressbooks.add(updatedAddressbook);
160
161                         // All fine
162                         return "login_own_addressbooks"; //NOI18N
163                 } catch (final AddressbookNameAlreadyUsedException ex) {
164                         // Throw again as cause
165                         throw new FaceletException(ex);
166                 }
167         }
168
169         @Override
170         public void afterAddressbookLoaded (final @Observes AddressbookLoadedEvent event) {
171                 // event should not be null
172                 if (null == event) {
173                         // Throw NPE
174                         throw new NullPointerException("event is null");
175                 } else if (event.getAddressbook() == null) {
176                         // Throw NPE again
177                         throw new NullPointerException("event.addressbook is null");
178                 } else if (event.getAddressbook().getAddressbookId() == null) {
179                         // And again a NPE
180                         throw new NullPointerException("event.addressbook.addressbookId is null");
181                 } else if (event.getAddressbook().getAddressbookId() < 1) {
182                         // Invalid id number
183                         throw new IllegalArgumentException("Address book instance " + event.getAddressbook() + " has invalid id number: " + event.getAddressbook().getAddressbookId());
184                 } else if (event.getAddressbook().getAddressbookUser() == null) {
185                         // One more NPE ...
186                         throw new NullPointerException("event.addressbook.addressbookUser is null");
187                 }
188
189                 // Get address book instance
190                 Addressbook addressbook = event.getAddressbook();
191
192                 // Set address book data
193                 this.setAddressbookId(addressbook.getAddressbookId());
194                 this.setAddressbookName(addressbook.getAddressbookName());
195                 this.setAddressbookUser(addressbook.getAddressbookUser());
196                 this.setAddressbookCreated(addressbook.getAddressbookCreated());
197         }
198
199         @Override
200         public List<Addressbook> allAddressbooks () {
201                 // Is the user logged in?
202                 if (!this.loginController.isUserLoggedIn()) {
203                         // Not logged in
204                         throw new FaceletException("This method can only be called as logged-in user."); //NOI18N
205                 }
206
207                 return Collections.unmodifiableList(this.usersAddressbooks);
208         }
209
210         @Override
211         public List<AddressbookEntry> allEntries (final Addressbook addressbook) {
212                 // Is the user logged in?
213                 if (!this.loginController.isUserLoggedIn()) {
214                         // Not logged in
215                         throw new FaceletException("This method can only be called as logged-in user."); //NOI18N
216                 }
217
218                 // Ask the bean
219                 return this.addressbookBean.allEntries(addressbook);
220         }
221
222         @Override
223         public int allEntriesSize (final Addressbook addressbook) {
224                 // Ask the bean
225                 return this.allEntries(addressbook).size();
226         }
227
228         @Override
229         public List<ShareableAddressbook> allShares () {
230                 // Is the user logged in?
231                 if (!this.loginController.isUserLoggedIn()) {
232                         // Not logged in
233                         throw new FaceletException("This method can only be called as logged-in user."); //NOI18N
234                 }
235
236                 return Collections.unmodifiableList(this.sharedAddressbooks);
237         }
238
239         @Override
240         public Integer countAllUserSharedAddressbooks (final User user) {
241                 // Is there cache?
242                 if (AddressbookWebBean.countSharesList.containsKey(user)) {
243                         // Return it instead
244                         return AddressbookWebBean.countSharesList.get(user);
245                 }
246
247                 // Call EJB ("expensive")
248                 Integer count = this.addressbookBean.countAllUserSharedAddressbooks(user);
249
250                 // Add to list
251                 AddressbookWebBean.countSharesList.put(user, count);
252
253                 // Return it
254                 return count;
255         }
256
257         @Override
258         public Calendar getAddressbookCreated () {
259                 return this.addressbookCreated;
260         }
261
262         @Override
263         public void setAddressbookCreated (final Calendar addressbookCreated) {
264                 this.addressbookCreated = addressbookCreated;
265         }
266
267         @Override
268         public Long getAddressbookId () {
269                 return this.addressbookId;
270         }
271
272         @Override
273         public void setAddressbookId (final Long addressbookId) {
274                 this.addressbookId = addressbookId;
275         }
276
277         @Override
278         public String getAddressbookName () {
279                 return this.addressbookName;
280         }
281
282         @Override
283         public void setAddressbookName (final String addressbookName) {
284                 this.addressbookName = addressbookName;
285         }
286
287         @Override
288         public User getAddressbookUser () {
289                 return this.addressbookUser;
290         }
291
292         @Override
293         public void setAddressbookUser (final User addressbookUser) {
294                 this.addressbookUser = addressbookUser;
295         }
296
297         @Override
298         public boolean hasCreatedAddressbooks () {
299                 // Is the user logged in?
300                 if (!this.loginController.isUserLoggedIn()) {
301                         // Not logged in
302                         throw new FaceletException("This method can only be called as logged-in user."); //NOI18N
303                 }
304
305                 // Check if the list is filled
306                 return (!this.usersAddressbooks.isEmpty());
307         }
308
309         @PostConstruct
310         public void init () {
311                 // Init list
312                 this.usersAddressbooks = new ArrayList<>(0);
313
314                 // Is the user logged-in?
315                 if (this.loginController.isUserLoggedIn()) {
316                         // Fill list with entries
317                         this.usersAddressbooks = this.addressbookBean.getUsersList(this.loginController.getLoggedInUser());
318                 }
319         }
320
321         @Override
322         public boolean isAddressbookNameUsed (final String addressbookName) {
323                 // Is it zero size?
324                 if (null == addressbookName) {
325                         // Is null
326                         throw new NullPointerException("addressbookName is null"); //NOI18N
327                 } else if (this.usersAddressbooks.isEmpty()) {
328                         // Not found!
329                         return false;
330                 }
331
332                 // Default is not found
333                 boolean isFound = false;
334
335                 // Check all entries
336                 for (final Addressbook addressbook : this.usersAddressbooks) {
337                         // Is the name same?
338                         if (addressbook.getAddressbookName().equals(addressbookName)) {
339                                 // Found a match
340                                 isFound = true;
341                                 break;
342                         }
343                 }
344
345                 // Return status
346                 return isFound;
347         }
348 }