diff --git a/layers/src/main/java/com/iluwatar/layers/App.java b/layers/src/main/java/com/iluwatar/layers/App.java
index 5a5bde483..b7407b681 100644
--- a/layers/src/main/java/com/iluwatar/layers/App.java
+++ b/layers/src/main/java/com/iluwatar/layers/App.java
@@ -2,10 +2,67 @@ package com.iluwatar.layers;
import java.util.Arrays;
+/**
+ *
+ *
+ * Multilayered architecture is an architectural style where software responsibilities are
+ * divided among the different layers of the application.
+ *
+ *
+ *
+ * This example demonstrates a traditional 3-layer architecture consisting of data access
+ * layer, business layer and presentation layer.
+ *
+ *
+ *
+ * The data access layer is formed of Spring Data repositories CakeDao
, CakeToppingDao
and
+ * CakeLayerDao
. The repositories can be used for CRUD operations on cakes, cake toppings
+ * and cake layers respectively.
+ *
+ *
+ *
+ * The business layer is built on top of the data access layer. CakeBakingService
offers
+ * methods to retrieve available cake toppings and cake layers and baked cakes. Also the
+ * service is used to create new cakes out of cake toppings and cake layers.
+ *
+ *
+ *
+ * The presentation layer is built on the business layer and in this example it simply lists
+ * the cakes that have been baked.
+ *
+ *
+ *
+ * We have applied so called strict layering which means that the layers can only access
+ * the classes directly beneath them. This leads the solution to create an additional set of
+ * DTOs (CakeInfo
, CakeToppingInfo
, CakeLayerInfo
)
+ * to translate data between layers. In other words, CakeBakingService
cannot
+ * return entities (Cake
, CakeTopping
, CakeLayer
)
+ * directly since these reside on data access layer but instead translates these into business
+ * layer DTOs (CakeInfo
, CakeToppingInfo
, CakeLayerInfo
)
+ * and returns them instead. This way the presentation layer does not have any knowledge of
+ * other layers than the business layer and thus is not affected by changes to them.
+ *
+ *
+ * @see Cake
+ * @see CakeTopping
+ * @see CakeLayer
+ * @see CakeDao
+ * @see CakeToppingDao
+ * @see CakeLayerDao
+ * @see CakeBakingService
+ * @see CakeInfo
+ * @see CakeToppingInfo
+ * @see CakeLayerInfo
+ *
+ */
public class App {
private static CakeBakingService cakeBakingService = new CakeBakingServiceImpl();
+ /**
+ * Application entry point
+ * @param args Command line parameters
+ */
public static void main(String[] args) {
// initialize example data
@@ -16,6 +73,10 @@ public class App {
cakeView.render();
}
+ /**
+ * Initializes the example data
+ * @param cakeBakingService
+ */
private static void initializeData(CakeBakingService cakeBakingService) {
cakeBakingService.saveNewLayer(new CakeLayerInfo("chocolate", 1200));
cakeBakingService.saveNewLayer(new CakeLayerInfo("banana", 900));
diff --git a/layers/src/main/java/com/iluwatar/layers/Cake.java b/layers/src/main/java/com/iluwatar/layers/Cake.java
index 9b395557c..193ba5e3f 100644
--- a/layers/src/main/java/com/iluwatar/layers/Cake.java
+++ b/layers/src/main/java/com/iluwatar/layers/Cake.java
@@ -11,6 +11,11 @@ import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
+/**
+ *
+ * Cake entity
+ *
+ */
@Entity
public class Cake {
diff --git a/layers/src/main/java/com/iluwatar/layers/CakeBakingException.java b/layers/src/main/java/com/iluwatar/layers/CakeBakingException.java
index 2b131da19..0a44d56f9 100644
--- a/layers/src/main/java/com/iluwatar/layers/CakeBakingException.java
+++ b/layers/src/main/java/com/iluwatar/layers/CakeBakingException.java
@@ -1,7 +1,14 @@
package com.iluwatar.layers;
+/**
+ *
+ * Custom exception used in cake baking
+ *
+ */
public class CakeBakingException extends Exception {
+ private static final long serialVersionUID = 1L;
+
public CakeBakingException() {
}
diff --git a/layers/src/main/java/com/iluwatar/layers/CakeBakingService.java b/layers/src/main/java/com/iluwatar/layers/CakeBakingService.java
index c90b0de91..fec16b494 100644
--- a/layers/src/main/java/com/iluwatar/layers/CakeBakingService.java
+++ b/layers/src/main/java/com/iluwatar/layers/CakeBakingService.java
@@ -2,17 +2,47 @@ package com.iluwatar.layers;
import java.util.List;
+/**
+ *
+ * Service for cake baking operations
+ *
+ */
public interface CakeBakingService {
+ /**
+ * Bakes new cake according to parameters
+ * @param cakeInfo
+ * @throws CakeBakingException
+ */
void bakeNewCake(CakeInfo cakeInfo) throws CakeBakingException;
+ /**
+ * Get all cakes
+ * @return
+ */
List getAllCakes();
+ /**
+ * Store new cake topping
+ * @param toppingInfo
+ */
void saveNewTopping(CakeToppingInfo toppingInfo);
+ /**
+ * Get available cake toppings
+ * @return
+ */
List getAvailableToppings();
+ /**
+ * Add new cake layer
+ * @param layerInfo
+ */
void saveNewLayer(CakeLayerInfo layerInfo);
+ /**
+ * Get available cake layers
+ * @return
+ */
List getAvailableLayers();
}
diff --git a/layers/src/main/java/com/iluwatar/layers/CakeBakingServiceImpl.java b/layers/src/main/java/com/iluwatar/layers/CakeBakingServiceImpl.java
index ff2ad6598..7e5e3dcff 100644
--- a/layers/src/main/java/com/iluwatar/layers/CakeBakingServiceImpl.java
+++ b/layers/src/main/java/com/iluwatar/layers/CakeBakingServiceImpl.java
@@ -13,6 +13,11 @@ import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+/**
+ *
+ * Implementation of CakeBakingService
+ *
+ */
@Service
@Transactional
public class CakeBakingServiceImpl implements CakeBakingService {
diff --git a/layers/src/main/java/com/iluwatar/layers/CakeDao.java b/layers/src/main/java/com/iluwatar/layers/CakeDao.java
index eb9e2fdaa..075e75d31 100644
--- a/layers/src/main/java/com/iluwatar/layers/CakeDao.java
+++ b/layers/src/main/java/com/iluwatar/layers/CakeDao.java
@@ -3,6 +3,11 @@ package com.iluwatar.layers;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
+/**
+ *
+ * CRUD repository for cakes
+ *
+ */
@Repository
public interface CakeDao extends CrudRepository {
diff --git a/layers/src/main/java/com/iluwatar/layers/CakeInfo.java b/layers/src/main/java/com/iluwatar/layers/CakeInfo.java
index 9487b0064..335ce5f4f 100644
--- a/layers/src/main/java/com/iluwatar/layers/CakeInfo.java
+++ b/layers/src/main/java/com/iluwatar/layers/CakeInfo.java
@@ -3,6 +3,11 @@ package com.iluwatar.layers;
import java.util.List;
import java.util.Optional;
+/**
+ *
+ * DTO for cakes
+ *
+ */
public class CakeInfo {
public final Optional id;
diff --git a/layers/src/main/java/com/iluwatar/layers/CakeLayer.java b/layers/src/main/java/com/iluwatar/layers/CakeLayer.java
index 255569322..2f8649c18 100644
--- a/layers/src/main/java/com/iluwatar/layers/CakeLayer.java
+++ b/layers/src/main/java/com/iluwatar/layers/CakeLayer.java
@@ -6,6 +6,11 @@ import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
+/**
+ *
+ * CakeLayer entity
+ *
+ */
@Entity
public class CakeLayer {
diff --git a/layers/src/main/java/com/iluwatar/layers/CakeLayerDao.java b/layers/src/main/java/com/iluwatar/layers/CakeLayerDao.java
index c46aafaeb..9e1d035a8 100644
--- a/layers/src/main/java/com/iluwatar/layers/CakeLayerDao.java
+++ b/layers/src/main/java/com/iluwatar/layers/CakeLayerDao.java
@@ -3,6 +3,11 @@ package com.iluwatar.layers;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
+/**
+ *
+ * CRUD repository for cake layers
+ *
+ */
@Repository
public interface CakeLayerDao extends CrudRepository {
diff --git a/layers/src/main/java/com/iluwatar/layers/CakeLayerInfo.java b/layers/src/main/java/com/iluwatar/layers/CakeLayerInfo.java
index c7715b61c..9aa7ff7f6 100644
--- a/layers/src/main/java/com/iluwatar/layers/CakeLayerInfo.java
+++ b/layers/src/main/java/com/iluwatar/layers/CakeLayerInfo.java
@@ -2,6 +2,11 @@ package com.iluwatar.layers;
import java.util.Optional;
+/**
+ *
+ * DTO for cake layers
+ *
+ */
public class CakeLayerInfo {
public final Optional id;
diff --git a/layers/src/main/java/com/iluwatar/layers/CakeTopping.java b/layers/src/main/java/com/iluwatar/layers/CakeTopping.java
index 0e9d19192..f0e30997a 100644
--- a/layers/src/main/java/com/iluwatar/layers/CakeTopping.java
+++ b/layers/src/main/java/com/iluwatar/layers/CakeTopping.java
@@ -6,6 +6,11 @@ import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
+/**
+ *
+ * CakeTopping entity
+ *
+ */
@Entity
public class CakeTopping {
diff --git a/layers/src/main/java/com/iluwatar/layers/CakeToppingDao.java b/layers/src/main/java/com/iluwatar/layers/CakeToppingDao.java
index 81f371750..3ddcf53ec 100644
--- a/layers/src/main/java/com/iluwatar/layers/CakeToppingDao.java
+++ b/layers/src/main/java/com/iluwatar/layers/CakeToppingDao.java
@@ -3,6 +3,11 @@ package com.iluwatar.layers;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
+/**
+ *
+ * CRUD repository cake toppings
+ *
+ */
@Repository
public interface CakeToppingDao extends CrudRepository {
diff --git a/layers/src/main/java/com/iluwatar/layers/CakeToppingInfo.java b/layers/src/main/java/com/iluwatar/layers/CakeToppingInfo.java
index 316f8ec04..152b0ff85 100644
--- a/layers/src/main/java/com/iluwatar/layers/CakeToppingInfo.java
+++ b/layers/src/main/java/com/iluwatar/layers/CakeToppingInfo.java
@@ -2,6 +2,11 @@ package com.iluwatar.layers;
import java.util.Optional;
+/**
+ *
+ * DTO for cake toppings
+ *
+ */
public class CakeToppingInfo {
public final Optional id;
diff --git a/layers/src/main/java/com/iluwatar/layers/CakeViewImpl.java b/layers/src/main/java/com/iluwatar/layers/CakeViewImpl.java
index a974d0672..5fed15c3a 100644
--- a/layers/src/main/java/com/iluwatar/layers/CakeViewImpl.java
+++ b/layers/src/main/java/com/iluwatar/layers/CakeViewImpl.java
@@ -1,5 +1,10 @@
package com.iluwatar.layers;
+/**
+ *
+ * View implementation for displaying cakes
+ *
+ */
public class CakeViewImpl implements View {
private CakeBakingService cakeBakingService;
diff --git a/layers/src/main/java/com/iluwatar/layers/View.java b/layers/src/main/java/com/iluwatar/layers/View.java
index 4e89ca0b7..123d4ecbf 100644
--- a/layers/src/main/java/com/iluwatar/layers/View.java
+++ b/layers/src/main/java/com/iluwatar/layers/View.java
@@ -1,5 +1,10 @@
package com.iluwatar.layers;
+/**
+ *
+ * View interface
+ *
+ */
public interface View {
void render();