Kenmegne
6 days ago 908e81dd173f380879d5fabeb5794d5b7a76df0e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
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;
    }
}