Ver Fonte

Make FileController not stupid.

Sam Jaffe há 5 anos atrás
pai
commit
65450f749a

+ 65 - 22
src/main/lombok/org/leumasjaffe/recipe/controller/FileController.java

@@ -1,18 +1,29 @@
 package org.leumasjaffe.recipe.controller;
 
 import java.awt.Component;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
 import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
 import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+import java.util.Optional;
 
 import javax.swing.JFileChooser;
 import javax.swing.JOptionPane;
 
-import org.leumasjaffe.container.functional.Result;
 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.NonNull;
 import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
 import lombok.experimental.FieldDefaults;
 import lombok.experimental.NonFinal;
 
@@ -23,28 +34,23 @@ public class FileController<T extends Component & FileController.Model> {
 		void setModel(Recipe model);
 	}
 	
+	private static final ObjectMapper mapper;
 	JFileChooser chooser = new JFileChooser();
 	T owner;
 	@NonFinal File filename = null;
 	@NonFinal Recipe model = null;
 	
+	static {
+		mapper = new ObjectMapper();
+		mapper.registerModule(new Jdk8Module());
+	}
+	
 	public void create() {
 		setModel(new Recipe());
 	}
 	
 	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() {
@@ -53,19 +59,56 @@ public class FileController<T extends Component & FileController.Model> {
 	}
 	
 	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
+	@SneakyThrows(FileNotFoundException.class)
 	public void open(final String 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) {

+ 0 - 47
src/main/lombok/org/leumasjaffe/recipe/util/IOUtil.java

@@ -1,47 +0,0 @@
-package org.leumasjaffe.recipe.util;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.Writer;
-
-import org.leumasjaffe.recipe.model.Recipe;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-
-@UtilityClass
-public class IOUtil {	
-	Recipe load(final @NonNull Reader in) throws IOException {
-		ObjectMapper mapper = new ObjectMapper();
-		mapper.registerModule(new Jdk8Module());
-		return mapper.readValue(in, Recipe.class);
-	}
-	
-	void save(final @NonNull Writer out, final @NonNull Recipe recipe) throws IOException {
-		ObjectMapper mapper = new ObjectMapper();
-		mapper.registerModule(new Jdk8Module());
-		mapper.writeValue(out, recipe);
-	}
-
-	public Recipe load(final @NonNull File handle) throws IOException {
-		try (FileReader file = new FileReader(handle);
-				BufferedReader buf = new BufferedReader(file)) {
-			return load(buf);
-		}
-	}
-	
-	public void save(final @NonNull File handle, final @NonNull Recipe recipe) throws IOException {
-		try (FileWriter file = new FileWriter(handle);
-				BufferedWriter buf = new BufferedWriter(file)) {
-			save(buf, recipe);
-		}
-	}
-}