]> git.mxchange.org Git - addressbook-war.git/blobdiff - src/java/org/mxchange/addressbook/beans/addressbook/AddressbookWebBean.java
Moved allShares() to proper bean
[addressbook-war.git] / src / java / org / mxchange / addressbook / beans / addressbook / AddressbookWebBean.java
index f81b2dbabbf82126c979036b02604e68f2ab768b..c5e0566ac8ba4e1bf6f517abbfa45c2acb8fe873 100644 (file)
@@ -18,11 +18,16 @@ package org.mxchange.addressbook.beans.addressbook;
 
 import java.text.MessageFormat;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Collections;
 import java.util.GregorianCalendar;
 import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import javax.annotation.PostConstruct;
 import javax.enterprise.context.SessionScoped;
+import javax.enterprise.event.Observes;
 import javax.faces.view.facelets.FaceletException;
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -30,15 +35,18 @@ import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 import org.mxchange.addressbook.beans.login.UserLoginWebController;
+import org.mxchange.addressbook.events.addressbook.AddressbookLoadedEvent;
 import org.mxchange.addressbook.exceptions.AddressbookNameAlreadyUsedException;
 import org.mxchange.addressbook.model.addressbook.Addressbook;
 import org.mxchange.addressbook.model.addressbook.AddressbookSessionBeanRemote;
 import org.mxchange.addressbook.model.addressbook.UserAddressbook;
 import org.mxchange.addressbook.model.addressbook.entry.AddressbookEntry;
 import org.mxchange.addressbook.model.addressbook.status.AddressbokStatus;
+import org.mxchange.jusercore.events.login.UserLoggedInEvent;
+import org.mxchange.jusercore.model.user.User;
 
 /**
- * A user bean (controller)
+ * An address book bean (controller)
  * <p>
  * @author Roland Haeder<roland@mxchange.org>
  */
@@ -46,33 +54,57 @@ import org.mxchange.addressbook.model.addressbook.status.AddressbokStatus;
 @SessionScoped
 public class AddressbookWebBean implements AddressbookWebController {
 
+       /**
+        * Map for count of user's shared addresses
+        */
+       private static ConcurrentMap<User, Integer> countSharesList;
+
        /**
         * Serial number
         */
        private static final long serialVersionUID = 185_781_756_712_969L;
 
+       /**
+        * Address book instance
+        */
+       private Addressbook addressbook;
+
        /**
         * Remote address book bean
         */
        private AddressbookSessionBeanRemote addressbookBean;
 
-       /////////////////////// Properties /////////////////////
        /**
-        * A list of all user's address books
+        * When this address book has been created
+        */
+       private Calendar addressbookCreated;
+
+       /**
+        * Address book id number (from URL for example)
         */
-       private List<Addressbook> addressbookList;
+       private Long addressbookId;
 
        /**
         * Name of the address book
         */
        private String addressbookName;
 
+       /**
+        * Who owns this address book
+        */
+       private User addressbookUser;
+
        /**
         * Login controller
         */
        @Inject
        private UserLoginWebController loginController;
 
+       /**
+        * A list of all user's address books
+        */
+       private List<Addressbook> usersAddressbooks;
+
        /**
         * Default constructor
         */
@@ -88,48 +120,108 @@ public class AddressbookWebBean implements AddressbookWebController {
                        // Throw again
                        throw new FaceletException(e);
                }
+
+               // Init list
+               AddressbookWebBean.countSharesList = new ConcurrentHashMap<>(0);
        }
 
        @Override
-       public void addAddressbook () {
+       public String addAddressbook () {
                // Is this name already used?
                if (!this.loginController.isUserLoggedIn()) {
                        // Not logged in
                        throw new FaceletException("This method can only be called as logged-in user."); //NOI18N
                } else if (this.getAddressbookName() == null) {
                        // Address book name is null
-                       throw new NullPointerException("addressbookName is null");
+                       throw new NullPointerException("addressbookName is null"); //NOI18N
                } else if (this.getAddressbookName().isEmpty()) {
                        // Address book name is empty
-                       throw new IllegalStateException("addressbookName is empty.");
+                       throw new IllegalStateException("addressbookName is empty."); //NOI18N
                } else if (this.isAddressbookNameUsed(this.getAddressbookName())) {
                        // Already used by this user
                        throw new FaceletException(MessageFormat.format("Address book name {0} already used.", this.getAddressbookName())); //NOI18N
                }
 
                // Create address book instance with name
-               Addressbook addressbook = new UserAddressbook(this.getAddressbookName());
+               Addressbook book = new UserAddressbook(this.getAddressbookName());
 
                // Set default status to UNLOCKED and owner
-               addressbook.setAddressbookStatus(AddressbokStatus.UNLOCKED);
-               addressbook.setAddressbookUser(this.loginController.getLoggedInUser());
-               addressbook.setAddressbookCreated(new GregorianCalendar());
+               book.setAddressbookStatus(AddressbokStatus.UNLOCKED);
+               book.setAddressbookUser(this.loginController.getLoggedInUser());
+               book.setAddressbookCreated(new GregorianCalendar());
 
                try {
                        // Register this address book
-                       Addressbook updatedAddressbook = this.addressbookBean.createAddressbook(addressbook);
+                       Addressbook updatedAddressbook = this.addressbookBean.createAddressbook(book);
 
                        // Remove name
                        this.setAddressbookName(null);
 
                        // Add address book entry to list
-                       this.addressbookList.add(updatedAddressbook);
+                       this.usersAddressbooks.add(updatedAddressbook);
+
+                       // All fine
+                       return "login_own_addressbooks"; //NOI18N
                } catch (final AddressbookNameAlreadyUsedException ex) {
                        // Throw again as cause
                        throw new FaceletException(ex);
                }
        }
 
+       @Override
+       public void afterAddressbookLoadedEvent (final @Observes AddressbookLoadedEvent event) {
+               // event should not be null
+               if (null == event) {
+                       // Throw NPE
+                       throw new NullPointerException("event is null"); //NOI18N
+               } else if (event.getAddressbook() == null) {
+                       // Throw NPE again
+                       throw new NullPointerException("event.addressbook is null"); //NOI18N
+               } else if (event.getAddressbook().getAddressbookId() == null) {
+                       // And again a NPE
+                       throw new NullPointerException("event.addressbook.addressbookId is null"); //NOI18N
+               } else if (event.getAddressbook().getAddressbookId() < 1) {
+                       // Invalid id number
+                       throw new IllegalArgumentException(MessageFormat.format("Address book instance {0} has invalid id number: {1}", event.getAddressbook(), event.getAddressbook().getAddressbookId())); //NOI18N
+               } else if (event.getAddressbook().getAddressbookUser() == null) {
+                       // One more NPE ...
+                       throw new NullPointerException("event.addressbook.addressbookUser is null"); //NOI18N
+               }
+
+               // Get address book instance
+               Addressbook book = event.getAddressbook();
+
+               // Set address book data
+               this.setAddressbookId(book.getAddressbookId());
+               this.setAddressbookName(book.getAddressbookName());
+               this.setAddressbookUser(book.getAddressbookUser());
+               this.setAddressbookCreated(book.getAddressbookCreated());
+
+               // And instance ...
+               this.setAddressbook(book);
+       }
+
+       @Override
+       public void afterLoginEvent (final @Observes UserLoggedInEvent event) {
+               // Is the user logged in?
+               if (null == event) {
+                       // Is null
+                       throw new NullPointerException("event is null"); //NOI18N
+               } else if (event.getUser() == null) {
+                       // user is null
+                       throw new NullPointerException("event.user is null"); //NOI18N
+               } else if (!event.getUser().equals(this.loginController.getLoggedInUser())) {
+                       // Not matching
+                       throw new IllegalStateException("event.user and loginController.loggedInUser don't match."); //NOI18N
+               } else if (!this.loginController.isUserLoggedIn()) {
+                       // Not logged in
+                       throw new FaceletException("This method can only be called as logged-in user."); //NOI18N
+               }
+
+               // Init user's address book list
+               this.initAddressbookList();
+       }
+
        @Override
        public List<Addressbook> allAddressbooks () {
                // Is the user logged in?
@@ -138,7 +230,7 @@ public class AddressbookWebBean implements AddressbookWebController {
                        throw new FaceletException("This method can only be called as logged-in user."); //NOI18N
                }
 
-               return Collections.unmodifiableList(this.addressbookList);
+               return Collections.unmodifiableList(this.usersAddressbooks);
        }
 
        @Override
@@ -159,6 +251,66 @@ public class AddressbookWebBean implements AddressbookWebController {
                return this.allEntries(addressbook).size();
        }
 
+       @Override
+       public List<User> allUsersNotSharing () {
+               // Is the user logged in?
+               if (!this.loginController.isUserLoggedIn()) {
+                       // Not logged in
+                       throw new FaceletException("This method can only be called as logged-in user."); //NOI18N
+               }
+
+               // Call EJB
+               return this.addressbookBean.allUsersNotSharing(this.loginController.getLoggedInUser(), this.getAddressbook());
+       }
+
+       @Override
+       public Integer countAllUserSharedAddressbooks (final User user) {
+               // Is there cache?
+               if (AddressbookWebBean.countSharesList.containsKey(user)) {
+                       // Return it instead
+                       return AddressbookWebBean.countSharesList.get(user);
+               }
+
+               // Call EJB ("expensive")
+               Integer count = this.addressbookBean.countAllUserSharedAddressbooks(user);
+
+               // Add to list
+               AddressbookWebBean.countSharesList.put(user, count);
+
+               // Return it
+               return count;
+       }
+
+       @Override
+       public Addressbook getAddressbook () {
+               return this.addressbook;
+       }
+
+       @Override
+       public void setAddressbook (final Addressbook addressbook) {
+               this.addressbook = addressbook;
+       }
+
+       @Override
+       public Calendar getAddressbookCreated () {
+               return this.addressbookCreated;
+       }
+
+       @Override
+       public void setAddressbookCreated (final Calendar addressbookCreated) {
+               this.addressbookCreated = addressbookCreated;
+       }
+
+       @Override
+       public Long getAddressbookId () {
+               return this.addressbookId;
+       }
+
+       @Override
+       public void setAddressbookId (final Long addressbookId) {
+               this.addressbookId = addressbookId;
+       }
+
        @Override
        public String getAddressbookName () {
                return this.addressbookName;
@@ -169,6 +321,16 @@ public class AddressbookWebBean implements AddressbookWebController {
                this.addressbookName = addressbookName;
        }
 
+       @Override
+       public User getAddressbookUser () {
+               return this.addressbookUser;
+       }
+
+       @Override
+       public void setAddressbookUser (final User addressbookUser) {
+               this.addressbookUser = addressbookUser;
+       }
+
        @Override
        public boolean hasCreatedAddressbooks () {
                // Is the user logged in?
@@ -178,19 +340,22 @@ public class AddressbookWebBean implements AddressbookWebController {
                }
 
                // Check if the list is filled
-               return (!this.addressbookList.isEmpty());
+               return (!this.usersAddressbooks.isEmpty());
        }
 
        @PostConstruct
        public void init () {
                // Init list
-               this.addressbookList = new ArrayList<>(0);
+               this.usersAddressbooks = new ArrayList<>(0);
 
                // Is the user logged-in?
                if (this.loginController.isUserLoggedIn()) {
-                       // Fill list with entries
-                       this.addressbookList = this.addressbookBean.getUsersList(this.loginController.getLoggedInUser());
+                       // Initialize list
+                       this.initAddressbookList();
                }
+
+               // TODO Initialize list from bean with just one call
+               //this.addressbookBean.getUserCountMap()
        }
 
        @Override
@@ -199,7 +364,7 @@ public class AddressbookWebBean implements AddressbookWebController {
                if (null == addressbookName) {
                        // Is null
                        throw new NullPointerException("addressbookName is null"); //NOI18N
-               } else if (this.addressbookList.isEmpty()) {
+               } else if (this.usersAddressbooks.isEmpty()) {
                        // Not found!
                        return false;
                }
@@ -208,9 +373,9 @@ public class AddressbookWebBean implements AddressbookWebController {
                boolean isFound = false;
 
                // Check all entries
-               for (final Addressbook addressbook : this.addressbookList) {
+               for (final Addressbook book : this.usersAddressbooks) {
                        // Is the name same?
-                       if (addressbook.getAddressbookName().equals(addressbookName)) {
+                       if (book.getAddressbookName().equals(addressbookName)) {
                                // Found a match
                                isFound = true;
                                break;
@@ -220,4 +385,33 @@ public class AddressbookWebBean implements AddressbookWebController {
                // Return status
                return isFound;
        }
+
+       @Override
+       public boolean isOtherAddressbook () {
+               // Just call the other method and invert it
+               return (!this.isOwnAddressbook());
+       }
+
+       @Override
+       public boolean isOwnAddressbook () {
+               // Is the user logged in?
+               if (!this.loginController.isUserLoggedIn()) {
+                       // No, then no own address book
+                       return false;
+               }
+
+               // Is same user?
+               return Objects.equals(this.getAddressbookUser(), this.loginController.getLoggedInUser());
+       }
+
+       /**
+        * Initializes the user user's address book list
+        */
+       private void initAddressbookList () {
+               // Get user instance
+               User user = this.loginController.getLoggedInUser();
+
+               // Fill list with entries
+               this.usersAddressbooks = this.addressbookBean.getUsersAddressbookList(user);
+       }
 }