|
@@ -1,18 +1,29 @@
|
|
|
package org.leumasjaffe.recipe.controller;
|
|
package org.leumasjaffe.recipe.controller;
|
|
|
|
|
|
|
|
import java.awt.Component;
|
|
import java.awt.Component;
|
|
|
|
|
+import java.io.BufferedReader;
|
|
|
|
|
+import java.io.BufferedWriter;
|
|
|
import java.io.File;
|
|
import java.io.File;
|
|
|
|
|
+import java.io.FileNotFoundException;
|
|
|
|
|
+import java.io.FileReader;
|
|
|
|
|
+import java.io.FileWriter;
|
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
|
|
|
+import java.io.Reader;
|
|
|
|
|
+import java.io.Writer;
|
|
|
|
|
+import java.util.Optional;
|
|
|
|
|
|
|
|
import javax.swing.JFileChooser;
|
|
import javax.swing.JFileChooser;
|
|
|
import javax.swing.JOptionPane;
|
|
import javax.swing.JOptionPane;
|
|
|
|
|
|
|
|
-import org.leumasjaffe.container.functional.Result;
|
|
|
|
|
import org.leumasjaffe.recipe.model.Recipe;
|
|
import org.leumasjaffe.recipe.model.Recipe;
|
|
|
-import org.leumasjaffe.recipe.util.IOUtil;
|
|
|
|
|
|
|
+
|
|
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
|
|
+import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
|
|
|
|
|
|
|
|
import lombok.AccessLevel;
|
|
import lombok.AccessLevel;
|
|
|
|
|
+import lombok.NonNull;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
+import lombok.SneakyThrows;
|
|
|
import lombok.experimental.FieldDefaults;
|
|
import lombok.experimental.FieldDefaults;
|
|
|
import lombok.experimental.NonFinal;
|
|
import lombok.experimental.NonFinal;
|
|
|
|
|
|
|
@@ -23,28 +34,23 @@ public class FileController<T extends Component & FileController.Model> {
|
|
|
void setModel(Recipe model);
|
|
void setModel(Recipe model);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private static final ObjectMapper mapper;
|
|
|
JFileChooser chooser = new JFileChooser();
|
|
JFileChooser chooser = new JFileChooser();
|
|
|
T owner;
|
|
T owner;
|
|
|
@NonFinal File filename = null;
|
|
@NonFinal File filename = null;
|
|
|
@NonFinal Recipe model = null;
|
|
@NonFinal Recipe model = null;
|
|
|
|
|
|
|
|
|
|
+ static {
|
|
|
|
|
+ mapper = new ObjectMapper();
|
|
|
|
|
+ mapper.registerModule(new Jdk8Module());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
public void create() {
|
|
public void create() {
|
|
|
setModel(new Recipe());
|
|
setModel(new Recipe());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public void save() {
|
|
public void save() {
|
|
|
- if (filename == null) {
|
|
|
|
|
- if (chooser.showSaveDialog(owner) == JFileChooser.APPROVE_OPTION) {
|
|
|
|
|
- // TODO Store the file instead
|
|
|
|
|
- filename = chooser.getSelectedFile();
|
|
|
|
|
- }
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- try {
|
|
|
|
|
- IOUtil.save(filename, model);
|
|
|
|
|
- } catch (IOException ioe) {
|
|
|
|
|
- errorPopup(ioe);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ getSaved().ifPresent(this::save);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public void saveAs() {
|
|
public void saveAs() {
|
|
@@ -53,19 +59,56 @@ public class FileController<T extends Component & FileController.Model> {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public void open() {
|
|
public void open() {
|
|
|
- if (chooser.showOpenDialog(owner) == JFileChooser.APPROVE_OPTION) {
|
|
|
|
|
- // TODO Store the file instead
|
|
|
|
|
- filename = chooser.getSelectedFile();
|
|
|
|
|
- }
|
|
|
|
|
- Result.maybe(IOUtil::load).apply(filename)
|
|
|
|
|
- .consume(this::setModel, this::errorPopup);
|
|
|
|
|
|
|
+ getOpened().ifPresent(this::load);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Deprecated
|
|
@Deprecated
|
|
|
|
|
+ @SneakyThrows(FileNotFoundException.class)
|
|
|
public void open(final String newFilename) {
|
|
public void open(final String newFilename) {
|
|
|
this.filename = new File(newFilename);
|
|
this.filename = new File(newFilename);
|
|
|
- Result.maybe(IOUtil::load).apply(filename)
|
|
|
|
|
- .consume(this::setModel, this::errorPopup);
|
|
|
|
|
|
|
+ load(new FileReader(this.filename));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @SuppressWarnings("resource")
|
|
|
|
|
+ @SneakyThrows(IOException.class)
|
|
|
|
|
+ private Optional<Writer> getSaved() {
|
|
|
|
|
+ if (filename != null) {
|
|
|
|
|
+ return Optional.of(new FileWriter(filename));
|
|
|
|
|
+ } else if (chooser.showOpenDialog(owner) == JFileChooser.APPROVE_OPTION) {
|
|
|
|
|
+ filename = chooser.getSelectedFile();
|
|
|
|
|
+ return Optional.of(new FileWriter(filename));
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return Optional.empty();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @SuppressWarnings("resource")
|
|
|
|
|
+ @SneakyThrows(FileNotFoundException.class)
|
|
|
|
|
+ private Optional<Reader> getOpened() {
|
|
|
|
|
+ if (chooser.showOpenDialog(owner) == JFileChooser.APPROVE_OPTION) {
|
|
|
|
|
+ filename = chooser.getSelectedFile();
|
|
|
|
|
+ return Optional.of(new FileReader(filename));
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return Optional.empty();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void load(final @NonNull Reader reader) {
|
|
|
|
|
+ try (Reader in = reader;
|
|
|
|
|
+ BufferedReader buf = new BufferedReader(in)) {
|
|
|
|
|
+ setModel(mapper.readValue(in, Recipe.class));
|
|
|
|
|
+ } catch (IOException ioe) {
|
|
|
|
|
+ errorPopup(ioe);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void save(final @NonNull Writer writer) {
|
|
|
|
|
+ try (Writer out = writer;
|
|
|
|
|
+ BufferedWriter buf = new BufferedWriter(out)) {
|
|
|
|
|
+ mapper.writeValue(buf, model);
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
|
+ errorPopup(e);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private void errorPopup(final Exception ex) {
|
|
private void errorPopup(final Exception ex) {
|