2 * Copyright (C) 2016 - 2020 Free Software Foundation
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.
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.
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/>.
17 package org.mxchange.jfinancials.beans.financial.model.receipt_item.list;
19 import fish.payara.cdi.jsr107.impl.NamedCache;
20 import java.text.MessageFormat;
21 import java.util.Comparator;
22 import java.util.Iterator;
23 import java.util.LinkedList;
24 import java.util.List;
25 import java.util.Objects;
26 import javax.annotation.PostConstruct;
27 import javax.cache.Cache;
29 import javax.enterprise.event.Observes;
30 import javax.faces.view.ViewScoped;
31 import javax.inject.Inject;
32 import javax.inject.Named;
33 import org.mxchange.jfinancials.beans.BaseFinancialsBean;
34 import org.mxchange.jfinancials.beans.user.login.FinancialsUserLoginWebSessionController;
35 import org.mxchange.jfinancials.events.receipt_item.added.ObservableReceiptItemAddedEvent;
36 import org.mxchange.jfinancials.model.receipt_item.BillableReceiptItem;
37 import org.mxchange.jfinancials.model.receipt_item.FinancialReceiptItemSessionBeanRemote;
38 import org.mxchange.jfinancials.model.receipt_item.ReceiptItems;
39 import org.mxchange.juserlogincore.events.login.ObservableUserLoggedInEvent;
42 * A list financial receipt item bean (controller)
44 * @author Roland Häder<roland@mxchange.org>
46 @Named ("receiptItemListController")
48 public class FinancialsReceiptItemListWebViewBean extends BaseFinancialsBean implements FinancialsReceiptItemListWebViewController {
53 private static final long serialVersionUID = 56_189_028_928_472L;
56 * All receipt items list
58 private final List<BillableReceiptItem> allReceiptItems;
61 * Filtered receipt items list
63 private List<BillableReceiptItem> filteredReceiptItems;
66 * EJB for general financial receipt purposes
68 @EJB (lookup = "java:global/jfinancials-ejb/financialReceiptItem!org.mxchange.jfinancials.model.receipt_item.FinancialReceiptItemSessionBeanRemote")
69 private FinancialReceiptItemSessionBeanRemote receiptItemBean;
72 * A list of all branch offices (globally)
75 @NamedCache (cacheName = "receiptItemCache")
76 private transient Cache<Long, BillableReceiptItem> receiptItemCache;
79 * Selected receipt item
81 private BillableReceiptItem selectedReceiptItem;
87 private FinancialsUserLoginWebSessionController userLoginController;
90 * User's receipt items
92 private final List<BillableReceiptItem> userReceiptItems;
97 @SuppressWarnings ("CollectionWithoutInitialCapacity")
98 public FinancialsReceiptItemListWebViewBean () {
99 // Call super constructor
103 this.allReceiptItems = new LinkedList<>();
104 this.userReceiptItems = new LinkedList<>();
108 * Observes events being fired when a new receipt item has been added
110 * @param event Event being fired
112 public void afterAddedReceiptItemEvent (@Observes final ObservableReceiptItemAddedEvent event) {
113 // Validate parameter
116 throw new NullPointerException("event is null"); //NOI18N
119 // Add to cache and general list
120 this.receiptItemCache.put(event.getReceiptItem().getItemId(), event.getReceiptItem());
121 this.getAllReceiptItems().add(event.getReceiptItem());
124 if (this.userLoginController.isUserLoggedIn() && Objects.equals(event.getReceiptItem().getItemReceipt().getReceiptUser(), this.userLoginController.getLoggedInUser())) {
125 // Same user, then add it
126 this.userReceiptItems.add(event.getReceiptItem());
131 * Event observer for logged-in user
133 * @param event Event instance
135 public void afterUserLoginEvent (@Observes final ObservableUserLoggedInEvent event) {
136 // event should not be null
139 throw new NullPointerException("event is null"); //NOI18N
140 } else if (event.getLoggedInUser() == null) {
142 throw new NullPointerException("event.loggedInUser is null"); //NOI18N
143 } else if (event.getLoggedInUser().getUserId() == null) {
145 throw new NullPointerException("event.loggedInUser.userId is null"); //NOI18N
146 } else if (event.getLoggedInUser().getUserId() < 1) {
148 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLoggedInUser(), event.getLoggedInUser().getUserId())); //NOI18N
151 // Fill cache with all found user's receipts
152 for (final BillableReceiptItem receiptItem : this.allReceiptItems) {
154 if (Objects.equals(receiptItem.getItemReceipt().getReceiptUser(), event.getLoggedInUser())) {
156 this.userReceiptItems.add(receiptItem);
162 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
163 public List<BillableReceiptItem> getAllReceiptItems () {
164 return this.allReceiptItems;
168 * Getter for filtered receipt items
170 * @return Filtered receipts
172 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
173 public List<BillableReceiptItem> getFilteredReceiptItems () {
174 return this.filteredReceiptItems;
178 * Setter for filtered receipt items
180 * @param filteredReceiptItems Filtered receipt items
182 @SuppressWarnings ("AssignmentToCollectionOrArrayFieldFromParameter")
183 public void setFilteredReceiptItems (final List<BillableReceiptItem> filteredReceiptItems) {
184 this.filteredReceiptItems = filteredReceiptItems;
188 * Getter for selected receipt item
190 * @return Selected receipt item
192 public BillableReceiptItem getSelectedReceiptItem () {
193 return this.selectedReceiptItem;
197 * Setter for selected receipt item
199 * @param selectedReceiptItem Selected receipt item
201 public void setSelectedReceiptItem (final BillableReceiptItem selectedReceiptItem) {
202 this.selectedReceiptItem = selectedReceiptItem;
206 public void initCache () {
208 if (!this.receiptItemCache.iterator().hasNext()) {
209 // Get whole list from EJB
210 final List<BillableReceiptItem> receiptItems = this.receiptItemBean.allReceiptItems();
213 for (final BillableReceiptItem receiptItem : receiptItems) {
215 this.receiptItemCache.put(receiptItem.getItemId(), receiptItem);
219 // Is the list empty, but filled cache?
220 if (this.getAllReceiptItems().isEmpty() && this.receiptItemCache.iterator().hasNext()) {
222 final Iterator<Cache.Entry<Long, BillableReceiptItem>> iterator = this.receiptItemCache.iterator();
225 while (iterator.hasNext()) {
227 final Cache.Entry<Long, BillableReceiptItem> next = iterator.next();
230 this.getAllReceiptItems().add(next.getValue());
234 this.getAllReceiptItems().sort(new Comparator<BillableReceiptItem>() {
236 public int compare (final BillableReceiptItem o1, final BillableReceiptItem o2) {
237 return o1.getItemId() > o2.getItemId() ? 1 : o1.getItemId() < o2.getItemId() ? -1 : 0;
245 public boolean isReceiptItemAdded (final BillableReceiptItem receiptItem) {
246 // Does it contain the same object?
247 if (this.getAllReceiptItems().contains(receiptItem)) {
248 // Yes, skip below code
252 // Get iterator from list
253 final Iterator<BillableReceiptItem> iterator = this.getAllReceiptItems().iterator();
255 // Default is not the same
256 boolean alreadyAdded = false;
259 while (iterator.hasNext()) {
261 final BillableReceiptItem item = iterator.next();
264 if (ReceiptItems.isSameReceiptItem(item, receiptItem)) {