]> git.mxchange.org Git - addressbook-war.git/blob - src/java/org/mxchange/addressbook/beans/addressbook/AddressbookWebSessionBean.java
Updated copyright year
[addressbook-war.git] / src / java / org / mxchange / addressbook / beans / addressbook / AddressbookWebSessionBean.java
1 /*
2  * Copyright (C) 2016, 2020 Free Software Foundation
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Affero General Public License as
6  * published by the Free Software Foundation, either version 3 of the
7  * License, or (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 Affero General Public License for more details.
13  *
14  * You should have received a copy of the GNU Affero 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.Calendar;
21 import java.util.Collections;
22 import java.util.LinkedList;
23 import java.util.List;
24 import java.util.Objects;
25 import javax.annotation.PostConstruct;
26 import javax.enterprise.context.SessionScoped;
27 import javax.enterprise.event.Event;
28 import javax.enterprise.event.Observes;
29 import javax.enterprise.inject.Any;
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.BaseAddressbookController;
37 import org.mxchange.addressbook.beans.user.login.AddressbookUserLoginWebSessionController;
38 import org.mxchange.addressbook.model.addressbook.AddressbookSessionBeanRemote;
39 import org.mxchange.jaddressbook.events.addressbook.AddressbookLoadedEvent;
40 import org.mxchange.jaddressbook.events.addressbook.ObservableAddressbookLoadedEvent;
41 import org.mxchange.jaddressbook.exceptions.AddressbookNameAlreadyUsedException;
42 import org.mxchange.jaddressbook.exceptions.AddressbookNotFoundException;
43 import org.mxchange.jaddressbook.model.addressbook.Addressbook;
44 import org.mxchange.jaddressbook.model.addressbook.UserAddressbook;
45 import org.mxchange.jaddressbook.model.addressbook.entry.AddressbookEntry;
46 import org.mxchange.jusercore.model.user.User;
47 import org.mxchange.juserlogincore.events.login.ObservableUserLoggedInEvent;
48
49 /**
50  * An address book bean (controller)
51  * <p>
52  * @author Roland Häder<roland@mxchange.org>
53  */
54 @Named ("addressbookController")
55 @SessionScoped
56 public class AddressbookWebSessionBean extends BaseAddressbookController implements AddressbookWebSessionController {
57
58         /**
59          * Serial number
60          */
61         private static final long serialVersionUID = 185_781_756_712_969L;
62
63         /**
64          * Address book instance
65          */
66         private Addressbook addressbook;
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          * Event fired when user has logged in
95          */
96         @Inject
97         @Any
98         private Event<ObservableAddressbookLoadedEvent> loadedEvent;
99
100         /**
101          * Login controller
102          */
103         @Inject
104         private AddressbookUserLoginWebSessionController userLoginController;
105
106         /**
107          * A list of all user's address books
108          */
109         private List<Addressbook> usersAddressbooks;
110
111         /**
112          * Default constructor
113          */
114         public AddressbookWebSessionBean () {
115                 // Call super constructor
116                 super();
117         }
118
119         @Override
120         public String addAddressbook () {
121                 // Is this name already used?
122                 if (!this.userLoginController.isUserLoggedIn()) {
123                         // Not logged in
124                         throw new FaceletException("This method can only be called as logged-in user."); //NOI18N
125                 } else if (this.getAddressbookName() == null) {
126                         // Address book name is null
127                         throw new NullPointerException("addressbookName is null"); //NOI18N
128                 } else if (this.getAddressbookName().isEmpty()) {
129                         // Address book name is empty
130                         throw new IllegalStateException("addressbookName is empty."); //NOI18N
131                 } else if (this.isAddressbookNameUsed(this.getAddressbookName())) {
132                         // Already used by this user
133                         throw new FaceletException(MessageFormat.format("Address book name {0} already used.", this.getAddressbookName())); //NOI18N
134                 }
135
136                 // Create address book instance with name
137                 Addressbook book = new UserAddressbook(this.getAddressbookName(), this.userLoginController.getLoggedInUser());
138
139                 try {
140                         // Register this address book
141                         Addressbook updatedAddressbook = this.addressbookBean.createAddressbook(book);
142
143                         // Remove name
144                         this.setAddressbookName(null);
145
146                         // Add address book entry to list
147                         this.usersAddressbooks.add(updatedAddressbook);
148
149                         // All fine
150                         return "login_own_addressbooks"; //NOI18N
151                 } catch (final AddressbookNameAlreadyUsedException ex) {
152                         // Throw again as cause
153                         throw new FaceletException(ex);
154                 }
155         }
156
157         /**
158          * Event being fired after an address book has been loaded
159          * <p>
160          * @param event Event being fired
161          */
162         public void afterAddressbookLoadedEvent (@Observes final ObservableAddressbookLoadedEvent event) {
163                 // event should not be null
164                 if (null == event) {
165                         // Throw NPE
166                         throw new NullPointerException("event is null"); //NOI18N
167                 } else if (event.getAddressbook() == null) {
168                         // Throw NPE again
169                         throw new NullPointerException("event.addressbook is null"); //NOI18N
170                 } else if (event.getAddressbook().getAddressbookId() == null) {
171                         // And again a NPE
172                         throw new NullPointerException("event.addressbook.addressbookId is null"); //NOI18N
173                 } else if (event.getAddressbook().getAddressbookId() < 1) {
174                         // Invalid id number
175                         throw new IllegalArgumentException(MessageFormat.format("Address book instance {0} has invalid id number: {1}", event.getAddressbook(), event.getAddressbook().getAddressbookId())); //NOI18N
176                 } else if (event.getAddressbook().getAddressbookUser() == null) {
177                         // One more NPE ...
178                         throw new NullPointerException("event.addressbook.addressbookUser is null"); //NOI18N
179                 }
180
181                 // Get address book instance
182                 Addressbook book = event.getAddressbook();
183
184                 // Set address book data
185                 this.setAddressbookId(book.getAddressbookId());
186                 this.setAddressbookName(book.getAddressbookName());
187                 this.setAddressbookUser(book.getAddressbookUser());
188                 this.setAddressbookCreated(book.getAddressbookCreated());
189
190                 // And instance ...
191                 this.setAddressbook(book);
192         }
193
194         /**
195          * Event being fired after user has logged-in
196          * <p>
197          * @param event Event being fired
198          */
199         public void afterLoginEvent (@Observes final ObservableUserLoggedInEvent event) {
200                 // Is the user logged in?
201                 if (null == event) {
202                         // Is null
203                         throw new NullPointerException("event is null"); //NOI18N
204                 } else if (event.getLoggedInUser()== null) {
205                         // user is null
206                         throw new NullPointerException("event.user is null"); //NOI18N
207                 } else if (!event.getLoggedInUser().equals(this.userLoginController.getLoggedInUser())) {
208                         // Not matching
209                         throw new IllegalStateException("event.user and userLoginController.loggedInUser don't match."); //NOI18N
210                 } else if (!this.userLoginController.isUserLoggedIn()) {
211                         // Not logged in
212                         throw new FaceletException("This method can only be called as logged-in user."); //NOI18N
213                 }
214
215                 // Init user's address book list
216                 this.initAddressbookList();
217         }
218
219         @Override
220         public List<Addressbook> allAddressbooks () {
221                 // Is the user logged in?
222                 if (!this.userLoginController.isUserLoggedIn()) {
223                         // Not logged in
224                         throw new FaceletException("This method can only be called as logged-in user."); //NOI18N
225                 }
226
227                 return Collections.unmodifiableList(this.usersAddressbooks);
228         }
229
230         @Override
231         public List<AddressbookEntry> allEntries (final Addressbook addressbook) {
232                 // Is the user logged in?
233                 if (!this.userLoginController.isUserLoggedIn()) {
234                         // Not logged in
235                         throw new FaceletException("This method can only be called as logged-in user."); //NOI18N
236                 }
237
238                 // Ask the bean
239                 return this.addressbookBean.allEntries(addressbook);
240         }
241
242         @Override
243         public int allEntriesSize (final Addressbook addressbook) {
244                 // Ask the bean
245                 return this.allEntries(addressbook).size();
246         }
247
248         @Override
249         public Addressbook getAddressbook () {
250                 return this.addressbook;
251         }
252
253         @Override
254         public void setAddressbook (final Addressbook addressbook) {
255                 this.addressbook = addressbook;
256         }
257
258         @Override
259         @SuppressWarnings ("ReturnOfDateField")
260         public Calendar getAddressbookCreated () {
261                 return this.addressbookCreated;
262         }
263
264         @Override
265         @SuppressWarnings ("AssignmentToDateFieldFromParameter")
266         public void setAddressbookCreated (final Calendar addressbookCreated) {
267                 this.addressbookCreated = addressbookCreated;
268         }
269
270         @Override
271         public Long getAddressbookId () {
272                 return this.addressbookId;
273         }
274
275         @Override
276         public void setAddressbookId (final Long addressbookId) {
277                 this.addressbookId = addressbookId;
278         }
279
280         @Override
281         public String getAddressbookName () {
282                 return this.addressbookName;
283         }
284
285         @Override
286         public void setAddressbookName (final String addressbookName) {
287                 this.addressbookName = addressbookName;
288         }
289
290         @Override
291         public User getAddressbookUser () {
292                 return this.addressbookUser;
293         }
294
295         @Override
296         public void setAddressbookUser (final User addressbookUser) {
297                 this.addressbookUser = addressbookUser;
298         }
299
300         @Override
301         public boolean hasCreatedAddressbooks () {
302                 // Is the user logged in?
303                 if (!this.userLoginController.isUserLoggedIn()) {
304                         // Not logged in
305                         throw new FaceletException("This method can only be called as logged-in user."); //NOI18N
306                 }
307
308                 // Check if the list is filled
309                 return (!this.usersAddressbooks.isEmpty());
310         }
311
312         /**
313          * Post-initialization of this class
314          */
315         @PostConstruct
316         public void init () {
317                 // Try it
318                 try {
319                         // Get initial context
320                         Context context = new InitialContext();
321
322                         // Try to lookup
323                         this.addressbookBean = (AddressbookSessionBeanRemote) context.lookup("java:global/addressbook-ejb/addressbook!org.mxchange.addressbook.model.addressbook.AddressbookSessionBeanRemote"); //NOI18N
324                 } catch (final NamingException e) {
325                         // Throw again
326                         throw new FaceletException(e);
327                 }
328
329                 // Init list
330                 this.usersAddressbooks = new LinkedList<>();
331
332                 // Is the user logged-in?
333                 if (this.userLoginController.isUserLoggedIn()) {
334                         // Initialize list
335                         this.initAddressbookList();
336                 }
337
338                 // TODO Initialize list from bean with just one call
339                 //this.addressbookBean.getUserCountMap()
340         }
341
342         @Override
343         public boolean isAddressbookLoaded () {
344                 return ((this.getAddressbookId() instanceof Long) &&
345                                 (this.getAddressbookName() instanceof String) &&
346                                 (!this.getAddressbookName().isEmpty()) &&
347                                 (this.getAddressbookUser() instanceof User));
348         }
349
350         @Override
351         public boolean isAddressbookNameUsed (final String addressbookName) {
352                 // Is it zero size?
353                 if (null == addressbookName) {
354                         // Is null
355                         throw new NullPointerException("addressbookName is null"); //NOI18N
356                 } else if (this.usersAddressbooks.isEmpty()) {
357                         // Not found!
358                         return false;
359                 }
360
361                 // Default is not found
362                 boolean isFound = false;
363
364                 // Check all entries
365                 for (final Addressbook book : this.usersAddressbooks) {
366                         // Is the name same?
367                         if (book.getAddressbookName().equals(addressbookName)) {
368                                 // Found a match
369                                 isFound = true;
370                                 break;
371                         }
372                 }
373
374                 // Return status
375                 return isFound;
376         }
377
378         @Override
379         public boolean isOtherAddressbook () {
380                 // Just call the other method and invert it
381                 return (!this.isOwnAddressbook());
382         }
383
384         @Override
385         public boolean isOwnAddressbook () {
386                 // Is the user logged in?
387                 if (!this.userLoginController.isUserLoggedIn()) {
388                         // No, then no own address book
389                         throw new IllegalStateException("isOwnAddressbook() has been invoked for a guest account"); //NOI18N
390                 }
391
392                 // Is same user?
393                 return Objects.equals(this.getAddressbookUser(), this.userLoginController.getLoggedInUser());
394         }
395
396         @Override
397         public boolean loadAddressbook () {
398                 // Check if the id is set
399                 if (this.getAddressbookId() == null) {
400                         // Throw NPE
401                         throw new NullPointerException("this.addressbookId is null");
402                 } else if (this.getAddressbookId() < 1) {
403                         // Not valid id
404                         throw new IllegalStateException(MessageFormat.format("this.addressbook={0} is invalid", this.getAddressbookId()));
405                 }
406
407                 // Default is not found
408                 boolean isFound = false;
409
410                 try {
411                         // Then try to look it up
412                         Addressbook a = this.addressbookBean.getAddressbookById(this.getAddressbookId());
413
414                         // Fire event here
415                         this.loadedEvent.fire(new AddressbookLoadedEvent(a));
416
417                         // Found it
418                         isFound = true;
419                 } catch (final AddressbookNotFoundException ex) {
420                         // Not found!
421                         throw new FaceletException(ex);
422                 }
423
424                 // Return status
425                 return isFound;
426         }
427
428         /**
429          * Initializes the user user's address book list
430          */
431         private void initAddressbookList () {
432                 // Get user instance
433                 User user = this.userLoginController.getLoggedInUser();
434
435                 // Fill list with entries
436                 this.usersAddressbooks = this.addressbookBean.getUsersAddressbookList(user);
437         }
438 }