diff --git a/layers/README.md b/layers/README.md index 2fbd0e64a..5f41ede03 100644 --- a/layers/README.md +++ b/layers/README.md @@ -3,34 +3,31 @@ title: Layers category: Architectural language: en tag: - - Decoupling +- Decoupling --- ## Intent -Layers is an architectural pattern where software responsibilities are divided among the different +Layers is an architectural pattern where software responsibilities are divided among the different layers of the application. ## Explanation Real world example -> Consider a web site displaying decorated cakes for weddings and such. Instead of the web page -> directly reaching into the database, it relies on a service to deliver this information. The +> Consider a website displaying decorated cakes for weddings and such. Instead of the web page +> directly reaching into the database, it relies on a service to deliver this information. The > service then queries the data layer to assimilate the needed information. - In plain words -> With Layers architectural pattern different concerns reside on separate layers. View layer is -> interested only in rendering, service layer assembles the requested data from various sources, and +> With Layers architectural pattern different concerns reside on separate layers. View layer is +> interested only in rendering, service layer assembles the requested data from various sources, and > data layer gets the bits from the data storage. - Wikipedia says -> In software engineering, multitier architecture (often referred to as n-tier architecture) or -> multilayered architecture is a client–server architecture in which presentation, application +> In software engineering, multitier architecture (often referred to as n-tier architecture) or +> multilayered architecture is a client–server architecture in which presentation, application > processing, and data management functions are physically separated. - **Programmatic Example** On the data layer, we keep our cake building blocks. `Cake` consist of layers and topping. @@ -38,14 +35,11 @@ On the data layer, we keep our cake building blocks. `Cake` consist of layers an ```java @Entity public class Cake { - @Id @GeneratedValue private Long id; - @OneToOne(cascade = CascadeType.REMOVE) private CakeTopping topping; - @OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER) private Set layers; } @@ -55,17 +49,11 @@ The service layer offers `CakeBakingService` for easy access to different aspect ```java public interface CakeBakingService { - void bakeNewCake(CakeInfo cakeInfo) throws CakeBakingException; - List getAllCakes(); - void saveNewTopping(CakeToppingInfo toppingInfo); - List getAvailableToppings(); - void saveNewLayer(CakeLayerInfo layerInfo); - List getAvailableLayers(); } ``` @@ -74,20 +62,14 @@ On the top we have our `View` responsible of rendering the cakes. ```java public interface View { - void render(); - } - @Slf4j public class CakeViewImpl implements View { - private final CakeBakingService cakeBakingService; - public CakeViewImpl(CakeBakingService cakeBakingService) { this.cakeBakingService = cakeBakingService; } - public void render() { cakeBakingService.getAllCakes().forEach(cake -> LOGGER.info(cake.toString())); } @@ -108,4 +90,4 @@ Use the Layers architecture when ## Credits -* [Pattern Oriented Software Architecture Volume 1: A System of Patterns](https://www.amazon.com/gp/product/0471958697/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0471958697&linkCode=as2&tag=javadesignpat-20&linkId=e3f42d7a2a4cc8c619bbc0136b20dadb) +* [Pattern Oriented Software Architecture Volume 1: A System of Patterns](https://www.amazon.com/gp/product/0471958697/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0471958697&linkCode=as2&tag=javadesignpat-20&linkId=e3f42d7a2a4cc8c619bbc0136b20dadb) \ No newline at end of file diff --git a/layers/etc/layers.ucls b/layers/etc/layers.ucls index a3cac547a..d2c19e774 100644 --- a/layers/etc/layers.ucls +++ b/layers/etc/layers.ucls @@ -1,256 +1,256 @@ - + - - - - - - + file="/layers/src/main/java/com/iluwatar/layers/CakeDao.java" binary="false" corner="BOTTOM_RIGHT"> + + + + + + - - - - - - + file="/layers/src/main/java/com/iluwatar/layers/CakeLayer.java" binary="false" corner="BOTTOM_RIGHT"> + + + + + + - - - - - - + file="/layers/src/main/java/com/iluwatar/layers/CakeViewImpl.java" binary="false" corner="BOTTOM_RIGHT"> + + + + + + - - - - - - + file="/layers/src/main/java/com/iluwatar/layers/CakeBakingException.java" binary="false" corner="BOTTOM_RIGHT"> + + + + + + - - - - - - + file="/layers/src/main/java/com/iluwatar/layers/CakeBakingServiceImpl.java" binary="false" corner="BOTTOM_RIGHT"> + + + + + + - - - - - - + file="/layers/src/main/java/com/iluwatar/layers/CakeLayerDao.java" binary="false" corner="BOTTOM_RIGHT"> + + + + + + - - - - - - + file="/layers/src/main/java/com/iluwatar/layers/View.java" binary="false" corner="BOTTOM_RIGHT"> + + + + + + - - - - - - + file="/layers/src/main/java/com/iluwatar/layers/CakeToppingInfo.java" binary="false" corner="BOTTOM_RIGHT"> + + + + + + - - - - - - + file="/layers/src/main/java/com/iluwatar/layers/CakeInfo.java" binary="false" corner="BOTTOM_RIGHT"> + + + + + + - - - - - - + file="/layers/src/main/java/com/iluwatar/layers/CakeToppingDao.java" binary="false" corner="BOTTOM_RIGHT"> + + + + + + - - - - - - + file="/layers/src/main/java/com/iluwatar/layers/CakeBakingService.java" binary="false" corner="BOTTOM_RIGHT"> + + + + + + - - - - - - + file="/layers/src/main/java/com/iluwatar/layers/CakeLayerInfo.java" binary="false" corner="BOTTOM_RIGHT"> + + + + + + - - - - - - + file="/layers/src/main/java/com/iluwatar/layers/Cake.java" binary="false" corner="BOTTOM_RIGHT"> + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + file="/layers/src/main/java/com/iluwatar/layers/CakeTopping.java" binary="false" corner="BOTTOM_RIGHT"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/layers/etc/layers.urm.puml b/layers/etc/layers.urm.puml index f73b7964a..51b09773f 100644 --- a/layers/etc/layers.urm.puml +++ b/layers/etc/layers.urm.puml @@ -131,6 +131,6 @@ CakeViewImpl --> "-cakeBakingService" CakeBakingService App --> "-cakeBakingService" CakeBakingService Cake --> "-topping" CakeTopping CakeLayer --> "-cake" Cake -CakeBakingServiceImpl ..|> CakeBakingService -CakeViewImpl ..|> View +CakeBakingServiceImpl ..|> CakeBakingService +CakeViewImpl ..|> View @enduml \ No newline at end of file diff --git a/layers/pom.xml b/layers/pom.xml index 601765cec..425b8eaed 100644 --- a/layers/pom.xml +++ b/layers/pom.xml @@ -1,11 +1,8 @@ ---> - - 4.0.0 - + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.0.2 + + com.iluwatar - java-design-patterns - 1.26.0-SNAPSHOT - - com.iluwatar.layers - layers - - - org.springframework.data - spring-data-jpa - - - org.hibernate - hibernate-core - - - javax.xml.bind - jaxb-api - - - commons-dbcp - commons-dbcp - - - com.h2database - h2 - - - org.junit.jupiter - junit-jupiter-engine - test - - - org.mockito - mockito-core - test - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - - - - com.iluwatar.layers.app.App - - - - - - - - + layers + layers + layers + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + diff --git a/layers/src/main/java/com/iluwatar/layers/Runner.java b/layers/src/main/java/com/iluwatar/layers/Runner.java new file mode 100644 index 000000000..6acfca8b7 --- /dev/null +++ b/layers/src/main/java/com/iluwatar/layers/Runner.java @@ -0,0 +1,68 @@ +package com.iluwatar.layers; + +import dto.CakeInfo; +import dto.CakeLayerInfo; +import dto.CakeToppingInfo; +import exception.CakeBakingException; +import lombok.extern.slf4j.Slf4j; +import service.CakeBakingService; +import view.CakeViewImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@Slf4j +public class Runner implements CommandLineRunner { + private final CakeBakingService cakeBakingService; + public static final String STRAWBERRY = "strawberry"; + + @Autowired + public Runner(CakeBakingService cakeBakingService) { + this.cakeBakingService = cakeBakingService; + } + @Override + public void run(String... args) { + //initialize sample data + initializeData(); + // create view and render it + var cakeView = new CakeViewImpl(cakeBakingService); + cakeView.render(); + } + + /** + * Initializes the example data. + */ + private void initializeData() { + cakeBakingService.saveNewLayer(new CakeLayerInfo("chocolate", 1200)); + cakeBakingService.saveNewLayer(new CakeLayerInfo("banana", 900)); + cakeBakingService.saveNewLayer(new CakeLayerInfo(STRAWBERRY, 950)); + cakeBakingService.saveNewLayer(new CakeLayerInfo("lemon", 950)); + cakeBakingService.saveNewLayer(new CakeLayerInfo("vanilla", 950)); + cakeBakingService.saveNewLayer(new CakeLayerInfo(STRAWBERRY, 950)); + + cakeBakingService.saveNewTopping(new CakeToppingInfo("candies", 350)); + cakeBakingService.saveNewTopping(new CakeToppingInfo("cherry", 350)); + + var cake1 = new CakeInfo(new CakeToppingInfo("candies", 0), List.of( + new CakeLayerInfo("chocolate", 0), + new CakeLayerInfo("banana", 0), + new CakeLayerInfo(STRAWBERRY, 0))); + try { + cakeBakingService.bakeNewCake(cake1); + } catch (CakeBakingException e) { + LOGGER.error("Cake baking exception", e); + } + var cake2 = new CakeInfo(new CakeToppingInfo("cherry", 0), List.of( + new CakeLayerInfo("vanilla", 0), + new CakeLayerInfo("lemon", 0), + new CakeLayerInfo(STRAWBERRY, 0))); + try { + cakeBakingService.bakeNewCake(cake2); + } catch (CakeBakingException e) { + LOGGER.error("Cake baking exception", e); + } + } +} diff --git a/layers/src/main/java/com/iluwatar/layers/app/App.java b/layers/src/main/java/com/iluwatar/layers/app/App.java deleted file mode 100644 index 30258991a..000000000 --- a/layers/src/main/java/com/iluwatar/layers/app/App.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.layers.app; - -import com.iluwatar.layers.dao.CakeDao; -import com.iluwatar.layers.dao.CakeLayerDao; -import com.iluwatar.layers.dao.CakeToppingDao; -import com.iluwatar.layers.dto.CakeInfo; -import com.iluwatar.layers.dto.CakeLayerInfo; -import com.iluwatar.layers.dto.CakeToppingInfo; -import com.iluwatar.layers.entity.Cake; -import com.iluwatar.layers.entity.CakeLayer; -import com.iluwatar.layers.entity.CakeTopping; -import com.iluwatar.layers.exception.CakeBakingException; -import com.iluwatar.layers.service.CakeBakingService; -import com.iluwatar.layers.service.CakeBakingServiceImpl; -import com.iluwatar.layers.view.CakeViewImpl; -import java.util.List; - -/** - * Layers 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 final CakeBakingService cakeBakingService = new CakeBakingServiceImpl(); - public static final String STRAWBERRY = "strawberry"; - - /** - * Application entry point. - * - * @param args Command line parameters - */ - public static void main(String[] args) { - - // initialize example data - initializeData(cakeBakingService); - - // create view and render it - var cakeView = new CakeViewImpl(cakeBakingService); - cakeView.render(); - } - - /** - * Initializes the example data. - */ - private static void initializeData(CakeBakingService cakeBakingService) { - cakeBakingService.saveNewLayer(new CakeLayerInfo("chocolate", 1200)); - cakeBakingService.saveNewLayer(new CakeLayerInfo("banana", 900)); - cakeBakingService.saveNewLayer(new CakeLayerInfo(STRAWBERRY, 950)); - cakeBakingService.saveNewLayer(new CakeLayerInfo("lemon", 950)); - cakeBakingService.saveNewLayer(new CakeLayerInfo("vanilla", 950)); - cakeBakingService.saveNewLayer(new CakeLayerInfo(STRAWBERRY, 950)); - - cakeBakingService.saveNewTopping(new CakeToppingInfo("candies", 350)); - cakeBakingService.saveNewTopping(new CakeToppingInfo("cherry", 350)); - - var cake1 = new CakeInfo(new CakeToppingInfo("candies", 0), List.of( - new CakeLayerInfo("chocolate", 0), - new CakeLayerInfo("banana", 0), - new CakeLayerInfo(STRAWBERRY, 0))); - try { - cakeBakingService.bakeNewCake(cake1); - } catch (CakeBakingException e) { - e.printStackTrace(); - } - var cake2 = new CakeInfo(new CakeToppingInfo("cherry", 0), List.of( - new CakeLayerInfo("vanilla", 0), - new CakeLayerInfo("lemon", 0), - new CakeLayerInfo(STRAWBERRY, 0))); - try { - cakeBakingService.bakeNewCake(cake2); - } catch (CakeBakingException e) { - e.printStackTrace(); - } - } -} diff --git a/layers/src/main/java/com/iluwatar/layers/app/LayersApp.java b/layers/src/main/java/com/iluwatar/layers/app/LayersApp.java new file mode 100644 index 000000000..af73f651f --- /dev/null +++ b/layers/src/main/java/com/iluwatar/layers/app/LayersApp.java @@ -0,0 +1,20 @@ +package com.iluwatar.layers.app; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +@SpringBootApplication +@EnableJpaRepositories(basePackages = "dao") +@EntityScan(basePackages = "entity") +@ComponentScan(basePackages = {"com.iluwatar.layers", "service", "dto", "exception", "view" ,"dao"}) +public class LayersApp { + + public static void main(String[] args) { + SpringApplication.run(LayersApp.class, args); + + } + +} diff --git a/layers/src/main/java/com/iluwatar/layers/entity/CakeLayer.java b/layers/src/main/java/com/iluwatar/layers/entity/CakeLayer.java deleted file mode 100644 index a98f39aa6..000000000 --- a/layers/src/main/java/com/iluwatar/layers/entity/CakeLayer.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.layers.entity; - -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.ManyToOne; - -/** - * CakeLayer entity. - */ -@Entity -public class CakeLayer { - - @Id - @GeneratedValue - private Long id; - - private String name; - - private int calories; - - @ManyToOne(cascade = CascadeType.ALL) - private Cake cake; - - public CakeLayer() { - } - - public CakeLayer(String name, int calories) { - this.setName(name); - this.setCalories(calories); - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getCalories() { - return calories; - } - - public void setCalories(int calories) { - this.calories = calories; - } - - @Override - public String toString() { - return String.format("id=%s name=%s calories=%d", id, name, calories); - } - - public Cake getCake() { - return cake; - } - - public void setCake(Cake cake) { - this.cake = cake; - } -} diff --git a/layers/src/main/java/com/iluwatar/layers/entity/CakeTopping.java b/layers/src/main/java/com/iluwatar/layers/entity/CakeTopping.java deleted file mode 100644 index e4f4238c6..000000000 --- a/layers/src/main/java/com/iluwatar/layers/entity/CakeTopping.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.layers.entity; - -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.OneToOne; - -/** - * CakeTopping entity. - */ -@Entity -public class CakeTopping { - - @Id - @GeneratedValue - private Long id; - - private String name; - - private int calories; - - @OneToOne(cascade = CascadeType.ALL) - private Cake cake; - - public CakeTopping() { - } - - public CakeTopping(String name, int calories) { - this.setName(name); - this.setCalories(calories); - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getCalories() { - return calories; - } - - public void setCalories(int calories) { - this.calories = calories; - } - - @Override - public String toString() { - return String.format("id=%s name=%s calories=%d", id, name, calories); - } - - public Cake getCake() { - return cake; - } - - public void setCake(Cake cake) { - this.cake = cake; - } -} diff --git a/layers/src/main/java/com/iluwatar/layers/service/CakeBakingServiceImpl.java b/layers/src/main/java/com/iluwatar/layers/service/CakeBakingServiceImpl.java deleted file mode 100644 index 887a59bf1..000000000 --- a/layers/src/main/java/com/iluwatar/layers/service/CakeBakingServiceImpl.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.layers.service; - -import com.iluwatar.layers.dao.CakeDao; -import com.iluwatar.layers.dao.CakeLayerDao; -import com.iluwatar.layers.dao.CakeToppingDao; -import com.iluwatar.layers.dto.CakeInfo; -import com.iluwatar.layers.dto.CakeLayerInfo; -import com.iluwatar.layers.dto.CakeToppingInfo; -import com.iluwatar.layers.entity.Cake; -import com.iluwatar.layers.entity.CakeLayer; -import com.iluwatar.layers.entity.CakeTopping; -import com.iluwatar.layers.exception.CakeBakingException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import org.springframework.context.support.AbstractApplicationContext; -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 { - - private final AbstractApplicationContext context; - - public CakeBakingServiceImpl() { - this.context = new ClassPathXmlApplicationContext("applicationContext.xml"); - } - - @Override - public void bakeNewCake(CakeInfo cakeInfo) throws CakeBakingException { - var allToppings = getAvailableToppingEntities(); - var matchingToppings = - allToppings.stream().filter(t -> t.getName().equals(cakeInfo.cakeToppingInfo.name)) - .toList(); - if (matchingToppings.isEmpty()) { - throw new CakeBakingException(String.format("Topping %s is not available", - cakeInfo.cakeToppingInfo.name)); - } - var allLayers = getAvailableLayerEntities(); - Set foundLayers = new HashSet<>(); - for (var info : cakeInfo.cakeLayerInfos) { - var found = allLayers.stream().filter(layer -> layer.getName().equals(info.name)).findFirst(); - if (found.isEmpty()) { - throw new CakeBakingException(String.format("Layer %s is not available", info.name)); - } else { - foundLayers.add(found.get()); - } - } - var toppingBean = context.getBean(CakeToppingDao.class); - var topping = toppingBean.findById(matchingToppings.iterator().next().getId()); - var cakeBean = context.getBean(CakeDao.class); - if (topping.isPresent()) { - var cake = new Cake(); - cake.setTopping(topping.get()); - cake.setLayers(foundLayers); - cakeBean.save(cake); - topping.get().setCake(cake); - toppingBean.save(topping.get()); - var layerBean = context.getBean(CakeLayerDao.class); - for (var layer : foundLayers) { - layer.setCake(cake); - layerBean.save(layer); - } - } else { - throw new CakeBakingException(String.format("Topping %s is not available", - cakeInfo.cakeToppingInfo.name)); - } - } - - @Override - public void saveNewTopping(CakeToppingInfo toppingInfo) { - var bean = context.getBean(CakeToppingDao.class); - bean.save(new CakeTopping(toppingInfo.name, toppingInfo.calories)); - } - - @Override - public void saveNewLayer(CakeLayerInfo layerInfo) { - var bean = context.getBean(CakeLayerDao.class); - bean.save(new CakeLayer(layerInfo.name, layerInfo.calories)); - } - - private List getAvailableToppingEntities() { - var bean = context.getBean(CakeToppingDao.class); - List result = new ArrayList<>(); - for (CakeTopping topping : bean.findAll()) { - if (topping.getCake() == null) { - result.add(topping); - } - } - return result; - } - - @Override - public List getAvailableToppings() { - var bean = context.getBean(CakeToppingDao.class); - List result = new ArrayList<>(); - for (CakeTopping next : bean.findAll()) { - if (next.getCake() == null) { - result.add(new CakeToppingInfo(next.getId(), next.getName(), next.getCalories())); - } - } - return result; - } - - private List getAvailableLayerEntities() { - var bean = context.getBean(CakeLayerDao.class); - List result = new ArrayList<>(); - for (CakeLayer next : bean.findAll()) { - if (next.getCake() == null) { - result.add(next); - } - } - return result; - } - - @Override - public List getAvailableLayers() { - var bean = context.getBean(CakeLayerDao.class); - List result = new ArrayList<>(); - for (CakeLayer next : bean.findAll()) { - if (next.getCake() == null) { - result.add(new CakeLayerInfo(next.getId(), next.getName(), next.getCalories())); - } - } - return result; - } - - @Override - public List getAllCakes() { - var cakeBean = context.getBean(CakeDao.class); - List result = new ArrayList<>(); - for (Cake cake : cakeBean.findAll()) { - var cakeToppingInfo = - new CakeToppingInfo(cake.getTopping().getId(), cake.getTopping().getName(), cake - .getTopping().getCalories()); - List cakeLayerInfos = new ArrayList<>(); - for (var layer : cake.getLayers()) { - cakeLayerInfos.add(new CakeLayerInfo(layer.getId(), layer.getName(), layer.getCalories())); - } - var cakeInfo = new CakeInfo(cake.getId(), cakeToppingInfo, cakeLayerInfos); - result.add(cakeInfo); - } - return result; - } -} diff --git a/layers/src/main/java/com/iluwatar/layers/dao/CakeDao.java b/layers/src/main/java/dao/CakeDao.java similarity index 87% rename from layers/src/main/java/com/iluwatar/layers/dao/CakeDao.java rename to layers/src/main/java/dao/CakeDao.java index 2ad9f1aeb..06d74bace 100644 --- a/layers/src/main/java/com/iluwatar/layers/dao/CakeDao.java +++ b/layers/src/main/java/dao/CakeDao.java @@ -22,16 +22,14 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.layers.dao; +package dao; -import com.iluwatar.layers.entity.Cake; -import org.springframework.data.repository.CrudRepository; +import entity.Cake; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; /** * CRUD repository for cakes. */ @Repository -public interface CakeDao extends CrudRepository { - -} +public interface CakeDao extends JpaRepository {} diff --git a/layers/src/main/java/com/iluwatar/layers/dao/CakeLayerDao.java b/layers/src/main/java/dao/CakeLayerDao.java similarity index 86% rename from layers/src/main/java/com/iluwatar/layers/dao/CakeLayerDao.java rename to layers/src/main/java/dao/CakeLayerDao.java index 3c91cf49f..90a523f16 100644 --- a/layers/src/main/java/com/iluwatar/layers/dao/CakeLayerDao.java +++ b/layers/src/main/java/dao/CakeLayerDao.java @@ -22,16 +22,16 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.layers.dao; +package dao; -import com.iluwatar.layers.entity.CakeLayer; -import org.springframework.data.repository.CrudRepository; +import entity.CakeLayer; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; /** * CRUD repository for cake layers. */ @Repository -public interface CakeLayerDao extends CrudRepository { +public interface CakeLayerDao extends JpaRepository { } diff --git a/layers/src/main/java/com/iluwatar/layers/dao/CakeToppingDao.java b/layers/src/main/java/dao/CakeToppingDao.java similarity index 86% rename from layers/src/main/java/com/iluwatar/layers/dao/CakeToppingDao.java rename to layers/src/main/java/dao/CakeToppingDao.java index 215e4bb8f..0d0c8836d 100644 --- a/layers/src/main/java/com/iluwatar/layers/dao/CakeToppingDao.java +++ b/layers/src/main/java/dao/CakeToppingDao.java @@ -22,16 +22,18 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.layers.dao; +package dao; -import com.iluwatar.layers.entity.CakeTopping; -import org.springframework.data.repository.CrudRepository; + + +import entity.CakeTopping; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; /** * CRUD repository cake toppings. */ @Repository -public interface CakeToppingDao extends CrudRepository { +public interface CakeToppingDao extends JpaRepository { } diff --git a/layers/src/main/java/com/iluwatar/layers/dto/CakeInfo.java b/layers/src/main/java/dto/CakeInfo.java similarity index 54% rename from layers/src/main/java/com/iluwatar/layers/dto/CakeInfo.java rename to layers/src/main/java/dto/CakeInfo.java index e72c754ac..8cc25e4ec 100644 --- a/layers/src/main/java/com/iluwatar/layers/dto/CakeInfo.java +++ b/layers/src/main/java/dto/CakeInfo.java @@ -22,7 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.layers.dto; +package dto; import java.util.List; import java.util.Optional; @@ -32,40 +32,40 @@ import java.util.Optional; */ public class CakeInfo { - public final Optional id; - public final CakeToppingInfo cakeToppingInfo; - public final List cakeLayerInfos; + public final Optional id; + public final CakeToppingInfo cakeToppingInfo; + public final List cakeLayerInfos; - /** - * Constructor. - */ - public CakeInfo(Long id, CakeToppingInfo cakeToppingInfo, List cakeLayerInfos) { - this.id = Optional.of(id); - this.cakeToppingInfo = cakeToppingInfo; - this.cakeLayerInfos = cakeLayerInfos; - } + /** + * Constructor. + */ + public CakeInfo(Long id, CakeToppingInfo cakeToppingInfo, List cakeLayerInfos) { + this.id = Optional.of(id); + this.cakeToppingInfo = cakeToppingInfo; + this.cakeLayerInfos = cakeLayerInfos; + } - /** - * Constructor. - */ - public CakeInfo(CakeToppingInfo cakeToppingInfo, List cakeLayerInfos) { - this.id = Optional.empty(); - this.cakeToppingInfo = cakeToppingInfo; - this.cakeLayerInfos = cakeLayerInfos; - } + /** + * Constructor. + */ + public CakeInfo(CakeToppingInfo cakeToppingInfo, List cakeLayerInfos) { + this.id = Optional.empty(); + this.cakeToppingInfo = cakeToppingInfo; + this.cakeLayerInfos = cakeLayerInfos; + } - /** - * Calculate calories. - */ - public int calculateTotalCalories() { - var total = cakeToppingInfo != null ? cakeToppingInfo.calories : 0; - total += cakeLayerInfos.stream().mapToInt(c -> c.calories).sum(); - return total; - } + /** + * Calculate calories. + */ + public int calculateTotalCalories() { + var total = cakeToppingInfo != null ? cakeToppingInfo.calories : 0; + total += cakeLayerInfos.stream().mapToInt(c -> c.calories).sum(); + return total; + } - @Override - public String toString() { - return String.format("CakeInfo id=%d topping=%s layers=%s totalCalories=%d", id.orElse(-1L), - cakeToppingInfo, cakeLayerInfos, calculateTotalCalories()); - } + @Override + public String toString() { + return String.format("CakeInfo id=%d topping=%s layers=%s totalCalories=%d", id.orElse(-1L), + cakeToppingInfo, cakeLayerInfos, calculateTotalCalories()); + } } diff --git a/layers/src/main/java/com/iluwatar/layers/dto/CakeLayerInfo.java b/layers/src/main/java/dto/CakeLayerInfo.java similarity index 67% rename from layers/src/main/java/com/iluwatar/layers/dto/CakeLayerInfo.java rename to layers/src/main/java/dto/CakeLayerInfo.java index c7d5d342e..4c74f47db 100644 --- a/layers/src/main/java/com/iluwatar/layers/dto/CakeLayerInfo.java +++ b/layers/src/main/java/dto/CakeLayerInfo.java @@ -22,7 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.layers.dto; +package dto; import java.util.Optional; @@ -31,30 +31,30 @@ import java.util.Optional; */ public class CakeLayerInfo { - public final Optional id; - public final String name; - public final int calories; + public final Optional id; + public final String name; + public final int calories; - /** - * Constructor. - */ - public CakeLayerInfo(Long id, String name, int calories) { - this.id = Optional.of(id); - this.name = name; - this.calories = calories; - } + /** + * Constructor. + */ + public CakeLayerInfo(Long id, String name, int calories) { + this.id = Optional.of(id); + this.name = name; + this.calories = calories; + } - /** - * Constructor. - */ - public CakeLayerInfo(String name, int calories) { - this.id = Optional.empty(); - this.name = name; - this.calories = calories; - } + /** + * Constructor. + */ + public CakeLayerInfo(String name, int calories) { + this.id = Optional.empty(); + this.name = name; + this.calories = calories; + } - @Override - public String toString() { - return String.format("CakeLayerInfo id=%d name=%s calories=%d", id.orElse(-1L), name, calories); - } + @Override + public String toString() { + return String.format("CakeLayerInfo id=%d name=%s calories=%d", id.orElse(-1L), name, calories); + } } diff --git a/layers/src/main/java/com/iluwatar/layers/dto/CakeToppingInfo.java b/layers/src/main/java/dto/CakeToppingInfo.java similarity index 67% rename from layers/src/main/java/com/iluwatar/layers/dto/CakeToppingInfo.java rename to layers/src/main/java/dto/CakeToppingInfo.java index 25a853aed..7a3feab0e 100644 --- a/layers/src/main/java/com/iluwatar/layers/dto/CakeToppingInfo.java +++ b/layers/src/main/java/dto/CakeToppingInfo.java @@ -22,7 +22,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.layers.dto; +package dto; + import java.util.Optional; @@ -31,31 +32,31 @@ import java.util.Optional; */ public class CakeToppingInfo { - public final Optional id; - public final String name; - public final int calories; + public final Optional id; + public final String name; + public final int calories; - /** - * Constructor. - */ - public CakeToppingInfo(Long id, String name, int calories) { - this.id = Optional.of(id); - this.name = name; - this.calories = calories; - } + /** + * Constructor. + */ + public CakeToppingInfo(Long id, String name, int calories) { + this.id = Optional.of(id); + this.name = name; + this.calories = calories; + } - /** - * Constructor. - */ - public CakeToppingInfo(String name, int calories) { - this.id = Optional.empty(); - this.name = name; - this.calories = calories; - } + /** + * Constructor. + */ + public CakeToppingInfo(String name, int calories) { + this.id = Optional.empty(); + this.name = name; + this.calories = calories; + } - @Override - public String toString() { - return String.format("CakeToppingInfo id=%d name=%s calories=%d", - id.orElse(-1L), name, calories); - } + @Override + public String toString() { + return String.format("CakeToppingInfo id=%d name=%s calories=%d", + id.orElse(-1L), name, calories); + } } diff --git a/layers/src/main/java/com/iluwatar/layers/entity/Cake.java b/layers/src/main/java/entity/Cake.java similarity index 54% rename from layers/src/main/java/com/iluwatar/layers/entity/Cake.java rename to layers/src/main/java/entity/Cake.java index 69f0781b9..a7d78e622 100644 --- a/layers/src/main/java/com/iluwatar/layers/entity/Cake.java +++ b/layers/src/main/java/entity/Cake.java @@ -22,17 +22,17 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.layers.entity; +package entity; import java.util.HashSet; import java.util.Set; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.CascadeType; +import jakarta.persistence.FetchType; /** * Cake entity. @@ -40,50 +40,50 @@ import javax.persistence.OneToOne; @Entity public class Cake { - @Id - @GeneratedValue - private Long id; + @Id + @GeneratedValue + private Long id; - @OneToOne(cascade = CascadeType.REMOVE) - private CakeTopping topping; + @OneToOne(cascade = CascadeType.REMOVE) + private CakeTopping topping; - @OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER) - private Set layers; + @OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER) + private Set layers; - public Cake() { - setLayers(new HashSet<>()); - } + public Cake() { + setLayers(new HashSet<>()); + } - public Long getId() { - return id; - } + public Long getId() { + return id; + } - public void setId(Long id) { - this.id = id; - } + public void setId(Long id) { + this.id = id; + } - public CakeTopping getTopping() { - return topping; - } + public CakeTopping getTopping() { + return topping; + } - public void setTopping(CakeTopping topping) { - this.topping = topping; - } + public void setTopping(CakeTopping topping) { + this.topping = topping; + } - public Set getLayers() { - return layers; - } + public Set getLayers() { + return layers; + } - public void setLayers(Set layers) { - this.layers = layers; - } + public void setLayers(Set layers) { + this.layers = layers; + } - public void addLayer(CakeLayer layer) { - this.layers.add(layer); - } + public void addLayer(CakeLayer layer) { + this.layers.add(layer); + } - @Override - public String toString() { - return String.format("id=%s topping=%s layers=%s", id, topping, layers.toString()); - } + @Override + public String toString() { + return String.format("id=%s topping=%s layers=%s", id, topping, layers.toString()); + } } diff --git a/layers/src/test/java/com/iluwatar/layers/app/AppTest.java b/layers/src/main/java/entity/CakeLayer.java similarity index 67% rename from layers/src/test/java/com/iluwatar/layers/app/AppTest.java rename to layers/src/main/java/entity/CakeLayer.java index f54dca0a6..d3bd65ad9 100644 --- a/layers/src/test/java/com/iluwatar/layers/app/AppTest.java +++ b/layers/src/main/java/entity/CakeLayer.java @@ -22,21 +22,42 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.layers.app; +package entity; -import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import jakarta.persistence.*; +import lombok.*; /** - * - * Application test - * + * CakeLayer entity. */ -class AppTest { +@Entity +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@EqualsAndHashCode +public class CakeLayer { - @Test - void shouldExecuteApplicationWithoutException() { - assertDoesNotThrow(() -> App.main(new String[]{})); - } + @Id + @GeneratedValue + private Long id; + + private String name; + + private int calories; + + @ManyToOne(cascade = CascadeType.ALL) + private Cake cake; + + public CakeLayer(String name, int calories) { + this.setName(name); + this.setCalories(calories); + } + + @Override + public String toString() { + return String.format("id=%s name=%s calories=%d", id, name, calories); + } } diff --git a/layers/src/main/java/entity/CakeTopping.java b/layers/src/main/java/entity/CakeTopping.java new file mode 100644 index 000000000..697ed5a07 --- /dev/null +++ b/layers/src/main/java/entity/CakeTopping.java @@ -0,0 +1,64 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package entity; + + +import jakarta.persistence.*; +import lombok.*; + +/** + * CakeTopping entity. + */ +@Entity +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@EqualsAndHashCode +public class CakeTopping { + + @Id + @GeneratedValue + private Long id; + + private String name; + + private int calories; + + @OneToOne(cascade = CascadeType.ALL) + private Cake cake; + + public CakeTopping(String name, int calories) { + this.setName(name); + this.setCalories(calories); + } + + @Override + public String toString() { + return String.format("id=%s name=%s calories=%d", id, name, calories); + } + +} diff --git a/layers/src/main/java/com/iluwatar/layers/exception/CakeBakingException.java b/layers/src/main/java/exception/CakeBakingException.java similarity index 84% rename from layers/src/main/java/com/iluwatar/layers/exception/CakeBakingException.java rename to layers/src/main/java/exception/CakeBakingException.java index 25a597d3e..95a2c1171 100644 --- a/layers/src/main/java/com/iluwatar/layers/exception/CakeBakingException.java +++ b/layers/src/main/java/exception/CakeBakingException.java @@ -22,19 +22,22 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.layers.exception; +package exception; + +import org.springframework.stereotype.Component; /** * Custom exception used in cake baking. */ +@Component public class CakeBakingException extends Exception { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - public CakeBakingException() { - } + public CakeBakingException() { + } - public CakeBakingException(String message) { - super(message); - } + public CakeBakingException(String message) { + super(message); + } } diff --git a/layers/src/main/java/com/iluwatar/layers/service/CakeBakingService.java b/layers/src/main/java/service/CakeBakingService.java similarity index 61% rename from layers/src/main/java/com/iluwatar/layers/service/CakeBakingService.java rename to layers/src/main/java/service/CakeBakingService.java index c939c9f64..7909b3f99 100644 --- a/layers/src/main/java/com/iluwatar/layers/service/CakeBakingService.java +++ b/layers/src/main/java/service/CakeBakingService.java @@ -22,46 +22,56 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.layers.service; +package service; + +import dto.CakeInfo; +import dto.CakeLayerInfo; +import dto.CakeToppingInfo; +import exception.CakeBakingException; +import org.springframework.stereotype.Service; -import com.iluwatar.layers.dto.CakeInfo; -import com.iluwatar.layers.dto.CakeLayerInfo; -import com.iluwatar.layers.dto.CakeToppingInfo; -import com.iluwatar.layers.exception.CakeBakingException; import java.util.List; /** * Service for cake baking operations. */ +@Service public interface CakeBakingService { - /** - * Bakes new cake according to parameters. - */ - void bakeNewCake(CakeInfo cakeInfo) throws CakeBakingException; + /** + * Bakes new cake according to parameters. + */ + void bakeNewCake(CakeInfo cakeInfo) throws CakeBakingException; - /** - * Get all cakes. - */ - List getAllCakes(); + /** + * Get all cakes. + */ + List getAllCakes(); - /** - * Store new cake topping. - */ - void saveNewTopping(CakeToppingInfo toppingInfo); + /** + * Store new cake topping. + */ + void saveNewTopping(CakeToppingInfo toppingInfo); - /** - * Get available cake toppings. - */ - List getAvailableToppings(); + /** + * Get available cake toppings. + */ + List getAvailableToppings(); - /** - * Add new cake layer. - */ - void saveNewLayer(CakeLayerInfo layerInfo); + /** + * Add new cake layer. + */ + void saveNewLayer(CakeLayerInfo layerInfo); + + /** + * Get available cake layers. + */ + List getAvailableLayers(); + + void deleteAllCakes(); + + void deleteAllLayers(); + + void deleteAllToppings(); - /** - * Get available cake layers. - */ - List getAvailableLayers(); } diff --git a/layers/src/main/java/service/CakeBakingServiceImpl.java b/layers/src/main/java/service/CakeBakingServiceImpl.java new file mode 100644 index 000000000..486e3e6d5 --- /dev/null +++ b/layers/src/main/java/service/CakeBakingServiceImpl.java @@ -0,0 +1,189 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package service; + +import dao.CakeDao; +import dao.CakeLayerDao; +import dao.CakeToppingDao; +import dto.CakeInfo; +import dto.CakeLayerInfo; +import dto.CakeToppingInfo; +import entity.Cake; +import entity.CakeLayer; +import entity.CakeTopping; +import exception.CakeBakingException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Implementation of CakeBakingService. + */ +@Service +@Transactional +public class CakeBakingServiceImpl implements CakeBakingService { + + private final CakeDao cakeDao; + private final CakeLayerDao cakeLayerDao; + private final CakeToppingDao cakeToppingDao; + + @Autowired + public CakeBakingServiceImpl(CakeDao cakeDao, CakeLayerDao cakeLayerDao, CakeToppingDao cakeToppingDao) { + this.cakeDao = cakeDao; + this.cakeLayerDao = cakeLayerDao; + this.cakeToppingDao = cakeToppingDao; + } + + @Override + public void bakeNewCake(CakeInfo cakeInfo) throws CakeBakingException { + var allToppings = getAvailableToppingEntities(); + var matchingToppings = + allToppings.stream().filter(t -> t.getName().equals(cakeInfo.cakeToppingInfo.name)) + .toList(); + if (matchingToppings.isEmpty()) { + throw new CakeBakingException(String.format("Topping %s is not available", + cakeInfo.cakeToppingInfo.name)); + } + var allLayers = getAvailableLayerEntities(); + Set foundLayers = new HashSet<>(); + for (var info : cakeInfo.cakeLayerInfos) { + var found = allLayers.stream().filter(layer -> layer.getName().equals(info.name)).findFirst(); + if (found.isEmpty()) { + throw new CakeBakingException(String.format("Layer %s is not available", info.name)); + } else { + foundLayers.add(found.get()); + } + } + + var topping = cakeToppingDao.findById(matchingToppings.iterator().next().getId()); + if (topping.isPresent()) { + var cake = new Cake(); + cake.setTopping(topping.get()); + cake.setLayers(foundLayers); + cakeDao.save(cake); + topping.get().setCake(cake); + cakeToppingDao.save(topping.get()); + Set foundLayersToUpdate = new HashSet<>(foundLayers); // copy set to avoid a ConcurrentModificationException + + for (var layer : foundLayersToUpdate) { + layer.setCake(cake); + cakeLayerDao.save(layer); + } + + } else { + throw new CakeBakingException(String.format("Topping %s is not available", + cakeInfo.cakeToppingInfo.name)); + } + } + + @Override + public void saveNewTopping(CakeToppingInfo toppingInfo) { + cakeToppingDao.save(new CakeTopping(toppingInfo.name, toppingInfo.calories)); + } + + @Override + public void saveNewLayer(CakeLayerInfo layerInfo) { + cakeLayerDao.save(new CakeLayer(layerInfo.name, layerInfo.calories)); + } + + private List getAvailableToppingEntities() { + List result = new ArrayList<>(); + for (CakeTopping topping : cakeToppingDao.findAll()) { + if (topping.getCake() == null) { + result.add(topping); + } + } + return result; + } + + @Override + public List getAvailableToppings() { + List result = new ArrayList<>(); + for (CakeTopping next : cakeToppingDao.findAll()) { + if (next.getCake() == null) { + result.add(new CakeToppingInfo(next.getId(), next.getName(), next.getCalories())); + } + } + return result; + } + + private List getAvailableLayerEntities() { + List result = new ArrayList<>(); + for (CakeLayer next : cakeLayerDao.findAll()) { + if (next.getCake() == null) { + result.add(next); + } + } + return result; + } + + @Override + public List getAvailableLayers() { + List result = new ArrayList<>(); + for (CakeLayer next : cakeLayerDao.findAll()) { + if (next.getCake() == null) { + result.add(new CakeLayerInfo(next.getId(), next.getName(), next.getCalories())); + } + } + return result; + } + + @Override + public void deleteAllCakes() { + cakeDao.deleteAll(); + } + + @Override + public void deleteAllLayers() { + cakeLayerDao.deleteAll(); + } + + @Override + public void deleteAllToppings() { + cakeToppingDao.deleteAll(); + } + + @Override + public List getAllCakes() { + List result = new ArrayList<>(); + for (Cake cake : cakeDao.findAll()) { + var cakeToppingInfo = + new CakeToppingInfo(cake.getTopping().getId(), cake.getTopping().getName(), cake + .getTopping().getCalories()); + List cakeLayerInfos = new ArrayList<>(); + for (var layer : cake.getLayers()) { + cakeLayerInfos.add(new CakeLayerInfo(layer.getId(), layer.getName(), layer.getCalories())); + } + var cakeInfo = new CakeInfo(cake.getId(), cakeToppingInfo, cakeLayerInfos); + result.add(cakeInfo); + } + return result; + } +} diff --git a/layers/src/main/java/com/iluwatar/layers/view/CakeViewImpl.java b/layers/src/main/java/view/CakeViewImpl.java similarity index 74% rename from layers/src/main/java/com/iluwatar/layers/view/CakeViewImpl.java rename to layers/src/main/java/view/CakeViewImpl.java index 2647d6e86..a060c7910 100644 --- a/layers/src/main/java/com/iluwatar/layers/view/CakeViewImpl.java +++ b/layers/src/main/java/view/CakeViewImpl.java @@ -22,24 +22,26 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.layers.view; +package view; -import com.iluwatar.layers.service.CakeBakingService; -import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import service.CakeBakingService; /** * View implementation for displaying cakes. */ -@Slf4j public class CakeViewImpl implements View { - private final CakeBakingService cakeBakingService; + private final CakeBakingService cakeBakingService; - public CakeViewImpl(CakeBakingService cakeBakingService) { - this.cakeBakingService = cakeBakingService; - } + private static final Logger LOGGER = LoggerFactory.getLogger(CakeViewImpl.class); - public void render() { - cakeBakingService.getAllCakes().forEach(cake -> LOGGER.info(cake.toString())); - } + public CakeViewImpl(CakeBakingService cakeBakingService) { + this.cakeBakingService = cakeBakingService; + } + + public void render() { + cakeBakingService.getAllCakes().forEach(cake -> LOGGER.info(cake.toString())); + } } diff --git a/layers/src/main/java/com/iluwatar/layers/view/View.java b/layers/src/main/java/view/View.java similarity index 96% rename from layers/src/main/java/com/iluwatar/layers/view/View.java rename to layers/src/main/java/view/View.java index 95c696950..fb49fc1b7 100644 --- a/layers/src/main/java/com/iluwatar/layers/view/View.java +++ b/layers/src/main/java/view/View.java @@ -22,13 +22,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.layers.view; +package view; /** * View interface. */ public interface View { - void render(); + void render(); } diff --git a/layers/src/main/resources/logback.xml b/layers/src/main/resources/META-INF/logback.xml similarity index 55% rename from layers/src/main/resources/logback.xml rename to layers/src/main/resources/META-INF/logback.xml index 05df6f860..9412507dd 100644 --- a/layers/src/main/resources/logback.xml +++ b/layers/src/main/resources/META-INF/logback.xml @@ -24,30 +24,30 @@ --> - - layers.log - - layers-%d.log - 5 - - - %-5p [%d{ISO8601,UTC}] %c: %m%n - - - - - %-5p [%d{ISO8601,UTC}] %c: %m%n - - - - - - - - - - - - - + + layers.log + + layers-%d.log + 5 + + + %-5p [%d{ISO8601,UTC}] %c: %m%n + + + + + %-5p [%d{ISO8601,UTC}] %c: %m%n + + + + + + + + + + + + + diff --git a/layers/src/main/resources/META-INF/persistence.xml b/layers/src/main/resources/META-INF/persistence.xml deleted file mode 100644 index 716afafb7..000000000 --- a/layers/src/main/resources/META-INF/persistence.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - diff --git a/layers/src/main/resources/application.properties b/layers/src/main/resources/application.properties new file mode 100644 index 000000000..fad9b72a5 --- /dev/null +++ b/layers/src/main/resources/application.properties @@ -0,0 +1,12 @@ + +spring.main.web-application-type=none + +#datasource settings +spring.datasource.url=jdbc:h2:~/databases/cake +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password=sa + +#data settings +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.jpa.hibernate.ddl-auto=create-drop diff --git a/layers/src/main/resources/applicationContext.xml b/layers/src/main/resources/applicationContext.xml deleted file mode 100644 index 22e36462b..000000000 --- a/layers/src/main/resources/applicationContext.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/layers/src/test/java/com/iluwatar/layers/app/LayersAppTests.java b/layers/src/test/java/com/iluwatar/layers/app/LayersAppTests.java new file mode 100644 index 000000000..e7e50a266 --- /dev/null +++ b/layers/src/test/java/com/iluwatar/layers/app/LayersAppTests.java @@ -0,0 +1,24 @@ +package com.iluwatar.layers.app; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@SpringBootTest(classes = LayersApp.class) +class LayersAppTests { + + private final ApplicationContext applicationContext; + + @Autowired + LayersAppTests(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } + @Test + void contextLoads() { + assertNotNull(applicationContext); + } + +} diff --git a/layers/src/test/java/com/iluwatar/layers/entity/CakeTest.java b/layers/src/test/java/com/iluwatar/layers/entity/CakeTest.java index 6677eb428..e452419bc 100644 --- a/layers/src/test/java/com/iluwatar/layers/entity/CakeTest.java +++ b/layers/src/test/java/com/iluwatar/layers/entity/CakeTest.java @@ -31,6 +31,10 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.HashSet; import java.util.Set; + +import entity.Cake; +import entity.CakeLayer; +import entity.CakeTopping; import org.junit.jupiter.api.Test; /** diff --git a/layers/src/test/java/com/iluwatar/layers/exception/CakeBakingExceptionTest.java b/layers/src/test/java/com/iluwatar/layers/exception/CakeBakingExceptionTest.java index 6a4c92b90..7ab244edf 100644 --- a/layers/src/test/java/com/iluwatar/layers/exception/CakeBakingExceptionTest.java +++ b/layers/src/test/java/com/iluwatar/layers/exception/CakeBakingExceptionTest.java @@ -27,6 +27,7 @@ package com.iluwatar.layers.exception; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; +import exception.CakeBakingException; import org.junit.jupiter.api.Test; /** @@ -34,8 +35,10 @@ import org.junit.jupiter.api.Test; * * @author Jeroen Meulemeester */ + class CakeBakingExceptionTest { + @Test void testConstructor() { final var exception = new CakeBakingException(); diff --git a/layers/src/test/java/com/iluwatar/layers/service/CakeBakingServiceImplTest.java b/layers/src/test/java/com/iluwatar/layers/service/CakeBakingServiceImplTest.java index 3773869be..2770689b7 100644 --- a/layers/src/test/java/com/iluwatar/layers/service/CakeBakingServiceImplTest.java +++ b/layers/src/test/java/com/iluwatar/layers/service/CakeBakingServiceImplTest.java @@ -30,33 +30,56 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import com.iluwatar.layers.dto.CakeInfo; -import com.iluwatar.layers.dto.CakeLayerInfo; -import com.iluwatar.layers.dto.CakeToppingInfo; -import com.iluwatar.layers.exception.CakeBakingException; +import com.iluwatar.layers.app.LayersApp; +import dto.CakeInfo; +import dto.CakeLayerInfo; +import dto.CakeToppingInfo; +import exception.CakeBakingException; +import org.junit.jupiter.api.BeforeEach; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import service.CakeBakingServiceImpl; import java.util.Collections; import java.util.List; + import org.junit.jupiter.api.Test; + /** * Date: 12/15/15 - 9:55 PM * * @author Jeroen Meulemeester */ + +@SpringBootTest(classes = LayersApp.class) class CakeBakingServiceImplTest { - @Test - void testLayers() { - final var service = new CakeBakingServiceImpl(); + private final CakeBakingServiceImpl cakeBakingService; - final var initialLayers = service.getAvailableLayers(); + @Autowired + CakeBakingServiceImplTest(CakeBakingServiceImpl cakeBakingService) { + this.cakeBakingService = cakeBakingService; + } + + @BeforeEach + void setUp() { + cakeBakingService.deleteAllCakes(); + cakeBakingService.deleteAllLayers(); + cakeBakingService.deleteAllToppings(); + } + + + @Test + + void testLayers() { + final var initialLayers = cakeBakingService.getAvailableLayers(); assertNotNull(initialLayers); assertTrue(initialLayers.isEmpty()); - service.saveNewLayer(new CakeLayerInfo("Layer1", 1000)); - service.saveNewLayer(new CakeLayerInfo("Layer2", 2000)); + cakeBakingService.saveNewLayer(new CakeLayerInfo("Layer1", 1000)); + cakeBakingService.saveNewLayer(new CakeLayerInfo("Layer2", 2000)); - final var availableLayers = service.getAvailableLayers(); + final var availableLayers = cakeBakingService.getAvailableLayers(); assertNotNull(availableLayers); assertEquals(2, availableLayers.size()); for (final var layer : availableLayers) { @@ -70,16 +93,14 @@ class CakeBakingServiceImplTest { @Test void testToppings() { - final var service = new CakeBakingServiceImpl(); - - final var initialToppings = service.getAvailableToppings(); + final var initialToppings = cakeBakingService.getAvailableToppings(); assertNotNull(initialToppings); assertTrue(initialToppings.isEmpty()); - service.saveNewTopping(new CakeToppingInfo("Topping1", 1000)); - service.saveNewTopping(new CakeToppingInfo("Topping2", 2000)); + cakeBakingService.saveNewTopping(new CakeToppingInfo("Topping1", 1000)); + cakeBakingService.saveNewTopping(new CakeToppingInfo("Topping2", 2000)); - final var availableToppings = service.getAvailableToppings(); + final var availableToppings = cakeBakingService.getAvailableToppings(); assertNotNull(availableToppings); assertEquals(2, availableToppings.size()); for (final var topping : availableToppings) { @@ -93,28 +114,27 @@ class CakeBakingServiceImplTest { @Test void testBakeCakes() throws CakeBakingException { - final var service = new CakeBakingServiceImpl(); - final var initialCakes = service.getAllCakes(); + final var initialCakes = cakeBakingService.getAllCakes(); assertNotNull(initialCakes); assertTrue(initialCakes.isEmpty()); final var topping1 = new CakeToppingInfo("Topping1", 1000); final var topping2 = new CakeToppingInfo("Topping2", 2000); - service.saveNewTopping(topping1); - service.saveNewTopping(topping2); + cakeBakingService.saveNewTopping(topping1); + cakeBakingService.saveNewTopping(topping2); final var layer1 = new CakeLayerInfo("Layer1", 1000); final var layer2 = new CakeLayerInfo("Layer2", 2000); final var layer3 = new CakeLayerInfo("Layer3", 2000); - service.saveNewLayer(layer1); - service.saveNewLayer(layer2); - service.saveNewLayer(layer3); + cakeBakingService.saveNewLayer(layer1); + cakeBakingService.saveNewLayer(layer2); + cakeBakingService.saveNewLayer(layer3); - service.bakeNewCake(new CakeInfo(topping1, List.of(layer1, layer2))); - service.bakeNewCake(new CakeInfo(topping2, Collections.singletonList(layer3))); + cakeBakingService.bakeNewCake(new CakeInfo(topping1, List.of(layer1, layer2))); + cakeBakingService.bakeNewCake(new CakeInfo(topping2, Collections.singletonList(layer3))); - final var allCakes = service.getAllCakes(); + final var allCakes = cakeBakingService.getAllCakes(); assertNotNull(allCakes); assertEquals(2, allCakes.size()); for (final var cakeInfo : allCakes) { @@ -130,61 +150,49 @@ class CakeBakingServiceImplTest { @Test void testBakeCakeMissingTopping() { - final var service = new CakeBakingServiceImpl(); - final var layer1 = new CakeLayerInfo("Layer1", 1000); final var layer2 = new CakeLayerInfo("Layer2", 2000); - service.saveNewLayer(layer1); - service.saveNewLayer(layer2); + cakeBakingService.saveNewLayer(layer1); + cakeBakingService.saveNewLayer(layer2); final var missingTopping = new CakeToppingInfo("Topping1", 1000); - assertThrows(CakeBakingException.class, () -> { - service.bakeNewCake(new CakeInfo(missingTopping, List.of(layer1, layer2))); - }); + assertThrows(CakeBakingException.class, () -> cakeBakingService.bakeNewCake(new CakeInfo(missingTopping, List.of(layer1, layer2)))); } @Test void testBakeCakeMissingLayer() { - final var service = new CakeBakingServiceImpl(); - - final var initialCakes = service.getAllCakes(); + final var initialCakes = cakeBakingService.getAllCakes(); assertNotNull(initialCakes); assertTrue(initialCakes.isEmpty()); final var topping1 = new CakeToppingInfo("Topping1", 1000); - service.saveNewTopping(topping1); + cakeBakingService.saveNewTopping(topping1); final var layer1 = new CakeLayerInfo("Layer1", 1000); - service.saveNewLayer(layer1); + cakeBakingService.saveNewLayer(layer1); final var missingLayer = new CakeLayerInfo("Layer2", 2000); - assertThrows(CakeBakingException.class, () -> { - service.bakeNewCake(new CakeInfo(topping1, List.of(layer1, missingLayer))); - }); + assertThrows(CakeBakingException.class, () -> cakeBakingService.bakeNewCake(new CakeInfo(topping1, List.of(layer1, missingLayer)))); } @Test void testBakeCakesUsedLayer() throws CakeBakingException { - final var service = new CakeBakingServiceImpl(); - - final var initialCakes = service.getAllCakes(); + final var initialCakes = cakeBakingService.getAllCakes(); assertNotNull(initialCakes); assertTrue(initialCakes.isEmpty()); final var topping1 = new CakeToppingInfo("Topping1", 1000); final var topping2 = new CakeToppingInfo("Topping2", 2000); - service.saveNewTopping(topping1); - service.saveNewTopping(topping2); + cakeBakingService.saveNewTopping(topping1); + cakeBakingService.saveNewTopping(topping2); final var layer1 = new CakeLayerInfo("Layer1", 1000); final var layer2 = new CakeLayerInfo("Layer2", 2000); - service.saveNewLayer(layer1); - service.saveNewLayer(layer2); + cakeBakingService.saveNewLayer(layer1); + cakeBakingService.saveNewLayer(layer2); - service.bakeNewCake(new CakeInfo(topping1, List.of(layer1, layer2))); - assertThrows(CakeBakingException.class, () -> { - service.bakeNewCake(new CakeInfo(topping2, Collections.singletonList(layer2))); - }); + cakeBakingService.bakeNewCake(new CakeInfo(topping1, List.of(layer1, layer2))); + assertThrows(CakeBakingException.class, () -> cakeBakingService.bakeNewCake(new CakeInfo(topping2, Collections.singletonList(layer2)))); } } diff --git a/layers/src/test/java/com/iluwatar/layers/view/CakeViewImplTest.java b/layers/src/test/java/com/iluwatar/layers/view/CakeViewImplTest.java index 614f90c6c..894872037 100644 --- a/layers/src/test/java/com/iluwatar/layers/view/CakeViewImplTest.java +++ b/layers/src/test/java/com/iluwatar/layers/view/CakeViewImplTest.java @@ -31,16 +31,17 @@ import static org.mockito.Mockito.when; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; -import com.iluwatar.layers.dto.CakeInfo; -import com.iluwatar.layers.dto.CakeLayerInfo; -import com.iluwatar.layers.dto.CakeToppingInfo; -import com.iluwatar.layers.service.CakeBakingService; +import dto.CakeInfo; +import dto.CakeLayerInfo; +import dto.CakeToppingInfo; +import service.CakeBakingService; import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.slf4j.LoggerFactory; +import view.CakeViewImpl; /** * Date: 12/15/15 - 10:04 PM @@ -68,9 +69,9 @@ class CakeViewImplTest { void testRender() { final var layers = List.of( - new CakeLayerInfo("layer1", 1000), - new CakeLayerInfo("layer2", 2000), - new CakeLayerInfo("layer3", 3000)); + new CakeLayerInfo("layer1", 1000), + new CakeLayerInfo("layer2", 2000), + new CakeLayerInfo("layer3", 3000)); final var cake = new CakeInfo(new CakeToppingInfo("topping", 1000), layers); final var cakes = List.of(cake); diff --git a/pom.xml b/pom.xml index 10348ef04..e59bbc2e8 100644 --- a/pom.xml +++ b/pom.xml @@ -333,7 +333,7 @@ google_checks.xml checkstyle-suppressions.xml - UTF-8 + true warning false