From 885ec87e6fb0baf865cce3429c56aa26446efd7d Mon Sep 17 00:00:00 2001
From: Ilkka Seppala <iluwatar@gmail.com>
Date: Mon, 13 Apr 2015 22:36:52 +0300
Subject: [PATCH] Moving towards Service Layer example.

---
 dao/src/main/java/com/iluwatar/App.java       | 19 ++++++-----------
 dao/src/main/java/com/iluwatar/Dao.java       | 16 ++++++++++++++
 .../{DaoBase.java => DaoBaseImpl.java}        | 17 +++++++++------
 .../main/java/com/iluwatar/MagicService.java  | 13 ++++++++++++
 .../java/com/iluwatar/MagicServiceImpl.java   | 21 +++++++++++++++++++
 dao/src/main/java/com/iluwatar/Spell.java     |  2 --
 dao/src/main/java/com/iluwatar/SpellDao.java  |  5 -----
 .../main/java/com/iluwatar/SpellDaoImpl.java  |  5 +++++
 dao/src/main/java/com/iluwatar/Spellbook.java |  4 +---
 .../main/java/com/iluwatar/SpellbookDao.java  |  5 -----
 .../java/com/iluwatar/SpellbookDaoImpl.java   |  5 +++++
 dao/src/main/java/com/iluwatar/Wizard.java    |  4 +---
 dao/src/main/java/com/iluwatar/WizardDao.java |  5 -----
 .../main/java/com/iluwatar/WizardDaoImpl.java |  5 +++++
 14 files changed, 84 insertions(+), 42 deletions(-)
 create mode 100644 dao/src/main/java/com/iluwatar/Dao.java
 rename dao/src/main/java/com/iluwatar/{DaoBase.java => DaoBaseImpl.java} (91%)
 create mode 100644 dao/src/main/java/com/iluwatar/MagicService.java
 create mode 100644 dao/src/main/java/com/iluwatar/MagicServiceImpl.java
 delete mode 100644 dao/src/main/java/com/iluwatar/SpellDao.java
 create mode 100644 dao/src/main/java/com/iluwatar/SpellDaoImpl.java
 delete mode 100644 dao/src/main/java/com/iluwatar/SpellbookDao.java
 create mode 100644 dao/src/main/java/com/iluwatar/SpellbookDaoImpl.java
 delete mode 100644 dao/src/main/java/com/iluwatar/WizardDao.java
 create mode 100644 dao/src/main/java/com/iluwatar/WizardDaoImpl.java

diff --git a/dao/src/main/java/com/iluwatar/App.java b/dao/src/main/java/com/iluwatar/App.java
index 285b325ad..db4d417b2 100644
--- a/dao/src/main/java/com/iluwatar/App.java
+++ b/dao/src/main/java/com/iluwatar/App.java
@@ -1,16 +1,15 @@
 package com.iluwatar;
 
-import java.util.List;
 
 
 public class App {
     public static void main( String[] args ) {   
-    	WizardDao dao = new WizardDao();
+    	WizardDaoImpl dao = new WizardDaoImpl();
     	persistData(dao);
-    	queryData(dao);
+    	queryData();
     }
     
-    public static void persistData(WizardDao dao) {
+    public static void persistData(WizardDaoImpl dao) {
     	Spell spell = new Spell("Fireball");
     	Spellbook spellbook = new Spellbook("Book of fire");
     	spell.setSpellbook(spellbook);
@@ -21,16 +20,10 @@ public class App {
     	dao.persist(wizard);
     }
     
-    public static void queryData(WizardDao dao) {
-    	List<Wizard> wizards = dao.findAll();
-    	for (Wizard w: wizards) {
+    public static void queryData() {
+    	MagicService magicService = new MagicServiceImpl();
+    	for (Wizard w: magicService.findAllWizards()) {
     		System.out.println(w);
-    		for (Spellbook spellbook: w.getSpellbooks()) {
-    			System.out.println(spellbook);
-    			for (Spell spell: spellbook.getSpells()) {
-    				System.out.println(spell);
-    			}
-    		}
     	}
     }
 }
diff --git a/dao/src/main/java/com/iluwatar/Dao.java b/dao/src/main/java/com/iluwatar/Dao.java
new file mode 100644
index 000000000..a0edd386e
--- /dev/null
+++ b/dao/src/main/java/com/iluwatar/Dao.java
@@ -0,0 +1,16 @@
+package com.iluwatar;
+
+import java.util.List;
+
+public interface Dao<E extends BaseEntity> {
+
+	E find(Long id);
+	
+	void persist(E entity);
+	
+	E merge(E entity);
+	
+	void delete(E entity);
+	
+	List<E> findAll();
+}
diff --git a/dao/src/main/java/com/iluwatar/DaoBase.java b/dao/src/main/java/com/iluwatar/DaoBaseImpl.java
similarity index 91%
rename from dao/src/main/java/com/iluwatar/DaoBase.java
rename to dao/src/main/java/com/iluwatar/DaoBaseImpl.java
index 86c09bbc3..a022f7038 100644
--- a/dao/src/main/java/com/iluwatar/DaoBase.java
+++ b/dao/src/main/java/com/iluwatar/DaoBaseImpl.java
@@ -10,7 +10,7 @@ import org.hibernate.Transaction;
 import org.hibernate.cfg.Configuration;
 import org.hibernate.criterion.Restrictions;
 
-public abstract class DaoBase<E extends BaseEntity> {
+public abstract class DaoBaseImpl<E extends BaseEntity> implements Dao<E> {
 	
 	@SuppressWarnings("unchecked")
 	protected Class<E> persistentClass = (Class<E>) ((ParameterizedType) getClass()
@@ -36,7 +36,8 @@ public abstract class DaoBase<E extends BaseEntity> {
 		return sessionFactory.openSession();
 	}
 	
-	E find(Long id) {
+	@Override
+	public E find(Long id) {
 		Session session = getSession();
 		Transaction tx = null;
 		E result = null;
@@ -57,7 +58,8 @@ public abstract class DaoBase<E extends BaseEntity> {
 		return result;
 	}
 	
-	void persist(E entity) {
+	@Override
+	public void persist(E entity) {
 		Session session = getSession();
 		Transaction tx = null;
 		try {
@@ -74,7 +76,8 @@ public abstract class DaoBase<E extends BaseEntity> {
 		}		
 	}
 	
-	E merge(E entity) {
+	@Override
+	public E merge(E entity) {
 		Session session = getSession();
 		Transaction tx = null;
 		E result = null;
@@ -93,7 +96,8 @@ public abstract class DaoBase<E extends BaseEntity> {
 		return result;
 	}
 	
-	void delete(E entity) {
+	@Override
+	public void delete(E entity) {
 		Session session = getSession();
 		Transaction tx = null;
 		try {
@@ -110,7 +114,8 @@ public abstract class DaoBase<E extends BaseEntity> {
 		}		
 	}
 	
-	List<E> findAll() {
+	@Override
+	public List<E> findAll() {
 		Session session = getSession();
 		Transaction tx = null;
 		List<E> result = null;
diff --git a/dao/src/main/java/com/iluwatar/MagicService.java b/dao/src/main/java/com/iluwatar/MagicService.java
new file mode 100644
index 000000000..c02c23ecb
--- /dev/null
+++ b/dao/src/main/java/com/iluwatar/MagicService.java
@@ -0,0 +1,13 @@
+package com.iluwatar;
+
+import java.util.List;
+
+public interface MagicService {
+
+	List<Wizard> findAllWizards();
+
+	List<Spellbook> findAllSpellbooks();
+	
+	List<Spell> findAllSpells();
+	
+}
diff --git a/dao/src/main/java/com/iluwatar/MagicServiceImpl.java b/dao/src/main/java/com/iluwatar/MagicServiceImpl.java
new file mode 100644
index 000000000..8fbd0d6e4
--- /dev/null
+++ b/dao/src/main/java/com/iluwatar/MagicServiceImpl.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+import java.util.List;
+
+public class MagicServiceImpl implements MagicService {
+
+	@Override
+	public List<Wizard> findAllWizards() {
+		return new WizardDaoImpl().findAll();
+	}
+
+	@Override
+	public List<Spellbook> findAllSpellbooks() {
+		return new SpellbookDaoImpl().findAll();
+	}
+
+	@Override
+	public List<Spell> findAllSpells() {
+		return new SpellDaoImpl().findAll();
+	}
+}
diff --git a/dao/src/main/java/com/iluwatar/Spell.java b/dao/src/main/java/com/iluwatar/Spell.java
index 076575e85..04b9dcd8b 100644
--- a/dao/src/main/java/com/iluwatar/Spell.java
+++ b/dao/src/main/java/com/iluwatar/Spell.java
@@ -4,8 +4,6 @@ import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
diff --git a/dao/src/main/java/com/iluwatar/SpellDao.java b/dao/src/main/java/com/iluwatar/SpellDao.java
deleted file mode 100644
index 1d96e231e..000000000
--- a/dao/src/main/java/com/iluwatar/SpellDao.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.iluwatar;
-
-public class SpellDao extends DaoBase<Spell> {
-
-}
diff --git a/dao/src/main/java/com/iluwatar/SpellDaoImpl.java b/dao/src/main/java/com/iluwatar/SpellDaoImpl.java
new file mode 100644
index 000000000..77e6872bd
--- /dev/null
+++ b/dao/src/main/java/com/iluwatar/SpellDaoImpl.java
@@ -0,0 +1,5 @@
+package com.iluwatar;
+
+public class SpellDaoImpl extends DaoBaseImpl<Spell> {
+
+}
diff --git a/dao/src/main/java/com/iluwatar/Spellbook.java b/dao/src/main/java/com/iluwatar/Spellbook.java
index 63b7de0b7..fbd490e70 100644
--- a/dao/src/main/java/com/iluwatar/Spellbook.java
+++ b/dao/src/main/java/com/iluwatar/Spellbook.java
@@ -9,8 +9,6 @@ import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
@@ -48,7 +46,7 @@ public class Spellbook extends BaseEntity {
 	@JoinColumn(name="WIZARD_ID_FK", referencedColumnName="WIZARD_ID")
 	private Wizard wizard;
 
-	@OneToMany(mappedBy = "spellbook", orphanRemoval = true, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
+	@OneToMany(mappedBy = "spellbook", orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
 	private Set<Spell> spells;
 	
 	public String getName() {
diff --git a/dao/src/main/java/com/iluwatar/SpellbookDao.java b/dao/src/main/java/com/iluwatar/SpellbookDao.java
deleted file mode 100644
index b1b1497dc..000000000
--- a/dao/src/main/java/com/iluwatar/SpellbookDao.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.iluwatar;
-
-public class SpellbookDao extends DaoBase<Spellbook> {
-
-}
diff --git a/dao/src/main/java/com/iluwatar/SpellbookDaoImpl.java b/dao/src/main/java/com/iluwatar/SpellbookDaoImpl.java
new file mode 100644
index 000000000..e1c6fd6f6
--- /dev/null
+++ b/dao/src/main/java/com/iluwatar/SpellbookDaoImpl.java
@@ -0,0 +1,5 @@
+package com.iluwatar;
+
+public class SpellbookDaoImpl extends DaoBaseImpl<Spellbook> {
+
+}
diff --git a/dao/src/main/java/com/iluwatar/Wizard.java b/dao/src/main/java/com/iluwatar/Wizard.java
index c75f549c6..bd8481f15 100644
--- a/dao/src/main/java/com/iluwatar/Wizard.java
+++ b/dao/src/main/java/com/iluwatar/Wizard.java
@@ -9,8 +9,6 @@ import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 
@@ -42,7 +40,7 @@ public class Wizard extends BaseEntity {
 	
 	private String name;
 
-	@OneToMany(mappedBy = "wizard", orphanRemoval = true, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
+	@OneToMany(mappedBy = "wizard", orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
 	private Set<Spellbook> spellbooks;
 	
 	public String getFirstName() {
diff --git a/dao/src/main/java/com/iluwatar/WizardDao.java b/dao/src/main/java/com/iluwatar/WizardDao.java
deleted file mode 100644
index f9cf92768..000000000
--- a/dao/src/main/java/com/iluwatar/WizardDao.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.iluwatar;
-
-public class WizardDao extends DaoBase<Wizard> {
-
-}
diff --git a/dao/src/main/java/com/iluwatar/WizardDaoImpl.java b/dao/src/main/java/com/iluwatar/WizardDaoImpl.java
new file mode 100644
index 000000000..58d61216b
--- /dev/null
+++ b/dao/src/main/java/com/iluwatar/WizardDaoImpl.java
@@ -0,0 +1,5 @@
+package com.iluwatar;
+
+public class WizardDaoImpl extends DaoBaseImpl<Wizard> {
+
+}