package com.megatim.fdxconvert.viewmodel; import com.megatim.dynamicjsonparser.enums.TypeDonnee; import com.megatim.fdxconvert.App; import com.megatim.fdxconvert.dao.JsonStructureDAO; import com.megatim.fdxconvert.model.JsonStructure; import com.megatim.fdxconvert.model.TypeFichierJson; import com.megatim.fdxconvert.service.TypeFichierJsonService; import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.beans.binding.StringBinding; import javafx.beans.property.*; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.concurrent.Task; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; public class JsonStructureTableViewModel { private final ObservableList data = FXCollections.observableArrayList(); private final ObjectProperty selectedItem = new SimpleObjectProperty<>(null); private final BooleanProperty loading = new SimpleBooleanProperty(false); private final IntegerProperty pageNumber = new SimpleIntegerProperty(0); private final LongProperty totalElements = new SimpleLongProperty(0); private final LongProperty numberPerPage = new SimpleLongProperty(0); private final BooleanProperty last = new SimpleBooleanProperty(false); private final BooleanProperty first = new SimpleBooleanProperty(false); private final StringBinding paginationNumberInfo = Bindings.createStringBinding(() -> evalString(), pageNumber, numberPerPage, totalElements); public void init() { loadData(pageNumber.get()); pageNumber.addListener((observable, oldValue, newValue) -> { loadData(newValue.intValue()); }); } public void reloadData() { loadData(pageNumber.get()); } public void loadSelectedItemChildren(Consumer consumer) { Task task = new Task() { @Override protected JsonStructure call() throws Exception { loading.set(true); JsonStructure jsonStructure = JsonStructureDAO.loadSubJsonStructure(selectedItem.get().getJsonStructure()); setDelimiteurDate(jsonStructure.getFields()); return jsonStructure; } }; task.setOnSucceeded(e -> { loading.set(false); selectedItem.get().setJsonStructure(task.getValue()); consumer.accept(selectedItem.get()); }); task.setOnFailed(e -> loading.set(false)); task.setOnCancelled(e -> loading.set(false)); Thread thread = new Thread(task); thread.setDaemon(true); thread.start(); } public void deleteSelectedItem() { Task task = new Task() { @Override protected Void call() throws Exception { loading.set(true); TypeFichierJsonService.getInstance().delete(selectedItem.get()); return null; } }; task.setOnSucceeded(e -> { loading.set(false); pageNumber.set(0); loadData(pageNumber.get()); }); task.setOnFailed(e -> loading.set(false)); task.setOnCancelled(e -> loading.set(false)); Thread thread = new Thread(task); thread.setDaemon(true); thread.start(); } public void nextPage() { if (!last.get()) { pageNumber.set(pageNumber.get() + 1); } } public void previousPage() { if (!first.get()) { pageNumber.set(pageNumber.get() - 1); } } private void setDelimiteurDate(List jsonStructures) { jsonStructures.stream().forEach(j -> { if (j.getTypeDonnee().equals(TypeDonnee.OBJET)) { setDelimiteurDate(j.getFields()); } else if (j.getTypeDonnee().equals(TypeDonnee.DATE) && j.getCodeDelimiteurDate() != null) { j.setDelimiteurDate(App.SEPARATEURS_DATE.get(j.getCodeDelimiteurDate())); } }); } private void loadData(int page) { Task task = new Task() { @Override protected Void call() throws Exception { loading.set(true); List typeFichierJsons = TypeFichierJsonService.getInstance().getAllByPage(page, Arrays.asList()); Platform.runLater(() -> { data.clear(); data.addAll(typeFichierJsons); totalElements.set(TypeFichierJsonService.getInstance().getTotalElements()); numberPerPage.set(TypeFichierJsonService.getInstance().getNumberPerPage()); last.set(TypeFichierJsonService.getInstance().isLast()); first.set(TypeFichierJsonService.getInstance().isFirst()); }); return null; } }; task.setOnSucceeded(e -> loading.set(false)); task.setOnFailed(e -> loading.set(false)); task.setOnCancelled(e -> loading.set(false)); Thread thread = new Thread(task); thread.setDaemon(true); thread.start(); } public ObservableList getData() { return data; } public BooleanProperty getLoadingProperty() { return loading; } public StringBinding getPaginationNumberInfo() { return paginationNumberInfo; } public BooleanProperty getLastProperty() { return last; } public BooleanProperty getFirstProperty() { return first; } public ObjectProperty selectedItemProperty() { return selectedItem; } private String evalString() { long currentNumber = (pageNumber.get() + 1) * numberPerPage.get(); return (currentNumber < totalElements.get() ? currentNumber : totalElements.get()) + "/" + totalElements.get(); } }