diff --git a/pom.xml b/pom.xml index b739b42..513bf4c 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ ru.simplex_software wicket-springdata - 1.3 + 1.4 wicket-springdata http://www.simplex-software.ru diff --git a/src/main/java/ru/simplex_software/wicket_springdata/PersistableCollectionModel.java b/src/main/java/ru/simplex_software/wicket_springdata/PersistableCollectionModel.java new file mode 100644 index 0000000..d3f32c7 --- /dev/null +++ b/src/main/java/ru/simplex_software/wicket_springdata/PersistableCollectionModel.java @@ -0,0 +1,157 @@ +package ru.simplex_software.wicket_springdata; + +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.LoadableDetachableModel; +import org.springframework.data.domain.Persistable; + +import java.io.Serializable; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * Модель хранимой коллекции. + */ +public class PersistableCollectionModel

> extends LoadableDetachableModel>> { + + /** + * Коллекция моделей. + */ + private Collection> models; + + public PersistableCollectionModel(Collection> collection) { + this.models = collection; + } + + @Override + protected Collection> load() { + models.forEach(model -> ((HibernateModel

) model).load()); + return models; + } + + public boolean isEmpty() { + return models.isEmpty(); + } + + public void detach() { + models.forEach(IModel::detach); + } + + /** + * Добавление модели. + */ + public void add(IModel

model) { + models.add(model); + } + + /** + * Оборачивание элемента в модель и добавление в коллецию. + */ + public void add(P object) { + models.add(new HibernateModel<>(object)); + } + + /** + * Оборачивание элементов коллекции в модели и добавление в коллецию. + * + * @param items коллекция элементов. + */ + public void addAll(Collection

items) { + items.forEach(this::add); + } + + /** + * Оборачивание элементов коллекции в модели и добавление в текущую коллекцию. + * + * @param objects исходная коллекция. + */ + public void wrapAndSet(Collection

objects) { + models.clear(); + objects.stream() + .map(HibernateModel::new) + .map(hm -> (IModel

) hm) + .forEach(models::add); + } + + /** + * Удаление модели из коллекции. + */ + public void remove(IModel

model) { + models.remove(model); + } + + /** + * Очистка коллекции моделей. + */ + public void clear() { + models.clear(); + } + + /** + * Фильтрация списка модклей. + */ + public Collection> filter(Predicate

predicate, Supplier>> supplier) { + return models.stream() + .filter(model -> predicate.test(model.getObject())) + .collect(Collectors.toCollection(supplier)); + } + + /** + * Получение потока элементов. + */ + public Stream

getElementsStream() { + return models.stream() + .map(IModel::getObject); + } + + /** + * Проверка наличия модели в коллекции. + */ + public boolean containsModel(IModel

model) { + return models.contains(model); + } + + /** + * Проверка наличия объекта в коллекции. + */ + public boolean containsModelObject(P object) { + return !unwrapAndFilter(item -> item.equals(object), HashSet::new).isEmpty(); + } + + /** + * Получение итератора коллеции моделей. + */ + public Iterator> getModelsIterator() { + return models.iterator(); + } + + /** + * Получение развернутых элементов коллекции. + * + * @param supplier поставщик коллекции элементов. + * @return коллекция развернутых элементов. + */ + public > C unwrapAndGet(Supplier supplier) { + return models.stream() + .map(IModel::getObject) + .collect(Collectors.toCollection(supplier)); + } + + /** + * Получение развернутых элементов с учетом фильтра. + * + * @param predicate условие фильтрации. + * @param supplier поставщик коллекции элементов. + * @return коллекция развернутых элементов. + */ + public > C unwrapAndFilter(Predicate

predicate, Supplier supplier) { + return models.stream() + .map(IModel::getObject) + .filter(predicate) + .collect(Collectors.toCollection(supplier)); + } +}