package com.megatim.fdxconvert.viewmodel; import com.megatim.dynamicjsonparser.enums.TypeDonnee; import com.megatim.fdxconvert.pojo.Delimiteur; import com.megatim.fdxconvert.views.jsonstructure.DefaultNestedJsonStructure; import com.megatim.fdxconvert.views.jsonstructure.NestedJsonStructure; import javafx.beans.Observable; import javafx.beans.binding.Bindings; import javafx.beans.property.*; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import java.util.UUID; public class JsonStructureViewModel { private final String id; private final boolean root; private final int level; private final StringProperty name = new SimpleStringProperty(); private final ObjectProperty type = new SimpleObjectProperty(TypeDonnee.ALPHANUMERIQUE); private final StringProperty format = new SimpleStringProperty(); private final ObjectProperty delimitor = new SimpleObjectProperty<>(null); private final IntegerProperty taille = new SimpleIntegerProperty(1); private final BooleanProperty required = new SimpleBooleanProperty(false); private final BooleanProperty collection = new SimpleBooleanProperty(false); private final BooleanProperty valid = new SimpleBooleanProperty(false); private final BooleanProperty validName = new SimpleBooleanProperty(false); private final BooleanProperty validType = new SimpleBooleanProperty(false); private final BooleanProperty validFormat = new SimpleBooleanProperty(false); private final BooleanProperty validDelimitor = new SimpleBooleanProperty(false); private final BooleanProperty validTaille = new SimpleBooleanProperty(false); private final BooleanProperty hasChild = new SimpleBooleanProperty(false); private final BooleanProperty hasDateType = new SimpleBooleanProperty(false); private final BooleanProperty hasSquareBracket = new SimpleBooleanProperty(false); private final BooleanProperty hasObjectSquareBracket = new SimpleBooleanProperty(false); private final ObservableList children = FXCollections.observableArrayList(vm -> new Observable[]{vm.validProperty()}); public JsonStructureViewModel(boolean root, int level, NestedJsonStructure nestedJsonStructure) { this.root = root; this.level = level; id = UUID.randomUUID().toString(); if (nestedJsonStructure != null) { name.set(nestedJsonStructure.name()); type.set(nestedJsonStructure.typeDonnee()); format.set(nestedJsonStructure.format()); delimitor.set(nestedJsonStructure.delimiteur()); taille.set(nestedJsonStructure.taille()); required.set(nestedJsonStructure.isRequired()); collection.set(nestedJsonStructure.isCollection()); nestedJsonStructure.children().forEach(nS -> { children.add(new JsonStructureViewModel(false, level + 1, nS)); }); } } public void init() { hasChild.bind(Bindings.createBooleanBinding(() -> isObjectType(), type)); hasDateType.bind(Bindings.createBooleanBinding(() -> isDateType(), type)); hasSquareBracket.bind(Bindings.createBooleanBinding(() -> !isObjectType() && collection.get(), type, collection)); hasObjectSquareBracket.bind(Bindings.createBooleanBinding(() -> isObjectType() && collection.get(), type, collection)); if (root) { this.required.set(true); this.collection.set(true); this.type.set(TypeDonnee.OBJET); } validName.bind(Bindings.createBooleanBinding(() -> name.get() != null && name.get().length() > 0, name)); validType.bind(Bindings.createBooleanBinding(() -> type.get() != null && (!root || type.get().equals(TypeDonnee.OBJET)), type)); validFormat.bind(Bindings.createBooleanBinding(() -> !TypeDonnee.DATE.equals(type.get()) || (format.get() != null && format.get().length() > 0), type, format)); validDelimitor.bind(Bindings.createBooleanBinding(() -> !TypeDonnee.DATE.equals(type.get()) || (delimitor.get() != null), type, delimitor)); validTaille.bind(Bindings.createBooleanBinding(() -> TypeDonnee.OBJET.equals(type.get()) || taille.get() > 0, type, taille)); valid.bind(Bindings.createBooleanBinding(() -> (validName.get() && validType.get() && validFormat.get() && validDelimitor.get() && validTaille.get() && (!TypeDonnee.OBJET.equals(type.get()) || (!children.isEmpty() && children.stream().map(c -> c.validProperty()).allMatch(c -> c.get())))), validName, validType, validFormat, validDelimitor, validTaille, type, children) ); } public NestedJsonStructure nestedJsonStructure() { return new DefaultNestedJsonStructure(this); } public void addNewChild() { JsonStructureViewModel newChild = new JsonStructureViewModel(false, level + 1, null); children.add(newChild); } public void removeChild(String id) { children.removeIf(item -> item.id == id); } public void removeAllChild() { children.removeIf(item -> true); } public ObservableList getChildren() { return children; } public StringProperty nameProperty() { return name; } public ObjectProperty typeProperty() { return type; } public IntegerProperty tailleProperty() { return taille; } public StringProperty formatProperty() { return format; } public ObjectProperty delimitorProperty() { return delimitor; } public BooleanProperty requiredProperty() { return required; } public BooleanProperty collectionProperty() { return collection; } public BooleanProperty hasChildProperty() { return hasChild; } public BooleanProperty hasDateTypeProperty() { return hasDateType; } public BooleanProperty hasSquareBracketProperty() { return hasSquareBracket; } public BooleanProperty hasObjectSquareBracketProperty() { return hasObjectSquareBracket; } public BooleanProperty validProperty() { return valid; } public String getId() { return id; } public boolean isRoot() { return root; } public int getLevel() { return level; } private boolean isDateType() { return type.get() != null && type.get() == TypeDonnee.DATE; } private boolean isObjectType() { return type.get() != null && type.get() == TypeDonnee.OBJET; } }