--- /dev/null
+/*
+ * Copyright (C) 2016 - 2022 Free Software Foundation
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.mxchange.jjobs.beans.mobileprovider.list;
+
+import fish.payara.cdi.jsr107.impl.NamedCache;
+import java.text.MessageFormat;
+import java.util.Comparator;
+import java.util.LinkedList;
+import java.util.List;
+import javax.annotation.PostConstruct;
+import javax.cache.Cache;
+import javax.ejb.EJB;
+import javax.enterprise.event.Observes;
+import javax.faces.view.ViewScoped;
+import javax.inject.Inject;
+import javax.inject.Named;
+import org.mxchange.jjobs.beans.BaseJobsBean;
+import org.mxchange.jphone.events.mobileprovider.added.ObservableAdminMobileProviderAddedEvent;
+import org.mxchange.jphone.exceptions.mobileprovider.MobileProviderNotFoundException;
+import org.mxchange.jphone.model.phonenumbers.mobileprovider.MobileProvider;
+import org.mxchange.jphone.model.phonenumbers.mobileprovider.MobileProviderSingletonBeanRemote;
+
+/**
+ * A views-scoped bean for mobile providers
+ * <p>
+ * @author Roland Häder<roland@mxchange.org>
+ */
+@Named ("mobileProviderListController")
+@ViewScoped
+public class JobsMobileProviderListWebViewBean extends BaseJobsBean implements JobsMobileProviderListWebViewController {
+
+ /**
+ * Serial number
+ */
+ private static final long serialVersionUID = 15_869_423_671_950_277L;
+
+ /**
+ * A list of all mobile providers
+ */
+ private final List<MobileProvider> allMobileProviders;
+
+ /**
+ * A list of filtered mobile providers
+ */
+ private List<MobileProvider> filteredMobileProviders;
+
+ /**
+ * Remote EJB for mobile providers (regular)
+ */
+ @EJB (lookup = "java:global/jjobs-ejb/mobileProvider!org.mxchange.jphone.model.phonenumbers.mobileprovider.MobileProviderSingletonBeanRemote")
+ private MobileProviderSingletonBeanRemote mobileProviderBean;
+
+ /**
+ * "Cached" list of mobile providers
+ */
+ @Inject
+ @NamedCache (cacheName = "mobileProviderCache")
+ private transient Cache<Long, MobileProvider> mobileProviderCache;
+
+ /**
+ * Selected mobile provider instance
+ */
+ private MobileProvider selectedMobileProvider;
+
+ /**
+ * Default constructor
+ */
+ public JobsMobileProviderListWebViewBean () {
+ // Call super constructor
+ super();
+
+ // Init list
+ this.allMobileProviders = new LinkedList<>();
+ }
+
+ /**
+ * Observes events being fired after the administrator has added a new
+ * mobile provider
+ * <p>
+ * @param event Event being fired
+ */
+ public void afterAdminAddedMobileProviderEvent (@Observes final ObservableAdminMobileProviderAddedEvent event) {
+ // Is all valid?
+ if (null == event) {
+ // Throw NPE
+ throw new NullPointerException("event is null"); //NOI18N
+ } else if (event.getAddedMobileProvider() == null) {
+ // Throw again ...
+ throw new NullPointerException("event.addedMobileProvider is null"); //NOI18N
+ } else if (event.getAddedMobileProvider().getProviderId() == null) {
+ // And again ...
+ throw new NullPointerException("event.addedMobileProvider.providerId is null"); //NOI18N
+ } else if (event.getAddedMobileProvider().getProviderId() < 1) {
+ // Id is invalid
+ throw new IllegalArgumentException(MessageFormat.format("event.addedMobileProvider.providerId={0} is not valid.", event.getAddedMobileProvider().getProviderId())); //NOI18N
+ }
+
+ // Add it to the list
+ this.mobileProviderCache.put(event.getAddedMobileProvider().getProviderId(), event.getAddedMobileProvider());
+ this.getAllMobileProviders().add(event.getAddedMobileProvider());
+ }
+
+ @Override
+ public MobileProvider findMobileProviderById (final Long mobileProviderId) throws MobileProviderNotFoundException {
+ // Validate parameter
+ if (null == mobileProviderId) {
+ // Throw NPE
+ throw new NullPointerException("mobileProviderId is null"); //NOI18N
+ } else if (mobileProviderId < 1) {
+ // Throw IAE
+ throw new IllegalArgumentException("mobileProviderId=" + mobileProviderId + " is invalid."); //NOI18N
+ } else if (!this.mobileProviderCache.containsKey(mobileProviderId)) {
+ // Not found
+ throw new MobileProviderNotFoundException(mobileProviderId);
+ }
+
+ // Get it from cache
+ final MobileProvider mobileProvider = this.mobileProviderCache.get(mobileProviderId);
+
+ // Return it
+ return mobileProvider;
+ }
+
+ @Override
+ @SuppressWarnings ("ReturnOfCollectionOrArrayField")
+ public List<MobileProvider> getAllMobileProviders () {
+ // Return it
+ return this.allMobileProviders;
+ }
+
+ /**
+ * Getter for filtered mobile provider list
+ * <p>
+ * @return Filtered mobile providers
+ */
+ @SuppressWarnings ("ReturnOfCollectionOrArrayField")
+ public List<MobileProvider> getFilteredMobileProviders () {
+ return this.filteredMobileProviders;
+ }
+
+ /**
+ * Getter for filtered mobile provider list
+ * <p>
+ * @param filteredMobileProviders Filtered mobile providers
+ */
+ @SuppressWarnings ("AssignmentToCollectionOrArrayFieldFromParameter")
+ public void setFilteredMobileProviders (final List<MobileProvider> filteredMobileProviders) {
+ this.filteredMobileProviders = filteredMobileProviders;
+ }
+
+ /**
+ * Getter for selected mobile provider instance
+ * <p>
+ * @return Selected mobile provider instance
+ */
+ public MobileProvider getSelectedMobileProvider () {
+ return this.selectedMobileProvider;
+ }
+
+ /**
+ * Setter for selected mobile provider instance
+ * <p>
+ * @param selectedMobileProvider Selected mobile provider instance
+ */
+ public void setSelectedMobileProvider (final MobileProvider selectedMobileProvider) {
+ this.selectedMobileProvider = selectedMobileProvider;
+ }
+
+ /**
+ * Post-construction method
+ */
+ @PostConstruct
+ public void initializeList () {
+ // Is cache there?
+ if (!this.mobileProviderCache.iterator().hasNext()) {
+ // Add all
+ for (final MobileProvider mobileProvider : this.mobileProviderBean.fetchAllMobileProviders()) {
+ // Add it to cache
+ this.mobileProviderCache.put(mobileProvider.getProviderId(), mobileProvider);
+ }
+ }
+
+ // Is the list empty, but filled cache?
+ if (this.getAllMobileProviders().isEmpty() && this.mobileProviderCache.iterator().hasNext()) {
+ // Build up list
+ for (final Cache.Entry<Long, MobileProvider> currentEntry : this.mobileProviderCache) {
+ // Add to list
+ this.getAllMobileProviders().add(currentEntry.getValue());
+ }
+
+ // Sort list
+ this.getAllMobileProviders().sort(new Comparator<MobileProvider>() {
+ @Override
+ public int compare (final MobileProvider mobileProvider1, final MobileProvider mobileProvider2) {
+ return mobileProvider1.getProviderId() > mobileProvider2.getProviderId() ? 1 : mobileProvider1.getProviderId() < mobileProvider2.getProviderId() ? -1 : 0;
+ }
+ });
+ }
+ }
+}