Skip to content

Commit e8992a2

Browse files
author
Arun Prasaad
committed
Refactor usage of level file
1 parent 6907168 commit e8992a2

File tree

2 files changed

+41
-43
lines changed

2 files changed

+41
-43
lines changed

src/main/java/ihm/Editor.java

Lines changed: 21 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,29 @@
11
package ihm;
22

33
import java.util.logging.Logger;
4-
import java.util.logging.Level;
54
import java.awt.Color;
65
import java.awt.Dimension;
76
import java.awt.event.ActionEvent;
87
import java.awt.event.ActionListener;
98
import java.awt.event.MouseEvent;
109
import java.awt.event.MouseListener;
1110
import java.awt.event.MouseMotionListener;
12-
import java.io.BufferedWriter;
1311
import java.io.File;
14-
import java.io.FileWriter;
1512
import java.io.IOException;
13+
import java.nio.file.StandardOpenOption;
1614

1715
import com.google.common.annotations.VisibleForTesting;
1816
import javax.swing.*;
1917

2018
import logic.TileType;
2119
import logic.Controller;
2220
import logic.LevelFile;
21+
import one.util.streamex.IntStreamEx;
2322

2423
public class Editor extends JFrame implements MouseListener, MouseMotionListener {
24+
25+
private final LevelFile levelFile;
26+
2527
@VisibleForTesting
2628
enum Component {
2729
// Tool buttons
@@ -63,18 +65,13 @@ TileType getContent() {
6365

6466
public Editor (int rowCount, int columnCount, String name) throws IOException {
6567

66-
FileWriter levelWriter = new FileWriter(new File(new File(".").getCanonicalPath() + "/levels/" + name + ".txt"));
67-
BufferedWriter lowerWriter = new BufferedWriter(levelWriter);
68-
for (int i = 0; i < rowCount; i++ ) {
69-
lowerWriter.write("_".repeat(columnCount));
70-
lowerWriter.newLine();
71-
}
72-
lowerWriter.close();
73-
levelWriter.close();
68+
levelFile = LevelFile.of(name);
69+
initializeEmptyLevel(rowCount, columnCount);
7470

75-
controller = new Controller(new File(new File(".").getCanonicalPath() + "/levels/" + name + ".txt").getPath());
71+
controller = new Controller(new File(new File(".").getCanonicalPath() + "/levels/" + name + ".txt").getPath());
7672
windowWidth = controller.warehouse.getColumns() * TILE_SIZE;
7773
windowHeight = controller.warehouse.getLines() * TILE_SIZE;
74+
7875
this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
7976
this.setTitle("Sokoban v1.0 par Gabriel FARAGO");
8077
this.setPreferredSize(new Dimension(windowWidth + 150, Math.max(windowHeight + 150, 330)));
@@ -171,34 +168,16 @@ public void actionPerformed(ActionEvent e) {
171168
}
172169

173170
if (line.length() == columnCount && i+1 == columnCount) {
174-
try {
175-
FileWriter levelWriter = new FileWriter(new File(new File(".").getCanonicalPath() + "/levels/" + name + ".txt"));
176-
BufferedWriter lowerWriter = new BufferedWriter(levelWriter);
177-
lowerWriter.write(line);
178-
lowerWriter.close();
179-
levelWriter.close();
180-
line = "";
181-
} catch (IOException e1) {
182-
LOGGER.log(Level.SEVERE, "Error while writing level file: " + name, e1);
183-
}
171+
LevelFile.of(name).write(line);
172+
line = "";
184173
}
185174
else if (line.length() == columnCount) {
186-
try {
187-
FileWriter levelWriter = new FileWriter(new File(new File(".").getCanonicalPath() + "/levels/" + name + ".txt"), true);
188-
BufferedWriter lowerWriter = new BufferedWriter(levelWriter);
189-
lowerWriter.newLine();
190-
lowerWriter.write(line);
191-
lowerWriter.close();
192-
levelWriter.close();
193-
line = "";
194-
} catch (IOException e1) {
195-
LOGGER.log(Level.SEVERE, "Error while writing level file: " + name, e1);
196-
}
175+
LevelFile.of(name).write(System.lineSeparator() + line, StandardOpenOption.APPEND);
176+
line = "";
197177
}
198178
}
199179
dispose();
200180
new HomeWindow();
201-
202181
}
203182
else {
204183
invalid_level.setText("Invalid level!");
@@ -222,6 +201,14 @@ else if (line.length() == columnCount) {
222201
this.setVisible( true );
223202
}
224203

204+
private void initializeEmptyLevel(int rowCount, int columnCount) {
205+
String content = IntStreamEx
206+
.range(rowCount)
207+
.mapToObj(i -> "_".repeat(columnCount))
208+
.joining(System.lineSeparator());
209+
levelFile.write(content);
210+
}
211+
225212
private void createQuitButton(String name) {
226213
JButton quit = new JButton("Quit");
227214
quit.setName(Component.QUIT_BUTTON.name());

src/main/java/logic/LevelFile.java

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,23 @@
11
package logic;
22

3+
import org.jspecify.annotations.NullMarked;
4+
35
import java.io.File;
46
import java.io.IOException;
57
import java.nio.file.Files;
8+
import java.nio.file.OpenOption;
69
import java.nio.file.Path;
710
import java.util.logging.Level;
811
import java.util.logging.Logger;
912

10-
/**
11-
* Thrown when an error occurs during level file operations.
12-
*/
13-
class LevelFileException extends RuntimeException {
14-
public LevelFileException(String message, Throwable cause) {
15-
super(message, cause);
16-
}
17-
}
18-
1913
/**
2014
* Simple utility class for handling level file paths.
2115
*/
16+
@NullMarked
2217
public class LevelFile {
2318
private static final Logger LOGGER = Logger.getLogger(LevelFile.class.getName());
2419
private static final String LEVELS_DIR = "levels";
20+
2521
/**
2622
* Creates a new LevelFile instance for the given level name.
2723
* @param levelName the name of the level (without .txt extension)
@@ -45,6 +41,21 @@ public boolean delete() {
4541
}
4642
}
4743

44+
/**
45+
* Writes content to the level file with the specified options.
46+
* @param content The content to write to the file
47+
* @param options Options specifying how the file is opened
48+
*/
49+
public void write(String content, OpenOption... options) {
50+
try {
51+
Files.createDirectories(getLevelsDirectory());
52+
Files.writeString(getFilePath(), content, options);
53+
} catch (IOException e) {
54+
String errorMsg = "Error while writing to level file: %s".formatted(levelName);
55+
LOGGER.log(Level.SEVERE, errorMsg, e);
56+
}
57+
}
58+
4859
private final String levelName;
4960

5061
private LevelFile(String levelName) {

0 commit comments

Comments
 (0)