/******************************************************************************* * Copyright (c) 2015 Development Gateway, Inc and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the MIT License (MIT) * which accompanies this distribution, and is available at * https://opensource.org/licenses/MIT * * Contributors: * Development Gateway - initial API and implementation *******************************************************************************/ package org.devgateway.toolkit.forms.wicket.providers; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.wicketstuff.select2.ChoiceProvider; import org.wicketstuff.select2.Response; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * @author idobre * @since 1/27/15 * * This is a ChoiceProvider for "non-persistable" unique list of elements */ public class GenericChoiceProvider<T> extends ChoiceProvider<T> { private static final long serialVersionUID = 1L; private static final Logger LOGGER = Logger.getLogger(GenericChoiceProvider.class); /** * all elements are identified by and id which in this case is the String * representation of the T object (see @toJson function) so we retain the * elements as a tuple <id, T> so we can easily have access to the original * T object in the @toChoices function */ private Map<String, T> bagOfElements; public GenericChoiceProvider(final List<T> listOfElements) { bagOfElements = new LinkedHashMap<>(); // see the description of 'listOfElements' variable for (T el : listOfElements) { bagOfElements.put(el.toString(), el); } } @Override public String getDisplayValue(final T object) { return object.toString(); } @Override public String getIdValue(final T object) { return object.toString(); } @Override public void query(final String term, final int page, final Response<T> response) { final List<T> ret = new ArrayList<>(); if (bagOfElements != null && bagOfElements.values() != null && bagOfElements.values().size() > 0) { for (final T el : bagOfElements.values()) { // the elements should implement the method toString in order to filter them if (StringUtils.isBlank(term) || el.toString().toLowerCase().contains(term.toLowerCase())) { ret.add(el); } } } response.setHasMore(false); response.addAll(ret); } @Override public Collection<T> toChoices(final Collection<String> ids) { final List<T> ret = new ArrayList<>(); if (ids != null) { for (final String id : ids) { try { // just get the element from the map ret.add(bagOfElements.get(id)); } catch (final NumberFormatException e) { LOGGER.error(e.getMessage()); } } } return ret; } }