/** * Get a provider based on the position in the stack (starting at 0 and ending at size-1). * * @param position the position to check for the provider * @return the provider from the position OR null if there is no provider at that position */ public T getProvider(final int position) { T provider = null; ProviderHolder<T> holder = getProviderHolder(position); if (holder != null) { provider = holder.getProvider(); } return provider; }
/** * Check to make sure all providers are refreshed and any that are no longer valid are flushed out * of the list. * * @return list of valid providers */ protected List<T> refresh() { ArrayList<T> l = new ArrayList<T>(); for (Iterator<ProviderHolder<T>> iterator = providers.iterator(); iterator.hasNext(); ) { ProviderHolder<T> holder = iterator.next(); T provider = holder.getProvider(); if (provider == null) { iterator.remove(); } else { l.add(provider); } } return l; }
/** * Remove a provider by the object equality. * * @param provider the provider to remove from the stack * @return true if the provider was found and removed OR false if not found */ public boolean removeProvider(T provider) { if (provider == null) { throw new IllegalArgumentException("provider to remove cannot be null"); } boolean removed = false; refresh(); for (Iterator<ProviderHolder<T>> iterator = providers.iterator(); iterator.hasNext(); ) { ProviderHolder<T> holder = iterator.next(); T p = holder.getProvider(); if (p == null) { iterator.remove(); } else { if (p.equals(provider)) { iterator.remove(); removed = true; } } } return removed; }