package org.appfuse.webapp.pages.admin;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.appfuse.model.User;
import org.appfuse.service.UserManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
import static org.appfuse.webapp.util.NumberRangeUtil.checkIfLongWithinIntegerRange;
import static org.springframework.util.Assert.notNull;
/**
* Sortable users data provider.
*
* @author Marcin ZajÄ…czkowski, 2011-05-22
*/
public class UserDataProvider extends SortableDataProvider<User, String> {
private static final String NO_SEARCH_FILTER = null;
protected final Logger log = LoggerFactory.getLogger(getClass());
private final UserManager userManager;
private String searchFilter;
public UserDataProvider(UserManager userManager) {
this(userManager, NO_SEARCH_FILTER);
}
public UserDataProvider(UserManager userManager, String searchFilter) {
notNull(userManager);
this.userManager = userManager;
this.searchFilter = searchFilter;
setSort("username", SortOrder.ASCENDING);
}
public void setSearchFilter(String searchFilter) {
this.searchFilter = searchFilter;
}
public Iterator<? extends User> iterator(long first, long count) {
//TODO: MZA: How sorting works in Tapestry/Spring MVC? - also in Java?
List<User> readUsers = userManager.search(searchFilter);
// Comparator<User> userComparator = UserComparatorResolver.getComparatorBySoftProperty(
// getSort().getProperty(), getSort().isAscending());
// Collections.sort(readUsers, userComparator);
Collections.sort(readUsers, getSortableUserDataProviderComparator());
checkIfLongWithinIntegerRange(first, count, first + count);
return readUsers.subList((int)first, (int)first + (int)count).iterator();
}
private SortableDataProviderComparator<User> getSortableUserDataProviderComparator() {
return SortableDataProviderComparator.getInstanceForSortParam(getSort());
}
public long size() {
//TODO: MZA: Not very optimal...
return userManager.search(searchFilter).size();
}
public IModel<User> model(final User user) {
//TODO: MZA: Separate class should be created
return new LoadableDetachableModel<User>(user) {
@Override
protected User load() {
User loadedUser = userManager.getUser(user.getId().toString());
//TODO: An ugly hack required to not force user to enter his password on each edition.
// Will be fixed in APF-1370
loadedUser.setConfirmPassword(loadedUser.getPassword());
return loadedUser;
}
};
}
}