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