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);
}
/**