From a9386126082a82d662e37cec79c3d449d89d25cf Mon Sep 17 00:00:00 2001
From: Roland Haeder <roland@mxchange.org>
Date: Fri, 17 Jul 2015 10:48:30 +0200
Subject: [PATCH] =?utf8?q?Rewrite=20start=20of=20storing=20contacts=20in?=
 =?utf8?q?=20database=20as=20the=20previous=20was=20just=20for=20demo=20(n?=
 =?utf8?q?eeds=20Apache=20Log4J=202.x)=20Signed-off-by:Roland=20H=C3=A4der?=
 =?utf8?q?=20<roland@mxchange.org>?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

---
 .../addressbook/contact/BaseContact.java      |  3 +-
 .../{csv => }/BaseDatabaseBackend.java        |  7 +-
 .../database/backend/DatabaseBackend.java     |  6 ++
 .../database/backend/csv/CsvBackend.java      | 35 ++++++++++
 .../backend/csv/CsvDatabaseBackend.java       | 17 ++++-
 .../contact/ContactDatabaseFrontend.java      | 64 ++++++++++++++++---
 .../frontend/contact/ContactWrapper.java      | 17 +++--
 .../manager/contact/ContactManager.java       | 64 +++++++++++++------
 .../manager/contact/ManageableContact.java    |  7 ++
 9 files changed, 182 insertions(+), 38 deletions(-)
 rename Addressbook/src/org/mxchange/addressbook/database/backend/{csv => }/BaseDatabaseBackend.java (83%)
 create mode 100644 Addressbook/src/org/mxchange/addressbook/database/backend/csv/CsvBackend.java

diff --git a/Addressbook/src/org/mxchange/addressbook/contact/BaseContact.java b/Addressbook/src/org/mxchange/addressbook/contact/BaseContact.java
index ef465f7..3e9da4c 100644
--- a/Addressbook/src/org/mxchange/addressbook/contact/BaseContact.java
+++ b/Addressbook/src/org/mxchange/addressbook/contact/BaseContact.java
@@ -543,7 +543,8 @@ public class BaseContact extends BaseFrameworkSystem {
     public String getCsvStringFromStoreableObject () {
 	// Get all together
 	String csvString = String.format(
-		"\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\"\n",
+		"\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\";\"%s\"\n",
+		this.isOwnContact(),
 		this.getGender(),
 		this.getSurname(),
 		this.getFamilyName(),
diff --git a/Addressbook/src/org/mxchange/addressbook/database/backend/csv/BaseDatabaseBackend.java b/Addressbook/src/org/mxchange/addressbook/database/backend/BaseDatabaseBackend.java
similarity index 83%
rename from Addressbook/src/org/mxchange/addressbook/database/backend/csv/BaseDatabaseBackend.java
rename to Addressbook/src/org/mxchange/addressbook/database/backend/BaseDatabaseBackend.java
index 59fe870..539f6d2 100644
--- a/Addressbook/src/org/mxchange/addressbook/database/backend/csv/BaseDatabaseBackend.java
+++ b/Addressbook/src/org/mxchange/addressbook/database/backend/BaseDatabaseBackend.java
@@ -14,15 +14,16 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-package org.mxchange.addressbook.database.backend.csv;
+package org.mxchange.addressbook.database.backend;
 
 import org.mxchange.addressbook.BaseFrameworkSystem;
 
 /**
- *
+ * Generall database backend
+ * 
  * @author Roland Haeder
  */
-class BaseDatabaseBackend extends BaseFrameworkSystem {
+public class BaseDatabaseBackend extends BaseFrameworkSystem {
     /**
      * No instances from this class
      */
diff --git a/Addressbook/src/org/mxchange/addressbook/database/backend/DatabaseBackend.java b/Addressbook/src/org/mxchange/addressbook/database/backend/DatabaseBackend.java
index a9d71f9..0d83aca 100644
--- a/Addressbook/src/org/mxchange/addressbook/database/backend/DatabaseBackend.java
+++ b/Addressbook/src/org/mxchange/addressbook/database/backend/DatabaseBackend.java
@@ -26,6 +26,12 @@ import org.mxchange.addressbook.database.storage.Storeable;
  * @author Roland Haeder
  */
 public interface DatabaseBackend extends FrameworkInterface {
+
+    /**
+     * Rewinds backend
+     */
+    public void rewind ();
+
     /**
      * Stores an object in the database.
      * 
diff --git a/Addressbook/src/org/mxchange/addressbook/database/backend/csv/CsvBackend.java b/Addressbook/src/org/mxchange/addressbook/database/backend/csv/CsvBackend.java
new file mode 100644
index 0000000..4a4df5c
--- /dev/null
+++ b/Addressbook/src/org/mxchange/addressbook/database/backend/csv/CsvBackend.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2015 Roland Haeder
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.mxchange.addressbook.database.backend.csv;
+
+import java.util.Iterator;
+import org.mxchange.addressbook.contact.Contact;
+import org.mxchange.addressbook.database.backend.DatabaseBackend;
+
+/**
+ *
+ * @author Roland Haeder
+ */
+public interface CsvBackend extends DatabaseBackend {
+
+    /**
+     * Gets an iterator for contacts
+     * 
+     * @return Iterator for contacts
+     */
+    public Iterator<Contact> contactIterator ();
+}
diff --git a/Addressbook/src/org/mxchange/addressbook/database/backend/csv/CsvDatabaseBackend.java b/Addressbook/src/org/mxchange/addressbook/database/backend/csv/CsvDatabaseBackend.java
index c2caeb3..a070abb 100644
--- a/Addressbook/src/org/mxchange/addressbook/database/backend/csv/CsvDatabaseBackend.java
+++ b/Addressbook/src/org/mxchange/addressbook/database/backend/csv/CsvDatabaseBackend.java
@@ -21,8 +21,8 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.RandomAccessFile;
 import java.text.MessageFormat;
+import org.mxchange.addressbook.database.backend.BaseDatabaseBackend;
 import org.mxchange.addressbook.database.storage.Storeable;
-import org.mxchange.addressbook.database.backend.DatabaseBackend;
 import org.mxchange.addressbook.database.storage.csv.StoreableCsv;
 
 /**
@@ -30,7 +30,7 @@ import org.mxchange.addressbook.database.storage.csv.StoreableCsv;
  * 
  * @author Roland Haeder
  */
-public class CsvDatabaseBackend extends BaseDatabaseBackend implements DatabaseBackend {
+public class CsvDatabaseBackend extends BaseDatabaseBackend implements CsvBackend {
     /**
      * Output stream for this storage engine
      */
@@ -67,6 +67,17 @@ public class CsvDatabaseBackend extends BaseDatabaseBackend implements DatabaseB
 	this.getLogger().debug(MessageFormat.format("Database for {0} has been initialized.", tableName));
     }
 
+    @Override
+    public void rewind () {
+	try {
+	    // Rewind underlaying database file
+	    this.storageFile.seek(0);
+	} catch (final IOException ex) {
+	    this.getLogger().catching(ex);
+	    System.exit(1);
+	}
+    }
+
     /**
      * Stores given object by "visiting" it
      *
@@ -81,7 +92,7 @@ public class CsvDatabaseBackend extends BaseDatabaseBackend implements DatabaseB
 	// Try to cast it, this will fail if the interface is not implemented
 	StoreableCsv csv = (StoreableCsv) object;
 
-	// Now get the object that needs to be stored
+	// Now get a string from the object that needs to be stored
 	String str = csv.getCsvStringFromStoreableObject();
 
 	// Debug message
diff --git a/Addressbook/src/org/mxchange/addressbook/database/frontend/contact/ContactDatabaseFrontend.java b/Addressbook/src/org/mxchange/addressbook/database/frontend/contact/ContactDatabaseFrontend.java
index a67be31..2f55241 100644
--- a/Addressbook/src/org/mxchange/addressbook/database/frontend/contact/ContactDatabaseFrontend.java
+++ b/Addressbook/src/org/mxchange/addressbook/database/frontend/contact/ContactDatabaseFrontend.java
@@ -17,9 +17,13 @@
 package org.mxchange.addressbook.database.frontend.contact;
 
 import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
 import org.mxchange.addressbook.contact.Contact;
-import org.mxchange.addressbook.database.storage.Storeable;
+import org.mxchange.addressbook.database.backend.csv.CsvBackend;
 import org.mxchange.addressbook.database.frontend.BaseDatabaseFrontend;
+import org.mxchange.addressbook.database.storage.Storeable;
+import org.mxchange.addressbook.manager.contact.ManageableContact;
 
 /**
  * Stores and retrieves Contact instances
@@ -40,14 +44,58 @@ public class ContactDatabaseFrontend extends BaseDatabaseFrontend implements Con
 	this.initBackend();
     }
 
+    /**
+     * Flushes all contact entries to database
+     * @param contactManager An instance of a MangeableContact class
+     */
+    @Override
+    public void flushAllContacts (final ManageableContact contactManager) {
+	// Get full list
+	List<Contact> contacts = contactManager.getList();
+
+	// Get iterator
+	Iterator<Contact> iterator = contacts.iterator();
+
+	// Rewind backend
+	this.getBackend().rewind();
+
+	// Get all entries
+	while (iterator.hasNext()) {
+	    // Get next entry
+	    Contact contact = iterator.next();
+
+	    try {
+		// Store this entry
+		this.getBackend().store((Storeable) contact);
+	    } catch (final IOException ex) {
+		// Should not happen?
+		this.getLogger().catching(ex);
+		System.exit(1);
+	    }
+	}
+    }
+
+    /**
+     * Reads all contacts from database backend and handles them over to the
+     * contact manager
+     * 
+     * @param contactManager Contact manager to handle loaded contacts
+     */
     @Override
-    public void addContact (final Contact contact) {
-	try {
-	    // Try to cast the object and handle it over to the backend
-	    this.getBackend().store((Storeable) contact);
-	} catch (final IOException ex) {
-	    this.getLogger().error("Cannot write contact to storage: " + ex.getMessage());
-	    System.exit(1);
+    public void readAllContacts (final ManageableContact contactManager) {
+	// Get iterator and case it
+	CsvBackend backend = (CsvBackend) this.getBackend();
+	
+	// First rewind to beginning
+	this.getBackend().rewind();
+
+	// Get backend iterator
+	Iterator<Contact> iterator = .contactIterator();
+
+	// Read all entries
+	while (iterator.hasNext()) {
+	    // Get next entry
+	    Contact contact = iterator.next();
 	}
     }
 }
diff --git a/Addressbook/src/org/mxchange/addressbook/database/frontend/contact/ContactWrapper.java b/Addressbook/src/org/mxchange/addressbook/database/frontend/contact/ContactWrapper.java
index e5d5d8f..ce574ab 100644
--- a/Addressbook/src/org/mxchange/addressbook/database/frontend/contact/ContactWrapper.java
+++ b/Addressbook/src/org/mxchange/addressbook/database/frontend/contact/ContactWrapper.java
@@ -16,18 +16,27 @@
  */
 package org.mxchange.addressbook.database.frontend.contact;
 
-import org.mxchange.addressbook.contact.Contact;
 import org.mxchange.addressbook.database.frontend.DatabaseWrapper;
+import org.mxchange.addressbook.manager.contact.ManageableContact;
 
 /**
  *
  * @author Roland Häder
  */
 public interface ContactWrapper extends DatabaseWrapper {
+
+    /**
+     * Flushes all contact entries to database
+     * 
+     * @param contactManager An instance of a MangeableContact class
+     */
+    public void flushAllContacts (final ManageableContact contactManager);
+
     /**
-     * Adds a Contact instance to database
+     * Reads all contacts from database backend and handles them over to the
+     * contact manager
      * 
-     * @param contact Contact instance to add(store) to database
+     * @param contactManager 
      */
-    public void addContact (final Contact contact);
+    public void readAllContacts (final ManageableContact contactManager);
 }
diff --git a/Addressbook/src/org/mxchange/addressbook/manager/contact/ContactManager.java b/Addressbook/src/org/mxchange/addressbook/manager/contact/ContactManager.java
index 73c095b..d4f7c32 100644
--- a/Addressbook/src/org/mxchange/addressbook/manager/contact/ContactManager.java
+++ b/Addressbook/src/org/mxchange/addressbook/manager/contact/ContactManager.java
@@ -17,6 +17,7 @@
 package org.mxchange.addressbook.manager.contact;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import org.mxchange.addressbook.UnhandledUserChoiceException;
@@ -61,6 +62,9 @@ public class ContactManager extends BaseManager implements ManageableContact {
 	// Init database connection
 	this.contactDatabase = new ContactDatabaseFrontend();
 
+	// Read all entries
+	this.contactDatabase.readAllContacts(this);
+
 	// Debug message
 	//* NOISY-DEBUG: */ this.getLogger().debug("client=" + client);
 
@@ -91,15 +95,8 @@ public class ContactManager extends BaseManager implements ManageableContact {
 	// Add contact to internal list
 	this.contacts.add(contact);
 
-	/*
-	 * @TODO This call doesn't make sense, it would cause that only one
-	 * entry exist in storage. A better solution is to iterate over all
-	 * contacts and add them. This may also require to rewrite the database
-	 * layer a little. For demonstrational purposes, this should be fine.
-	 */
-
-	// Add object to database
-	this.getContactDatabase().addContact(contact);
+	// Flush whole list
+	this.flush();
     }
 
     /**
@@ -191,6 +188,9 @@ public class ContactManager extends BaseManager implements ManageableContact {
 	    // Other contact's address data to change
 	    throw new UnsupportedOperationException("Changing contact entries not finished.");
 	}
+
+	// Flush whole list
+	this.flush();
     }
 
     /**
@@ -225,6 +225,9 @@ public class ContactManager extends BaseManager implements ManageableContact {
 	    // Then re-ask them ...
 	    throw new UnsupportedOperationException("Changing contact entries not finished.");
 	}
+
+	// Flush whole list
+	this.flush();
     }
 
     /**
@@ -262,6 +265,9 @@ public class ContactManager extends BaseManager implements ManageableContact {
 	    // Then re-ask them ...
 	    throw new UnsupportedOperationException("Changing contact entries not finished.");
 	}
+
+	// Flush whole list
+	this.flush();
     }
 
     /**
@@ -291,6 +297,16 @@ public class ContactManager extends BaseManager implements ManageableContact {
 	this.addContact(contact);
     }
 
+    /**
+     * Getter for whole contact list
+     * 
+     * @return List of all contacts
+     */
+    @Override
+    public List<Contact> getList () {
+	return Collections.unmodifiableList(this.contacts);
+    }
+
     /**
      * Getter for size
      *
@@ -414,6 +430,23 @@ public class ContactManager extends BaseManager implements ManageableContact {
 	return this.getClient().enterInt(0, 99_999, "Bitte geben Sie Ihre Postleitzahl ein: ");
     }
 
+    /**
+     * Flushes all entries by calling database backend
+     */
+    private void flush () {
+	// Flusgh all
+	this.getContactDatabase().flushAllContacts(this);
+    }
+
+    /**
+     * A ContactWrapper instance
+     *
+     * @return the database
+     */
+    private ContactWrapper getContactDatabase () {
+	return this.contactDatabase;
+    }
+
     /**
      * "Getter" for own contact instance or null if not found
      *
@@ -481,7 +514,9 @@ public class ContactManager extends BaseManager implements ManageableContact {
     }
 
     /**
-     * Checks whether own contact is already added by checking all entries for isOwnContact flag
+     * Checks whether own contact is already added by checking all entries for
+     * isOwnContact flag
+     * 
      * @return Whether own contact is already added
      */
     private boolean isOwnContactAdded () {
@@ -511,13 +546,4 @@ public class ContactManager extends BaseManager implements ManageableContact {
 	// Return result
 	return isAdded;
     }
-
-    /**
-     * A ContactWrapper instance
-     *
-     * @return the database
-     */
-    private ContactWrapper getContactDatabase () {
-	return this.contactDatabase;
-    }
 }
diff --git a/Addressbook/src/org/mxchange/addressbook/manager/contact/ManageableContact.java b/Addressbook/src/org/mxchange/addressbook/manager/contact/ManageableContact.java
index 6df9615..14c3be6 100644
--- a/Addressbook/src/org/mxchange/addressbook/manager/contact/ManageableContact.java
+++ b/Addressbook/src/org/mxchange/addressbook/manager/contact/ManageableContact.java
@@ -16,6 +16,7 @@
  */
 package org.mxchange.addressbook.manager.contact;
 
+import java.util.List;
 import org.mxchange.addressbook.client.Client;
 import org.mxchange.addressbook.contact.Contact;
 import org.mxchange.addressbook.manager.Manageable;
@@ -84,6 +85,12 @@ public interface ManageableContact extends Manageable {
      */
     public void doEnterOwnData();
 
+    /**
+     * Getter for whole list
+     * @return List of all contacts
+     */
+    public List<Contact> getList ();
+
     /**
      * Getter for size
      *
-- 
2.39.5