package com.kodcu.config;
import com.kodcu.controller.ApplicationController;
import com.kodcu.other.IOHelper;
import com.kodcu.other.Item;
import com.kodcu.service.ThreadService;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.scene.layout.VBox;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.json.*;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Objects;
/**
* Created by usta on 07.08.2015.
*/
@Component
public class StoredConfigBean extends ConfigurationBase {
private final ApplicationController controller;
private final ThreadService threadService;
private StringProperty workingDirectory = new SimpleStringProperty();
private ObservableList<Item> recentFiles = FXCollections.observableArrayList();
private ObservableList<String> favoriteDirectories = FXCollections.observableArrayList();
@Override
public String formName() {
return "Stored Settings";
}
@Autowired
public StoredConfigBean(ApplicationController controller, ThreadService threadService) {
super(controller, threadService);
this.controller = controller;
this.threadService = threadService;
}
public String getWorkingDirectory() {
return workingDirectory.get();
}
public StringProperty workingDirectoryProperty() {
return workingDirectory;
}
public void setWorkingDirectory(String workingDirectory) {
this.workingDirectory.set(workingDirectory);
}
public ObservableList<Item> getRecentFiles() {
return recentFiles;
}
public void setRecentFiles(ObservableList<Item> recentFiles) {
this.recentFiles = recentFiles;
}
public ObservableList<String> getFavoriteDirectories() {
return favoriteDirectories;
}
public void setFavoriteDirectories(ObservableList<String> favoriteDirectories) {
this.favoriteDirectories = favoriteDirectories;
}
@Override
public VBox createForm() {
return null;
}
@Override
public Path getConfigPath() {
return super.resolveConfigPath("stored_directories.json");
}
@Override
public void load(ActionEvent... actionEvent) {
Reader fileReader = IOHelper.fileReader(getConfigPath());
JsonReader jsonReader = Json.createReader(fileReader);
JsonObject jsonObject = jsonReader.readObject();
JsonArray recentFiles = jsonObject.getJsonArray("recentFiles");
JsonArray favoriteDirectories = jsonObject.getJsonArray("favoriteDirectories");
String workingDirectory = jsonObject.getString("workingDirectory", System.getProperty("user.home"));
IOHelper.close(jsonReader, fileReader);
threadService.runActionLater(() -> {
if (Objects.nonNull(workingDirectory)) {
this.workingDirectory.setValue(workingDirectory);
}
if (Objects.nonNull(recentFiles)) {
recentFiles.stream().map(e -> (JsonString) e).map(e -> e.getString())
.map(e -> new Item(Paths.get(e)))
.forEach(this.recentFiles::add);
}
if (Objects.nonNull(favoriteDirectories)) {
favoriteDirectories.stream().map(e -> (JsonString) e).map(e -> e.getString()).forEach(this.favoriteDirectories::add);
}
});
}
@Override
public void save(ActionEvent... actionEvent) {
saveJson(getJSON());
}
@Override
public JsonObject getJSON() {
JsonObjectBuilder objectBuilder = Json.createObjectBuilder();
JsonArrayBuilder recentFilesArrayBuilder = Json.createArrayBuilder();
JsonArrayBuilder favoriteDirectoriesArrayBuilder = Json.createArrayBuilder();
recentFiles.stream()
.map(Item::getPath)
.filter(Files::exists)
.map(e -> e.toString())
.forEach(recentFilesArrayBuilder::add);
favoriteDirectories.stream()
.forEach(favoriteDirectoriesArrayBuilder::add);
objectBuilder
.add("workingDirectory", getWorkingDirectory())
.add("recentFiles", recentFilesArrayBuilder)
.add("favoriteDirectories", favoriteDirectoriesArrayBuilder);
return objectBuilder.build();
}
}