diff --git a/service-layer/src/main/java/com/iluwatar/app/App.java b/service-layer/src/main/java/com/iluwatar/app/App.java index 27411ddb0..813c74220 100644 --- a/service-layer/src/main/java/com/iluwatar/app/App.java +++ b/service-layer/src/main/java/com/iluwatar/app/App.java @@ -1,5 +1,7 @@ package com.iluwatar.app; +import java.util.List; + import com.iluwatar.magic.MagicService; import com.iluwatar.magic.MagicServiceImpl; import com.iluwatar.spell.Spell; @@ -14,18 +16,34 @@ import com.iluwatar.wizard.WizardDaoImpl; /** + * Service layer defines an application's boundary with a layer of services that establishes + * a set of available operations and coordinates the application's response in each operation. * + * Enterprise applications typically require different kinds of interfaces to the data + * they store and the logic they implement: data loaders, user interfaces, integration gateways, + * and others. Despite their different purposes, these interfaces often need common interactions + * with the application to access and manipulate its data and invoke its business logic. The + * interactions may be complex, involving transactions across multiple resources and the + * coordination of several responses to an action. Encoding the logic of the interactions + * separately in each interface causes a lot of duplication. * + * The example application demonstrates interactions between a client (App) and a service + * (MagicService). The service is implemented with 3-layer architecture (entity, dao, service). + * For persistence the example uses in-memory H2 database which is populated on each application + * startup. * */ public class App { public static void main( String[] args ) { + // populate the in-memory database initData(); + // query the data using the service queryData(); } public static void initData() { + // spells Spell spell1 = new Spell("Ice dart"); Spell spell2 = new Spell("Invisibility"); Spell spell3 = new Spell("Stun bolt"); @@ -62,6 +80,7 @@ public class App { spellDao.persist(spell16); spellDao.persist(spell17); + // spellbooks SpellbookDao spellbookDao = new SpellbookDaoImpl(); Spellbook spellbook1 = new Spellbook("Book of Orgymon"); spellbookDao.persist(spellbook1); @@ -102,6 +121,7 @@ public class App { spellbook7.addSpell(spell17); spellbookDao.merge(spellbook7); + // wizards WizardDao wizardDao = new WizardDaoImpl(); Wizard wizard1 = new Wizard("Aderlard Boud"); wizardDao.persist(wizard1); @@ -138,5 +158,15 @@ public class App { for (Spell s: service.findAllSpells()) { System.out.println(s.getName()); } + System.out.println("Find wizards with spellbook 'Book of Idores'"); + List wizardsWithSpellbook = service.findWizardsWithSpellbook("Book of Idores"); + for (Wizard w: wizardsWithSpellbook) { + System.out.println(String.format("%s has 'Book of Idores'", w.getName())); + } + System.out.println("Find wizards with spell 'Fireball'"); + List wizardsWithSpell = service.findWizardsWithSpell("Fireball"); + for (Wizard w: wizardsWithSpell) { + System.out.println(String.format("%s has 'Fireball'", w.getName())); + } } } diff --git a/service-layer/src/main/java/com/iluwatar/common/BaseEntity.java b/service-layer/src/main/java/com/iluwatar/common/BaseEntity.java index 752d5bfdc..072d8277b 100644 --- a/service-layer/src/main/java/com/iluwatar/common/BaseEntity.java +++ b/service-layer/src/main/java/com/iluwatar/common/BaseEntity.java @@ -5,6 +5,11 @@ import javax.persistence.InheritanceType; import javax.persistence.MappedSuperclass; import javax.persistence.Version; +/** + * + * Base class for entities. + * + */ @MappedSuperclass @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) public class BaseEntity { diff --git a/service-layer/src/main/java/com/iluwatar/common/Dao.java b/service-layer/src/main/java/com/iluwatar/common/Dao.java index 768cd4e43..f8e81aafb 100644 --- a/service-layer/src/main/java/com/iluwatar/common/Dao.java +++ b/service-layer/src/main/java/com/iluwatar/common/Dao.java @@ -2,6 +2,13 @@ package com.iluwatar.common; import java.util.List; +/** + * + * Dao interface. + * + * @param + * + */ public interface Dao { E find(Long id); diff --git a/service-layer/src/main/java/com/iluwatar/common/DaoBaseImpl.java b/service-layer/src/main/java/com/iluwatar/common/DaoBaseImpl.java index 4c7c4f89f..a5d2ea6b4 100644 --- a/service-layer/src/main/java/com/iluwatar/common/DaoBaseImpl.java +++ b/service-layer/src/main/java/com/iluwatar/common/DaoBaseImpl.java @@ -10,6 +10,13 @@ import org.hibernate.criterion.Restrictions; import com.iluwatar.hibernate.HibernateUtil; +/** + * + * Base class for Dao implementations. + * + * @param + * + */ public abstract class DaoBaseImpl implements Dao { @SuppressWarnings("unchecked") diff --git a/service-layer/src/main/java/com/iluwatar/hibernate/HibernateUtil.java b/service-layer/src/main/java/com/iluwatar/hibernate/HibernateUtil.java index d6f26765f..01699e52f 100644 --- a/service-layer/src/main/java/com/iluwatar/hibernate/HibernateUtil.java +++ b/service-layer/src/main/java/com/iluwatar/hibernate/HibernateUtil.java @@ -7,6 +7,11 @@ import com.iluwatar.spell.Spell; import com.iluwatar.spellbook.Spellbook; import com.iluwatar.wizard.Wizard; +/** + * + * Produces the Hibernate SessionFactory. + * + */ public class HibernateUtil { private static final SessionFactory sessionFactory; diff --git a/service-layer/src/main/java/com/iluwatar/magic/MagicService.java b/service-layer/src/main/java/com/iluwatar/magic/MagicService.java index 846705a38..75765cd44 100644 --- a/service-layer/src/main/java/com/iluwatar/magic/MagicService.java +++ b/service-layer/src/main/java/com/iluwatar/magic/MagicService.java @@ -7,6 +7,11 @@ import com.iluwatar.spellbook.Spellbook; import com.iluwatar.wizard.Wizard; +/** + * + * Service interface. + * + */ public interface MagicService { List findAllWizards(); @@ -14,5 +19,8 @@ public interface MagicService { List findAllSpellbooks(); List findAllSpells(); - + + List findWizardsWithSpellbook(String name); + + List findWizardsWithSpell(String name); } diff --git a/service-layer/src/main/java/com/iluwatar/magic/MagicServiceImpl.java b/service-layer/src/main/java/com/iluwatar/magic/MagicServiceImpl.java index fc300eab8..1c1f722db 100644 --- a/service-layer/src/main/java/com/iluwatar/magic/MagicServiceImpl.java +++ b/service-layer/src/main/java/com/iluwatar/magic/MagicServiceImpl.java @@ -1,5 +1,6 @@ package com.iluwatar.magic; +import java.util.ArrayList; import java.util.List; import com.iluwatar.spell.Spell; @@ -9,6 +10,11 @@ import com.iluwatar.spellbook.SpellbookDao; import com.iluwatar.wizard.Wizard; import com.iluwatar.wizard.WizardDao; +/** + * + * Service implementation. + * + */ public class MagicServiceImpl implements MagicService { private WizardDao wizardDao; @@ -35,4 +41,17 @@ public class MagicServiceImpl implements MagicService { public List findAllSpells() { return spellDao.findAll(); } + + @Override + public List findWizardsWithSpellbook(String name) { + Spellbook spellbook = spellbookDao.findByName(name); + return new ArrayList(spellbook.getWizards()); + } + + @Override + public List findWizardsWithSpell(String name) { + Spell spell = spellDao.findByName(name); + Spellbook spellbook = spell.getSpellbook(); + return new ArrayList(spellbook.getWizards()); + } } diff --git a/service-layer/src/main/java/com/iluwatar/spell/Spell.java b/service-layer/src/main/java/com/iluwatar/spell/Spell.java index 6db7f2c5a..0202efcbc 100644 --- a/service-layer/src/main/java/com/iluwatar/spell/Spell.java +++ b/service-layer/src/main/java/com/iluwatar/spell/Spell.java @@ -11,6 +11,11 @@ import javax.persistence.Table; import com.iluwatar.common.BaseEntity; import com.iluwatar.spellbook.Spellbook; +/** + * + * Spell entity. + * + */ @Entity @Table(name="SPELL") public class Spell extends BaseEntity { diff --git a/service-layer/src/main/java/com/iluwatar/spell/SpellDao.java b/service-layer/src/main/java/com/iluwatar/spell/SpellDao.java index 65e6fdc38..318ec24f0 100644 --- a/service-layer/src/main/java/com/iluwatar/spell/SpellDao.java +++ b/service-layer/src/main/java/com/iluwatar/spell/SpellDao.java @@ -2,6 +2,11 @@ package com.iluwatar.spell; import com.iluwatar.common.Dao; +/** + * + * SpellDao interface. + * + */ public interface SpellDao extends Dao { Spell findByName(String name); diff --git a/service-layer/src/main/java/com/iluwatar/spell/SpellDaoImpl.java b/service-layer/src/main/java/com/iluwatar/spell/SpellDaoImpl.java index 4b816af60..ac6391421 100644 --- a/service-layer/src/main/java/com/iluwatar/spell/SpellDaoImpl.java +++ b/service-layer/src/main/java/com/iluwatar/spell/SpellDaoImpl.java @@ -7,6 +7,11 @@ import org.hibernate.criterion.Expression; import com.iluwatar.common.DaoBaseImpl; +/** + * + * SpellDao implementation. + * + */ public class SpellDaoImpl extends DaoBaseImpl implements SpellDao { @Override @@ -19,6 +24,7 @@ public class SpellDaoImpl extends DaoBaseImpl implements SpellDao { Criteria criteria = session.createCriteria(persistentClass); criteria.add(Expression.eq("name", name)); result = (Spell) criteria.uniqueResult(); + result.getSpellbook().getWizards().size(); tx.commit(); } catch (Exception e) { diff --git a/service-layer/src/main/java/com/iluwatar/spellbook/Spellbook.java b/service-layer/src/main/java/com/iluwatar/spellbook/Spellbook.java index 85cbb594e..1b6446255 100644 --- a/service-layer/src/main/java/com/iluwatar/spellbook/Spellbook.java +++ b/service-layer/src/main/java/com/iluwatar/spellbook/Spellbook.java @@ -16,6 +16,11 @@ import com.iluwatar.common.BaseEntity; import com.iluwatar.spell.Spell; import com.iluwatar.wizard.Wizard; +/** + * + * Spellbook entity. + * + */ @Entity @Table(name="SPELLBOOK") public class Spellbook extends BaseEntity { diff --git a/service-layer/src/main/java/com/iluwatar/spellbook/SpellbookDao.java b/service-layer/src/main/java/com/iluwatar/spellbook/SpellbookDao.java index 54a963a0c..7ac54d6a2 100644 --- a/service-layer/src/main/java/com/iluwatar/spellbook/SpellbookDao.java +++ b/service-layer/src/main/java/com/iluwatar/spellbook/SpellbookDao.java @@ -2,6 +2,11 @@ package com.iluwatar.spellbook; import com.iluwatar.common.Dao; +/** + * + * SpellbookDao interface. + * + */ public interface SpellbookDao extends Dao { Spellbook findByName(String name); diff --git a/service-layer/src/main/java/com/iluwatar/spellbook/SpellbookDaoImpl.java b/service-layer/src/main/java/com/iluwatar/spellbook/SpellbookDaoImpl.java index d918bab58..ba3de6ed2 100644 --- a/service-layer/src/main/java/com/iluwatar/spellbook/SpellbookDaoImpl.java +++ b/service-layer/src/main/java/com/iluwatar/spellbook/SpellbookDaoImpl.java @@ -7,6 +7,11 @@ import org.hibernate.criterion.Expression; import com.iluwatar.common.DaoBaseImpl; +/** + * + * SpellbookDao implementation. + * + */ public class SpellbookDaoImpl extends DaoBaseImpl implements SpellbookDao { @Override diff --git a/service-layer/src/main/java/com/iluwatar/wizard/Wizard.java b/service-layer/src/main/java/com/iluwatar/wizard/Wizard.java index a8aac9187..63638c748 100644 --- a/service-layer/src/main/java/com/iluwatar/wizard/Wizard.java +++ b/service-layer/src/main/java/com/iluwatar/wizard/Wizard.java @@ -14,6 +14,11 @@ import javax.persistence.Table; import com.iluwatar.common.BaseEntity; import com.iluwatar.spellbook.Spellbook; +/** + * + * Wizard entity. + * + */ @Entity @Table(name="WIZARD") public class Wizard extends BaseEntity { diff --git a/service-layer/src/main/java/com/iluwatar/wizard/WizardDao.java b/service-layer/src/main/java/com/iluwatar/wizard/WizardDao.java index eaa6b4cef..d0fd52ad7 100644 --- a/service-layer/src/main/java/com/iluwatar/wizard/WizardDao.java +++ b/service-layer/src/main/java/com/iluwatar/wizard/WizardDao.java @@ -2,6 +2,11 @@ package com.iluwatar.wizard; import com.iluwatar.common.Dao; +/** + * + * WizardDao interface. + * + */ public interface WizardDao extends Dao { Wizard findByName(String name); diff --git a/service-layer/src/main/java/com/iluwatar/wizard/WizardDaoImpl.java b/service-layer/src/main/java/com/iluwatar/wizard/WizardDaoImpl.java index d14f1c20e..c5cef69a5 100644 --- a/service-layer/src/main/java/com/iluwatar/wizard/WizardDaoImpl.java +++ b/service-layer/src/main/java/com/iluwatar/wizard/WizardDaoImpl.java @@ -6,7 +6,13 @@ import org.hibernate.Transaction; import org.hibernate.criterion.Expression; import com.iluwatar.common.DaoBaseImpl; +import com.iluwatar.spellbook.Spellbook; +/** + * + * WizardDao implementation. + * + */ public class WizardDaoImpl extends DaoBaseImpl implements WizardDao { @Override @@ -19,7 +25,9 @@ public class WizardDaoImpl extends DaoBaseImpl implements WizardDao { Criteria criteria = session.createCriteria(persistentClass); criteria.add(Expression.eq("name", name)); result = (Wizard) criteria.uniqueResult(); - result.getSpellbooks().size(); + for (Spellbook s: result.getSpellbooks()) { + s.getSpells().size(); + } tx.commit(); } catch (Exception e) {