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<TypeDonnee> type = new SimpleObjectProperty(TypeDonnee.ALPHANUMERIQUE);
|
private final StringProperty format = new SimpleStringProperty();
|
private final ObjectProperty<Delimiteur> 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<JsonStructureViewModel> 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<JsonStructureViewModel> getChildren() {
|
return children;
|
}
|
|
public StringProperty nameProperty() {
|
return name;
|
}
|
|
public ObjectProperty<TypeDonnee> typeProperty() {
|
return type;
|
}
|
|
public IntegerProperty tailleProperty() {
|
return taille;
|
}
|
|
public StringProperty formatProperty() {
|
return format;
|
}
|
|
public ObjectProperty<Delimiteur> 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;
|
}
|
}
|