diff --git a/pom.xml b/pom.xml index 505f82c..38dd25a 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ pr0crustes PDFToolHelper - 1.0.0 + 1.4.0 1.8 diff --git a/src/main/java/me/pr0crustes/backend/classes/file/SaveFileSelector.java b/src/main/java/me/pr0crustes/backend/classes/file/SaveFileSelector.java index 5abf600..0fae69c 100644 --- a/src/main/java/me/pr0crustes/backend/classes/file/SaveFileSelector.java +++ b/src/main/java/me/pr0crustes/backend/classes/file/SaveFileSelector.java @@ -3,8 +3,11 @@ import javafx.stage.FileChooser; import javafx.stage.Stage; import me.pr0crustes.backend.enums.FileExtensions; +import me.pr0crustes.backend.exeptions.NullFileException; +import org.apache.pdfbox.pdmodel.PDDocument; import java.io.File; +import java.io.IOException; import java.util.List; import java.util.concurrent.Callable; @@ -26,4 +29,20 @@ protected Callable getCallable(Stage stage, List this.createFileWindow("Save as", filters).showSaveDialog(stage)); } + /** + * Method that asks the user and saves a given PDDocument. + * @param document the PDDocument to be saved. + * @throws IOException in case of an exception during file saving. + * @throws NullFileException in case the user selected file is null. + */ + public void savePDF(PDDocument document) throws IOException, NullFileException { + File saveAs = this.getSelection(); + + if (saveAs == null) { + throw new NullFileException(); + } + + document.save(saveAs); + } + } diff --git a/src/main/java/me/pr0crustes/backend/classes/number/RangeEx.java b/src/main/java/me/pr0crustes/backend/classes/number/RangeEx.java index cbad804..f18cefe 100644 --- a/src/main/java/me/pr0crustes/backend/classes/number/RangeEx.java +++ b/src/main/java/me/pr0crustes/backend/classes/number/RangeEx.java @@ -2,6 +2,7 @@ import me.pr0crustes.backend.exeptions.ArgumentException; +import java.util.Collection; import java.util.HashSet; import java.util.Set; import java.util.regex.Matcher; @@ -66,10 +67,12 @@ * '*' can be used to match every number. In this case, all other operations will be ignored. * * Because of this, RangeEx allows the user to specifically select pages of a file, even not continuous ones. + * + * + * Extends HashSet of generic Integer, overriding a few methods. */ -public class RangeEx { +public class RangeEx extends HashSet { - private final Set values; private boolean isUniversal = false; /** @@ -77,19 +80,7 @@ public class RangeEx { * @param rangeString a valid RangeEx string. */ public RangeEx(String rangeString) throws ArgumentException { - this.values = this.getValues(rangeString); - } - - /** - * Method that tests if value is in rangex. - * @param value the value to test. - * @return if the value is contained in this rangex. - */ - public boolean contains(int value) { - if (this.isUniversal) { - return true; - } - return this.values.contains(value); + this.addAll(this.getValues(rangeString)); } /** @@ -111,21 +102,18 @@ private Set getValues(String rangeString) throws ArgumentException { return parsedValues; // Empty set } - Set rangesParts = RangeEx.getMatches(rangeString, "\\d+_\\d+"); - for (String str : rangesParts) { + for (String str : RangeEx.getMatches(rangeString, "\\d+_\\d+")) { String[] parts = str.split("_"); - for (int i = Integer.valueOf(parts[0]); i <= Integer.valueOf(parts[1]); i++) { + for (int i = RangeEx.stringAsUnsigned(parts[0]); i <= RangeEx.stringAsUnsigned(parts[1]); i++) { parsedValues.add(i); } } - Set addParts = RangeEx.getMatches(rangeString, "[+]\\d+"); - for (String str : addParts) { + for (String str : RangeEx.getMatches(rangeString, "[+]\\d+")) { parsedValues.add(RangeEx.stringAsUnsigned(str)); } - Set subParts = RangeEx.getMatches(rangeString, "[-]\\d+"); - for (String str : subParts) { + for (String str : RangeEx.getMatches(rangeString, "[-]\\d+")) { parsedValues.remove(RangeEx.stringAsUnsigned(str)); } @@ -163,4 +151,35 @@ private static Set getMatches(String str, String regex) { return matches; } + /** + * Override of `contains`: + * If isUniversal, every value should return true. + * Else, check if the value is in the hashSet. + * @param o the object to check. + * @return if contains o. + */ + @Override + public boolean contains(Object o) { + if (!(o instanceof Integer)) { + return false; + } + return this.isUniversal || super.contains(o); + } + + /** + * Override of `containsAll`: + * Just calls `contains` in every elem. + * @param c the Collection to check. + * @return if contains all the values of c. + */ + @Override + public boolean containsAll(Collection c) { + for (Object e : c) { + if (!this.contains(e)) { + return false; + } + } + return true; + } + } diff --git a/src/main/java/me/pr0crustes/backend/exeptions/NullFileException.java b/src/main/java/me/pr0crustes/backend/exeptions/NullFileException.java new file mode 100644 index 0000000..67e46ef --- /dev/null +++ b/src/main/java/me/pr0crustes/backend/exeptions/NullFileException.java @@ -0,0 +1,10 @@ +package me.pr0crustes.backend.exeptions; + +/** + * NullFileException is a custom exception that should be thrown when the save as file is null. + */ +public class NullFileException extends Exception { + public NullFileException() { + super(); + } +} diff --git a/src/main/java/me/pr0crustes/frontend/gui/classes/ActionController.java b/src/main/java/me/pr0crustes/frontend/gui/classes/ActionController.java index 185a801..92fe9dd 100644 --- a/src/main/java/me/pr0crustes/frontend/gui/classes/ActionController.java +++ b/src/main/java/me/pr0crustes/frontend/gui/classes/ActionController.java @@ -4,6 +4,7 @@ import javafx.event.EventHandler; import javafx.scene.layout.Pane; import me.pr0crustes.backend.exeptions.ArgumentException; +import me.pr0crustes.backend.exeptions.NullFileException; import java.io.IOException; @@ -61,13 +62,13 @@ public void run() { private void runExecute() { try { this.execute(); + } catch (NullFileException e) { + e.printStackTrace(); + // Ignore, user didn't selected a file + // TODO: Handle this in some way (?) } catch (ArgumentException e) { e.printStackTrace(); AlertFactory.DefinedAlert.invalidArgument.sendAlert(); - } catch (NullPointerException e) { - e.printStackTrace(); - // Ignore, user didn't selected a file - //TODO: Handle this in some way (?) } catch (IOException e) { e.printStackTrace(); AlertFactory.DefinedAlert.fileError.sendAlert(); @@ -82,10 +83,10 @@ private void runExecute() { * This method can throw exceptions and because of this is mainly called from runExecute. * @throws ArgumentException in case of invalid arguments. * @throws IOException in case a file related error. - * @throws NullPointerException in case the user did not selected a file. + * @throws NullFileException in case the file selected by the user to saveAs is null. * @throws Exception in case of any other error. */ @SuppressWarnings("RedundantThrows") - protected abstract void execute() throws ArgumentException, IOException, NullPointerException, Exception; + protected abstract void execute() throws ArgumentException, IOException, NullFileException, Exception; } diff --git a/src/main/java/me/pr0crustes/frontend/gui/scene/ConvertController.java b/src/main/java/me/pr0crustes/frontend/gui/scene/ConvertController.java index 47f8a98..4b2449b 100644 --- a/src/main/java/me/pr0crustes/frontend/gui/scene/ConvertController.java +++ b/src/main/java/me/pr0crustes/frontend/gui/scene/ConvertController.java @@ -4,6 +4,7 @@ import me.pr0crustes.backend.classes.file.SaveFileSelector; import me.pr0crustes.backend.classes.pdf.PDFConverter; import me.pr0crustes.backend.exeptions.ArgumentException; +import me.pr0crustes.backend.exeptions.NullFileException; import me.pr0crustes.frontend.gui.classes.ListController; import me.pr0crustes.frontend.gui.classes.elements.FileListViewManagerFactory; import me.pr0crustes.frontend.gui.classes.elements.ListViewManager; @@ -37,21 +38,20 @@ public class ConvertController extends ListController { * Implementation of execute, converts the files and saves. * @throws IOException in case of file error. * @throws ArgumentException in case of invalid arguments. + * @throws NullFileException in case the file selected by the user to saveAs is null. * @see me.pr0crustes.frontend.gui.classes.ActionController */ - public void execute() throws IOException, ArgumentException { + public void execute() throws IOException, ArgumentException, NullFileException { List fileList = this.listViewManager.getList(); if (fileList.size() == 0) { throw new ArgumentException(); } - File saveAs = new SaveFileSelector().getSelection(); - PDFConverter converter = new PDFConverter(fileList); PDDocument document = converter.getDocumentFromImages(); - document.save(saveAs); + new SaveFileSelector().savePDF(document); } /** diff --git a/src/main/java/me/pr0crustes/frontend/gui/scene/CropController.java b/src/main/java/me/pr0crustes/frontend/gui/scene/CropController.java index 0c08016..a14a338 100644 --- a/src/main/java/me/pr0crustes/frontend/gui/scene/CropController.java +++ b/src/main/java/me/pr0crustes/frontend/gui/scene/CropController.java @@ -14,6 +14,7 @@ import me.pr0crustes.backend.classes.pdf.PDFCropper; import me.pr0crustes.backend.enums.FileExtensions; import me.pr0crustes.backend.exeptions.ArgumentException; +import me.pr0crustes.backend.exeptions.NullFileException; import me.pr0crustes.frontend.gui.classes.ActionController; import me.pr0crustes.frontend.gui.classes.internationalization.LocalizableStrings; import me.pr0crustes.frontend.gui.classes.layout.NodeFactory; @@ -55,20 +56,19 @@ private void onClickSearch() { * Method that creates a PDFCropper, crops the pdf and saves. * @throws ArgumentException in case of invalid args. * @throws IOException in case of file error. + * @throws NullFileException in case the file selected by the user to saveAs is null. * @see ActionController * @see PDFCropper */ - public void execute() throws ArgumentException, IOException { + public void execute() throws ArgumentException, IOException, NullFileException { if (this.selectedFile == null) { throw new ArgumentException(); } - File saveAs = new SaveFileSelector().getSelection(); - PDFCropper cropper = new PDFCropper(this.selectedFile); PDDocument document = cropper.subDocument(new RangeEx(this.textFieldRange.getText())); - document.save(saveAs); + new SaveFileSelector().savePDF(document); } /** diff --git a/src/main/java/me/pr0crustes/frontend/gui/scene/InsertController.java b/src/main/java/me/pr0crustes/frontend/gui/scene/InsertController.java index 6e88505..ef2698d 100644 --- a/src/main/java/me/pr0crustes/frontend/gui/scene/InsertController.java +++ b/src/main/java/me/pr0crustes/frontend/gui/scene/InsertController.java @@ -15,6 +15,7 @@ import me.pr0crustes.backend.classes.pdf.PDFInsert; import me.pr0crustes.backend.enums.FileExtensions; import me.pr0crustes.backend.exeptions.ArgumentException; +import me.pr0crustes.backend.exeptions.NullFileException; import me.pr0crustes.frontend.gui.classes.ActionController; import me.pr0crustes.frontend.gui.classes.internationalization.LocalizableStrings; import me.pr0crustes.frontend.gui.classes.layout.NodeFactory; @@ -52,10 +53,11 @@ public class InsertController extends ActionController { * Method that creates a PDFInsert, inserts a pdf into other and saves. * @throws ArgumentException in case of argument error. * @throws IOException in case of file error. + * @throws NullFileException in case the file selected by the user to saveAs is null. * @see ActionController * @see PDFInsert */ - public void execute() throws ArgumentException, IOException { + public void execute() throws ArgumentException, IOException, NullFileException { if (this.insertFile == null || this.intoFile == null) { throw new ArgumentException(); } @@ -64,12 +66,10 @@ public void execute() throws ArgumentException, IOException { int afterPage = Numbers.valueFromTextField(this.textFieldIntoAfterPage); - File saveAs = new SaveFileSelector().getSelection(); - PDFInsert pdfInsert = new PDFInsert(this.insertFile, this.intoFile); PDDocument document = pdfInsert.insertDocument(rangeEx, afterPage); - document.save(saveAs); + new SaveFileSelector().savePDF(document); } /** diff --git a/src/main/java/me/pr0crustes/frontend/gui/scene/MergeController.java b/src/main/java/me/pr0crustes/frontend/gui/scene/MergeController.java index dee09ad..0b928aa 100644 --- a/src/main/java/me/pr0crustes/frontend/gui/scene/MergeController.java +++ b/src/main/java/me/pr0crustes/frontend/gui/scene/MergeController.java @@ -4,6 +4,7 @@ import me.pr0crustes.backend.classes.file.SaveFileSelector; import me.pr0crustes.backend.classes.pdf.PDFMerger; import me.pr0crustes.backend.exeptions.ArgumentException; +import me.pr0crustes.backend.exeptions.NullFileException; import me.pr0crustes.frontend.gui.classes.ListController; import me.pr0crustes.frontend.gui.classes.elements.FileListViewManagerFactory; import me.pr0crustes.frontend.gui.classes.elements.ListViewManager; @@ -37,10 +38,11 @@ public class MergeController extends ListController { * Implementation of execute, merges the files and saves. * @throws IOException in case of file related error. * @throws ArgumentException in case of invalid arguments. + * @throws NullFileException in case the file selected by the user to saveAs is null. * @see me.pr0crustes.frontend.gui.classes.ActionController */ @Override - public void execute() throws IOException, ArgumentException { + public void execute() throws IOException, ArgumentException, NullFileException { List fileList = this.listViewManager.getList(); @@ -48,13 +50,10 @@ public void execute() throws IOException, ArgumentException { throw new ArgumentException(); } - File saveAs = new SaveFileSelector().getSelection(); - PDFMerger merger = new PDFMerger(fileList); PDDocument document = merger.mergeFiles(); - - document.save(saveAs); + new SaveFileSelector().savePDF(document); } diff --git a/src/main/java/me/pr0crustes/frontend/gui/scene/QualityController.java b/src/main/java/me/pr0crustes/frontend/gui/scene/QualityController.java index 1b69b58..7b08a21 100644 --- a/src/main/java/me/pr0crustes/frontend/gui/scene/QualityController.java +++ b/src/main/java/me/pr0crustes/frontend/gui/scene/QualityController.java @@ -13,6 +13,7 @@ import me.pr0crustes.backend.classes.number.Numbers; import me.pr0crustes.backend.classes.pdf.PDFQualityModifier; import me.pr0crustes.backend.exeptions.ArgumentException; +import me.pr0crustes.backend.exeptions.NullFileException; import me.pr0crustes.frontend.gui.classes.ActionController; import me.pr0crustes.frontend.gui.classes.internationalization.LocalizableStrings; import me.pr0crustes.frontend.gui.classes.layout.NodeFactory; @@ -55,21 +56,20 @@ private void onClickSearch() { * Method that creates a PDFQualityModifier, changes the pdf dpi and saves. * @throws ArgumentException in case of invalid args. * @throws IOException in case of file related error. + * @throws NullFileException in case the file selected by the user to saveAs is null. * @see ActionController * @see PDFQualityModifier */ @Override - public void execute() throws ArgumentException, IOException { + public void execute() throws ArgumentException, IOException, NullFileException { if (this.selectedFile == null) { throw new ArgumentException(); } - File saveAs = new SaveFileSelector().getSelection(); - PDFQualityModifier qualityModifier = new PDFQualityModifier(this.selectedFile); PDDocument document = qualityModifier.getDocumentWithDPI(Numbers.valueFromTextField(this.textFieldDpi)); - document.save(saveAs); + new SaveFileSelector().savePDF(document); } /**