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