Избегание фрагмента кода шаблона, возвращающего границы страницы (из p: dataTable), повторяется в управляемом beans

При удалении строк из итерирующего компонента, такого как <p:dataTable>, текущая страница должна быть reset на ее предыдущей предыдущей странице, если все строки в последней странице были удалены, Это, к сожалению, не автоматизировано в <p:dataTable> с помощью LazyDataModel<T>.

Лингвистически, если таблица данных содержит 11 страниц с 10 строками на странице и все строки на 11-й странице, т.е. последняя удалена, она должна автоматически получить 10-ю страницу (т.е. непосредственно на предыдущей странице), но это делает не происходит автоматически (текущая страница остается неподвижной (11), как если бы сама таблица данных опустела), если явно не закодировано где-то в связанной поддержке bean.

Неформально соответствующий сегмент псевдокода выглядел бы следующим образом.

if (rowCount <= (ceiling)((first + 1) / pageSize) * pageSize - pageSize) {
    first -= pageSize;
}

Где first - смещение страницы (начиная с 0), pageSize указывает строки на странице и rowCount указывает общее количество строк из связанного хранилища данных/базы данных.

Практически:

@Override
public List<Entity> load(int first, int pageSize, List<SortMeta> multiSortMeta, Map<String, Object> filters) {

    // ...

    int rowCount = service.getRowCount();
    setRowCount(rowCount);

    // ...

    if (pageSize <= 0) {
        // Add an appropriate FacesMessage.
        return new ArrayList<Entity>();
    } else if (first >= pageSize && rowCount <= Utility.currentPage(first, pageSize) * pageSize - pageSize) {
        first -= pageSize;
    } else if (...) {
        // ...
    }

    // ...

    return service.getList(first, pageSize, map, filters);
    // SortMeta in List<SortMeta> is PrimeFaces specific.
    // Thus, in order to avoid the PrimeFaces dependency on the service layer,
    // List<SortMeta> has been turned into a LinkedHashMap<String, String>()
    // - the second last parameter (named "map") of the above method call.
}

Статический метод утилиты Utility#currentPage() определяется следующим образом.

public static int currentPage(int first, int pageSize) {
    return first <= 0 || pageSize <= 0 ? 1 : new BigDecimal(first + 1).divide(new BigDecimal(pageSize), 0, BigDecimal.ROUND_CEILING).intValue();
}

Это часть кода шаблона, и его следует избегать повторяться повсюду - в каждом управляемом bean с помощью <p:dataTable> с LazyDataModel<T>.

Есть ли способ автоматизировать этот процесс?