From 7c915981c542ce86188c531ecbdaaa6ba420e922 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Wed, 27 Sep 2017 17:35:23 +0200
Subject: [PATCH] #96 - delete tags that are not referenced

---
 .../budgetmaster/ui/fxml/FilterGUI.fxml       | 10 +++++--
 .../logic/database/DatabaseImportExport.java  |  7 +++++
 .../logic/database/DatabaseTagHandler.java    | 26 +++++++++++++++++
 .../tag/match/TagMatchDeleteForPayment.java   |  4 +++
 .../TagMatchDeleteForRepeatingPayment.java    |  4 +++
 .../server/updater/TagUpdater.java            | 28 +++++++++++++++++++
 6 files changed, 77 insertions(+), 2 deletions(-)
 create mode 100644 src/de/deadlocker8/budgetmasterserver/server/updater/TagUpdater.java

diff --git a/src/de/deadlocker8/budgetmaster/ui/fxml/FilterGUI.fxml b/src/de/deadlocker8/budgetmaster/ui/fxml/FilterGUI.fxml
index e7585bb45..8e1cf6c95 100644
--- a/src/de/deadlocker8/budgetmaster/ui/fxml/FilterGUI.fxml
+++ b/src/de/deadlocker8/budgetmaster/ui/fxml/FilterGUI.fxml
@@ -83,7 +83,10 @@
                                     </HBox>
                                     <ScrollPane prefHeight="183.0" prefWidth="297.0" VBox.vgrow="ALWAYS">
                                        <content>
-                                          <VBox fx:id="vboxCategories" spacing="5.0" />
+                                          <VBox fx:id="vboxCategories" spacing="5.0">
+                                             <padding>
+                                                <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
+                                             </padding></VBox>
                                        </content>
                                     </ScrollPane>
                                  </children>
@@ -155,7 +158,10 @@
                                     </HBox>
                                     <ScrollPane prefHeight="85.0" prefWidth="409.0" VBox.vgrow="ALWAYS">
                                        <content>
-                                          <VBox fx:id="vboxTags" spacing="5.0" />
+                                          <VBox fx:id="vboxTags" spacing="5.0">
+                                             <padding>
+                                                <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
+                                             </padding></VBox>
                                        </content>
                                     </ScrollPane>
                                  </children>
diff --git a/src/de/deadlocker8/budgetmasterserver/logic/database/DatabaseImportExport.java b/src/de/deadlocker8/budgetmasterserver/logic/database/DatabaseImportExport.java
index 977bc2ace..96a79db8b 100644
--- a/src/de/deadlocker8/budgetmasterserver/logic/database/DatabaseImportExport.java
+++ b/src/de/deadlocker8/budgetmasterserver/logic/database/DatabaseImportExport.java
@@ -1,7 +1,14 @@
 package de.deadlocker8.budgetmasterserver.logic.database;
 
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
 /**
  * Used to mark model classes that only exists in order to allow gson to import and export the database  
  *
  */
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.SOURCE)
 public @interface DatabaseImportExport {}
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java b/src/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java
index 9067c0357..562e2b20f 100644
--- a/src/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java
+++ b/src/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java
@@ -386,4 +386,30 @@ public class DatabaseTagHandler
 			closeConnection(stmt);
 		}
 	}
+	
+	public boolean isTagUsedInMatches(int tagID)
+	{
+		PreparedStatement stmt = null;
+		try
+		{
+			stmt = connection.prepareStatement("SELECT * FROM tag_match WHERE tag_match.Tag_ID = ?;");
+			stmt.setInt(1, tagID);
+			ResultSet rs = stmt.executeQuery();
+
+            while(rs.next())
+            {
+            	return true;
+            }
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeConnection(stmt);
+		}
+		
+		return false;
+	}	
 }
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForPayment.java b/src/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForPayment.java
index dd5613c6c..9f676c0e8 100644
--- a/src/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForPayment.java
+++ b/src/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForPayment.java
@@ -3,6 +3,7 @@ package de.deadlocker8.budgetmasterserver.server.tag.match;
 import static spark.Spark.halt;
 
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.server.updater.TagUpdater;
 import spark.Request;
 import spark.Response;
 import spark.Route;
@@ -35,6 +36,9 @@ public class TagMatchDeleteForPayment implements Route
 			}
 			
 			tagHandler.deleteTagMatchForPayment(tagID, paymentID);
+			
+			TagUpdater tagUpdater = new TagUpdater(tagHandler);
+			tagUpdater.deleteTagsIfNotReferenced();
 
 			return "";
 		}
diff --git a/src/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForRepeatingPayment.java b/src/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForRepeatingPayment.java
index 505ad6cb4..ab0e5a1c6 100644
--- a/src/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForRepeatingPayment.java
+++ b/src/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForRepeatingPayment.java
@@ -3,6 +3,7 @@ package de.deadlocker8.budgetmasterserver.server.tag.match;
 import static spark.Spark.halt;
 
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.server.updater.TagUpdater;
 import spark.Request;
 import spark.Response;
 import spark.Route;
@@ -35,6 +36,9 @@ public class TagMatchDeleteForRepeatingPayment implements Route
 			}
 			
 			tagHandler.deleteTagMatchForRepeatingPayment(tagID, repeatingPaymentID);
+			
+			TagUpdater tagUpdater = new TagUpdater(tagHandler);
+			tagUpdater.deleteTagsIfNotReferenced();
 
 			return "";
 		}
diff --git a/src/de/deadlocker8/budgetmasterserver/server/updater/TagUpdater.java b/src/de/deadlocker8/budgetmasterserver/server/updater/TagUpdater.java
new file mode 100644
index 000000000..1263871ae
--- /dev/null
+++ b/src/de/deadlocker8/budgetmasterserver/server/updater/TagUpdater.java
@@ -0,0 +1,28 @@
+package de.deadlocker8.budgetmasterserver.server.updater;
+
+import java.util.ArrayList;
+
+import de.deadlocker8.budgetmaster.logic.tag.Tag;
+import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+
+public class TagUpdater
+{
+	private DatabaseTagHandler tagHandler;
+	
+	public TagUpdater(DatabaseTagHandler tagHandler)
+	{	
+		this.tagHandler = tagHandler;
+	}
+	
+	public void deleteTagsIfNotReferenced() 
+	{
+		ArrayList<Tag> tags = tagHandler.getAllTags();
+		for(Tag currentTag : tags)
+		{
+			if(!tagHandler.isTagUsedInMatches(currentTag.getID()))
+			{		
+				tagHandler.deleteTag(currentTag.getID());
+			}
+		}
+	}
+}
\ No newline at end of file
-- 
GitLab