/*
* Copyright [2014] [Christian Loehnert, krampenschiesser@gmail.com]
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.ks.idnadrev.exportall;
import de.ks.BaseController;
import de.ks.i18n.Localized;
import de.ks.idnadrev.expimp.EntityExportSource;
import de.ks.idnadrev.expimp.xls.XlsxExporter;
import de.ks.persistence.PersistentWork;
import de.ks.persistence.entity.AbstractPersistentObject;
import de.ks.validation.validators.FileExtensionValidator;
import de.ks.validation.validators.NotEmptyValidator;
import de.ks.validation.validators.ValidFilePathValidator;
import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.TextField;
import javafx.stage.FileChooser;
import javafx.util.StringConverter;
import org.controlsfx.dialog.Dialogs;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.util.List;
import java.util.ResourceBundle;
import java.util.stream.Collectors;
public class ExportAll extends BaseController<Void> {
private static final Logger log = LoggerFactory.getLogger(ExportAll.class);
@FXML
private Button exportBtn;
@FXML
private CheckBox openAfterExport;
@FXML
private TextField filePath;
@FXML
private ProgressIndicator progress;
protected final SimpleObjectProperty<File> exportFile = new SimpleObjectProperty<>();
protected final java.awt.Desktop desktop = java.awt.Desktop.getDesktop();
@Override
public void initialize(URL location, ResourceBundle resources) {
exportBtn.disableProperty().bind(validationRegistry.invalidProperty());
filePath.textProperty().bindBidirectional(exportFile, new StringConverter<File>() {
@Override
public String toString(File object) {
if (object == null) {
return null;
}
return object.getPath();
}
@Override
public File fromString(String string) {
try {
return new File(string);
} catch (Exception e) {
return null;
}
}
});
validationRegistry.registerValidator(filePath, true, new NotEmptyValidator());
validationRegistry.registerValidator(filePath, true, new ValidFilePathValidator());
validationRegistry.registerValidator(filePath, true, new FileExtensionValidator(".xlsx"));
progress.setProgress(-1D);
}
@FXML
void showFileChooser() {
FileChooser fileChooser = new FileChooser();
fileChooser.setInitialFileName("export");
fileChooser.setSelectedExtensionFilter(new FileChooser.ExtensionFilter("export to excel", ".xlsx"));
File file = fileChooser.showOpenDialog(exportBtn.getScene().getWindow());
exportFile.set(file);
}
@FXML
void export() {
progress.setVisible(true);
controller.save();
controller.reload();
}
@Override
protected void onRefresh(Void model) {
super.onRefresh(model);
progress.setVisible(false);
}
@Override
public void duringSave(Void model) {
List<EntityExportSource<? extends AbstractPersistentObject>> entityExportSources = PersistentWork.read(em -> {
@SuppressWarnings("unchecked") List<Class<? extends AbstractPersistentObject>> entityClasses = em.getEntityManagerFactory().getMetamodel().getEntities().stream().map(e -> (Class<? extends AbstractPersistentObject>) e.getJavaType()).collect(Collectors.toList());
List<EntityExportSource<? extends AbstractPersistentObject>> exportSources = entityClasses.stream().map(c -> new EntityExportSource<>(PersistentWork.idsFrom(c), c)).collect(Collectors.toList());
return exportSources;
});
XlsxExporter exporter = new XlsxExporter(controller.getExecutorService());
File file = exportFile.get();
try {
if (file.exists()) {
log.info("Deleting existing file {}", file);
file.delete();
}
Files.createDirectories(file.toPath());
file.createNewFile();
} catch (IOException e) {
log.error("Could not create file {}", file, e);
}
List<EntityExportSource<?>> bla = entityExportSources;
exporter.export(file, bla);
controller.getJavaFXExecutor().submit(() -> {
Dialogs.create().message(Localized.get("export.successfully", file)).showInformation();
if (openAfterExport.isSelected()) {
controller.getExecutorService().submit(() -> {
try {
desktop.edit(file);
} catch (IOException e) {
log.error("Could not open {}", file, e);
}
});
}
});
}
}