X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2Fjava%2Forg%2Fmxchange%2Faddressbook%2Fbeans%2Faddressbook%2FAddressbookWebBean.java;h=c5e0566ac8ba4e1bf6f517abbfa45c2acb8fe873;hb=34654c8de41131dc7b69c37bd313a08557d51da5;hp=f1b563e4f6a22abf47ba5b77d3867a63a9569df3;hpb=0fb0af6e6593a71700aa3113dd7ac3080736fb7c;p=addressbook-war.git diff --git a/src/java/org/mxchange/addressbook/beans/addressbook/AddressbookWebBean.java b/src/java/org/mxchange/addressbook/beans/addressbook/AddressbookWebBean.java index f1b563e4..c5e0566a 100644 --- a/src/java/org/mxchange/addressbook/beans/addressbook/AddressbookWebBean.java +++ b/src/java/org/mxchange/addressbook/beans/addressbook/AddressbookWebBean.java @@ -16,8 +16,18 @@ */ 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; @@ -25,11 +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) *

* @author Roland Haeder */ @@ -37,21 +54,45 @@ import org.mxchange.addressbook.model.addressbook.AddressbookSessionBeanRemote; @SessionScoped public class AddressbookWebBean implements AddressbookWebController { + /** + * Map for count of user's shared addresses + */ + private static ConcurrentMap countSharesList; + /** * Serial number */ private static final long serialVersionUID = 185_781_756_712_969L; - /////////////////////// Properties ///////////////////// /** - * A list of all user's addressbooks + * Address book instance + */ + private Addressbook addressbook; + + /** + * Remote address book bean + */ + private AddressbookSessionBeanRemote addressbookBean; + + /** + * When this address book has been created + */ + private Calendar addressbookCreated; + + /** + * Address book id number (from URL for example) */ - private List addressbookList; + private Long addressbookId; /** - * Remote addressbook bean + * Name of the address book */ - private final AddressbookSessionBeanRemote addressbookBean; + private String addressbookName; + + /** + * Who owns this address book + */ + private User addressbookUser; /** * Login controller @@ -59,6 +100,11 @@ public class AddressbookWebBean implements AddressbookWebController { @Inject private UserLoginWebController loginController; + /** + * A list of all user's address books + */ + private List usersAddressbooks; + /** * Default constructor */ @@ -74,10 +120,298 @@ public class AddressbookWebBean implements AddressbookWebController { // Throw again throw new FaceletException(e); } + + // Init list + AddressbookWebBean.countSharesList = new ConcurrentHashMap<>(0); + } + + @Override + 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"); //NOI18N + } else if (this.getAddressbookName().isEmpty()) { + // Address book name 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 book = new UserAddressbook(this.getAddressbookName()); + + // Set default status to UNLOCKED and owner + book.setAddressbookStatus(AddressbokStatus.UNLOCKED); + book.setAddressbookUser(this.loginController.getLoggedInUser()); + book.setAddressbookCreated(new GregorianCalendar()); + + try { + // Register this address book + Addressbook updatedAddressbook = this.addressbookBean.createAddressbook(book); + + // Remove name + this.setAddressbookName(null); + + // Add address book entry to list + 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 allAddressbooks () { + // 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 + } + + return Collections.unmodifiableList(this.usersAddressbooks); + } + + @Override + public List allEntries (final Addressbook addressbook) { + // 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 + } + + // Ask the bean + return this.addressbookBean.allEntries(addressbook); + } + + @Override + public int allEntriesSize (final Addressbook addressbook) { + // Ask the bean + return this.allEntries(addressbook).size(); + } + + @Override + public List 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; + } + + @Override + public void setAddressbookName (final String addressbookName) { + this.addressbookName = addressbookName; + } + + @Override + public User getAddressbookUser () { + return this.addressbookUser; + } + + @Override + public void setAddressbookUser (final User addressbookUser) { + this.addressbookUser = addressbookUser; } @Override public boolean hasCreatedAddressbooks () { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + // 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 + } + + // Check if the list is filled + return (!this.usersAddressbooks.isEmpty()); + } + + @PostConstruct + public void init () { + // Init list + this.usersAddressbooks = new ArrayList<>(0); + + // Is the user logged-in? + if (this.loginController.isUserLoggedIn()) { + // Initialize list + this.initAddressbookList(); + } + + // TODO Initialize list from bean with just one call + //this.addressbookBean.getUserCountMap() + } + + @Override + public boolean isAddressbookNameUsed (final String addressbookName) { + // Is it zero size? + if (null == addressbookName) { + // Is null + throw new NullPointerException("addressbookName is null"); //NOI18N + } else if (this.usersAddressbooks.isEmpty()) { + // Not found! + return false; + } + + // Default is not found + boolean isFound = false; + + // Check all entries + for (final Addressbook book : this.usersAddressbooks) { + // Is the name same? + if (book.getAddressbookName().equals(addressbookName)) { + // Found a match + isFound = true; + break; + } + } + + // 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); } }