feature/serialize #1

Merged
manuel merged 7 commits from feature/serialize into master 2022-02-02 01:15:21 +01:00
5 changed files with 38 additions and 49 deletions
Showing only changes of commit 41330de4f4 - Show all commits

View file

@ -36,16 +36,16 @@ class Generator {
final PDDocumentInformation info = new PDDocumentInformation(); final PDDocumentInformation info = new PDDocumentInformation();
info.setTitle("Labyrinth " + this.labyrinth.getWidth() + "x" + this.labyrinth.getHeight() + ", ID " + this.labyrinth.getRandomSeed()); info.setTitle("Labyrinth " + this.labyrinth.getWidth() + "x" + this.labyrinth.getHeight() + ", ID " + this.labyrinth.getRandomSeed());
pdDocument.setDocumentInformation(info); pdDocument.setDocumentInformation(info);
final PDPage page = new PDPage(new PDRectangle(pageWidth, pageHeight)); final PDPage puzzlePage = new PDPage(new PDRectangle(pageWidth, pageHeight));
final PDPage solution = new PDPage(new PDRectangle(pageWidth, pageHeight)); final PDPage solutionPage = new PDPage(new PDRectangle(pageWidth, pageHeight));
pdDocument.addPage(page); pdDocument.addPage(puzzlePage);
pdDocument.addPage(solution); pdDocument.addPage(solutionPage);
try (final PDPageContentStream labyrinthPageContentStream = new PDPageContentStream(pdDocument, page); try (final PDPageContentStream puzzlePageContentStream = new PDPageContentStream(pdDocument, puzzlePage);
final PDPageContentStream solutionPageContentStream = new PDPageContentStream(pdDocument, solution)) { final PDPageContentStream solutionPageContentStream = new PDPageContentStream(pdDocument, solutionPage)) {
setUpPageContentStream(labyrinthPageContentStream); setUpPageContentStream(puzzlePageContentStream);
setUpPageContentStream(solutionPageContentStream); setUpPageContentStream(solutionPageContentStream);
this.drawHorizonzalLines(labyrinthPageContentStream, solutionPageContentStream); this.drawHorizontalLines(puzzlePageContentStream, solutionPageContentStream);
this.drawVerticalLines(labyrinthPageContentStream, solutionPageContentStream); this.drawVerticalLines(puzzlePageContentStream, solutionPageContentStream);
this.drawSolution(solutionPageContentStream); this.drawSolution(solutionPageContentStream);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
@ -68,9 +68,10 @@ class Generator {
pageContentStream.setNonStrokingColor(Color.BLACK); pageContentStream.setNonStrokingColor(Color.BLACK);
} }
private void drawHorizonzalLines(@NonNull final PDPageContentStream... contentStreams) throws IOException { private void drawHorizontalLines(@NonNull final PDPageContentStream... contentStreams) throws IOException {
// PDF has the origin in the lower left corner. We want it in the upper left corner, hence some magic is required. // PDF has the origin in the lower left corner. We want it in the upper left corner, hence some magic is required.
Coordinate coordinate = new Coordinate(0f, 0f); Coordinate coordinate = new Coordinate(0f, 0f);
// Draw the TOP borders of all tiles.
for (int y = 0; y < this.labyrinth.getHeight(); y++) { for (int y = 0; y < this.labyrinth.getHeight(); y++) {
boolean isPainting = false; boolean isPainting = false;
coordinate = coordinate.withY(y); coordinate = coordinate.withY(y);
@ -102,6 +103,7 @@ class Generator {
} }
} }
} }
// Draw the BOTTOM border of the last row of tiles.
boolean isPainting = false; boolean isPainting = false;
int y = this.labyrinth.getHeight(); int y = this.labyrinth.getHeight();
coordinate = coordinate.withY(this.labyrinth.getHeight()); coordinate = coordinate.withY(this.labyrinth.getHeight());
@ -137,6 +139,7 @@ class Generator {
private void drawVerticalLines(@NonNull final PDPageContentStream... contentStreams) throws IOException { private void drawVerticalLines(@NonNull final PDPageContentStream... contentStreams) throws IOException {
// PDF has the origin in the lower left corner. We want it in the upper left corner, hence some magic is required. // PDF has the origin in the lower left corner. We want it in the upper left corner, hence some magic is required.
Coordinate coordinate = new Coordinate(0f, 0f); Coordinate coordinate = new Coordinate(0f, 0f);
// Draw the LEFT borders of all tiles.
for (int x = 0; x < this.labyrinth.getWidth(); x++) { for (int x = 0; x < this.labyrinth.getWidth(); x++) {
boolean isPainting = false; boolean isPainting = false;
coordinate = coordinate.withX(x); coordinate = coordinate.withX(x);
@ -168,6 +171,7 @@ class Generator {
} }
} }
} }
// Draw the RIGHT border of the last column of tiles.
boolean isPainting = false; boolean isPainting = false;
int x = this.labyrinth.getWidth(); int x = this.labyrinth.getWidth();
coordinate = coordinate.withX(this.labyrinth.getWidth()); coordinate = coordinate.withX(this.labyrinth.getWidth());

View file

@ -9,7 +9,6 @@ public class PDFRenderer implements Renderer<byte[]> {
static final float SCALE = 10; static final float SCALE = 10;
private PDFRenderer() { private PDFRenderer() {
} }
@NonNull @NonNull
@ -23,6 +22,4 @@ public class PDFRenderer implements Renderer<byte[]> {
final Generator generator = new Generator(labyrinth); final Generator generator = new Generator(labyrinth);
return generator.generate(); return generator.generate();
} }
} }

View file

@ -3,24 +3,30 @@ package ch.fritteli.labyrinth.generator.renderer.pdffile;
import ch.fritteli.labyrinth.generator.model.Labyrinth; import ch.fritteli.labyrinth.generator.model.Labyrinth;
import ch.fritteli.labyrinth.generator.renderer.Renderer; import ch.fritteli.labyrinth.generator.renderer.Renderer;
import ch.fritteli.labyrinth.generator.renderer.pdf.PDFRenderer; import ch.fritteli.labyrinth.generator.renderer.pdf.PDFRenderer;
import io.vavr.control.Option;
import io.vavr.control.Try;
import lombok.NonNull; import lombok.NonNull;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.NoSuchElementException;
public class PDFFileRenderer implements Renderer<Path> { public class PDFFileRenderer implements Renderer<Path> {
@NonNull @NonNull
private static final PDFRenderer PDF_RENDERER = PDFRenderer.newInstance(); private static final PDFRenderer PDF_RENDERER = PDFRenderer.newInstance();
private Path targetFile; @NonNull
private Option<Path> targetFile;
private PDFFileRenderer() { private PDFFileRenderer() {
try { this.targetFile = Try
this.targetFile = Files.createTempFile("labyrinth_", ".pdf"); .of(() -> Files.createTempFile("labyrinth_", ".pdf"))
} catch (IOException e) { .onFailure(ex -> {
System.err.println("Unable to set default target file."); System.err.println("Unable to set default target file.");
e.printStackTrace(); ex.printStackTrace();
} })
.toOption();
} }
@NonNull @NonNull
@ -29,12 +35,15 @@ public class PDFFileRenderer implements Renderer<Path> {
} }
public boolean isTargetFileDefinedAndWritable() { public boolean isTargetFileDefinedAndWritable() {
return this.targetFile != null && this.targetFile.toFile().canWrite(); return this.targetFile
.map(Path::toFile)
.map(File::canWrite)
.getOrElse(false);
} }
@NonNull @NonNull
public PDFFileRenderer setTargetFile(@NonNull final Path targetFile) { public PDFFileRenderer setTargetFile(@NonNull final Path targetFile) {
this.targetFile = targetFile; this.targetFile = Option.of(targetFile);
return this; return this;
} }
@ -42,18 +51,19 @@ public class PDFFileRenderer implements Renderer<Path> {
public Path render(@NonNull final Labyrinth labyrinth) { public Path render(@NonNull final Labyrinth labyrinth) {
if (!this.isTargetFileDefinedAndWritable()) { if (!this.isTargetFileDefinedAndWritable()) {
try { try {
Files.createFile(this.targetFile); Files.createFile(this.targetFile.get());
} catch (IOException e) { } catch (IOException | NoSuchElementException e) {
throw new IllegalArgumentException("Cannot write to target file.", e); throw new IllegalArgumentException("Cannot write to target file.", e);
} }
} }
final byte[] bytes = PDF_RENDERER.render(labyrinth); final byte[] bytes = PDF_RENDERER.render(labyrinth);
final Path targetFile = this.targetFile.get();
try { try {
Files.write(this.targetFile, bytes); Files.write(targetFile, bytes);
} catch (IOException e) { } catch (IOException e) {
System.err.println("Failed writing to file " + this.targetFile.normalize().toString()); System.err.println("Failed writing to file " + targetFile.normalize().toString());
e.printStackTrace(); e.printStackTrace();
} }
return this.targetFile; return targetFile;
} }
} }

View file

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/java" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View file

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/java" isTestSource="true" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>